单片机lcd1602液晶屏电子时钟C程序.docx
《单片机lcd1602液晶屏电子时钟C程序.docx》由会员分享,可在线阅读,更多相关《单片机lcd1602液晶屏电子时钟C程序.docx(11页珍藏版)》请在冰豆网上搜索。
单片机lcd1602液晶屏电子时钟C程序
单片机lcd1602液晶屏电子时钟C程序
/********************************************************************
*文件名:
液晶1602显示.c
*描述:
该程序实现了对液晶1602的控制。
*创建人:
东流,2009年4月10日
*版本号:
2.0
***********************************************************************/
#include
#defineucharunsignedchar
#defineuintunsignedint
uintcount,t;
intshi=1,fen=11,miao=22,nian=12,yue=7,ri=1;
ucharshijian[16]={"time00-00-00t"},shijian1[16]={"date00-00-00"};
//这三个引脚参考资料
sbitE=P2^7;//1602使能引脚
sbitRW=P2^6;//1602读写引脚
sbitRS=P2^5;//1602数据/命令选择引脚
sbitLE=P3^7;
sbitkey1=P3^2;//小时修改建
sbitkey2=P3^3;//分钟修改键
sbitkey3=P3^4;//显示选择键
/********************************************************************
*名称:
delay()
*功能:
延时,延时时间大概为5US。
*输入:
无
*输出:
无
***********************************************************************/
voiddelay()
{
uintn=250;
while(n--);
}
/********************************************************************
*名称:
bitBusy(void)
*功能:
这个是一个读状态函数,读出函数是否处在忙状态
*输入:
输入的命令值
*输出:
无
***********************************************************************/
bitBusy(void)
{
bitbusy_flag=0;
RS=0;
RW=1;
E=1;
delay();
busy_flag=(bit)(P0&0x80);
E=0;
returnbusy_flag;
}
/********************************************************************
*名称:
wcmd(uchardel)
*功能:
1602命令函数
*输入:
输入的命令值
*输出:
无
***********************************************************************/
voidwcmd(uchardel)
{
while(Busy());
RS=0;
RW=0;
E=0;
delay();
P0=del;
delay();
E=1;
delay();
E=0;
}
/********************************************************************
*名称:
wdata(uchardel)
*功能:
1602写数据函数
*输入:
需要写入1602的数据
*输出:
无
***********************************************************************/
voidwdata(uchardel)
{
while(Busy());
RS=1;
RW=0;
E=0;
delay();
P0=del;
delay();
E=1;
delay();
E=0;
}
/********************************************************************
*名称:
L1602_init()
*功能:
1602初始化,请参考1602的资料
*输入:
无
*输出:
无
***********************************************************************/
voidL1602_init(void)
{
wcmd(0x38);
wcmd(0x0c);
wcmd(0x06);
wcmd(0x01);
}
voidtimeInit()
{
TMOD=0X01;//定义定时器1工作方式16位定时c/t选为定时器GATE选TR1控制
TL0=(65536-10000)%256;
TH0=(65536-10000)/256;
TR0=1;
EA=1;
ET0=1;
}
voidtimeint()interrupt1
{
TL0=(65536-10000)%256;
TH0=(65536-10000)/256;
count++;
}
/*************************
***时间日期设定
*************************/
voidshijianxian()
{
if(count>=100)
{
miao++;
count=0;
}
if(miao>=60)
{
fen++;
miao=0;
}
if(fen>=60)
{
shi++;
fen=0;
}
if(shi>=24)
{
ri++;
shi=0;
}
if(ri>30)
{
yue++;
ri=1;
}
if(yue>12)
{
nian++;;
yue=1;
}
if(nian==99)
{
nian=0;
}
if((key1==0)&((t%6)==0))
{
delay();
if((key1==0)&((t%6)==0))
{
shi++;
if(shi>23)shi=0;
}
delay();
}
if((key3==0)&((t%6)==0))
{
delay();
if((key3==0)&((t%6)==0))
{
shi--;
if(shi<0)shi=23;
}
}
if((key1==0)&((t%6)==1))
{
delay();
if((key1==0)&((t%6)==1))
{
fen++;
if(fen>59)fen=0;
}
delay();
}
if((key3==0)&((t%6)==1))
{
delay();
if((key3==0)&((t%6)==1))
{
fen--;
if(fen<0)fen=59;
}
delay();
}
if((key1==0)&((t%6)==2))
{
delay();
if((key1==0)&((t%6)==2))yue++;
delay();
}
if((key1==0)&((t%6)==3))
{
delay();
if((key1==0)&((t%6)==3))ri++;
delay();
}
}
/******************************
****时间显示
*******************************/
voidshijianxian1()
{
shijian[6]=shi/10+48;
shijian[7]=shi%10+48;
shijian[9]=fen/10+48;
shijian[10]=fen%10+48;
shijian[12]=miao/10+48;
shijian[13]=miao%10+48;
shijian[8]=45;
shijian[11]=45;
shijian[15]=t+48;
}
/******************************
****日期显示
*******************************/
voidriqi()
{
shijian1[6]=nian/10+48;
shijian1[7]=nian%10+48;
shijian1[9]=yue/10+48;
shijian1[10]=yue%10+48;
shijian1[12]=ri/10+48;
shijian1[13]=ri%10+48;
shijian1[8]=45;
shijian1[11]=45;
}
/********************************************************************
*名称:
Main()
*功能:
主函数
*输入:
无
*输出:
无
***********************************************************************/
voidMain()
{
uinti;
L1602_init();
timeInit();
while
(1)
{
shijianxian();
shijianxian1();
if(key2==0)
{
delay();
if((key2==0))
t++;
if(t>=6)t=0;
delay();
}
riqi();
for(i=0;i<16;i++)
{
wcmd(0xc0+i);
wdata(shijian[i]);
wcmd(0x80+i);
wdata(shijian1[i]);
}
}
}