📄 tiaoshi.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit n0=P1^0;
sbit n1=P1^1;
sbit n2=P1^2;
sbit n3=P1^3;
sbit n4=P1^4;
sbit led=P1^7; //led为1时,使发光二极管点亮;
uchar dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar second=0,minute=0,hour=0,clock_s=0,clock_m=0,clock_h=0;//时分秒及闹钟的时分秒!
uint t0_zc=0;
uchar t_move=0,flag=0,flag2=0,k1=0,k2=0;//t_move指移位情况,为1当前对秒操作,为2对分操作,为3对时操作
//flag为状态位,为1进入闹钟显示及操作状态,flag2为了则立即停止闹铃!
void time0() interrupt 1
{t0_zc++;
if(t0_zc==4000)
{t0_zc=0;
second++;
if(second==60)
{second=0;
minute++;
if(flag2==1)flag2=0; //下一次分更新时,看是否刚在闹铃,是的话,闹一分钟就停止!
k1=hour^clock_h; //当时钟与闹钟的相同时,异或是0;
k2=minute^clock_m; //同理,看是否到闹钟所设定的时间;
if(k1==0)
{if(k2==0)flag2=1;}
if(minute==60)
{minute=0;
hour++;
if(hour==24)
{hour=0;}
}
}
}
}
void delay(uchar i)
{uchar j;
for(;i>0;i--)
for(j=248;j>0;j--);
}
uchar keyscan(void)
{uchar keyword=0;
uchar tmp;
tmp=P1&0x1f;
if(tmp!=0x1f)
{delay(20);
tmp=P1&0x1f;
if(tmp!=0x1f)
{if(n0==0)keyword=1;
while(n0==0);
if(n1==0)keyword=2;
while(n1==0);
if(n2==0)keyword=3;
while(n2==0);
if(n3==0)keyword=4;
while(n3==0);
if(n4==0)keyword=5;
while(n4==0);
}
}
return keyword;
}
void update(uchar keyword)
{if(keyword!=0)
{switch(keyword)
{case 1:
flag2=0;
TR0=0;
EA=0;
t_move=1;
break;
case 2:
flag2=0;
if(t_move==1)second=0;
if(t_move==2)
{if(flag==1) //先前按下了闹铃键,对闹铃显示单元操作!
{clock_m++;
if(clock_m==60)clock_m=0;}
else minute++;
if(minute==60)minute=0;
}
if(t_move==3)
{if(flag==1)
{clock_h++;
if(clock_h==24)clock_h=0;}
else hour++;
if(hour==24)hour=0;
}
break;
case 3:
flag2=0;
t_move++;
if(t_move==4)t_move=1;
break;
case 4:
flag2=0;
TR0=1;
EA=1;
t_move=0;
flag=0;
break;
case 5:
flag2=0;
flag=1;
t_move=2;
break;
default:break;
}
}
}
void display(void)
{
if(flag==0)
{uchar m=1;
if(t_move==1)m=50;
P0=dispcode[second%10];
P2=0x1f;
delay(m);
P0=dispcode[second/10];
P2=0x2f;
delay(m);
m=1;
if(t_move==2)m=50;
P0=dispcode[minute%10];
P2=0x37;
delay(m);
P0=dispcode[minute/10];
P2=0x3b;
delay(m);
m=1;
if(t_move==3)m=50;
P0=dispcode[hour%10];
P2=0x3d;
delay(m);
P0=dispcode[hour/10];
P2=0x3e;
delay(m);
if(flag2==1)led=0;
else led=1;
}
if(flag==1)
{uchar m=1;
if(t_move==1)m=50;
P0=dispcode[clock_s%10];
P2=0x1f;
delay(m);
P0=dispcode[clock_s/10];
P2=0x2f;
delay(m);
m=1;
if(t_move==2)m=50;
P0=dispcode[clock_m%10];
P2=0x37;
delay(m);
P0=dispcode[clock_m/10];
P2=0x3b;
delay(m);
m=1;
if(t_move==3)m=50;
P0=dispcode[clock_h%10];
P2=0x3d;
delay(m);
P0=dispcode[clock_h/10];
P2=0x3e;
delay(m);
}
}
void main(void)
{uchar keyword;
TMOD=0x02;
TH0=0x06;
TL0=0x06;
TR0=1;
ET0=1;
EA=1;
while(1)
{keyword=keyscan();
update(keyword);
display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -