📄 eclock.c
字号:
#include <reg52.h>
#define uchar unsigned char
typedef struct
{ uchar hour;
uchar min;
uchar second;
}time;
time now ={12,30,00};
uchar idata disbuf[10];
uchar code addr[6]={0x06,0x05,0x04,0x03,0x02,0x01};
uchar keyval;
uchar times = 0;
bit adjh = 0;
bit adjm = 0;
sbit Data = P2^5;
sbit Clk = P2^6;
sbit Load = P2^7;
void ini7219(void);
void bytedin(uchar x);
void sdin(uchar a,uchar d);
void adj(void);
void inc(void);
void delay10(void);
void initiate(void)
{ P1 = 0xff;
P2 = P2 & 0x1f;
TMOD = 0x11;
TH0 = (65536 - 25000) / 256;
TL0 = (65536 - 25000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void display(void)
{ uchar i;
disbuf[0] = now.second % 10;
disbuf[1] = now.second / 10;
disbuf[6] = now.min % 10;
disbuf[7] = now.min / 10;
disbuf[8] = now.hour % 10;
disbuf[9] = now.hour / 10;
if((adjm)&&(now.second % 2))
{ disbuf[2] = 0xff;
disbuf[3] = 0xff;
}
else
{ disbuf[2] = disbuf[6];
disbuf[3] = disbuf[7];
}
if((adjh)&&(now.second % 2))
{ disbuf[4] = 0xff;
disbuf[5] = 0xff;
}
else
{ disbuf[4] = disbuf[8];
disbuf[5] = disbuf[9];
}
ini7219();
for(i = 0;i < 6;i++)
sdin(addr[i],disbuf[5-i]);
}
void timer0(void) interrupt 1 using 1
{ TH0 = (65536 - 25000) / 256;
TL0 = (65536 - 25000) % 256;
times++;
if(times >= 20)
{ now.second++;
times = 0;
if(now.second >= 60)
{ now.min++;
now.second = 0;
if(now.min >= 60)
{ now.hour++;
now.min = 0;
if(now.hour >= 24)
now.hour = 0;
}
}
}
}
void keyproc(void)
{ ET0 = 0;
keyval = (P1 & 0x03);
switch(keyval)
{ case 0x02: adj(); break;
case 0x01: inc(); break;
default:;
}
ET0 = 1;
}
void adj(void)
{ if((~adjh) & (~adjm))
adjh = 1;
else if(adjh)
{ adjm = 1;
adjh = 0;
}
else if(adjm)
{ adjm = 0;
adjh = 0;
}
}
void inc(void)
{ if(adjh)
{ now.hour++;
if(now.hour >= 24)
now.hour = 0;
}
if(adjm)
{ now.min++;
if(now.min >= 60)
now.min = 0;
}
}
void main()
{ initiate();
for(;;)
{ display();
if(keyval != 0x03)
{ delay10();
if(keyval != 0x03)
keyproc();
}
}
}
void delay10(void)
{ TH1 = (65536 - 5000) / 256;
TL1 = (65536 - 5000) % 256;
TR1 = 1;
while(!TF1);
TR1 = 0;
TF1 = 0;
}
void bytedin(uchar x)
{ uchar i,a;
a = x;
for(i = 0;i < 8;i++)
{ Data = (bit)(a & 0x80);
a = a << 1;
Clk = 0;
Clk = 1;
}
}
void sdin(uchar a,uchar d)
{ bytedin(a);
bytedin(d);
Load = 0;
Load = 1;
}
void ini7219(void)
{ sdin(0x09,0xff);
sdin(0x0a,0x07);
sdin(0x0b,0x05);
sdin(0x0c,0x01);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -