您好,欢迎访问三七文档
万年历时钟芯片代码/*********************************************************************文件名:时钟DS1302LCD.c*描述:该程序实现了用单片机来控制时钟芯片DS1302进行时钟的显示。时钟会在1602上显示.*创建人:东流,2012年2月7日*版本号:1.0*杜邦线接法:P3.5接J18的1端;J3.6接J18的2端;J3.7接J18的3端。1602接到J17的排座上。***********************************************************************/#include<reg52.h>#include<intrins.h>#defineucharunsignedchar#defineuintunsignedintsbitACC0=ACC^0;sbitACC7=ACC^7;sbitT_CLK=P3^5;/*实时时钟时钟线引脚*/sbitT_IO=P3^6;/*实时时钟数据线引脚*/sbitT_RST=P3^7;/*实时时钟复位线引脚*///这三个引脚参考资料sbitE=P2^7;//1602使能引脚sbitRW=P2^6;//1602读写引脚sbitRS=P2^5;//1602数据/命令选择引脚/*********************************************************************名称:delay()*功能:延时,延时时间大概为5US。*输入:无*输出:无***********************************************************************/voiddelay(){_nop_();_nop_();_nop_();_nop_();_nop_();}voidDelay(uinti){uintx,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}/*********************************************************************名称: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);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);Delay(5);wcmd(0x38);wcmd(0x08);wcmd(0x0c);wcmd(0x04);wcmd(0x01);}/*********************************************************************名称:L1602_char(ucharhang,ucharlie,charsign)*功能:改变液晶中某位的值,如果要让第一行,第五个字符显示"b",调用该函数如下L1602_char(1,5,'b')*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_char(ucharhang,ucharlie,charsign){uchara;if(hang==1)a=0x80;if(hang==2)a=0xc0;a=a+lie-1;wcmd(a);wdata(sign);}/*********************************************************************名称:L1602_string(ucharhang,ucharlie,uchar*p)*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下L1602_string(1,5,"abcdef;")*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidL1602_string(ucharhang,ucharlie,uchar*p){uchara,b=0;if(hang==1)a=0x80;if(hang==2)a=0xc0;a=a+lie-1;while(1){wcmd(a++);if((*p=='\0')||(b==16))break;b++;wdata(*p);p++;}}/*********************************************************************名称:v_RTInputByte()*功能:往DS1302写入1Byte数据*输入:ucDa写入的数据*输出:无***********************************************************************/voidv_RTInputByte(ucharucDa){uchari;ACC=ucDa;T_RST=1;for(i=8;i>0;i--){T_IO=ACC0;T_CLK=1;T_CLK=0;ACC=ACC>>1;}}/*********************************************************************名称:uc_RTOutputByte()*功能:从DS1302读取1Byte数据*输入:无*返回值:ACC***********************************************************************/ucharuc_RTOutputByte(void){uchari;T_RST=1;for(i=8;i>0;i--){ACC=ACC>>1;T_IO=1;ACC7=T_IO;T_CLK=1;T_CLK=0;}return(ACC);}/*********************************************************************名称:v_W1302(ucharucAddr,ucharucDa)*功能:往DS1302写入数据*输入:ucAddr:DS1302地址,ucDa:要写的数据*返回值:无***********************************************************************/voidv_W1302(ucharucAddr,ucharucDa){T_RST=0;T_CLK=0;T_RST=1;v_RTInputByte(ucAddr);//写地址_nop_();_nop_();v_RTInputByte(ucDa);//写1Byte数据T_CLK=1;T_RST=0;}/*********************************************************************名称:uc_R1302(ucharucAddr)*功能:读取DS1302某地址的数据*输入:ucAddr:DS1302地址*返回值:ucDa:读取的数据***********************************************************************/ucharuc_R1302(ucharucAddr){ucharucDa;T_RST=0;T_CLK=0;T_RST=1;v_RTInputByte(ucAddr);//写地址,命令_nop_();_nop_();ucDa=uc_RTOutputByte();//读1Byte数据T_CLK=1;T_RST=0;return(ucDa);}/*********************************************************************名称:v_BurstW1302T*功能:往DS1302写入时钟数据(多字节方式)*输入:pSecDa:时钟数据地址格式为:秒分时日月星期年控制*8Byte(BCD码)1B1B1B1B1B1B1B1B*返回值:无***********************************************************************/voidv_BurstW1302T(uchar*pSecDa){uchari;v_W1302(0x8e,0x00);//控制命令,WP=0,写操作T_RST=0;T_CLK=0;T_RST=1;v_RTInputByte(0xbe);//0xbe:时钟多字节写命令for(i=8;i>0;i--)//8Byte=7Byte时钟数据+1Byte控制{v_RTInputByte(*pSecDa);//写1Byte数据pSecDa++;}T_CLK=1;T_RST=0;}/*********************************************************************名称:v_BurstR1302T(uchar*pSecDa)*功能:读取DS1302时钟数据*输入:pSecDa:时钟数据地址格式为:秒分时日月星期年*7Byte(BCD码)1B1B1B1B1
本文标题:万年历时钟芯片代码
链接地址:https://www.777doc.com/doc-5079021 .html