|
程序中用到兩個(gè)時(shí)鐘。
MCLK設(shè)置為8MHZ
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
定時(shí)器A0時(shí)鐘選擇SMCLK,32768HZ,可在proteus中設(shè)置
功能描述: 數(shù)碼管顯示秒、分。在顯示過(guò)程中如果按下按鍵,則觸發(fā)中斷,停止計(jì)數(shù),
再按一次,秒表繼續(xù)計(jì)數(shù)。
開發(fā)中遇到的問(wèn)題:在同時(shí)顯示兩個(gè)以上數(shù)碼管時(shí),由于P2端口的數(shù)據(jù)沒(méi)有全部置位(共陽(yáng)極數(shù)碼管),
導(dǎo)致顯示不完整,相同部分缺失。
解決辦法,在掃描顯示切換時(shí),增加中間過(guò)渡數(shù)據(jù)如下
- void display(int sec, int min){
- //數(shù)碼管顯示數(shù)字緩存
- 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端口線恢復(fù)成0xff,這一點(diǎn)很重要
- //可以消除跳變導(dǎo)致的顯示錯(cuò)誤
-
- 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;
- }
復(fù)制代碼
中斷函數(shù)定義
- #pragma vector = PORT1_VECTOR
- __interrupt void PORT1_ISR(void){
- if(KEYIN == 0){
- delay_ms8M(20);
- flag = ~flag;
- delay_ms8M(5);
- if(!flag){
- TACCTL0 &= ~CCIE;//中斷失能,關(guān)閉
- }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++;
- }
- }
復(fù)制代碼 端口初始化
- 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;//清零 復(fù)位
- }
復(fù)制代碼
全部資料51hei下載地址:
MSP430_秒表.zip
(435.05 KB, 下載次數(shù): 90)
2019-4-4 16:56 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|