以下是个简单的数码管动态显示的C语言程序, 假如我们把延时的delay(2);这个去掉,结果虽然从逻辑上讲是没问题的,但是下载到板上后,看到显示比较模糊,一些不该亮的地方也有点亮。 这是为什么呢?
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函数还是有点浪费资源,改为定时器来完成延时, 以下是刚调试好的60秒倒计时。就是在调试这个程序时遇到了前面提到的数码管模糊现象。
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是显示位数。 9 #define START 59 10 #define TIMER_NUM 1000 11 12 uchar tmp[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管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 }
[此贴子已经被作者于2012-6-9 12:19:33编辑过]
|