|
如题- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //用一维数组定义0-9、横杠、全灭
- uchar a[8];
- uchar second=0,minute=0,hour=0;
- uchar minute1=0,hour1=0;
- uchar b[8]={0x01,0x02,0x04,0x08}; //扫描按键1的信号,进行选位
- uchar k=0; unsigned int temp; // 记录毫秒为秒的变量
- uchar M,flag; //M是模式,更新时间的种模式加上正常模式
- uchar counter;
- sbit K1=P1^0;
- sbit K2=P1^1;
- sbit K3=P1^2;
- sbit K4=P1^3;
- sbit S1=P1^6;
- sbit S2=P1^7;
- void T0_ISR() interrupt 1
- {
-
- TMOD=1;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- while(1);
- if(20==counter)
- {
- counter=0;
- S2=~S2;
- }
- }
- void delay(unsigned n) //0.2毫秒
- {
- int x,y;
- for(x=0;x<n;x++)
- for(y=0;y<24;y++);
- }
-
-
- void time1()interrupt 3 //定时器中断函数
- {
- TH1=0xfc; //定时ms
- TL1=0x18;
- temp++;
- counter++;
- if(temp==1000) //配合定时器定时s
- {
- temp=0;
- second++;
- }
- if(second==59)
- {
- second=0;
- if(minute<59)
- minute++;
- else
- {
- minute=0;
- hour++;
- hour%=24;
- }
- }
- if(hour1==hour&&minute1==0&&second<10) //整点报时
- {
- if(M==0)
- S1=0;
- S2=0;
- }
- if(temp%250==0) //每ms
- flag=!flag; //闪烁标志位取反
- if(k==8)
- k=0;
- P0=a[k];
- P2=b[k++];
- delay(1);
- P2=0x00;
- }
-
- void display()
- {
- switch(M)
- {
- case 0:
- {
- if(flag==1)
- a[0]=led[hour/10];
- a[1]=led[hour%10];
- a[2]=led[minute/10];
- a[3]=led[minute%10];
- }
- break;
- case 1:
- {
- if(flag==1)
- {
- a[0]=led[hour/10];
- a[1]=led[hour%10];
- a[2]=led[minute/10];
- a[3]=led[minute%10];
- }
- break;
- case 2:
- {
- if(flag==1)
- {
- a[0]=led[hour/10];
- a[1]=led[hour%10];
- a[2]=led[minute/10];
- a[3]=led[minute%10];
- }
- }
- break;
- case 3:
- {
- if(flag==1)
- {
- a[0]=led[hour1/10];
- a[1]=led[hour1%10];
- a[2]=led[minute1/10];
- a[3]=led[minute1%10];
- }
- }
- break;
- case 4:
- {
- if(flag==1)
- {
- a[0]=led[hour1/10];
- a[1]=led[hour1%10];
- a[2]=led[minute1/10];
- a[3]=led[minute1%10];
- }
- }
- }
- }
- }
-
- void key_scan()
- {
- if(K1==0)
- {
- delay(10); //延时去抖
- if(K1==0) //按K1进行模式切换
- {
- M++;
- if(M==5)
- M=0;
- if(K4==0)
- M=0;
- }
- while(!K1); //等待按键释放
- }
- if(M!=0)
- {
- switch(M)
- {
- case 1: //调时
- {
- if(K2==0) //加键按下
- {
- delay(10);
- if(K2==0)
- {
- if(hour<23) hour++;
- else hour=0;
- }
- while(!K2);
- }
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- if(hour> 0) hour--;
- else hour=23;
- }
- while(!K3);
- }
- }
- break;
- case 2: //调分
- {
- if(K2==0)
- {
- delay(10);
- if(K2==0)
- {
- if(minute<59)
- minute++;
- else
- minute=0;
- }
- while(!K2);
- }
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- if(minute>0)
- minute--;
- else
- minute=59;
- }
- while(!K3);
- }
- }
- break;
- case 3: //闹钟调时
- {
- if(K2==0)
- {
- delay(10);
- if(K2==0)
- {
- if(hour1<23)
- hour1++;
- else hour1=0;
- }
- while(!K2);
- }
- if(K3==0)
- {
- delay(10);
- if(K3==0)
- {
- if(hour1>0)
- hour1--;
- else hour1=23;
- }
- while(!K3);
- }
- }
- break;
- case 4: //闹钟调分
- {
- if(K2==0)
- {
- delay(10);
- if(K2==0)
- {
- if(minute1<59)
- minute1++;
- else minute1=0;
- }
- while(!K2);
- }
- if(K3==0)
- {
- delay(10); //延时去抖
- if(K3==0) //减键按下
- { if(minute1>0)
- minute1--;
- else minute1=59;
- }
- while(!K3);
- }
- }
- break;
- }
- }
- }
- void main()
- {
- M=0;
- flag=0; //闪烁标志位
- TMOD=0x10; //定时器以方式定时
- TL1=0x18;
- EA=1; //打开总中断
- ET1=1; //允许定时器中断
- TR1=1; //开启定时器(开始定时计数)
- while(1)
- {
- key_scan();
- display();
- }
- }
复制代码 |
|