- #include<reg51.h>
- #define uchar unsigned char
- #define dula P0 //段选信号的锁存器控制
- #define wela P2 //位选信号的锁存器控制,这里只用到P2.4-P2.7
- sbit k1=P3^4;
- sbit k2=P3^5;
- sbit k3=P3^6;
- //sbit k4=P3^7;
- unsigned int j,k,a1,a0,c1,c0,aa1,aa0,cc1,cc0,m,f,s,ns=10,nf=32,num,n=255;
- unsigned char pp;
- //unsigned char code weitable[]={0x8f,0x4f,0x2f,0x1f};//数码管各位的码表
- unsigned char code weitable[]={0xe0,0xd0,0xb0,0x70};//数码管各位的码表
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- uchar data dis_buf[4];
- bit flag=0;
- void delay(unsigned char i)
- {
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void display()
- {
- static i=0;
- dula=0x00;//段码消隐
- wela&=0x0f;//清P2高4位
- wela|=weitable[i];//送位码
- dula=dis_buf[i]; //送段码
- i++;
- i%=4;
- }
- void keyscan()
- {
- if(k1==0)
- {
- delay(10);
- if(k1==0)
- {
- f++;
- if(f>=60)
- f=0;
- while(k1==0);
- }
- }
- if(k2==0)
- {
- delay(10);
- if(k2==0)
- {
- s++;
- if(s>=24)
- s=0;
- while(k2==0);
- }
- }
- if(k3==0)
- {
- delay(10);
- if(k3==0)
- {
- flag=~flag;
- while(k3==0);
- }
- }
- }
- void main()
- {
- TMOD |= 0x01; //设置定时器模式
- TL0 = 0x00; //设置定时初值5ms
- TH0 = 0xEE; //设置定时初值5ms
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0=1; //开定时器0中断
- EA=1; //开总中断
- while(1)
- {
- keyscan();
- if(pp>=200)
- {
- pp=0;
- m++;
- n--;
- P1=n;//闪烁灯
- if(m==60)
- {
- m=0;//若到了60s,则归零
- f++;
- if(f==60)
- {
- f=0;
- s++;
- if(s==24)
- {
- s=0;
- }
- }
- }
- }
- }
- }
- void time0() interrupt 1
- {
- TL0 = 0x00; //设置定时初值5ms
- TH0 = 0xEE; //设置定时初值5ms
- pp++;
- if(!flag)
- {
- dis_buf[3]=table[f%10]; //取出当前描述的个位与十位
- dis_buf[2]=table[f/10];
- if(pp>0 && pp<100)
- dis_buf[1]=table[s%10]|0x80;//闪点
- else
- dis_buf[1]=table[s%10];
- dis_buf[0]=table[s/10];
- }
- else
- {
- dis_buf[3]=table[nf%10]; //取出当前描述的个位与十位
- dis_buf[2]=table[nf/10];
- dis_buf[1]=table[ns%10];
- dis_buf[0]=table[ns/10];
- }
- display();
- }
复制代码
|