您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > DS1302+LCD1602显示程序
/****************************************************************程序名称:LCD1602显示时间说明:使用本程序你必须把SE3设置为1-2短接SE5设置为2-3短接*****************************************************************//*头文件*/#includereg52.h#includeintrins.h#defineuintunsignedint#defineucharunsignedchar#definenop()_nop_()sbitlcd_rs_port=P2^0;/*定义LCD控制端口*/sbitlcd_rw_port=P2^1;/*定义LCD控制端口*/sbitlcd_en_port=P2^2;/*定义LCD控制端口*/#definelcd_data_portP0/*定义LCD控制端口*/sbitT_CLK=P1^2;/*实时时钟时钟线引脚*/sbitT_IO=P1^3;/*实时时钟数据线引脚*/sbitT_RST=P3^3;/*实时时钟复位线引脚*/sbitACC0=ACC^0;sbitACC7=ACC^7;ucharcodemun_to_char[]={0123456789ABCDEF};/*定义数字跟ASCII码的关系*/uchardatatime_data_buff[7]={0x00,0x00,0x09,0x01,0x01,0x04,0x09};/*格式为:秒分时日月星期年*/uchardatalcd1602_line1[]={2000/00/00000};uchardatalcd1602_line2[]={00:00:00};ucharcodeWeeks[][3]={{SUN},{MON},{TUE},{WED},{THU},{FRI},{SAT},{SUN}};/********************************************************************函数名:RTInputByte()功能:实时时钟写入一字节说明:往DS1302写入1Byte数据(内部函数)入口参数:d写入的数据返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:***********************************************************************/voidRTInputByte(uchard){uchari;ACC=d;for(i=8;i0;i--){T_IO=ACC0;/*相当于汇编中的RRC*/T_CLK=1;T_CLK=0;ACC=ACC1;}}/********************************************************************函数名:RTOutputByte()功能:实时时钟读取一字节说明:从DS1302读取1Byte数据(内部函数)入口参数:无返回值:ACC设计:zhaojunjie日期:2002-03-19修改:日期:***********************************************************************/ucharRTOutputByte(void){uchari;for(i=8;i0;i--){ACC=ACC1;/*相当于汇编中的RRC*/ACC7=T_IO;T_CLK=1;T_CLK=0;}return(ACC);}/********************************************************************函数名:W1302()功能:往DS1302写入数据说明:先写地址,后写命令/数据(内部函数)调用:RTInputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址,ucData:要写的数据返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:***********************************************************************/voidW1302(ucharucAddr,ucharucDa){T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/RTInputByte(ucDa);/*写1Byte数据*/T_CLK=1;T_RST=0;}/********************************************************************函数名:R1302()功能:读取DS1302某地址的数据说明:先写地址,后读命令/数据(内部函数)调用:RTInputByte(),RTOutputByte()入口参数:ucAddr:DS1302地址返回值:ucData:读取的数据设计:zhaojunjie日期:2002-03-19修改:日期:***********************************************************************/ucharR1302(ucharucAddr){ucharucData;T_RST=0;T_CLK=0;T_RST=1;RTInputByte(ucAddr);/*地址,命令*/ucData=RTOutputByte();/*读1Byte数据*/T_CLK=1;T_RST=0;return(ucData);}/********************************************************************函数名:Set1302()功能:设置初始时间说明:先写地址,后读命令/数据(寄存器多字节方式)调用:W1302()入口参数:pClock:设置时钟数据地址格式为:秒分时日月星期年7Byte(BCD码)1B1B1B1B1B1B1B返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:***********************************************************************/voidSet1302(uchar*pClock){uchari;ucharucAddr=0x80;EA=0;W1302(0x8e,0x00);/*控制命令,WP=0,写操作?*/for(i=7;i0;i--){W1302(ucAddr,*pClock);/*秒分时日月星期年*/pClock++;ucAddr+=2;}W1302(0x8e,0x80);/*控制命令,WP=1,写保护?*/EA=1;}/********************************************************************函数名:Get1302()功能:读取DS1302当前时间说明:调用:R1302()入口参数:ucCurtime:保存当前时间地址。当前时间格式为:秒分时日月星期年7Byte(BCD码)1B1B1B1B1B1B1B返回值:无设计:zhaojunjie日期:2002-03-19修改:日期:***********************************************************************/voidGet1302(ucharucCurtime[]){uchari;ucharucAddr=0x81;EA=0;for(i=0;i7;i++){ucCurtime[i]=R1302(ucAddr);/*格式为:秒分时日月星期年*/ucAddr+=2;}EA=1;}//---------------------------------------------voidlcd_delay(ucharms)/*LCD1602延时*/{ucharj;while(ms--){for(j=0;j250;j++){;}}}voidlcd_busy_wait()/*LCD1602忙等待*/{lcd_rs_port=0;lcd_rw_port=1;lcd_en_port=1;lcd_data_port=0xff;while(lcd_data_port&0x80);lcd_en_port=0;}voidlcd_command_write(ucharcommand)/*LCD1602命令字写入*/{lcd_busy_wait();lcd_rs_port=0;lcd_rw_port=0;lcd_en_port=0;lcd_data_port=command;lcd_en_port=1;lcd_en_port=0;}voidlcd_system_reset()/*LCD1602初始化*/{lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_command_write(0x0c);lcd_data_port=0xff;/*释放数据端口*/}voidlcd_char_write(ucharx_pos,y_pos,lcd_dat)/*LCD1602字符写入*/{x_pos&=0x0f;/*X位置范围0~15*/y_pos&=0x01;/*Y位置范围0~1*/if(y_pos==1)x_pos+=0x40;x_pos+=0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port=1;lcd_rw_port=0;lcd_en_port=0;lcd_data_port=lcd_dat;lcd_en_port=1;lcd_en_port=0;lcd_data_port=0xff;/*释放数据端口*/}voidmain(){uchari;lcd_system_reset();/*LCD1602初始化*/Set1302(time_data_buff);/*设置时间*/while(1){Get1302(time_data_buff);/*读取当前时间*//*刷新显示*/lcd1602_line1[3]=mun_to_char[time_data_buff[6]/0x10];lcd1602_line1[4]=mun_to_char[time_data_buff[6]%0x10];/*年*/lcd1602_line1[6]=mun_to_char[time_data_buff[4]/0x10];lcd1602_line1[7]=mun_to_char[time_data_buff[4]%0x10];/*月*/lcd1602_line1[9]=mun_to_char[time_data_buff[3]/0x10];lcd1602_line1[10]=mun_to_char[time_data_buff[3]%0x10];/*日*/for(i=0;i3;i++)lcd1602_line1[i+13]=Weeks[time_data_buff[5]&0x07][i];/*星期*/lcd1602_line2[4]=mun_to_char[time_data_buff[2]/0x10];lcd1602_line2[5]=mun_to_char[time_data_buff[2]%0x10];/*时*/lcd1602_line2[7
本文标题:DS1302+LCD1602显示程序
链接地址:https://www.777doc.com/doc-1681526 .html