#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;//T0使能标志位
sbit rs=P3^5;//T1
sbit rw=P3^6;//WR
sbit dula=P2^6;//段选
sbit wela=P2^7;//位选
sbit s1=P3^0;//RXD
sbit s2=P3^1;//TXD
sbit s3=P3^2;//INT0
sbit s4=P3^3;
//D0-D7=P0
uchar count,s1num,k;
uint i;
char miao,shi,fen;
uchar code table[]=" head count ";//节省内部存储器的空间
uchar code table1[]=" 00:00:00";
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;//1-8命令
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;
lcden=0;
dula=0;
wela=0;
// fen=59;
// miao=53;
// shi=23;
rw=0;//命令除忙状态或地址,以及读数据
write_com(0x38);//命令6:两行显示,5*7点阵,八位数据接口
write_com(0x0c);//命令4:开整体显示,无光标,无闪烁
write_com(0x06);//命令3:显示模式设置
write_com(0x01);//清屏
write_com(0x80);//DDRAM地址设置
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);
}
}
void write_sfm(uchar add,uchar date)//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(s1==0) //按下独立按键S1(移动光标)
{
delay(5);
if(s1==0)
{ s1num++;
while(!s1);
if(s1num==1)
{
write_com(0x80+0x40+10);//写命令8:显示数据RAM地址100 1010 74H
write_com(0x0f);//显示开关及光标设置
}
}
if(s1num==2)
{
write_com(0x80+0x40+7);//写命令8:显示数据RAM地址100 0111 71H
}
if(s1num==3)
{
write_com(0x80+0x40+4);//写命令8:显示数据RAM地址100 0100 68H
}
if(s1num==4)
{
s1num=0;
write_com(0x0c);//命令4:开整体显示,光标关,无闪烁
}
}
if(s1num!=0)
{
if(s2==0)//按下独立按键S2(加一)
{
delay(5);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
miao++;
if(miao==100)
miao=0;
write_sfm(10,miao);////写命令8:显示数据RAM地址100 1010 74H
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen++;
if(fen==100)
fen=0;
write_sfm(7,fen);//写命令8:显示数据RAM地址100 0111 71H
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi++;
if(shi==100)
shi=0;
write_sfm(4,shi);//写命令8:显示数据RAM地址100 0100 68H
write_com(0x80+0x40+4);
}
}
}
if(s3==0)//按下独立按键s3(减1)
{
delay(5);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
miao--;
if(miao==-1)
miao=99;
write_sfm(10,miao);
write_com(0x80+0x40+10);
}
if(s1num==2)
{
fen--;
if(fen==-1)
fen=99;
write_sfm(7,fen);
write_com(0x80+0x40+7);
}
if(s1num==3)
{
shi--;
if(shi==-1)
shi=99;
write_sfm(4,shi);
write_com(0x80+0x40+4);
}
}
}
if(s4==0)//按下独立按键s4(流水灯)
{
delay(5);
if(s4==0)
{
while(!s4);
if(i==4)
i=0;
switch(i)
{
case 0:P1=0xff;delay(2000);i++;break;
case 1:P1=0xfe;for(k=0;k<8;k++){delay(200);P1=_crol_(P1,1);}i++;break;
case 2:P1=0x7f;for(k=0;k<8;k++){delay(200);P1=_cror_(P1,1);}i++;break;
case 3:P1=0x00;delay(2000);i++;break;
}
}
}
}
}