液晶LCD1602时钟显示键盘控制
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit rw=P2^1;
sbit en=P2^2;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
sbit rd=P3^4;
uchar num,count,keynum;
char second,minute,hour;
uchar code table[]="2011-06-20 THU"; uchar code table1[]="00:00:00";
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
en=1;
P0=com;
delay(5);
en=0;
}
void write_date(uchar date)
{
rs=1;
rw=0;
en=1;
P0=date;
delay(5);
en=0;
}
void init()
{ en=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x02);
for(num=0;num<14;num++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x44);
for(num=0;num<8;num++)
{
write_date(table1[num]);
delay(5);
}
TMOD=0x01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void write_shijian(uchar add,uchar date) {
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void keyscan()
{
rd=0;
if(key1==0)
{
delay(5);
if(key1==0)
{ keynum++;
while(!key1);
if(keynum==1)
{
TR0=0;
write_com(0x80+0x40+10); write_com(0x0f);
}
}
if(keynum==2)
{
write_com(0x80+0x40+7); }
if(keynum==3)
{
write_com(0x80+0x40+4); }
if(keynum==4)
{
keynum=0;
write_com(0x0c);
TR0=1;
}
}
if(keynum!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
if(keynum==1)
{
second++;
if(second==60)
second=0;
write_shijian(10,second); write_com(0x80+0x40+10); }
if(keynum==2)
{
minute++;
if(minute==60)
minute=0;
write_shijian(7,minute); write_com(0x80+0x40+7); }
if(keynum==3)
{
hour++;
if(hour==24)
hour=0;
write_shijian(4,hour);
write_com(0x80+0x40+4); }
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
if(keynum==1)
{
second--;
if(second==-1)
second=59;
write_shijian(10,second); write_com(0x80+0x40+10); }
if(keynum==2)
{
minute--;
if(minute==-1)
minute=59;
write_shijian(7,minute); write_com(0x80+0x40+7); }
if(keynum==3)
{
hour--;
if(hour==-1)
hour=23;
write_shijian(4,hour);
write_com(0x80+0x40+4);
}
}
}
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
{
count=0;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
}
write_shijian(4,hour); }
write_shijian(7,minute); }
write_shijian(10,second);
}
}
void main()
{
init();
while(1)
{
keyscan();
}}