1. 按键把定时器0都关闭了,数码管无法显示。
2. 最好加一个定时器刷新数码管。
代码太乱,我也只能随意改改了:
- #include <REG51.H>
- #define uchar unsigned char
- #define uint unsigned int
- uint i,j,sec,sec1=0,sec2=0;
- sbit k1=P3^1;//停止或启动定时器
- sbit k2=P3^0;//小时
- sbit k3=P3^2;//分
- sbit k4=P3^3;//秒
- sbit BZ=P1^5;//为了不让开发板的蜂鸣器响所以设置了一下,可以不用管BZ
- uchar code table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7D,0x07,0x7F,0x6F};
- void display();
- void button();
- void init();
- void button_int();
- unsigned char num = 0;
- void delay(uint t)
- {
- while(t--);
- }
- void main()
- {
- P3=0x0f;//0000 1111
- init();
- while(1)
- {
-
- display();
- if(P3!=0x0f)
- {
- delay(1000);
- if(P3!=0x0f)
- {
- button_int();
- display();
- while(P3!=0x0f);
- }
- }
- delay(100);
- P0=0x00;
- }
- }
- //a=10,b=11,c=12,d=13,e=14,f=15
- void button_int()
- {
- if(P3==0x0d)//0000 1101 - P3^1 - K1
- {
- num = 2;
- TR0=~TR0;
- }
- if(TR0==0)
- {
- if(P3==0x0e)//0000 1110 - P3^0 - K2 - num = 2 - set sec2
- {
- num = 2;
- sec2++;
- if(sec2==24)
- {
- sec2=0;
- }
- }
- if(P3==0x0b)//0000 1011 - P3^2 - K3 - num = 3 - set sec1
- {
- num = 3;
- sec1++;
- if(sec1==60)
- {
- sec1=0;
- }
- }
- if(P3==0x07)//0000 0111 - P3^3 - K4 - num = 4 - set sec
- {
- num = 4;
- sec=0;
- }
- }
- }
- void T0_time()interrupt 1
- {
- TH0=0xfc;
- TL0=0x67;
- i++;
- if(i>=1000)
- {
- i=0;
- sec++;
- if(sec==60)
- {
- sec=0;
- sec1++;
- if(sec1==60)
- {
- sec1=0;
- sec2++;
- if(sec2==24)
- {
- sec2=0;
- }
- }
- }
- }
- }
- void init()
- {
- BZ=0;
- TMOD=0x01;
- TH0=0xfc;
- TL0=0x67;
- ET0=1;
- EA=1;
- TR0=1;
- }
- void display()
- {
- if(TR0==0)
- {
- if(num==4)//P3^3 - K4 - num = 4 - set sec
- {
- P2=0x00;P0=table[sec%10];delay(500);
- P2=0x04;P0=table[sec/10%10];
- }
- if(num==3)//P3^2 - K3 - num = 3 - set sec1
- {
- P2=0x0c;P0=table[sec1%10];delay(500);
- P2=0x10;P0=table[sec1/10%10];
- }
- if(num==2)//P3^0 - K2 - num = 2 - set sec2
- {
- P2=0x18;P0=table[sec2%10];delay(500);
- P2=0x1c;P0=table[sec2/10%10];
- }
- }else{
- num = 0;
- switch(j)
- {
- case 0:P2=0x00;j++;P0=table[sec%10];break;
- case 1:P2=0x04;j++;P0=table[sec/10%10];break;
- case 2:P2=0x08;j++;P0=0x40;break;
- case 3:P2=0x0c;j++;P0=table[sec1%10];break;
- case 4:P2=0x10;j++;P0=table[sec1/10%10];break;
- case 5:P2=0x14;j++;P0=0x40;break;
- case 6:P2=0x18;j++;P0=table[sec2%10];break;
- case 7:P2=0x1c;j=0;P0=table[sec2/10%10];break;
- default:break;
- }
- }
- }
|