//奉上,希望对初学者有帮助//
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit W=P2^5;
sbit k1=P3^0;
sbit k2=P3^1;
sbit k3=P3^2;
uchar num,count,k1num;
char miao,fen,shi;
uchar code table[]=" 2015-01-5 SAT" ;
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) // 写命令
{
W=0;
lcdrs=0; //RS选择写命令还是写数据,写命令
P0=com; //将写入的命令送到数据总线上
delay(5); //稍作延时以待数据稳定
lcden=1; //使能端给一个高脉冲,因为初始化函数已将lcden置为0
delay(5); //稍作延时
lcden=0; //将使能端置0以完成高脉冲
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_sfm(uchar add,uchar date) //将数据写到某个地址上
{
uchar shi,ge;
shi=date/10;
ge=date;
write_com(0x80+0x40+add); //地址指针指在第二行的第add+1个
write_data(0x30+shi); //送数据,将数据data的十位数送过去
write_data(0x30+ge); //送数据,将数据data的个位数送过去
}
void keyscan()
{
if(k1==0)
{
delay(5);
if(k1==0)//去抖
{
k1num++; //计数,计算k1按了几次
while(!k1); //松手检测
if(k1num==1) //当按了一次
{
TR0=0; //计时器停止,时间停止
write_com(0x0f); //开显示,显示光标,光标闪烁
write_com(0x80+0x49); //数据指针指在第二行秒的个位
}
if(k1num==2) //当k1按了两次
{
// write_com(0x0f);
write_com(0x80+0x46); //数据指针指在第二行分的个位
}
if(k1num==3) //当k1按了三次
{
// write_com(0x0f);
write_com(0x80+0x43); //数据指针指在第二行时的个位
}
if(k1num==4) //如果被按了四次
{
TR0=1; //启动计时器
k1num=0; //清零
write_com(0x0c); //关闭光标
}
// if(k1num==5)
// {
// write_com(0x80+0x14)
// }
}
}
if(k1num!=0) //如果k1已经按下过
{
if(k2==0) //如果k2按下
{
delay(5);
if(k2==0)
{
while(!k2); //松手检测
if(k1num==1) //当k1按了一次,调秒
{
miao++; //每按一次k2秒加一
if(miao==60)
{
miao=0;
}
write_sfm(8,miao); //数据显示在第二行第9位和第10位
write_com(0x80+0x40+9); //k1中已设置光标,数据指针指在0x48
}
if(k1num==2) //如果k1被按过两次
{
fen++;
if(fen==60)
fen=0;
write_sfm(5,fen); //数据送到数据指针指在第六位++
write_com(0x80+0x40+6); //数据指针指在第七位
}
if(k1num==3) //如果k1被按过3次
{
shi++;
if(shi==24)
shi=0;
write_sfm(2,shi); // 数据送到第3++
write_com(0x80+0x40+3); //地址指针指在第四位
}
}
}
if(k3==0) //k1按过后,如果k3按下
{
delay(5);
if(k3==0)
{
while(!k3);
if(k1num==1) //如果k1按下一次
{
miao--;
if(miao==-1)
{
miao=59;
}
write_sfm(8,miao); //数据送到第二行第九位++
write_com(0x80+0x40+9); //指针指在第十位
}
if(k1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(5,fen);
write_com(0x80+0x40+6);
}
if(k1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(2,shi);
write_com(0x80+0x40+3);
}
}
}
}
}
void init() //初始化函数
{
// dula=0;
// wela=0;
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c ); //开显示,不显示光标
write_com(0x06); //当写一个数据后地址指针加1,且光标加1,当显示一个数据时,整屏显示不移动
write_com(0x01); //数据指针清0,显示清0
write_com(0x80); //显示在屏内
TMOD=0x01;
TH0=(655536-50000)/256;
TL0=(655536-50000)%6;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init(); //初始化
for(num=0;num<15;num++)
{
write_data(table[num]);
delay(10);
}
write_com(0x80+0x40); //开始时第二行显s
for(num=0;num<10;num++)
{
write_data(table1[num]);
delay(5);
}
while(1)
{
keyscan();
}
}
void timer0() interrupt 1
{
TH0=(655536-50000)/256;
TL0=(655536-50000)%6;
count++;
if(count==18) //一秒时间到
{
count=0;
miao++;
if(miao==60)
{ miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(2,shi);
}
write_sfm(5,fen);
}
write_sfm(8,miao);
}
}