以下是個簡單的數(shù)碼管動態(tài)顯示的C語言程序, 假如我們把延時的delay(2);這個去掉,結(jié)果雖然從邏輯上講是沒問題的,但是下載到板上后,看到顯示比較模糊,一些不該亮的地方也有點亮。 這是為什么呢?
1 #include <reg52.h> 2 sbit DUAN = P2^6; 3 sbit WEI = P2^7; 4 5 void delay(unsigned int z) //1ms延時 6 { 7 unsigned int x,y; 8 for(x=z;x>0;x--) 9 for(y=110;y>0;y--); 10 } 11 12 void main() 13 { 14 unsigned char code show[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07}; 15 unsigned int i,which; 16 while(1) 17 { 18 which = 1; 19 for(i=0; i<8; i++) 20 { 21 DUAN = 1; 22 P0 = show; 23 DUAN = 0; 24 P0 = 0XFF; 25 WEI = 1; 26 P0 = 255-which; 27 WEI = 0; 28 which *= 2; 29 //delay(2); 30 } 31 } 32 33 } 34 35
delay函數(shù)還是有點浪費資源,改為定時器來完成延時, 以下是剛調(diào)試好的60秒倒計時。就是在調(diào)試這個程序時遇到了前面提到的數(shù)碼管模糊現(xiàn)象。
1 #include <reg52.h> 2 3 #define uchar unsigned char 4 #define uint unsigned int 5 #define LED_LOCK openLed = 1 6 #define MATRIX_LOCK P2 = 0x35 7 #define N 2 8 //N是顯示位數(shù)。 9 #define START 59 10 #define TIMER_NUM 1000 11 12 uchar tmp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //數(shù)碼管0~9編碼 13 14 uint timer1 = 0; timer2 = 0; 15 16 sbit led1 = P0^0; 17 sbit openLed = P1^4; 18 sbit Duan = P2^6; 19 sbit Wei = P2^7; 20 21 22 void main() 23 { 24 uint whichOne = 0; 25 uchar select[]={0xff - 1, 0xff - 2, 0xff - 4, 0xff - 8, 0xff-16, 0xff-32, 0xff-64, 0xff-128}, 26 show[2], 27 num = START; 28 //select:位選編碼 29 LED_LOCK; 30 MATRIX_LOCK; 31 32 TMOD = 0x01; 33 TH0 = (65536 - TIMER_NUM) >> 8; 34 TL0 = (65536 - TIMER_NUM) % 256; 35 EA = 1; 36 ET0 = 1; 37 TR0 = 1; 38 39 while(1) 40 { 41 if(timer1 >= 1000) 42 { 43 if(num == 0) 44 num = START + 1; 45 num--; 46 timer1 = 0; 47 } 48 49 if(timer2 >= 10) 50 { 51 whichOne++; 52 whichOne %= N; 53 show[0] = num / 10; 54 show[1] = num % 10; 55 Duan = 1; 56 P0 = tmp[show[whichOne]]; 57 Duan = 0; 58 P0 = 0xff; 59 Wei = 1; 60 P0 = select[whichOne]; 61 Wei = 0; 62 timer2 = 0; 63 } 64 } 65 66 } 67 68 void Timer0() interrupt 1 69 { 70 TH0 = (65536 - TIMER_NUM) >> 8; 71 TL0 = (65536 - TIMER_NUM) % 256; 72 timer1 ++; 73 timer2 ++; 74 }
[此貼子已經(jīng)被作者于2012-6-9 12:19:33編輯過]
|