您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > LCD1602显示时间和温度
/********************************************************************************标题:LCD1602显示时钟****通过本例程了解DS1302时钟芯片和LCD1602液晶的基本原理和使用,理解并掌握DS1302时钟芯片****注意:JP1302跳线冒要短接。**请学员认真消化本例程,懂DS1302在C语言中的操作*********************************************************************************/#include<reg52.h>//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<intrins.h>#defineucharunsignedchar#defineuintunsignedint#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};//管脚定义sbitSCK=P3^6;//DS1302时钟端sbitSDA=P3^4;//数据端sbitRST=P3^5;//DS1302复位端sbitLCD_RW=P2^5;//1602的读写端sbitLCD_RS=P2^6;//1602的数据命令端sbitLCD_EN=P2^7;//1602的使能sbitDQ=P3^7;//DS18b20温度传感器sbitS1=P1^0;//按键使用sbitS2=P1^1;sbitS3=P1^2;sbitS4=P1^3;uchargw,shw,t,R1;ucharsecond,minute,hour,date,month,year,week;//定义时间变量/*************************************************************//**//*延时子程序*//**//*************************************************************/voiddelay(ucharx){ucharj;while((x--)!=0){for(j=0;j<125;j++){;}}}voidDELAY_US(uinti){while(i--);}/*************************************************************//**//*LCD1602模块*//**//*************************************************************//*************************************************************//**//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据*//**//*************************************************************/bitlcd_busy(){bitresult;LCD_RS=0;LCD_RW=1;LCD_EN=1;delayNOP();//高电平读出4usresult=(bit)(P0&0x80);LCD_EN=0;return(result);}/*******************************************************************//**//*写指令数据到LCD*//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。*//**//*******************************************************************/voidlcd_wcom(ucharcom){while(lcd_busy());LCD_RS=0;LCD_RW=0;LCD_EN=0;_nop_();_nop_();P0=com;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*******************************************************************//**//*写显示数据到LCD*//*RS=H,RW=L,E=高脉冲,D0-D7=数据。*//**//*******************************************************************/voidlcd_wdat(uchardat){while(lcd_busy());LCD_RS=1;LCD_RW=0;LCD_EN=0;P0=dat;delayNOP();LCD_EN=1;delayNOP();LCD_EN=0;}/*************************************************************//**//*LCD初始化设定*//**//*************************************************************/voidlcd_init(){delay(15);lcd_wcom(0x38);//16*2显示,5*7点阵,8位数据delay(5);lcd_wcom(0x38);delay(5);lcd_wcom(0x38);delay(5);lcd_wcom(0x0c);//显示开,关光标delay(5);lcd_wcom(0x06);//移动光标delay(5);lcd_wcom(0x01);//清除LCD的显示内容delay(5);}/*************************************************************//**//*1602显示字符串*//**//*************************************************************/voidlcd_word(unsignedchar*p){while(*p>0){lcd_wdat(*p);p++;}}/*************************************************************//**//*1602显示星期子程序*//**//*************************************************************/voidwrite_week(ucharweek)//写时分秒{lcd_wcom(0x80+0x0b);switch(week){case1:lcd_word("MON");break;case2:lcd_word("TUE");break;case3:lcd_word("WED");break;case4:lcd_word("THU");break;case5:lcd_word("FRI");break;case6:lcd_word("SAT");break;case7:lcd_word("SUN");break;}}/******************************************************************//*DS1302模块*//******************************************************************//******************************************************************//*写一个字节*//******************************************************************/voidWrite_Ds1302_Byte(unsignedchartemp){unsignedchari;for(i=0;i<8;i++)//循环8次写入数据{SCK=0;SDA=temp&0x01;//每次传输低字节temp>>=1;//右移一位SCK=1;}}/******************************************************************//*写入DS1302*//******************************************************************/voidWrite_Ds1302(unsignedcharaddress,unsignedchardat){RST=0;//初始复位端为0_nop_();SCK=0;//初始时钟线为0_nop_();RST=1;//启动_nop_();Write_Ds1302_Byte(address);//传输命令字,发送要写入的时间地址Write_Ds1302_Byte(dat);//发送数据,写入哟啊修改的时间RST=0;//读取结束,结束数据的传输}/******************************************************************//*读出DS1302数据*//******************************************************************/unsignedcharRead_Ds1302(unsignedcharaddress){unsignedchari,temp=0x00;RST=0;//初始复位端为0_nop_();_nop_();SCK=0;//初始时钟线为0_nop_();_nop_();RST=1;//启动_nop_();_nop_();Write_Ds1302_Byte(address);for(i=0;i<8;i++)//循环8次读取数据{if(SDA)temp|=0x80;//每次传输低字节SCK=0;temp>>=1;//右移一位_nop_();_nop_();_nop_();SCK=1;}RST=0;_nop_();//以下为DS1302复位的稳定时间_nop_();RST=0;SCK=0;_nop_();_nop_();_nop_();_nop_();SCK=1;_nop_();_nop_();SDA=0;_nop_();_nop_();SDA=1;_nop_();_nop_();return(temp);//返回}//**********温度模块*******voidDS1820RST()//DS18b20的初始化函数{ucharx=0;DQ=1;//DQ复位DELAY_US(4);//延时DQ=0;//DQ拉低DELAY_US(1000);//精确延时大于480usDQ=1;//拉高DELAY_US(40);x=DQ;}ucharDS1820RD()//读一个字节{uchari=0,dat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat=dat>>1;DQ=1;//给脉冲信号if(DQ==1)dat|=0x80;DELAY_US(10);}return(dat);//写一个字节}voidDS1820WR(uchardat){chari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;DELAY_US(10);DQ=1;dat=dat>>1;}}ucharREAD_T(){u
本文标题:LCD1602显示时间和温度
链接地址:https://www.777doc.com/doc-4597023 .html