📄 shizhong.c
字号:
#include "reg51.h"
unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示0--9
unsigned char time[6]={0,0,0,0,0,0}; //每一位控制
unsigned char dtime[6]={0,0,0,0,0,0}; //定制时间
unsigned char con[6]={0x01,0x02,0x04,0x08,0x10,0x20}; //位选码
unsigned char j=0,i=0,m,n,mn;
char k=0;
sbit p07=P0^7; //小数点控制
int x=0;
void delay() //延时
{ int j;
for(j=0;j<=5000;j++);
}
void keyscan() //键盘扫描
{
//int m,n,mn;
P1=0x0f;
while(P1==0x0f);
if(P1!=0x0f)
{
delay(); //消抖
P1=0x0f;
m=P1;
P1=0xf0;
n=P1;
mn=m+n;
switch(mn) //按键实现功能
{case 0xee: TR0=0; break;
case 0xed: TR0=1; break;
case 0xde: time[0]++; if(time[0]==10){time[0]=0;time[1]++;} if(time[1]==6){time[1]=0;} break;
case 0xdd: if(time[0]==0){time[0]=0x0a; if(time[1]==0){time[1]=5;}else time[1]--; } time[0]--; break;
case 0xbe: time[2]++; if(time[2]==10){time[2]=0;time[3]++;} if(time[3]==6){time[3]=0;} break;
case 0xbd: if(time[2]==0){time[2]=0x0a; if(time[3]==0){time[3]=5;}else time[3]--; } time[2]--; break;
case 0x7e: time[4]++; if(time[4]==10){time[4]=0;time[5]++;} if(time[4]==4&&time[5]==2){time[4]=0;time[5]=0;} break;
case 0x7d: if(time[4]==0){time[4]=0x0a;if(time[5]==0){time[4]=4;time[5]=2;}else time[5]--;} time[4]--; break;
case 0xeb: k++;if(x>0)x=0; if(k==2)k=0; break; //关闹铃
case 0xe7: RD=1;x++; break;
case 0xdb: break;
case 0xd7: break;
case 0xbb: if(k==1){dtime[2]++; if(dtime[2]==10){dtime[2]=0;dtime[3]++;} if(dtime[3]==6){dtime[3]=0;}} break;
case 0xb7: if(k==1){if(dtime[2]==0){dtime[2]=0x0a; if(dtime[3]==0){dtime[3]=5;}else dtime[3]--; }dtime[2]--;} break;
case 0x7b: if(k==1){dtime[4]++; if(dtime[4]==10){dtime[4]=0;dtime[5]++;} if(dtime[4]==4&&dtime[5]==2){dtime[4]=0;dtime[5]=0;}} break;
case 0x77: if(k==1)
{if(dtime[4]==0)
{dtime[4]=0x0a;
if(dtime[5]==0)
{dtime[4]=4;dtime[5]=2;
}
else
dtime[5]--; //用当K=1时,设置闹铃的时间分钟
}
dtime[4]--;
}
break;
default: break;
}
P1=0x0f;
while(P1!=0x0f);
delay();
P1=0x0f;
}
}
void T0_srv(void) interrupt 1 using 1 //中断程序,进行时钟显示
{
TL0=-46080%256;
TH0=-46080/256;
j++;
if(j==20){j=0;time[0]++;}
if(time[0]==10){time[0]=0;time[1]++;}
if(time[1]==6){time[1]=0;time[2]++;}
if(time[2]==10){time[2]=0;time[3]++;}
if(time[3]==6){time[3]=0;time[4]++;}
if(time[4]==10){time[4]=0;time[5]++;}
if(time[5]==2&&time[4]==4){time[5]=0;time[4]=0;}
if(time[5]==dtime[5]&time[4]==dtime[4]&time[3]==dtime[3]&time[2]==dtime[2]&((dtime[2]+dtime[3]+dtime[4]+dtime[5])!=0)&time[1]<3&x==0) RD=!RD; //定时到时,响铃三十秒
if(time[2]==0&time[3]==0&time[1]==0&time[0]<3) {RD=0;if(time[0]==2)RD=1;} //每隔一小时响铃一次
// if(time[0]==5)RD=1;
}
void T1_srv()interrupt 3 using 3 //位扫描
{TH1=-500/256;
TL1=-500%256;
i++;
if(i==6) i=0;
P2=con[i];
if(k==0)P0=tab[time[i]];
if(k==1)P0=tab[dtime[i]]; //定时时间显示
if(i==2||i==4)
p07=1;
}
void main() //主函数
//采用T0定时器进行50ms定时
{TMOD=0x11;
TL0=-46080%256;
TH0=-46080/256;
TH1=-500/256; //采用T1定时进行位扫描
TL1=-500%256;
EA=1;
ET0=1;
ET1=1;
TR1=1;
TR0=1;
P0=0xff;
while(1)
{keyscan();delay();}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -