程序中用到兩個時鐘。
MCLK設置為8MHZ
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
仿真圖.jpg (141.25 KB, 下載次數: 132)
下載附件
2019-4-4 16:56 上傳
定時器A0時鐘選擇SMCLK,32768HZ,可在proteus中設置
功能描述: 數碼管顯示秒、分。在顯示過程中如果按下按鍵,則觸發中斷,停止計數,
再按一次,秒表繼續計數。
開發中遇到的問題:在同時顯示兩個以上數碼管時,由于P2端口的數據沒有全部置位(共陽極數碼管),
導致顯示不完整,相同部分缺失。
解決辦法,在掃描顯示切換時,增加中間過渡數據如下
- void display(int sec, int min){
- //數碼管顯示數字緩存
- uchar buf[] = {0, 0, 0, 0};
- buf[0] = sec%10;
- buf[1] = sec/10%10;
- buf[2] = min%10;
- buf[3] = min/10%10;
-
- P2OUT = SEG[buf[0]];
- P3OUT = 0x08;
- delay_ms8M(1);
- P2OUT = 0xff;// 將P2端口線恢復成0xff,這一點很重要
- //可以消除跳變導致的顯示錯誤
-
- P2OUT = SEG[buf[1]];
- P3OUT = 0x04;
- delay_ms8M(1);
- P2OUT = 0xff;
- P2OUT = SEG[buf[2]];
- P3OUT = 0x02;
- delay_ms8M(1);
- P2OUT = 0xff;
- P2OUT = SEG[buf[3]];
- P3OUT = 0x01;
- delay_ms8M(1);
- P2OUT = 0xff;
- }
復制代碼
中斷函數定義
- #pragma vector = PORT1_VECTOR
- __interrupt void PORT1_ISR(void){
- if(KEYIN == 0){
- delay_ms8M(20);
- flag = ~flag;
- delay_ms8M(5);
- if(!flag){
- TACCTL0 &= ~CCIE;//中斷失能,關閉
- }else{
- TACCTL0 |= CCIE;//開啟
- }
- }
- P1IFG = 0;
- delay_ms8M(5);
- }
- #pragma vector = TIMERA0_VECTOR
- __interrupt void TIMER0_ISR(void){
- sec++;
- display_flag = ~display_flag;
- if(sec == 60){
- sec = 0;
- min++;
- }
- }
復制代碼 端口初始化
- void init_seg_port(void){
- P2DIR = 0XFF;
- P2OUT = SEG[0];
- P3DIR = 0XFF;
- P3OUT = 0X00;
- }
- void init_exti_port(void){
- P1DIR &= ~BIT0;
- P1IES |= BIT0;
- P1IE |= BIT0;
- P1IFG &= ~BIT0;//清零 復位
- }
復制代碼
全部資料51hei下載地址:
MSP430_秒表.zip
(435.05 KB, 下載次數: 90)
2019-4-4 16:56 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|