您的位置 首页 新能源

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

奉上,希望对初学者有帮助includedefineucharunsignedchardefineuintunsignedintsbitlcden=P2^7;sbitlcdrs=P2^6;sb

//奉上,期望对初学者有协助//

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/256568.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部