![]() |
發布時間: 2018-6-10 00:03
正文摘要:這是我自己設計的計時和點亮三個小燈的設計,現在發現計時和點亮小燈沒法同時實現. 遇到的問題如下: 1.假如我把led_display程序發在while語句最后一行,會發生數碼管前五位會隨著小燈一起閃爍 ... |
wulin 發表于 2018-6-10 06:43 問題解決了,謝謝解答。 |
放在中斷里試試,弄個標志位,應該可以 |
因為你使用delay處理兩個程序,就會產生互相干擾。你把數碼管動態顯示放在中斷里,中斷時間改為1ms就不會互相干擾了。 #include<reg51.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; /*七段共陰管顯示定義*/ uchar seconde=0; /*定義并初始化變量*/ uchar minite=0; uchar hour=0; uint mstcnt=0; /*函數聲明*/ void delay(uchar k ); //延時子程序 void time_pro( ); //時間處理子程序 void display( ); //顯示子程序 void keyscan( ); //鍵盤掃描子程序 void led_display( ); // led閃爍程序 /*****************************/ /*led燈閃爍程序*/ /****************************/ void led_display(void) { delay(50); //led燈閃爍三次后熄滅 P2=0x07; //賦初始值 delay(50); P2=0x00; delay(50); P2=0x07; delay(50); P2=0x00; delay(50); P2=0x07; delay(50); P2=0x00; } /*****************************/ /*延時子程序*/ /****************************/ void delay (uchar k) { uchar j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } /**************************/ /*時間處理子程序*/ /**************************/ void time_pro( void) { if(seconde==60) //秒鐘設為60進制 { seconde=0; minite++; if(minite==60) //分鐘設為60進制 { minite=0; hour++; if(hour==24) //時鐘設為24進制 { hour=0; } } } } /*****************************/ /* 顯示子程序*/ /*****************************/ void display() { static uchar i=0; P0=0x00; //消隱 switch(i) { case 0: P1=0xfe; P0=dispcode[hour/10];//顯示小時的十位 i++; break; case 1: P1=0xfd; P0=(dispcode[(hour%10)])|0X80;//顯示小時的個位 i++; break; case 2: P1=0xfb; P0=dispcode[minite/10];//顯示分的十位 i++; break; case 3: P1=0xf7; P0=(dispcode[minite%10])|0X80;//顯示分的個位 i++; break; case 4: P1=0xef; P0=dispcode[seconde/10];//顯示秒的十位 i++; break; case 5: P1=0xdf; P0=dispcode[seconde%10];//顯示秒的個位 i=0; break; } } /**************************/ /*主函數*/ /**************************/ void main(void) { P1=0xff; //初始化p1口,全設為1 TMOD=0x01; //time0為定時器,方式1 TH0=0xfc; //預置計數初值1ms TL0=0x18; EA=1; ET0=1; TR0=1; while (1) { led_display( ); //led燈閃爍 time_pro( ); //時間處理 // display( ); //顯示時間 } } void timer0(void) interrupt 1 using 0 //定時器0方式1,50ms中斷一次 { TH0=0xfc; //重置計數初值1ms TL0=0x18; mstcnt++; if(mstcnt>=1000) { seconde++; mstcnt=0; } display( ); //顯示時間 } ![]() |