下面面這個(gè)是我在51hei論壇上看到的程序,我看了一下我有個(gè)疑問(1)當(dāng)stopwatch=1的時(shí)候, LedNumbe[]這個(gè)數(shù)組是否除了LedNumbe[0]=1以外,其他LedNumbe[]是否都為0 ,假如是的話,請看問題2。(2)當(dāng)stopwatch=1的時(shí)候,進(jìn)入動(dòng)態(tài)刷新,除了第一個(gè)數(shù)碼管能顯示1外 其他數(shù)碼管都會(huì)有顯示0,到最后的數(shù)碼管的效果就會(huì)變成這樣000001 000002 000003,而這個(gè)程序的效果應(yīng)該是 1 2 3 4 5 6,就是多余位是不會(huì)顯示的0的。我現(xiàn)在疑問的是 我不知道自己所描述的疑問是否正確
#include <reg52.h> //包含寄存器的庫文件 sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code LedChar[] = { //用數(shù)組來表示數(shù)碼管真值表 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e, }; unsigned char LedNumber[6] = {0}; //定義全局變量 unsigned char j = 0; unsigned int counter = 0; void main() { unsigned long stopwatch =0; ENLED = 0; ADDR3 = 1; P0 = 0XFF; //74HC138和P0初始化部分 TMOD = 0x01; //設(shè)置定時(shí)器0為模式1 TH0 = 0xFC; TL0 = 0x67; //定時(shí)值初值,定時(shí)1ms TR0 = 1; //打開定時(shí)器0 EA = 1; //打開中中斷 ET0 = 1; //打開定時(shí)器0中斷 while(1) { if(1000 == counter) //判斷定時(shí)器0溢出是否達(dá)到1000次 { counter = 0; stopwatch++; LedNumber[0] = stopwatch%10; LedNumber[1] = stopwatch/10%10; LedNumber[2] = stopwatch/100%10; LedNumber[3] = stopwatch/1000%10; LedNumber[4] = stopwatch/10000%10; LedNumber[5] = stopwatch/100000%10; } } } void InterruptTimer0() interrupt 1 //中斷函數(shù)的特殊寫法,數(shù)字’1’為中斷入口號(hào) { TH0 = 0xFC; //溢出后進(jìn)入中斷重新賦值 TL0 = 0x67; counter++; //計(jì)數(shù)值counter加1 P0 = 0xFF; //消隱 switch(j) { case 0: ADDR0=0; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[0]]; break; case 1: ADDR0=1; ADDR1=0; ADDR2=0; j++; P0=LedChar[LedNumber[1]]; break; case 2: ADDR0=0; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[2]]; break; case 3: ADDR0=1; ADDR1=1; ADDR2=0; j++; P0=LedChar[LedNumber[3]]; break; case 4: ADDR0=0; ADDR1=0; ADDR2=1; j++; P0=LedChar[LedNumber[4]]; break; case 5: ADDR0=1; ADDR1=0; ADDR2=1; j=0; P0=LedChar[LedNumber[5]]; break; default: break; } //動(dòng)態(tài)刷新 }
|