您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > LCD带温度显示万年历
LCD带温度显示万年历(2009-4-515:02:00)【收藏】【评论】【打印】【关闭】标签:1#includereg52.h#includeintrins.h#defineucharunsignedchar#defineuintunsignedint#defineLCD_DataP2#defineBusy0x80//用于检测LCD状态字中的Busy标识sbitDQ=P1^3;sbitlcdrs=P3^5;//数据命令选择端(H/L)sbitlcdrw=P3^6;//读写选择端(H/L)sbitlcde=P3^7;//使能信号sbitSCL2=P1^0;//SCL2定义为P1口的第3位脚,连接DS1302SCL和ADC0831SCL脚sbitSDA2=P1^1;//SDA2定义为P1口的第4位脚,连接DS1302SCL和ADC0831SDA脚sbitRST=P1^2;//DS1302片选脚sbitkey0=P0^0;//定义三个按键sbitkey1=P0^1;//加按键sbitkey2=P0^2;//减按键sbitH1=P0^3;sbitL=P0^4;bitpresence;ucharcodecdis2[]={.C};ucharbuzyc,funtion_flag=0,temp_num;charshi,fen,miao,nian,yue,ri,xin;ucharbeep;unsignedchardatatemp_data[2]={0x00,0x00};unsignedchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};unsignedcharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};unsignedcharcodemytab[8]={0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00};unsignedcharl_tmpdate[8]={0x00,59,12,19,2,8,2};//显示初值unsignedcharl_tmpdisplay[8]={0x40,0x40,0x40,0x40,0x40,0x40,0x40,0};//待显示的数codeunsignedcharwrite_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//1302写入地址codeunsignedcharread_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};//1302读出地址codeunsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//共阴数码管0-9'-''熄灭‘表uchardate1[]=MON;uchardate2[]=TUE;uchardate3[]=WED;uchardate4[]=THU;uchardate5[]=FRI;uchardate6[]=SAT;uchardate7[]=SUN;#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};/*****************************************************************************************************字节写入子函数:将要写入的数字先右移一位,是最低位溢出,然后在scl2的一个上升沿数据被写入DS1302,注意数据的写入时从低位到高位*****************************************************************************************************/voidWrite_Ds1302_Byte(unsignedchardate){ucharj,temp;temp=date;for(j=0;j8;j++){temp=temp1;//将数据右移一位使最低位溢出SDA2=CY;//将待写入数据最低位写入数据缓冲SCL2=0;SCL2=1;//在scl的上升延写入数据}}/*****************************************************************************************************字节读出子函数:分8次读出数据,将读出的数据存入temp:在时钟信号的下降沿读出一个字节的数据数据读出也是从低位到高位的*****************************************************************************************************/ucharRead_Ds1302_Byte(){ucharj,temp;for(j=0;j8;j++){temp=temp1;//将temp右移一位使最高位变为次高位,最高为为0SDA2=1;SCL2=1;SCL2=0;//在scl2的一个下降沿数据读出if(SDA2==1)//如果读出的数据为1,即在temp的最高位写入1,为0的时候则写入0temp=temp|0x80;temp=temp|0x00;}returntemp;}/***************************************************************************************************************数据写入DS1302函数:在指定地址写入指定数据,在rst为低scl2为低的情况下将rst置高,即允许数据写入先写入地址然后写入数据最后将rst拉低结束数据写入****************************************************************************************************************/voidWrite_Ds1302(unsignedcharaddress,unsignedchardat){RST=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL2=0;_nop_();_nop_();_nop_();_nop_();_nop_();RST=1;_nop_();_nop_();_nop_();_nop_();_nop_();//开启,写入数据地址,这是本串口协议的开始,加入延时防止干扰Write_Ds1302_Byte(address);//发送地址Write_Ds1302_Byte(dat);//发送数据RST=0;//恢复}/************************************************************************************************************从指定地址读取数据子函数:在rst为低scl2为低的情况下将rst置高,即允许数据被读出(注意加入延时可以防止干扰)先写入地址在分八次吧数据一位位读出,在scl2的一个下降沿数据被读出,数据位从0开始***************************************************************************************************************/unsignedcharRead_Ds1302(unsignedcharaddress){unsignedchartemp1,temp2;RST=0;_nop_();_nop_();_nop_();_nop_();_nop_();SCL2=0;_nop_();_nop_();_nop_();_nop_();_nop_();RST=1;_nop_();_nop_();_nop_();_nop_();_nop_();//开启,写入数据地址,这是本串口协议的开始,加入延时防止干扰Write_Ds1302_Byte(address);temp1=Read_Ds1302_Byte();temp2=temp14;temp2=temp2*10;temp1=temp1&0x0f;temp1=temp1+temp2;//读出数据的时候要将BCD码转换成十进制RST=0;return(temp1);//返回}/***************************************************************************************************设定时间初值:在写入之前应当把要写入的数据转换成BCD码的形式每写入一次数据记得都要打开1302的写入允许****************************************************************************************************/voidSet_RTC(void)//设定日历{unsignedchari,*p,tmp;for(i=0;i8;i++){//数据的转换,DS1302以4位存储一个10进制数,因此需要将数据进行转换tmp=l_tmpdate[i]/10;l_tmpdate[i]=l_tmpdate[i]%10;l_tmpdate[i]=l_tmpdate[i]+tmp*16;}Write_Ds1302(0x8E,0X00);//打开DS1302的写入允许p=write_rtc_address;//传地址for(i=0;i8;i++)//7次写入年月日时分秒星期{Write_Ds1302(*p,l_tmpdate[i]);p++;}Write_Ds1302(0x8E,0x80);//关闭DS1302的写入允许}/****************************************************************************************************读取时钟日历:循环几次分别读出数据,存放在一个数组中,注意此时读出的数据为BCD码形式每读一次数值让1302空运行一次可有效的防治干扰******************************************************************************************************/voidRead_RTC(void)//读取日历{unsignedchari,*p;p=read_rtc_address;//地址传递for(i=0;i8;i++)//分7次读取年月日时分秒星期{l_tmpdisplay[i]=Read_Ds1302(*p);//读取数据存放于数组变量中p++;_nop_();_nop_();_nop_();_nop_();_nop_();//5个空指令Read_Ds1302(0x00);//让1302空运行一次是最好的防干扰方法_nop_();_nop_();_nop_();_nop_();_nop_();}}/********************************************液晶显示函数部分***********************************************/voiddelay(intms){unsignedchary;while(ms--){for(y=0;y250;y++){_
本文标题:LCD带温度显示万年历
链接地址:https://www.777doc.com/doc-3549577 .html