📄 n90clockc.c
字号:
#include<io8515.h>
#include<slavr.h>
#pragma interrupt_handler timer0_ovf:8
#define clrcs PORTC&=~0x10;
#define setcs PORTC|=0x10;
#define clrclk PORTC&=~0x08;
#define setclk PORTC|=0x08;
unsigned char led[]={0,0,0,0,0,0};
unsigned char *ledpoint;
unsigned char beep,timecnt;
struct time //定义结构体time
{
unsigned char second;
unsigned char minute;
unsigned char hour;
} time;
void delay(unsigned char mst) //延时子程序
{ unsigned char i;
for (i = 1; i<mst; i++)
;
}
void send(unsigned char temp) //发送子程序
{
unsigned char i;
clrcs
delay(150);
clrclk
for(i=8;i>0;i--)
{
PORTC=(temp&0x80)?PORTC|0x04:PORTC&0xfb;
setclk
delay(10);
clrclk
delay(10);
temp=temp<<1;
}
PORTC&=~0x04;
}
void write279(unsigned char cmd1, unsigned char cmd2)
{
send(cmd1);
send(cmd2);
setcs;
}
receive(void) //接收子程序
{
unsigned char i,rec_buff;
DDRC&=~0x04;
PORTC&=~0x04;
delay(150);
for(i=8;i>0;i--)
{
rec_buff=rec_buff<<1;
setclk
delay(10);
rec_buff=(PINC&0x04)==0?rec_buff&0xfe:rec_buff|0x01;
clrclk
delay(10);
}
DDRC|=0x04;
PORTC&=~0x04;
return rec_buff;
}
void initdis() //初始化时间
{
unsigned char i;
write279(0x88,0x7f);
for(i=0xc8;i<2+0xc8;i++)
{
write279(i,0);
}
write279(0x92,0x01);
for(i=0xcb;i<2+0xcb;i++)
{
write279(i,0);
}
write279(0x95,0x01);
for(i=0xce;i<2+0xce;i++)
{
write279(i,0);
}
beep=0;
}
void display(unsigned char ledcnt,unsigned char 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 signed char keycode,keypress=0;
if((PINC&0x02)==0)
{
if(keypress==0)
{
send(0x15);
keycode=receive();
setcs
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;
}
void opentime() //初始化定时器
{
timecnt=0;
SREG|=0X80;
TCNT0=0X06;
TIMSK=0X02;
TCCR0=0X04;
}
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);
}
main()
{
unsigned char i,j,n,c,ledbit;
DDRC=0xfd;
PORTC=0xf7;
send(0xa4);
setcs
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<15;j++)
{
for(i=0;i<250;i++)
{
PORTC^=0X01;
delay(220);
}
}
beep=0;
}
goto ww;
}
void timer0_ovf() //溢出中断子程序
{
TCNT0=0x06;
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();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -