一直想有这样的显示,没有成功,只是在仿真中能显示,是静态显示,对定时器学习后,有更深了一点认识,就感觉用定时器能实现,结果就成功了。
单片机源程序如下:
- #include<reg51.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 num,t,aa;
- u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值
- void delay(u16 i)
- {
- while(i--);
- }
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- void TimerInit()
- {
- TMOD=0X11;
- TH1=0X3C;
- TL1=0XB0;
- TH0=0X3C;
- TL0=0XB0;
- EA=1;
- ET1=1;
- TR1=1;
- ET0=1;
- }
- void Timer1() interrupt 3
- {
- TH1=0X3C;
- TL1=0XB0;
- num++;
- if(num==20)
- {
- num=0;
- TF1=0;
- t++;
- if(t==15)
- {
- TR1=0;
- TF1=0;
- TR0=1;
- }
- }
- }
- void Timer0() interrupt 1
- {
- TH0=0X3C;
- TL0=0XB0;
- aa++;
- if(aa==20)
- {
- aa=0;
- TF0=0;
- t--;
- }
- if(t==0)
- {
- TR0=0;
- TF0=0;
- TR1=1;
- }
- }
- void DigDisplay()
- {
- u8 i;
- for(i=0;i<8;i++)
- {
- switch(i)
- {
- case(0):LSA=0;LSB=0;LSC=0;break;
- case(1):LSA=1;LSB=0;LSC=0;break;
- case(2):LSA=0;LSB=1;LSC=0;break;
- case(3):LSA=1;LSB=1;LSC=0;break;
- case(4):LSA=0;LSB=0;LSC=1;break;
- case(5):LSA=1;LSB=0;LSC=1;break;
- case(6):LSA=0;LSB=1;LSC=1;break;
- case(7):LSA=1;LSB=1;LSC=1;break;
- }
- P0=smgduan[t];
- delay(10);
- P0=0x00;
- }
- }
- void main()
- {
- TimerInit();
- while(1)
- {
- DigDisplay();
- }
- }
-
复制代码
所有资料51hei提供下载:
控制普中的板子动态加减循环0-F.zip
(13 KB, 下载次数: 6)
|