久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2672|回復: 4
收起左側

stc89c52單片機+DS1302+LCD1602無法正常顯示

[復制鏈接]
ID:669435 發表于 2019-12-20 20:27 | 顯示全部樓層 |閱讀模式
150030cntyed1qqtq1qtdh.jpg.thumb.jpg

會刷新,但顯示亂碼,芯片stc89c52,LCD1602,DS1302,請問這是什么情況?
代碼如下:
  1. #include "DS1302.h"
  2. #include "LCD1602.h"
  3. #include <reg52.h>


  4. sbit SCLK = P1^0;//時鐘線
  5. sbit IO        = P1^1;         //數據輸/入輸出線
  6. sbit RST = P1^2; //復位腳


  7. unsigned char now_date[] = { 0 };
  8. unsigned char old_date[] = { 19, 40, 14, 16, 12, 19 };


  9. void delay_ms(unsigned int time)
  10. {
  11.         unsigned int a, b;
  12.         for (a = time; a > 0; a--)
  13.                 for (b = 114; b > 0; b--);
  14. }


  15. void main()
  16. {
  17.         DS1302_write(0x8e, 0);//關閉寫保護
  18.         DS1302_write(0x80, data_to_BCD(old_date[0]));//sec
  19.         DS1302_write(0x82, data_to_BCD(old_date[1]));//min
  20.         DS1302_write(0x84, data_to_BCD(old_date[2]));//hour
  21.         DS1302_write(0x86, data_to_BCD(old_date[3]));//day
  22.         DS1302_write(0x88, data_to_BCD(old_date[4]));//month
  23.         DS1302_write(0x8c, data_to_BCD(old_date[5]));//year
  24.         DS1302_write(0x8e, 0x80);//開啟寫保護
  25.         LCD1602_init();//LCD1602初始化
  26.         LCD1602_write_string("Date:20", 7);
  27.         LCD1602_write_cmd(0x80 | 0x40);//第一行第一格開始寫
  28.         LCD1602_write_string("Time:", 5);
  29.         while (1)
  30.         {
  31.                 DS1302_write(0x8e, 0);//關閉寫保護
  32.                 now_date[0] = BCD_to_data(DS1302_read(0x81));
  33.                 now_date[1] = BCD_to_data(DS1302_read(0x83));
  34.                 now_date[2] = BCD_to_data(DS1302_read(0x85));
  35.                 now_date[3] = BCD_to_data(DS1302_read(0x87));
  36.                 now_date[4] = BCD_to_data(DS1302_read(0x89));
  37.                 now_date[5] = BCD_to_data(DS1302_read(0x8D));
  38.                 DS1302_write(0x8e, 0x80);//開啟寫保護


  39.                 LCD1602_write_cmd(0x80 | 0x08);
  40.                 LCD1602_write_data('0' + now_date[5]);
  41.                 LCD1602_write_data('-');
  42.                 LCD1602_write_data('0' + now_date[4]);
  43.                 LCD1602_write_data('-');
  44.                 LCD1602_write_data('0' + now_date[3]);
  45.                
  46.                 LCD1602_write_cmd(0x80 | 0x46);
  47.                 LCD1602_write_data('0' + now_date[2]);
  48.                 LCD1602_write_data(':');
  49.                 LCD1602_write_data('0' + now_date[1]);
  50.                 LCD1602_write_data(':');
  51.                 LCD1602_write_data('0' + now_date[0]);
  52.                
  53.                 delay_ms(500);      
  54.         }
  55. }


  56. void DS1302_write_byte(unsigned char dat)//寫一個字節數據
  57. {
  58.         unsigned char i;
  59.         for (i = 0; i < 8; i++)
  60.         {
  61.                 SCLK = 0;                //為下次產生上升沿做準備
  62.                 IO = dat & 0x01;//從最低位開始讀
  63.                 SCLK = 1;                //產生上升沿,讀走數據
  64.                 dat >>= 1;                //露出屁股讓它讀
  65.         }
  66. }


  67. unsigned char DS1302_read_byte()//讀取一個字節數據
  68. {
  69.         unsigned char i, dat;
  70.         for (i = 0; i < 8; i++)//先寫命令
  71.         {
  72.                 SCLK = 0;                //為下次產生上升沿做準備
  73.                 dat >>= 1;
  74.                 IF (IO)
  75.                         dat |= 0x80;//先寫到最高位,然后再移過去
  76.                 SCLK = 1;                //產生上升沿,讀走數據
  77.         }
  78.         return dat;      
  79. }


  80. void DS1302_write(unsigned char cmd, unsigned char dat)
  81. {
  82.         RST = 0;
  83.         SCLK = 0;
  84.         RST = 1;//開始
  85.         DS1302_write_byte(cmd);//寫命令
  86.         DS1302_write_byte(dat);//寫數據
  87.         SCLK = 1;
  88.         RST = 0;
  89. }


  90. unsigned char DS1302_read(unsigned cmd)
  91. {
  92.         unsigned char dat;
  93.         RST = 0;
  94.         SCLK = 0;
  95.         RST = 1;//開始
  96.         DS1302_write_byte(cmd);//寫命令
  97.         dat = DS1302_read_byte();//讀取數據
  98.         SCLK = 1;
  99.         RST = 0;
  100.         return dat;
  101. }


  102. unsigned char data_to_BCD(unsigned char dat)//數據轉BCD碼
  103. {
  104.         unsigned char temp;
  105.         temp = dat / 10;
  106.         dat %= 10;
  107.         dat = dat + temp * 16;
  108.         return dat;
  109. }


  110. unsigned char BCD_to_data(unsigned char dat)//BCD碼轉數據
  111. {
  112.         unsigned char temp;
  113.         temp = dat / 16;
  114.         dat %= 16;
  115.         dat = dat + temp * 10;
  116.         return dat;
  117. }
復制代碼


回復

使用道具 舉報

ID:617449 發表于 2019-12-22 09:15 | 顯示全部樓層
你好!重點檢查一下DS1302讀取時序吧
回復

使用道具 舉報

ID:213173 發表于 2019-12-22 15:32 | 顯示全部樓層
樓主把讀取1302的十進制2位數直接保存在顯示緩存中,再送到1602,造成亂碼。必須把十進制位數分解保存,按單個字符送到1602才行。程序補充完整顯示正常。緩存寫法unsigned char now_date[12];
無標題.jpg
  1. #include <reg52.h>

  2. //sbit LCD_RW=P2^6;                                //液晶屏RS口接地
  3. sbit LCD_RS=P2^5;                                        //液晶屏RS口
  4. sbit LCD_EN=P2^4;                                        //液晶屏EN口

  5. sbit SCLK = P1^0;//時鐘線
  6. sbit IO   = P1^1; //數據輸/入輸出線
  7. sbit RST  = P1^2; //復位腳

  8. unsigned char now_a[] = "Date:20";//第一行固定字符
  9. unsigned char now_d[] = "Time:";//第二行固定字符
  10. unsigned char now_date[12];
  11. unsigned char old_date[] = { 19, 40, 14, 16, 12, 19 };


  12. void delay_ms(unsigned int time)
  13. {
  14.         unsigned int a, b;
  15.         for (a = time; a > 0; a--)
  16.                 for (b = 114; b > 0; b--);
  17. }

  18. void DS1302_write_byte(unsigned char dat)//寫一個字節數據
  19. {
  20.         unsigned char i;
  21.         for (i = 0; i < 8; i++)
  22.         {
  23.                 SCLK = 0;                //為下次產生上升沿做準備
  24.                 IO = dat & 0x01;//從最低位開始讀
  25.                 SCLK = 1;                //產生上升沿,讀走數據
  26.                 dat >>= 1;                //露出屁股讓它讀
  27.         }
  28. }


  29. unsigned char DS1302_read_byte()//讀取一個字節數據
  30. {
  31.         unsigned char i, dat;
  32.         for (i = 0; i < 8; i++)//先寫命令
  33.         {
  34.                 SCLK = 0;                //為下次產生上升沿做準備
  35.                 dat >>= 1;
  36.                 if (IO)
  37.                         dat |= 0x80;//先寫到最高位,然后再移過去
  38.                 SCLK = 1;                //產生上升沿,讀走數據
  39.         }
  40.         return dat;      
  41. }


  42. void DS1302_write(unsigned char cmd, unsigned char dat)
  43. {
  44.         RST = 0;
  45.         SCLK = 0;
  46.         RST = 1;//開始
  47.         DS1302_write_byte(cmd);//寫命令
  48.         DS1302_write_byte(dat);//寫數據
  49.         SCLK = 1;
  50.         RST = 0;
  51. }


  52. unsigned char DS1302_read(unsigned cmd)
  53. {
  54.         unsigned char dat;
  55.         RST = 0;
  56.         SCLK = 0;
  57.         RST = 1;//開始
  58.         DS1302_write_byte(cmd);//寫命令
  59.         dat = DS1302_read_byte();//讀取數據
  60.         SCLK = 1;
  61.         RST = 0;
  62.         return dat;
  63. }


  64. unsigned char data_to_BCD(unsigned char dat)//數據轉BCD碼
  65. {
  66.         unsigned char temp;
  67.         temp = dat / 10;
  68.         dat %= 10;
  69.         dat = dat + temp * 16;
  70.         return dat;
  71. }


  72. unsigned char BCD_to_data(unsigned char dat)//BCD碼轉數據
  73. {
  74.         unsigned char temp;
  75.         temp = dat / 16;
  76.         dat %= 16;
  77.         dat = dat + temp * 10;
  78.         return dat;
  79. }
  80. /*******100us延時程序********/
  81. void delay(unsigned int x)
  82. {
  83.         unsigned int a,b;
  84.         for(a=x;a>0;a--)
  85.                 for(b=10;b>0;b--);
  86. }
  87. /*******1602液晶屏寫指令程序********/
  88. void LCD1602_write_cmd(unsigned char com)
  89. {
  90.         LCD_EN=0;        //初始設置LCD_EN低電平
  91.         LCD_RS=0;        //允許寫指令
  92.         P0=com;                //傳遞指令
  93.         delay(10);        //延時1ms
  94.         LCD_EN=1;        //使能寫入
  95.         delay(10);        //延時1ms
  96.         LCD_EN=0;        //低跳變執行
  97.        
  98. }
  99. /*******1602液晶屏寫數據程序********/
  100. void LCD1602_write_data(unsigned char date)
  101. {
  102. //        LCD_EN=0;        //初始設置LCD_EN低電平
  103.         LCD_RS=1;        //允許寫數據
  104.         P0 =date;        //傳遞數據
  105.         delay(10);        //延時1ms
  106.         LCD_EN=1;        //使能寫入
  107.         delay(10);        //延時1ms
  108.         LCD_EN=0;        //低跳變執行
  109.        
  110. }
  111. /*******1602液晶屏初始化程序********/
  112. void LCD1602_init()                //設置顯示模式、
  113. {
  114.         LCD1602_write_cmd(0x38);//設置16*2顯示,5*7點陣,8位數據接口
  115.         LCD1602_write_cmd(0x01);//顯示清零,數據指針清零
  116. //        write_com(0x0f);//設置開顯示,顯示光標,光標閃爍
  117. //        write_com(0x0e);//設置開顯示,顯示光標,光標不閃
  118.         LCD1602_write_cmd(0x0c);//設置開顯示,不顯光標
  119.         LCD1602_write_cmd(0x06);//設置寫一個字符后地址指針加1
  120. //        write_com(0x07);//設置寫一個字符后整屏左移
  121.         LCD1602_write_cmd(0x80);//數據指針初始化,設置顯示初始位置
  122. }
  123. void main()
  124. {
  125.         unsigned char i;
  126.        DS1302_write(0x8e, 0);//關閉寫保護
  127.         DS1302_write(0x80, data_to_BCD(old_date[0]));//sec
  128.         DS1302_write(0x82, data_to_BCD(old_date[1]));//min
  129.         DS1302_write(0x84, data_to_BCD(old_date[2]));//hour
  130.         DS1302_write(0x86, data_to_BCD(old_date[3]));//day
  131.         DS1302_write(0x88, data_to_BCD(old_date[4]));//month
  132.         DS1302_write(0x8c, data_to_BCD(old_date[5]));//year
  133.         DS1302_write(0x8e, 0x80);//開啟寫保護

  134.         LCD1602_init();//LCD1602初始化
  135.         LCD1602_write_cmd(0x80);//第一行第一格開始寫
  136.                         for(i=0;i<7;i++)
  137.                                 LCD1602_write_data(now_a[i]);
  138. //        LCD1602_write_string("Date:20", 7);
  139.         LCD1602_write_cmd(0xc0);//第二行第一格開始寫
  140.                         for(i=0;i<5;i++)
  141.                                 LCD1602_write_data(now_d[i]);
  142. //        LCD1602_write_string("Time:", 5);
  143.         while (1)
  144.         {
  145.                                         DS1302_write(0x8e, 0);//關閉寫保護
  146.                                         i = BCD_to_data(DS1302_read(0x81));
  147.                                         now_date[0] = i%10;
  148.                                         now_date[1] = i/10;
  149.                                         i = BCD_to_data(DS1302_read(0x83));
  150.                                         now_date[2] = i%10;
  151.                                         now_date[3] = i/10;
  152.                                         i = BCD_to_data(DS1302_read(0x85));
  153.                                         now_date[4] = i%10;
  154.                                         now_date[5] = i/10;
  155.                                         i = BCD_to_data(DS1302_read(0x87));
  156.                                         now_date[6] = i%10;
  157.                                         now_date[7] = i/10;
  158.                                         i = BCD_to_data(DS1302_read(0x89));
  159.                                         now_date[8] = i%10;
  160.                                         now_date[9] = i/10;
  161.                                         i = BCD_to_data(DS1302_read(0x8D));
  162.                                         now_date[10] = i%10;
  163.                                         now_date[11] = i/10;
  164.                DS1302_write(0x8e, 0x80);//開啟寫保護

  165.                                         LCD1602_write_cmd(0x80 | 0x07);
  166.                                        
  167.                                         LCD1602_write_data(now_date[11]+'0');
  168.                                         LCD1602_write_data(now_date[10]+'0');
  169.                                         LCD1602_write_data('-');
  170.                                         LCD1602_write_data(now_date[9]+'0');
  171.                                         LCD1602_write_data(now_date[8]+'0');
  172.                                         LCD1602_write_data('-');
  173.                                         LCD1602_write_data(now_date[7]+'0');
  174.                                         LCD1602_write_data(now_date[6]+'0');

  175.                                         LCD1602_write_cmd(0x80 | 0x45);                                       
  176.                                         LCD1602_write_data(now_date[5]+'0');
  177.                                         LCD1602_write_data(now_date[4]+'0');
  178.                                         LCD1602_write_data(':');
  179.                                         LCD1602_write_data(now_date[3]+'0');
  180.                                         LCD1602_write_data(now_date[2]+'0');
  181.                                         LCD1602_write_data(':');
  182.                                         LCD1602_write_data(now_date[1]+'0');
  183.                                         LCD1602_write_data(now_date[0]+'0');
  184.                                        
  185.                delay_ms(500);      
  186.         }
  187. }
復制代碼



回復

使用道具 舉報

ID:327029 發表于 2019-12-23 07:59 | 顯示全部樓層
unsigned char now_date[] = { 0 };
unsigned char old_date[] = { 19, 40, 14, 16, 12, 19 };   這里的問題,單片機不能直接讀取十進制數,把它分組轉換為16進制即可
回復

使用道具 舉報

ID:584814 發表于 2019-12-23 10:12 | 顯示全部樓層
日期和時間應該每個都是兩位可你的顯示只有一位的空檔,問題應該很清楚了,正如樓上所言。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 97超在线视频 | 精品亚洲一区二区三区四区五区 | 久久精品视频免费观看 | 日韩成人免费视频 | 国产精品一区二区欧美黑人喷潮水 | 99视频在线免费观看 | 日韩一区二区在线播放 | 日韩成人av在线 | 亚洲视频免费在线 | 国产欧美在线 | 国产精品一区二区三区四区 | 国产精品一区二区在线播放 | 亚洲福利一区 | 亚洲国产精品一区二区三区 | 日韩性在线 | 国产美女在线免费观看 | 亚洲欧美中文日韩在线 | 古典武侠第一页久久777 | 国产乱码精品一品二品 | 在线观看免费高清av | 亚洲香蕉 | 在线成人免费视频 | 欧美日韩免费视频 | 午夜久久久久久久久久一区二区 | 日韩中文字幕在线播放 | 亚洲欧美精品在线观看 | 精品九九九 | 精品视频在线播放 | 日本中出视频 | 欧美一区二区在线免费观看 | 欧美日韩三区 | 欧美视频在线播放 | 久久精品久久久久久 | 97人人超碰| 免费在线观看av网址 | 一区 | 中文字幕国产视频 | 久久中文免费视频 | 久久久久久成人 | 精品久久国产 | 亚洲欧美网 |