您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于LCD1602和DS1302的时间显示程序
/*============================================================使用1602液晶显示DS1302+S51时钟+温度显示zhaojun2007/06/29==============================================================声明:1.1602驱动程序照搬明皓的,非常好用2.DS1302驱动程序是参考网友修改而来NS1602R(16*2)模拟口线接线方式连接线图:---------------------------------------------------|LCM-----51|LCM-----51|LCM------51||-----------------------------------------------||DB0-----P0.0|DB4-----P0.4|RS-------P2.0||DB1-----P0.1|DB5-----P0.5|RW-------P2.1||DB2-----P0.2|DB6-----P0.6|E--------P2.2||DB3-----P0.3|DB7-----P0.7|VLCD接1K电阻到GND|---------------------------------------------------DS1302接线图Vcc2CLKI/O/RST||||---------------|8765||DS1302||||1234|---------------||||VCC1GND1.脚接+5V2,3.脚32768HZ晶振4.脚接地5.脚接S51的P1.26.脚接S51的P1.17.接S51的P1.08.脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容电压在2.5V以上即可维持按键说明:1.共三个键,低电平有效2.P1.4和P1.5同时按:初始化3.P1.6端口按键:选择要调整的项目4.P1.5端口按键:增加;P1.4端口按键:减少[注:AT89S51使用12M晶振]源代码:=================定义与申明=============================================================*/#includeregx51.h#includestring.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedinttypedefunsignedcharbyte;typedefunsignedintword;//***********1602引脚定义引脚#defineLCM_RSP2_0//数据/命令选择信号#defineLCM_RWP2_1//读/写选择信号#defineLCM_EP2_2//使能信号//***********DS1302时间显示定义部分sbitT_CLK=P1^0;//串行时钟输入sbitT_IO=P1^1;//串行数据端口sbitT_RST=P1^2;//复位端口//***********18B20温度显示定义部分sbitDQ=P3^3;//18B20接P33口sbitACC0=ACC^0;sbitACC7=ACC^7;#defineLCM_DataP0//显示数据端口#defineBusy0x80//用于检测LCM状态字中的Busy标识ucharid,timecount;//全局变量bitflag,sflag;//flag是时钟冒号闪烁标志,sflag是温度负号显示标志bitsec,min,hour,year,mon,day,weekk;//闪烁标志位//*********************函数申明voidDisp_line1(void);//显示屏幕第一行voidDisp_line2(void);//显示屏幕第二行voidid_case1_key();//id为1时的下一级选择voidSet(uchar,uchar);//根据选择调整相应项目voidRTInputByte(uchar);/*输入1Byte*/ucharRTOutputByte(void);/*输出1Byte*/voidW1302(uchar,uchar);//向DS1302写入一个字节ucharR1302(uchar);//从DS1302读出一个字节voidSet1302(uchar*);//设置时间//*******1602LCD驱动**********************************************************voidWriteDataLCM(ucharWDLCM);//写数据voidWriteCommandLCM(ucharWCLCM,BuysC);//写指令ucharReadStatusLCM(void);//读状态voidLCMInit(void);//LCM初始化voidDisplayOneChar(ucharX,ucharY,ucharDData);//按指定位置显示一个字符voidDisplayListChar(ucharX,ucharY,ucharcode*DData);//按指定位置显示一串字符voidDelay5Ms(void);//5ms延时voidDelay400Ms(void);//400ms延时Read_Temperature(char,char);//温度显示voidmychar(void);//显示自定义字符voidadjust_res(charres);//res分别等于0x1f,0x3f,0x5f温度读数分辨率分别对应//0.5,0.25,0.125//初始化后设置为:07年07月04日星期312点00分00秒//12:00:00XX.C//07/07/04Week.3unsignedcharinittime[7]={0x00,0x00,0x12,0x04,0x07,0x03,0x07};//秒分钟小时日月星期年ucharcodeweek[]={Week.};//星期显示//=========================主函数=======================================================/*****************************************************函数名:main()功能:主函数说明:入口参数:无返回值:无*****************************************************/voidmain(void){Delay400Ms();//启动等待,等LCM讲入工作状态LCMInit();//LCM初始化Delay5Ms();//延时片刻(可不要)mychar();//显示自定义字符TMOD=0x01;//选择定时模式TH0=(65535-50000)/256;//取定时初值TL0=(65535-50000)%256;EA=1;//开中断TR0=1;ET0=1;W1302(0x90,0xa5);//打开充电二级管一个二级管串联一个2K电阻W1302(0x8e,0x80);//写保护,禁止写操作adjust_res(0x5f);//调整18B20的分辨率0x1f:0.5;0x3f:0.25;0x5f:0.125while(1){if((P1_4|P1_5)==0)//初始化同时按下P1_4、P1_5{Delay5Ms();//适当延时,消除抖动if((P1_4|P1_5)==0)Set1302(inittime);//显示初始值}if(P1_6==0)//设置和选择项目键{Delay5Ms();//适当延时,消除抖动if(P1_6==0){id++;if(id7)id=0;}//7个可调节项目循环调节while(P1_6==0);}switch(id)//跳转到对应的项目进行设置{case0:sec=0;Disp_line1();Disp_line2();break;case1://调节年year=1;//设置年闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;case2://调节月year=0;mon=1;//设置月闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;case3://调节日mon=0;day=1;//设置日闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;case4://调节星期day=0;weekk=1;//设置星期闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;case5://调节小时weekk=0;hour=1;//设置小时闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;case6://调节分钟hour=0;min=1;//设置分钟闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;case7://调节秒min=0;sec=1;//设置秒钟闪烁标志位Disp_line1();Disp_line2();id_case1_key();break;}}}//==================================定时中断=============================================/*****************************************************函数名:voidt0()功能:时间工作时,冒号闪烁说明:T0中断入口,方式1入口参数:无返回值:无*****************************************************/voidt0(void)interrupt1using0{TH0=(65535-50000)/256;//取50ms定时初值TL0=(65535-50000)%256;timecount++;if(timecount9){timecount=0;//计时到,从先开始flag=~flag;//标志位取反}}//====================================项目设置===========================================/*****************************************************函数名:voidid_case1_key()功能:项目设置加减控制说明:P1.5和P1.4==+和-入口参数:无返回值:无*****************************************************///id为1时的下一级选择voidid_case1_key(){if(P1_5==0)//P1_5有按下,则数值增加(+){Delay5Ms();//适当延时,消除抖动if(P1_5==0)Set(id,0);//根据选择调整相应项目if(id!=7)while(P1_5==0);}if(P1_4==0)//P1_4有按下,则数值减少(-){Delay5Ms();//适当延时,消除抖动if(P1_4==0)Set(id,1);//根据选择调整相应项目if(id!=7)while(P1_4==0);}}/*****************************************************函数名:voidSet()功能:项目设置说明:sel_1=0时,数值加;sel_1=1时,数值减入口参数:sel和sel_1返回值:无**
本文标题:基于LCD1602和DS1302的时间显示程序
链接地址:https://www.777doc.com/doc-5285402 .html