新闻中心

EEPW首页>嵌入式系统>设计应用> 关于LCD1602显示可调时钟的程序

关于LCD1602显示可调时钟的程序

作者: 时间:2016-11-28 来源:网络 收藏

//奉上,希望对初学者有帮助//

本文引用地址://m.amcfsurvey.com/article/201611/322998.htm

#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()interrupt1
{
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);
}
}



评论


技术专区

关闭