#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit key0 = P3^0;//时间调节分秒时切换
sbit key1 = P3^1; //时间加
sbit key2 = P3^2; //时间减
sbit lcdrw = P2^5;//读写操作选择,1读 0写
sbit rs = P2^6;//寄存器选择,1数据 0指令
sbit lcden = P2^7;//使能信号
uchar code table[] = {" 2010-10-22 FRI"};
uchar code table1[] = {" 00:00:00"};
uchar count,shi,fen,miao,s1num;
void delay(uint z)
{
uint x,y;
for(x = z;x > 0;x --)
for(y = 110;y > 0;y --);
}
void write_com(uchar com)//写指令
{
rs = 0;
lcden = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void write_date(uchar date)//写数据
{
rs = 1;
lcden = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void init()
{
uchar num;
lcdrw = 0;
lcden = 0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);//清零
write_com(0x80); //液晶第一行地址
for(num = 0;num < 15;num ++)
{
write_date(table[num]);
delay(5);
}
write_com(0x80+0x40);//液晶第二行地址
for(num = 0;num < 12;num ++)
{
write_date(table1[num]);
delay(5);
}
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA = 1; // 开中断
ET0 = 1; //定时器0中断
TR0 = 1; //启动定时器
}
void write_sfm(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()
{
if(key0 == 0)
{
delay(5);
if(key0 == 0)
{
s1num ++;
while(!key0);
if(s1num == 1)
{
TR0 = 0;
write_com(0x80+0x40+10);
write_com(0x0f);
}
if(s1num == 2)
{
write_com(0x80+0x40+7);
}
if(s1num == 3)
{
write_com(0x80+0x40+4);
}
if(s1num == 4)
{
s1num = 0;
write_com(0x0c);//不闪光标
TR0 = 1;
}
}
}
if(s1num != 0)
{
if(key1 == 0)
{
delay(5);
if(key1 == 0)
{
while(!key1);
if(s1num == 1)
{
miao ++;
if(miao == 60)
miao = 0;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num == 2)
{
fen ++;
if(fen == 60)
fen = 0;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num == 3)
{
shi ++;
if(shi == 24)
shi = 0;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(key2 == 0)
{
delay(5);
if(key2 == 0)
{
while(!key2);
if(s1num == 1)
{
if(miao == 0)
{
miao = 60;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
miao --;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num == 2)
{
if(fen == 0)
{
fen = 60;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
fen --;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num == 3)
{
if(shi == 0)
{
shi = 24;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
shi --;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
}
}
void main()
{
init();
while(1)
{
keyscan();
// while(1);
}
}
void timer0() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
count ++;
if(count == 20)
{
count = 0;
miao ++;
if(miao == 60)
{
miao = 0;
fen ++;
if(fen == 60)
{
fen = 0;
shi ++;
if(shi ==24)
{
shi = 0;
}
write_sfm(4,shi);
}
write_sfm(7,fen);
}
write_sfm(10,miao);
}
}