#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0; //定义RS口为P10
sbit rw=P2^1; //定义RW口为P11
sbit en=P2^2; //定义E口为P12
sbit key_set=P3^3;
sbit key_up=P3^4;
sbit key_down=P3^5;
uchar code table[]="AUTOMATIC";
uchar code table1[]="NUMBER 18";
uchar code table2[]="2011/3/6 SUNDAY";
uchar code table3[]="00:00:00";
uchar num,aa,sec,min,hou,key_num;
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
{
for(y=250;y>0;y--);
}
}
void write_dat(uchar); //写数据子程序
void write_com(uchar); // 写程序子程序
void init();
void display_2(uchar add,uchar acc); //时分秒显示子程序
void keyscan() //时间调节程序
{
if(key_set==0)
{
delay(5);
if(key_set==0)
{
while(!key_set);
key_num++;
if(key_num==1)
{
TR0=0;
write_com(0x80+0x40+11);
write_com(0x0f);
}
if(key_num==2)
{
write_com(0x80+0x40+8);
}
if(key_num==3)
{
write_com(0x80+0x40+5);
}
if(key_num==4)
{
key_num=0;
write_com(0x0c);
TR0=1;
}
}
}
if(key_num!=0)
{
if(key_up==0)
{
delay(5);
if(key_up==0)
{
while(!key_up);
if(key_num==1)
{
sec++;
if(sec==60)
sec=0;
display_2(10,sec);
write_com(0x80+0x40+11);
}
if(key_num==2)
{
min++;
if(min==60)
min=0;
display_2(7,min);
write_com(0x80+0x40+8);
}
if(key_num==3)
{
hou++;
if(hou==24)
hou=0;
display_2(4,hou);
write_com(0x80+0x40+5);
}
}
}
if(key_down==0)
{
delay(5);
if(key_down==0)
{
while(!key_down);
if(key_num==1)
{
sec--;
if(sec==-1)
sec=59;
display_2(10,sec);
write_com(0x80+0x40+11);
}
if(key_num==2)
{
min--;
if(min==-1)
min=59;
display_2(7,min);
write_com(0x80+0x40+8);
}
if(key_num==3)
{
hou--;
if(hou==-1)
hou=23;
display_2(4,hou);
write_com(0x80+0x40+5);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
if(aa==20)
{
aa=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hou++;
if(hou==24)
{
hou=0;
}
display_2(4,hou);
}
display_2(7,min);
}
display_2(10,sec);
}
}
}
void write_com(uchar com) //写程序子程序
{
rs=0;
en=1;
P1=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_dat(uchar dat) //写数据子程序
{
rs=1;
en=1;
P1=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void init()
{
rw=0;
en=0;
write_com(0x38); // 显示模式设置
write_com(0x0c); // 光标控制设置 开关 闪烁
write_com(0x06); // 光标控制设置 自动左移
write_com(0x80); // 数据指针位置复位
write_com(0x01); // 显示清屏
for(num=0;num<14;num++) //显示作者
{
write_dat(table[num]);
delay(1);
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_dat(table1[num]);
delay(1);
}
delay(100);
write_com(0x01);
for(num=0;num<16;num++)
{
write_dat(table2[num]);
delay(1);
}
write_com(0x80+0x40);
for(num=0;num<12;num++)
{
write_dat(table3[num]);
delay(1);
}
TMOD=0x01; //初始化定时器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display_2(uchar add,uchar acc) //时分秒显示子程序
{
uchar shi,ge;
shi=acc/10;
ge=acc%10;
write_com(0x80+0x40+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}