?? lcd_clock.c
字號:
#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int
typedef struct {
char hour;
char minute;
char second;
}time;
typedef struct {
int year;
char month;
char day;
}date;
date today={2008,02,25};
time now={23,59,00};
u8 code dayofmonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
u8 flag;
char secondlow,secondhigh,minutelow,minutehigh,hourlow,hourhigh,daylow,dayhigh,monthlow,monthhigh,
yearlow,yearsecondlow,yearthirdlow,yearhigh;
u16 tick;
sbit rs=P3^5;
sbit rw=P3^6;
sbit en=P3^7;
sbit mode=P3^0;
sbit up=P3^1;
sbit down=P3^2;
#define lcdcommand 0
#define lcddate 1
char monthofday(char month,int year)//返回月的天數(shù)
{
if(month==2&&year%4==0)
{
return(29);
}
else
{
return(dayofmonth[month-1]);
}
}
void delay(u8 z)
{
u8 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void timer0()interrupt 1
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
EA=1;
tick++;
if(tick==200)
{
tick=0;
now.second++;
if(now.second==60)
{
now.second=0;
now.minute++;
if(now.minute==60)
{
now.minute=0;
now.hour++;
if(now.hour==24)
{
now.hour=0;
today.day++;
if(today.day==monthofday(today.month,today.year))
{
today.day=1;
today.month++;
if(today.month==13)
{
today.month=1;
today.year++;
if(today.year==9999)
{
today.year=1900;
}
}
}
}
}
}
}
}
void write_lcd(bit writestyle,u8 input)
{
rw=0;
rs=writestyle;
_nop_();
P1=input;
en=1;
delay(5);//這一句延時要足夠長才行。
en=0;
}
/*void write_sfr(char second,char minute,char hour,char day,char month,int year)
{
}*/
void initialize()
{
write_lcd(lcdcommand,0x38);
write_lcd(lcdcommand,0x0c);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x01);
write_lcd(lcdcommand,0x80);
}
void timer0_initialize()
{
EA=0;
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
ET0=1;
TR0=1;
tick=0;
EA=1;
}
void write_second_nocursor()
{
write_lcd(lcdcommand,0x80+0x40+11);
write_lcd(lcddate,secondhigh+0x30);
write_lcd(lcddate,secondlow+0x30);
}
void write_second()
{
write_lcd(lcdcommand,0x80+0x40+11);
write_lcd(lcddate,secondhigh+0x30);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0e);
write_lcd(lcdcommand,0x0c);
write_lcd(lcddate,secondlow+0x30);
}
void write_minute()
{
write_lcd(lcdcommand,0x38);
write_lcd(lcdcommand,0x80+0x40+8);
write_lcd(lcddate,minutehigh+0x30);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0e);
write_lcd(lcdcommand,0x0c);
write_lcd(lcddate,minutelow+0x30);
write_lcd(lcddate,0x30+10);//加上冒號
}
void write_hour()
{
write_lcd(lcdcommand,0x80+0x40+5);
write_lcd(lcddate,hourhigh+0x30);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0e);
write_lcd(lcdcommand,0x0c);
write_lcd(lcddate,hourlow+0x30);
write_lcd(lcddate,0x30+10);//加上冒號
}
void write_day()
{
write_lcd(lcdcommand,0x80+12);
write_lcd(lcddate,dayhigh+0x30);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0e);
write_lcd(lcdcommand,0x0c);
write_lcd(lcddate,daylow+0x30);
}
void write_month()
{
write_lcd(lcdcommand,0x80+9);
write_lcd(lcddate,monthhigh+0x30);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0e);
write_lcd(lcdcommand,0x0c);
write_lcd(lcddate,monthlow+0x30);
}
void write_year()
{
write_lcd(lcdcommand,0x80+4);
write_lcd(lcddate,yearhigh+0x30);
write_lcd(lcddate,yearthirdlow+0x30);
write_lcd(lcddate,yearsecondlow+0x30);
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0e);
write_lcd(lcdcommand,0x0c);//這三句用來在最末位顯示光標(biāo)
write_lcd(lcddate,yearlow+0x30);
}
void keyscan()
{
if(mode==0)
{
delay(20);
if(mode==0)
{
flag++;
if(flag==7)
{
flag=0;
}
}
while(!mode);
}
if(flag==6)
{
TR0=0;
write_lcd(lcdcommand,0x0c);
if(up==0)
{
delay(20);
if(up==0)
{
now.second++;
if(now.second==60)
{
now.second=0;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
now.second--;
if(now.second==-1)
{
now.second=59;
}
}
while(!down);
}
write_second();
TR0=1;
}
if(flag==5)
{
if(up==0)
{
delay(20);
if(up==0)
{
now.minute++;
if(now.minute==60)
{
now.minute=0;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
now.minute--;
if(now.minute==-1)
{
now.minute=59;
}
}
while(!down);
}
write_minute();
write_second_nocursor();
}
if(flag==4)
{
if(up==0)
{
delay(20);
if(up==0)
{
now.hour++;
if(now.hour==24)
{
now.hour=0;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
now.hour--;
if(now.minute==-1)
{
now.minute=23;
}
}
while(!down);
}
write_hour();
write_second_nocursor();
}
if(flag==3)
{
if(up==0)
{
delay(20);
if(up==0)
{
today.day++;
if(today.day==monthofday(today.month,today.year))
{
today.day=1;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
today.day--;
if(today.day==0)
{
today.day=monthofday(today.month,today.year);
}
}
while(!down);
}
write_day();
write_second_nocursor();
}
if(flag==2)
{
if(up==0)
{
delay(20);
if(up==0)
{
today.month++;
if(today.month==13)
{
today.month=1;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
today.month--;
if(today.month==0)
{
today.month=12;
}
}
while(!down);
}
write_month();
write_second_nocursor();
}
if(flag==1)
{
if(up==0)
{
delay(20);
if(up==0)
{
today.year++;
if(today.year==9999)
{
today.year=0;
}
}
while(!up);
}
if(down==0)
{
delay(20);
if(down==0)
{
today.year--;
if(today.year==1899)
{
today.year=9999;
}
}
while(!down);
}
write_year();
write_second_nocursor();
}
}
void calculate()
{
secondlow=now.second%10;
secondhigh=now.second/10;
minutelow=now.minute%10;
minutehigh=now.minute/10;
hourlow=now.hour%10;
hourhigh=now.hour/10;
daylow=today.day%10;
dayhigh=today.day/10;
monthlow=today.month%10;
monthhigh=today.month/10;
yearlow=today.year%10;
yearsecondlow=today.year/10%10;
yearthirdlow=today.year/100%10;
yearhigh=today.year/1000;
}
void write_sfr()
{
write_lcd(lcdcommand,0x06);
write_lcd(lcdcommand,0x0c);
write_lcd(lcdcommand,0x80+4);
write_lcd(lcddate,yearhigh+0x30);
write_lcd(lcddate,yearthirdlow+0x30);
write_lcd(lcddate,yearsecondlow+0x30);
write_lcd(lcddate,yearlow+0x30);
write_lcd(lcdcommand,0x80+9);
write_lcd(lcddate,monthhigh+0x30);
write_lcd(lcddate,monthlow+0x30);
write_lcd(lcdcommand,0x80+12);
write_lcd(lcddate,dayhigh+0x30);
write_lcd(lcddate,daylow+0x30);
write_lcd(lcdcommand,0x80+0x40+5);
write_lcd(lcddate,hourhigh+0x30);
write_lcd(lcddate,hourlow+0x30);
write_lcd(lcddate,0x30+10);//加上冒號
write_lcd(lcdcommand,0x80+0x40+8);
write_lcd(lcddate,minutehigh+0x30);
write_lcd(lcddate,minutelow+0x30);
write_lcd(lcddate,0x30+10);//加上冒號
write_lcd(lcdcommand,0x80+0x40+11);
write_lcd(lcddate,secondhigh+0x30);
write_lcd(lcddate,secondlow+0x30);
}
void main()
{
initialize();
timer0_initialize();
while(1)//不加這一句while()循環(huán),光標(biāo)會一直在閃。
{
calculate();
keyscan();
if(flag==0)
{
write_sfr();
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -