樓主把讀取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);
- }
- }
復制代碼
|