?? 89clockc1.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[]={0,0,0,0,0,0};
unsigned char data *ledpoint;
unsigned char data timecnt;
struct time //定義結構體time
{
unsigned char second;
unsigned char minute;
unsigned 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(void) //接收子程序
{
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;
write279(0x88,0x7f);
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) //顯示子程序
{
write279(ledcnt,dischar);
*(ledpoint++)=dischar;
}
void bitblink(unsigned char m)
{
if(m==5|m==2) m=m-1;
if(m==0xff) m=7;
m=1<<m;
m^=0xff;
write279(0x88,m);
}
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)>=60)
{
time.second=0;
if((++time.minute)>=60)
{
beep=1;
time.minute=0;
if((++time.hour)>=24)
{
time.hour=0;
}
dishour();
}
disminute();
}
dissecond();
}
}
main()
{
unsigned char i,j,n,c,ledbit;
key=1;
clk=0;
cs =1;
send(0xa4);
cs=1;
initdis();
ledbit=0xcf;
ledpoint=led;
n=7;
while((c=keyscan())!=0x17)
{
if(c!=0xff)
{
if(ledbit==0xc7)
{
ledbit=0xcf;
ledpoint=led;
n=7;
}
if((ledbit==0xcd)|(ledbit==0xca))
{
ledbit=ledbit-1;
n=n-1;
}
display(ledbit--,c);
bitblink(--n);
}
}
write279(0x88,0xff);
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 + -