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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

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

查看數: 2906 | 評論數: 4 | 收藏 0
關燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發布時間: 2019-12-20 20:27

正文摘要:

會刷新,但顯示亂碼,芯片stc89c52,LCD1602,DS1302,請問這是什么情況? 代碼如下: #include "DS1302.h" #include "LCD1602.h" #include <reg52.h> sbit SCLK = P1^0;//時鐘線 sbit IO&nbs ...

回復

ID:584814 發表于 2019-12-23 10:12
日期和時間應該每個都是兩位可你的顯示只有一位的空檔,問題應該很清楚了,正如樓上所言。
ID:327029 發表于 2019-12-23 07:59
unsigned char now_date[] = { 0 };
unsigned char old_date[] = { 19, 40, 14, 16, 12, 19 };   這里的問題,單片機不能直接讀取十進制數,把它分組轉換為16進制即可
ID:213173 發表于 2019-12-22 15:32
樓主把讀取1302的十進制2位數直接保存在顯示緩存中,再送到1602,造成亂碼。必須把十進制位數分解保存,按單個字符送到1602才行。程序補充完整顯示正常。緩存寫法unsigned char now_date[12];

  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:617449 發表于 2019-12-22 09:15
你好!重點檢查一下DS1302讀取時序吧

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 秋霞电影一区二区 | 日本久久一区 | 日韩视频免费 | 超碰免费观看 | 久久国产传媒 | 黄色一级片在线播放 | 亚洲精品中文字幕av | 99精品视频一区二区三区 | 欧美一级片在线观看 | 91麻豆精品国产91久久久久久 | 久久国产精品99久久久久久丝袜 | 男女网站免费观看 | 亚洲精品一二三 | 精品视频导航 | 日本福利片 | 国产成人免费视频网站高清观看视频 | 久久久久久久久久一区 | 国产色视频网站 | 伊人伊成久久人综合网站 | 精品亚洲一区二区 | 国产三级一区二区 | 一级欧美一级日韩片 | 亚洲午夜小视频 | 久久99精品久久久久久 | 国产成人99久久亚洲综合精品 | 色网在线观看 | 亚洲精品日韩综合观看成人91 | 超碰免费在线 | 91一区| 久亚州在线播放 | 久久国产精品99久久久大便 | 在线免费看91 | 龙珠z国语版在线观看 | 日韩欧美视频在线 | 日韩成人精品在线观看 | 中文字幕在线一区 | 日韩一区在线视频 | 国产欧美日韩精品一区 | 男女啪啪网址 | 色综久久 | 中文字幕av亚洲精品一部二部 |