📄 clock.c
字号:
#include<avr/io.h>
#include<avr/signal.h>
#include<avr/interrupt.h>
#define TLCD_CTRL (unsigned char *)0x7000
#define TLCD_DATA (unsigned char *)0x7001
#define PPI_1_PA (unsigned char *)0x6000
#define PPI_1_PB (unsigned char *)0x6001
#define PPI_1_PC (unsigned char *)0x6002
#define PPI_1_CT (unsigned char *)0x6003
#define ADD_YEAR 0x80
#define ADD_MONTH 0x85
#define ADD_DATE 0x88
#define ADD_WEEK 0x8b
#define ADD_HOUR 0xc0
#define ADD_MINITE 0xc3
#define ADD_SECOND 0xc6
#define ADD_ALTHOUR 0xc9
#define ADD_ALTMINITE 0xcc
unsigned int Second=0,Minite=0,Hour=0;
unsigned int Date=1,Month=7,Year=2006;
unsigned int second=0,minite=0,hour=0;
unsigned int date=1,month=7,year=2006;
unsigned int AltHour=0,AltMinite=0;
int m[]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char *lcd_data,*lcd_ctrl;
unsigned int interrupt_count=0;
unsigned char keying;
unsigned char *ppi_ctrl,*key;
int Feb(int year);
void init_timer();
void delay(int d1,int d2);
void lcd_ctrl_wait(void);
void lcd_data_wait(void);
void init_text_lcd(void);
void printmsg(char*msg);
void printchar(char c);
void printweek();
void display();
void printcell(int data,int address);
unsigned char key2asc(unsigned char in);
unsigned char key_scan(void);
int bell();
void init_key(void);
int Feb(int year){
if(((year%4==0)&&(year%100!=0))||(year%100==0))
return 29;
else
return 28;
}
SIGNAL(SIG_OVERFLOW0){
TCNT0=0x70;
TCCR0=0X07;
m[1]=Feb(Year);
PORTB=0x60&bell();
interrupt_count++;
if(interrupt_count<100)goto ed;interrupt_count=0;Second++;
if(Second<60)goto ed;Second=0;Minite++;
if(Minite<60)goto ed;Minite=0;Hour++;
if(Hour<24) goto ed;Hour=0;Date++;
if(Date<m[Month-1])goto ed;Date=1;Month++;
if(Month<13)goto ed;Month=1;Year++;
ed:
if(keying)return;
display();
}
void init_timer(){
TCNT0=0x70;
TCCR0=0X07;
TIMSK=0x01;
sei();
}
void delay(int d1,int d2){
int i,j;
for(i=0;i<d1;i++)
for(j=0;j<d2;j++);
}
void lcd_ctrl_wait(void){
delay(1000,100);
}
void lcd_data_wait(void){
delay(1000,10);
}
void init_text_lcd(void){
lcd_ctrl=TLCD_CTRL;
lcd_data=TLCD_DATA;
lcd_ctrl_wait();
*lcd_ctrl=0x38;
lcd_ctrl_wait();
*lcd_ctrl=0x02;
lcd_ctrl_wait();
*lcd_ctrl=0x01;
lcd_ctrl_wait();
*lcd_ctrl=0x06;
lcd_ctrl_wait();
*lcd_ctrl=0x0C;
lcd_ctrl_wait();
}
void printmsg(char*msg)
{
unsigned int i=0;
for(i=0;msg[i]!='\0';i++)
{
if(msg[i]=='\r')
{
*lcd_ctrl=0xc0;
lcd_ctrl_wait();
}
else
{
*lcd_data=msg[i];
lcd_data_wait();
}
}
}
void printchar(char c){
*lcd_data=c;
lcd_data_wait();
}
void printcell(int data,int address)
{
char str[5]={0};
int i;
for(i=3;i>=0;i--)
{
str[i]=data%10+'0';
data=data/10;
}
*lcd_ctrl=address;
lcd_ctrl_wait();
for(i=(address==ADD_YEAR?0:2);str[i];i++)
{
*lcd_data=str[i];
lcd_data_wait();
}
}
void display(){
if(Second-second){printcell(Second,ADD_SECOND);second=Second;}
if(Minite-minite){printcell(Minite,ADD_MINITE);minite=Minite;}
if(Hour-hour){printcell(Hour,ADD_HOUR);hour=Hour;}
if(Date-date){printcell(Date,ADD_DATE);printweek();date=Date;}
if(Month-month){printcell(Month,ADD_MONTH);printweek();month=Month;}
if(Year-year){printcell(Year,ADD_YEAR);printweek();year=Year;}
}
unsigned char key2asc(unsigned char in)
{
unsigned char ka[]={0x11,0x21,0x41,0x81,0x12,0x22,0x42,0x82,0x14,0x24,0x44,0x84,0x18,0x28,0x48,0x88};
unsigned char a;
for(a=0;a<0x10;a++)
if(ka[a]==in)break;
return (a&0x0f);
}
unsigned char key_scan(void)
{
unsigned char save_low,save_high;
*ppi_ctrl=0x91;
*key=0xf0;
delay(10,10);
save_low=*key&0x0f;
*ppi_ctrl=0x90;
*key=0x00;
if(save_low)
{
*ppi_ctrl=0x98;
*key=0x0f;
delay(10,10);
save_high=*key&0xf0;
*ppi_ctrl=0x90;
*key=0x00;
if(!save_high)return 0;
save_high|=save_low;
return save_high;
}
return 0;
}
void init_key(void)
{
ppi_ctrl=PPI_1_CT;
key=PPI_1_PC;
*ppi_ctrl=0x90;
*key=0x00;
}
int main(){
unsigned char in;
keying=0;
MCUCR=(1<<SRE);
init_timer();
init_text_lcd();
init_key();
printmsg("2006-07-01\r00:00:00 00:00");
printweek();
DDRB=0x60;
while(1)
{
in=key_scan();
if(in==0)continue;
delay(1152,750);
in=key2asc(in);
keying=1;
switch(in)
{
case 1:
Year++;
year=Year;
printcell(Year,ADD_YEAR);
printweek();
break;
case 2:
Month++;
if(Month==13)Month=1;
month=Month;
printcell(Month,ADD_MONTH);
printweek();
break;
case 3:
Date++;
m[1]=Feb(Year);
if(Date>m[Month-1])Date=1;
date=Date;
printcell(Date,ADD_DATE);
printweek();
break;
case 9:
Hour=(Hour+49)%24;
hour=Hour;
printcell(Hour,ADD_HOUR);
break;
case 10:
Minite=(Minite+121)%60;
minite=Minite;
printcell(Minite,ADD_MINITE);
break;
case 11:
Second=(Second+121)%60;
second=Second;
printcell(Second,ADD_SECOND);
break;
case 5:
Year--;
year=Year;
printcell(Year,ADD_YEAR);
printweek();
break;
case 6:
Month--;
if(Month<1)Month=12;
month=Month;
printcell(Month,ADD_MONTH);
printweek();
break;
case 7:
Date--;
m[1]=Feb(Year);
if(Date<1)Date=m[Month-1];
date=Date;
printcell(Date,ADD_DATE);
printweek();
break;
case 13:
Hour=(Hour+47)%24;
hour=Hour;
printcell(Hour,ADD_HOUR);
break;
case 14:
Minite=(Minite+119)%60;
minite=Minite;
printcell(Minite,ADD_MINITE);
break;
case 15:
Second=(Second+119)%60;
second=Second;
printcell(Second,ADD_SECOND);
break;
case 0:
AltHour=(AltHour+49)%24;
printcell(AltHour,ADD_ALTHOUR);
break;
case 8:
AltMinite=(AltMinite+121)%60;
printcell(AltMinite,ADD_ALTMINITE);
break;
case 4:
AltHour=(AltHour+47)%24;
printcell(AltHour,ADD_ALTHOUR);
break;
case 12:
AltMinite=(AltMinite+119)%60;
printcell(AltMinite,ADD_ALTMINITE);
break;
}
m[1]=Feb(Year);
if(Date>m[Month-1])
{
Date=1;
date=1;
printcell(Date,ADD_DATE);
printweek();
}
keying=0;
}
}
void printweek()
{
unsigned char week[7][7]={"Sun. ","Mon. ","Tues.","Wed. ","Thur.","Fri. ","Sat. "};
int i,d;
d=Year+(Year-1)/4-(Year-1)/100+(Year-1)/400-1;
for(i=0;i<Month-1;i++)
d+=m[i];
d+=Date;
d=d%7;
*lcd_ctrl=ADD_WEEK;
lcd_ctrl_wait();
for(i=0;week[d][i];i++)
{
*lcd_data=week[d][i];
lcd_data_wait();
}
}
int bell()
{
if(Hour==AltHour&&Minite==AltMinite&&Second%2)return 0x0;
return 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -