📄 89clockdc.c
字号:
#include<reg51.h>
sbit bee= P2^0;
sbit key = P2^1;
sbit dat = P2^2;
sbit clk = P2^3;
sbit cs = P2^4;
bit beep;
unsigned char data led[6];
unsigned char data *ledpoint;
unsigned char data timecnt;
struct time //定义结构体time
{
signed char second;
signed char minute;
signed char hour;
} time;
void delay(unsigned char mst) //延时子程序
{ unsigned char i;
for (i=0; i<mst; i++)
;
}
void send(unsigned char temp) //发送子程序
{
unsigned char i;
cs=0;
delay(7);
for(i=0;i<8;i++)
{
dat=(temp&0x80)?1:0;
clk=1;
delay(1);
clk=0;
delay(1);
temp=temp<<1;
}
dat=1;
}
receive() //接收子程序
{
unsigned char i,rec_buf;
dat=1;
delay(7);
for(i=8;i>0;i--)
{
rec_buf=rec_buf<<1;
clk=1;
delay(1);
rec_buf=(dat==0)?rec_buf&0xfe:rec_buf|0x01;
clk=0;
delay(1);
}
dat=0;
return rec_buf;
}
void write279(unsigned char cmd1, unsigned char cmd2)
{
send(cmd1);
send(cmd2);
cs=1;
}
void initdis() //初始化时间
{
unsigned char i;
for(i=0xc8;i<2+0xc8;i++)
{
write279(i,0);
}
write279(0x92,1);
for(i=0xcb;i<2+0xcb;i++)
{
write279(i,0);
}
write279(0x95,1);
for(i=0xce;i<2+0xce;i++)
{
write279(i,0);
}
beep=0;
}
void display(unsigned char ledcnt,dischar) //显示子程序
{
if(ledcnt==0xcd)
{
ledcnt--;
}
if(ledcnt==0xca)
{
ledcnt--;
}
write279(ledcnt,dischar);
*(ledpoint++)=dischar;
}
keyscan(void) //键扫子程序
{
static bit keypress=0;
static signed char keycode;
if(key==0)
{
if(keypress==0)
{
send(0x15);
keycode=receive();
cs=1;
keypress=1;
}
return 0xff;
}
if(keypress==1)
{
keypress=0;
return keycode;
}
return 0xff;
}
void judgetime() //判断时间是否正确
{
unsigned char i;
for(i=0;i<6;i++)
{
if(led[i]>=10)
{
goto settime0;
}
}
time.hour=led[0]*10+led[1];
time.minute=led[2]*10+led[3];
time.second=led[4]*10+led[5];
if(time.hour>=24)
{
goto settime0;
}
if(time.minute>=60)
{
goto settime0;
}
if(time.second>=60)
{
goto settime0;
}
return;
settime0:
initdis();
time.hour=0;
time.minute=0;
time.second=0;
}
opentime() //初始化定时器
{
timecnt=0;
TH0 =0xeb;
TL0 =0x2b;
TMOD = TMOD | 0x01;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void dissecond() //显示秒
{
write279(0xc9,time.second/10);
write279(0xc8,time.second%10);
}
void disminute() //显示分
{
write279(0xcc,time.minute/10);
write279(0xcb,time.minute%10);
}
void dishour() //显示小时
{
write279(0xcf,time.hour/10);
write279(0xce,time.hour%10);
}
void timer0 () interrupt 1 //溢出中断子程序
{
TH0=0xeb;
TL0=0x2b;
TR0=1;
if((++timecnt)>=125)
{
timecnt=0;
if((--time.second)<0)
{
time.second=59;
if((--time.minute)<0)
{
time.minute=59;
if((--time.hour)<0)
{
beep=1;
time.hour=23;
}
dishour();
}
disminute();
}
dissecond();
}
}
main()
{
unsigned char i,j,keyc,ledbit;
key=1;
clk=0;
cs =1;
for(i=0;i<6;i++)
{
led[i]=0;
}
send(0xa4);
cs=1;
initdis();
ledbit=0xcf;
ledpoint=led;
while((keyc=keyscan())!=0x17)
{
if(keyc!=0xff)
{
if(ledbit==0xc7) ledbit=0xcf;
display(ledbit++,keyc);
}
}
judgetime();
opentime();
ww:
while(beep)
{
for(j=0;j<10;j++)
{
for(i=0;i<80;i++)
{
bee=~bee;
delay(20);
}
}
beep=0;
}
goto ww;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -