楼主把读取1302的十进制2位数直接保存在显示缓存中,再送到1602,造成乱码。必须把十进制位数分解保存,按单个字符送到1602才行。程序补充完整显示正常。缓存写法unsigned char now_date[12];
- #include <reg52.h>
- //sbit LCD_RW=P2^6; //液晶屏RS口接地
- sbit LCD_RS=P2^5; //液晶屏RS口
- sbit LCD_EN=P2^4; //液晶屏EN口
- sbit SCLK = P1^0;//时钟线
- sbit IO = P1^1; //数据输/入输出线
- sbit RST = P1^2; //复位脚
- unsigned char now_a[] = "Date:20";//第一行固定字符
- unsigned char now_d[] = "Time:";//第二行固定字符
- unsigned char now_date[12];
- unsigned char old_date[] = { 19, 40, 14, 16, 12, 19 };
- void delay_ms(unsigned int time)
- {
- unsigned int a, b;
- for (a = time; a > 0; a--)
- for (b = 114; b > 0; b--);
- }
- void DS1302_write_byte(unsigned char dat)//写一个字节数据
- {
- unsigned char i;
- for (i = 0; i < 8; i++)
- {
- SCLK = 0; //为下次产生上升沿做准备
- IO = dat & 0x01;//从最低位开始读
- SCLK = 1; //产生上升沿,读走数据
- dat >>= 1; //露出屁股让它读
- }
- }
- unsigned char DS1302_read_byte()//读取一个字节数据
- {
- unsigned char i, dat;
- for (i = 0; i < 8; i++)//先写命令
- {
- SCLK = 0; //为下次产生上升沿做准备
- dat >>= 1;
- if (IO)
- dat |= 0x80;//先写到最高位,然后再移过去
- SCLK = 1; //产生上升沿,读走数据
- }
- return dat;
- }
- void DS1302_write(unsigned char cmd, unsigned char dat)
- {
- RST = 0;
- SCLK = 0;
- RST = 1;//开始
- DS1302_write_byte(cmd);//写命令
- DS1302_write_byte(dat);//写数据
- SCLK = 1;
- RST = 0;
- }
- unsigned char DS1302_read(unsigned cmd)
- {
- unsigned char dat;
- RST = 0;
- SCLK = 0;
- RST = 1;//开始
- DS1302_write_byte(cmd);//写命令
- dat = DS1302_read_byte();//读取数据
- SCLK = 1;
- RST = 0;
- return dat;
- }
- unsigned char data_to_BCD(unsigned char dat)//数据转BCD码
- {
- unsigned char temp;
- temp = dat / 10;
- dat %= 10;
- dat = dat + temp * 16;
- return dat;
- }
- unsigned char BCD_to_data(unsigned char dat)//BCD码转数据
- {
- unsigned char temp;
- temp = dat / 16;
- dat %= 16;
- dat = dat + temp * 10;
- return dat;
- }
- /*******100us延时程序********/
- void delay(unsigned int x)
- {
- unsigned int a,b;
- for(a=x;a>0;a--)
- for(b=10;b>0;b--);
- }
- /*******1602液晶屏写指令程序********/
- void LCD1602_write_cmd(unsigned char com)
- {
- LCD_EN=0; //初始设置LCD_EN低电平
- LCD_RS=0; //允许写指令
- P0=com; //传递指令
- delay(10); //延时1ms
- LCD_EN=1; //使能写入
- delay(10); //延时1ms
- LCD_EN=0; //低跳变执行
-
- }
- /*******1602液晶屏写数据程序********/
- void LCD1602_write_data(unsigned char date)
- {
- // LCD_EN=0; //初始设置LCD_EN低电平
- LCD_RS=1; //允许写数据
- P0 =date; //传递数据
- delay(10); //延时1ms
- LCD_EN=1; //使能写入
- delay(10); //延时1ms
- LCD_EN=0; //低跳变执行
-
- }
- /*******1602液晶屏初始化程序********/
- void LCD1602_init() //设置显示模式、
- {
- LCD1602_write_cmd(0x38);//设置16*2显示,5*7点阵,8位数据接口
- LCD1602_write_cmd(0x01);//显示清零,数据指针清零
- // write_com(0x0f);//设置开显示,显示光标,光标闪烁
- // write_com(0x0e);//设置开显示,显示光标,光标不闪
- LCD1602_write_cmd(0x0c);//设置开显示,不显光标
- LCD1602_write_cmd(0x06);//设置写一个字符后地址指针加1
- // write_com(0x07);//设置写一个字符后整屏左移
- LCD1602_write_cmd(0x80);//数据指针初始化,设置显示初始位置
- }
- void main()
- {
- unsigned char i;
- DS1302_write(0x8e, 0);//关闭写保护
- DS1302_write(0x80, data_to_BCD(old_date[0]));//sec
- DS1302_write(0x82, data_to_BCD(old_date[1]));//min
- DS1302_write(0x84, data_to_BCD(old_date[2]));//hour
- DS1302_write(0x86, data_to_BCD(old_date[3]));//day
- DS1302_write(0x88, data_to_BCD(old_date[4]));//month
- DS1302_write(0x8c, data_to_BCD(old_date[5]));//year
- DS1302_write(0x8e, 0x80);//开启写保护
- LCD1602_init();//LCD1602初始化
- LCD1602_write_cmd(0x80);//第一行第一格开始写
- for(i=0;i<7;i++)
- LCD1602_write_data(now_a[i]);
- // LCD1602_write_string("Date:20", 7);
- LCD1602_write_cmd(0xc0);//第二行第一格开始写
- for(i=0;i<5;i++)
- LCD1602_write_data(now_d[i]);
- // LCD1602_write_string("Time:", 5);
- while (1)
- {
- DS1302_write(0x8e, 0);//关闭写保护
- i = BCD_to_data(DS1302_read(0x81));
- now_date[0] = i%10;
- now_date[1] = i/10;
- i = BCD_to_data(DS1302_read(0x83));
- now_date[2] = i%10;
- now_date[3] = i/10;
- i = BCD_to_data(DS1302_read(0x85));
- now_date[4] = i%10;
- now_date[5] = i/10;
- i = BCD_to_data(DS1302_read(0x87));
- now_date[6] = i%10;
- now_date[7] = i/10;
- i = BCD_to_data(DS1302_read(0x89));
- now_date[8] = i%10;
- now_date[9] = i/10;
- i = BCD_to_data(DS1302_read(0x8D));
- now_date[10] = i%10;
- now_date[11] = i/10;
- DS1302_write(0x8e, 0x80);//开启写保护
- LCD1602_write_cmd(0x80 | 0x07);
-
- LCD1602_write_data(now_date[11]+'0');
- LCD1602_write_data(now_date[10]+'0');
- LCD1602_write_data('-');
- LCD1602_write_data(now_date[9]+'0');
- LCD1602_write_data(now_date[8]+'0');
- LCD1602_write_data('-');
- LCD1602_write_data(now_date[7]+'0');
- LCD1602_write_data(now_date[6]+'0');
- LCD1602_write_cmd(0x80 | 0x45);
- LCD1602_write_data(now_date[5]+'0');
- LCD1602_write_data(now_date[4]+'0');
- LCD1602_write_data(':');
- LCD1602_write_data(now_date[3]+'0');
- LCD1602_write_data(now_date[2]+'0');
- LCD1602_write_data(':');
- LCD1602_write_data(now_date[1]+'0');
- LCD1602_write_data(now_date[0]+'0');
-
- delay_ms(500);
- }
- }
复制代码
|