#defineucharunsignedchar
#defineuintunsignedint
sbitLCD_RS=P1^0;//定义寄存器选择
sbitLCD_RW=P1^1;//定义读写信号线
sbitLCD_EN=P1^2;//定义定义使能端
sbitkey1=P0^0;
sbitkey2=P0^4;
sbitkey3=P0^5;
sbitkey4=P0^6;
voiddelay_ms(uintxms);//延时函数声明
bitlcd_busy();//忙检查函数声明
voidlcd_wcmd(ucharcmd);//写指令寄存器IR函数声明
voidlcd_wdat(uchardat);//写数据寄存器DR函数声明
voidlcd_clr();//清屏函数声明
voidlcd_init();//LCD初始化函数声明
voidkey_mode();
voidyear_moon_day();
uchardis_buf[19];
uchardis[]={'0’,'1','2','3’,’4','5’,'6','7',’8','9’};
ucharcodename1[]={”helpyourself!
"};
ucharcodename2[]={”holdon!
"};
ucharyear_month_day[3][8]=
{
{0x04,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0},//年
{0x0f,0x09,0x0f,0x09,0x0f,0x09,0x13,0x00},//月
{0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x0e,0x02}//日
};
uchardingshi=0;//50ms计数
ucharflag=0;//按键控制变量
charmiao=55,fen=59,shi=23;
charmoon=12,day=31;
intyear=2012;
ucharleap;
ucharshan;//控制时分的闪烁位
ucharkey_value;
/****************LCD显示部分******************/
//读忙
bitlcd_busy()
{
bitresult;
LCD_RS=0;
LCD_RW=1;
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
result=(bit)(P2&0x80);
LCD_EN=0;
returnresult;
}
//清屏
voidlcd_clr()
{
lcd_wcmd(0x01);
delay_ms(5);
}
//写指令
voidlcd_wcmd(ucharcmd)
{
while(lcd_busy());
//delay_ms
(2);
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P2=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
//写数据
voidlcd_wdat(uchardat)
{
while(lcd_busy());
//delay_ms
(2);
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
_nop_();
_nop_();
P2=dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN=0;
}
//显示初始化
voidlcd_init()
{
//delay_ms(15);
lcd_wcmd(0x38);//显示模式为16*25*7点阵8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x01);//清屏
delay_ms(5);
lcd_wcmd(0x06);//移动光标
delay_ms(5);
lcd_wcmd(0x0c);//开光标
delay_ms(5);
}
voiddelay_ms(uintxms)
{
uchari,j;
for(i=xms;i〉0;i——)
for(j=110;j〉0;j—-);
}
voidlcd_conv(ucharshi,fen,miao)
{
dis_buf[0]=dis[shi/10];
dis_buf[1]=dis[shi%10];
dis_buf[2]=0x3a;
dis_buf[3]=dis[fen/10];
dis_buf[4]=dis[fen%10];
dis_buf[5]=0x3a;
dis_buf[6]=dis[miao/10];
dis_buf[7]=dis[miao%10];
}
voidlcd_conv_year(uintyear,ucharmoon,day)
{
dis_buf[8]=dis[year/1000];
dis_buf[9]=dis[(year%1000)/100];
dis_buf[10]=dis[(year%100)/10];
dis_buf[11]=dis[year%10];
dis_buf[12]=1;
dis_buf[13]=dis[moon/10];
dis_buf[14]=dis[moon%10];
dis_buf[15]=2;
dis_buf[16]=dis[day/10];
dis_buf[17]=dis[day%10];
dis_buf[18]=3;
}
voidlcd_dis()
{
uchari;
lcd_conv(shi,fen,miao);
lcd_conv_year(year,moon,day);
lcd_wcmd(0x00|0x80);
for(i=8;i<19;i++)
lcd_wdat(dis_buf[i]);
lcd_wcmd(0x40|0x80);
for(i=0;i〈8;i++)
lcd_wdat(dis_buf[i]);
}
//自定义字符图形
voidlcd_wCGROM()//将汉字写入CGROM
{
uchari,j;
for(i=1;i<4;i++)
{
for(j=0;j<8;j++)
{
lcd_wcmd(0x40+i*8+j);
lcd_wdat(year_month_day[i—1][j]);
}
}
}
/*******************按键部分**********************/
//键盘扫描
voidkeyscan()
{
key1=0;
delay_ms(20);
if(key2==0||key3==0||key4==0)
{
delay_ms(20);
if(key2==0)
{
flag++;
if(flag==1)
{
lcd_wcmd(0x0e);//有光标,但是不闪
delay_ms
(1);
lcd_wcmd(0xc0+1);//时
delay_ms
(1);
TR0=0;
}
if(flag==2)
{
lcd_wcmd(0xc0+4);//分
delay_ms
(1);
}
if(flag==3)
{
lcd_wcmd(0x80+3);//年
delay_ms
(1);
}
if(flag==4)
{
lcd_wcmd(0x80+6);//月
delay_ms
(1);
}
if(flag==5)
{
lcd_wcmd(0x80+9);//日
delay_ms
(1);
}
if(flag〉5)
{
flag=0;
lcd_wcmd(0x0c);//关光标
delay_ms
(1);
TR0=1;
}
}
if(key3==0)
key_value=2;
if(key4==0)
key_value=3;
while(key2==0||key3==0||key4==0);
}
}
voidkeyprocess()
{
switch(flag)
{
case1:
{
if(key_value==2)
{
shi++;if(shi>23)shi=0;lcd_dis();lcd_wcmd(0xc0+1);delay_ms
(1);
}
if(key_value==3)
{
shi—-;if(shi<0)shi=23;lcd_dis();lcd_wcmd(0xc0+1);delay_ms
(1);
}
}break;
case2:
{
if(key_value==2)
{
fen++;if(fen>59)fen=0;lcd_dis();lcd_wcmd(0xc0+4);delay_ms
(1);
}
if(key_value==3)
{
fen——;if(fen〈0)fen=59;lcd_dis();lcd_wcmd(0xc0+4);delay_ms
(1);
}
}break;
case3:
{
if(key_value==2)
{
year++;if(year>9999)year=2000;lcd_dis();lcd_wcmd(0x80+3);delay_ms
(1);
}
if(key_value==3)
{
year--;if(year〈2000)year=9999;lcd_dis();lcd_wcmd(0x80+3);delay_ms
(1);
}
}break;
case4:
{
if(key_value==2)
{
moon++;if(moon>12)moon=1;lcd_dis();lcd_wcmd(0x80+6);delay_ms
(1);
}
if(key_value==3)
{
moon-—;if(moon<0)moon=12;lcd_dis();lcd_wcmd(0x80+6);delay_ms
(1);
}
}break;
case5:
{
if(key_value==2)
{
day++;
if(moon==2&&((year—2000)%4==0)&&day>29)day=1;
if(moon==2&&((year-2000)%4!
=0)&&day>28)day=1;
if((moon==1||moon==3||moon==5||moon==7||moon==8||moon==10||moon==12)&&day〉31)
day=1;
if((moon==4||moon==6||moon==9||moon==11)&&day>30)
day=1;
lcd_dis();lcd_wcmd(0x80+9);delay_ms
(1);
}
if(key_value==3)
{
day—-;
if(moon==2&&((year—2000)%4==0)&&day<1)day=29;
if(moon==2&&((year-2000)%4!
=0)&&day〈1)day=28;
if((moon==1||moon==3||moon==5||moon==7||moon==8||moon==10||moon==12)&&day<1)
day=31;
if((moon==4||moon==6||moon==9||moon==11)&&day〈1)
day=30;
lcd_dis();lcd_wcmd(0x80+9);delay_ms
(1);
}
}break;
default:
flag=0;
}
key_value=0;
}
/*********************走时部分**********************/
voidzoushi_inint()
{
TMOD=0x01;
TH0=(65536—50000)/256;
TL0=(65536—50000)%256;
TR0=1;
EA=1;
ET0=1;
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536—50000)%256;
if(++dingshi〉20)
{
miao++;
dingshi=0;
if(miao〉59)
{
miao=0;
fen++;
if(fen〉59)
{
fen=0;
shi++;
if(shi>23)
{
shi=0;
year_moon_day();
}
}
}
}
}
//年月日
voidyear_moon_day()
{
day++;
if((year—2000)%4==0)
leap=1;
else
leap=0;
if(day>28)
{
switch(moon)
{
case1:
if(day>31){day=1;}break;
case2:
if(leap==1)
{
if(day〉29)
{
day=1;
moon++;
}
}
else
{
day=1;
moon++;
}break;
case3:
if(day〉31){day=1;moon++;}break;
case4:
if(day>30){day=1;moon++;}break;
case5:
if(day>31){day=1;moon++;}break;
case6:
if(day〉30){day=1;moon++;}break;
case7:
if(day〉31){day=1;moon++;}break;
case8:
if(day〉31){day=1;moon++;}break;
case9:
if(day>30){day=1;moon++;}break;
case10:
if(day>31){day=1;moon++;}break;
case11:
if(day〉30){day=1;moon++;}break;
case12:
if(day〉31){day=1;moon++;}break;
}
if(moon〉12)
{
moon=1;
year++;
if(year>9999)
year=2000;
}
}
}
voiddisplay()//开机个性化显示
{
uchari;
lcd_wcmd(0x00|0x80);
i=0;
while(i<14)
{
lcd_wdat(name1[i]);
i++;
}
lcd_wcmd(0x40|0x80);
i=0;
while(i<8)
{
lcd_wdat(name2[i]);
i++;
}
}
voidmain()
{
inti,j;
lcd_init();
lcd_clr();
delay_ms(5);
display();
for(i=0;i<5;i++)
for(j=0;j<1000;j++)
{
delay_ms
(2);
}
lcd_clr();
zoushi_inint();
lcd_wCGROM();
while
(1)
{
lcd_dis();
delay_ms(5);
keyscan();
if(flag!
=0)
{
while
(1)
{
keyprocess();
keyscan();
if(TR0==1)
break;
}
}
}
}