- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit K1=P3^0;
- uchar code tab[]={ //标准字库
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
- //black - H J K L N o P U t G Q r M y
- 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e};
- uchar displayData[4];//显示数据缓存
- uchar Cnt2ms;
- uchar KeySec;
- uint num;
- bit flag1,flag2;
- void Timer0Init() //2毫秒@12.000MHz
- {
- TMOD= 0x01; //设置定时器模式
- TL0 = 0x30; //设置定时初始值
- TH0 = 0xF8; //设置定时初始值
- TR0 = 1; //定时器0开始计时
- EA = 1;
- ET0 = 1;
- }
- //按键扫描
- void keyscan()
- {
- static unsigned int time=0;
- static bit sign=0;
- if(!K1)
- {
- if(++time>=100 && sign==0)
- {
- sign=1;
- if(num<1000 && flag1==0)
- {
- flag1=1;
- flag2=1;
- }
- else if(num<1000 && flag1==1)
- {
- flag1=0;
- flag2=1;
- }
- else if(num>=1000 && flag1==0)
- {
- flag1=0;
- flag2=0;
- num=0;
- }
- }
- }
- else
- {
- time=0;
- sign=0;
- }
- }
- void display()//显示
- {
- static uchar i=0;
- if(flag2)
- {
- displayData[0] = tab[num/1000%10];
- displayData[1] = tab[num/100%10];
- displayData[2] = tab[num/10%10];
- displayData[3] = tab[num%10];
- }
- else
- {
- displayData[0] = 0x00;
- displayData[1] = 0x5C;//'O'
- displayData[2] = 0x71;//'F'
- displayData[3] = 0x71;//'F'
- }
- P0=0x00;//消隐
- P2&=0xF0;
- P2|=~(0x01<<i);
- P0=displayData[i];
- i=++i%4;
- }
- void main()//主函数
- {
- Timer0Init();//初始化定时器
- while(1)
- {
- keyscan();
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TL0 = 0x30;
- TH0 = 0xF8;
- if(flag1)
- {
- if(++Cnt2ms>=50)
- {
- Cnt2ms=0;
- num++;
- if(++num>=1000)
- {
- flag1=0;
- }
- }
- }
- display();//数码管显示
- }
复制代码
|