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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2113|回復: 4
打印 上一主題 下一主題
收起左側

單片機LCD12864顯示DS302數字時鐘,但是顯示出來都是問號?

[復制鏈接]
跳轉到指定樓層
樓主
單片機源程序如下.單片機是89c51RC,屏幕是帶字庫12864,ds1302


  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit PSB = P2 ^ 4;
  5. sbit SCLK = P2 ^ 5;
  6. sbit SID = P2 ^ 6;

  7. sbit clk=P1^0;
  8. sbit io=P1^1;
  9. sbit ce=P1^2;

  10. uchar add_write[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
  11. uchar add_read[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
  12. uchar tim0[]={20,1,4,13,9,10,26};//年、星期、月、日、時、分秒

  13. uchar tim_bcd[7];//保存讀出的時間日期
  14. uchar tim[14];//保存分解開的十位、個位

  15. //將8位二進制數逐位寫入
  16. void LCD_sendbyte(uchar dat);
  17. //寫入命令
  18. void LCD_write_com(uchar com);
  19. //寫入數據
  20. void LCD_write_dat(uchar dat);
  21. //LCD初始化
  22. void LCD_init();
  23. //LCD屏幕地址定位
  24. void LCD_Setaddress(uchar x, uchar y);
  25. //LCD顯示字符數組(文字)
  26. void LCD_Putstring( uchar x, uchar y, uchar *pData );

  27. void display_1302();
  28. void write_1302_8(uchar dat);
  29. void write_1302_byte(uchar add,uchar dat);
  30. uchar read_1302_byte(uchar add);
  31. void ds1302_initial();
  32. void read_1302time();


  33. void Delayms(uint n)                 //延時時間為 1ms * x 晶振是11.0592M
  34. {
  35.         unsigned int i, j;
  36.         for (i = n; i > 0; i--)
  37.                 for (j = 110; j > 0; j--);
  38. }


  39. //將8位二進制數逐位寫入
  40. void LCD_sendbyte(uchar dat) {
  41.         unsigned char i;
  42.         for (i = 0; i < 8; i++) {
  43.                 SCLK = 0;
  44.                 if (dat & 0x80)
  45.                         SID = 1;
  46.                 else
  47.                         SID = 0;
  48.                 SCLK = 1;
  49.                 dat = dat << 1;     //左移一位
  50.         }
  51. }



  52. //寫入命令
  53. void write_com(uchar com) {
  54.         LCD_sendbyte(0xf8);          //送入5個連續的“1“,啟動一個周期,11111,RW(0),RS(0),0
  55.         LCD_sendbyte(0xf0 & com);    //取高四位,數據分兩次傳送,每個字節的內容被送入兩個字節,高四位放在第一個字節的高四位
  56.         LCD_sendbyte(0xf0 & (com << 4)); //低四位放在第二個字節的高四位
  57.         Delayms(1);                   //串行不支持讀操作,不可檢測忙操作,這里用延時替代
  58. }



  59. //寫入數據
  60. void write_data(uchar dat) {
  61.         LCD_sendbyte(0xfa);
  62.         LCD_sendbyte(0xf0 & dat);
  63.         LCD_sendbyte(0xf0 & (dat << 4));
  64.         Delayms(1);
  65. }



  66. //LCD初始化
  67. void initial_12864() {
  68.         write_com(0x30);    //選擇基本指令集
  69.         write_com(0x0c);    //開顯示,無游標,不反白
  70.         write_com(0x01);    //清除顯示屏幕,把DDRAM位址計數器調整為00H
  71.         Delayms(1);            //清屏操作時間較長1.6ms 因此加此延時
  72.         write_com(0x02);    //清DDRAM位址歸位,此處貌似與清屏重復
  73.         write_com(0x06);    //設定光標右移,整體顯示不移動
  74. }


  75. //LCD屏幕地址定位
  76. void LCD_Setaddress(uchar x, uchar y) { //地址從第1行第1列開始不從0開始(y)
  77.         unsigned char addr;
  78.         switch (x) {
  79.                 case 1:
  80.                         addr = 0x80 + y - 1;
  81.                         break;
  82.                 case 2:
  83.                         addr = 0x90 + y - 1;
  84.                         break;
  85.                 case 3:
  86.                         addr = 0x88 + y - 1;
  87.                         break;
  88.                 case 4:
  89.                         addr = 0x98 + y - 1;
  90.                         break;
  91.                 default :
  92.                         break;
  93.         }
  94.         write_com(addr);   //字符顯示開始地址
  95. }




  96. //LCD顯示字符數組(文字)
  97. void LCD_Putstring( uchar x, uchar y, uchar *pData ) {
  98.         LCD_Setaddress(x, y);
  99.         while (*pData) {
  100.                 write_data( *pData++ );
  101.         }
  102. }

  103. /****************寫一個字節*************/
  104. /*************寫地址,寫數據(方式)**************/

  105. void write_1302_8(uchar dat)
  106. {
  107.         uchar i,temp ;
  108.         for(i=0; i<8; i++)
  109.         {
  110.                 clk = 0;//時鐘信號為低時,數據才能改變,同時為出現上升沿做準備
  111.                 temp  = dat&0x01;//取出最低位
  112.                 if(temp )
  113.                         io =1;//如果這一位為1,io拉高
  114.                 else
  115.                         io=0;//如果這一位為0,io拉低
  116.                 clk = 1;//出現上升沿,1302讀數據
  117.                 dat=dat>>1;//為送出下一位做準備
  118.                
  119.         }
  120. }

  121. /*****************寫操作******************/
  122. /*************寫地址,寫數據(目的)**************/

  123. void write_1302_byte(uchar add,uchar dat)
  124. {
  125.         ce =0;//不進行操作時拉低
  126.         clk = 0;//時鐘線開始前為低
  127.         ce =1;//拉高啟動一次寫操作過程
  128.         write_1302_8(add );//送地址字節
  129.         write_1302_8(dat );//送數據字節
  130.         ce =0;//一次寫操作的結束
  131. }


  132. /*****************讀操作*************/
  133. /*************寫地址,讀數據(sclk)**************/

  134. uchar read_1302_byte(uchar add)
  135. {
  136.         uchar i,value;
  137.         ce =0;
  138.         clk =0;
  139.         ce =1;//開始一次讀操作
  140.         write_1302_8(add );//送地址字節
  141.         for(i=0; i<8; i++)
  142.         {
  143.                 clk =0;//讀數據時下降沿有效
  144.                 value =value >>1;//將上一次保存的數據移到次高位
  145.                 if(io)//若檢測為1
  146.                         value =value|0x80;//將1放到最高位
  147.                 clk =1;//接受完一位后將時鐘線拉高,為再次出現下降沿做準備
  148.         
  149.         }
  150.         ce =0;//結束一次讀操作過程
  151.         return value ;//將讀取的1字節數據傳遞出去
  152. }



  153. /***************初始化**************/
  154. /**********時間、日期的初始值設置**********/

  155. void ds1302_initial()
  156. {
  157.         uchar i,temp;
  158.         for(i=0; i<7; i++)//給寄存器賦初值之前,將日期、時間轉換為BCD碼
  159.         {
  160.                 temp = tim0[i]/10;//取十位
  161.                 tim0[i]=temp*16+tim0[i]%10;//bcd 碼
  162.         }
  163.         
  164.         write_1302_byte(0x8e,0x00);//給寄存器設置初始值之前,需要去掉寫保護
  165.         
  166.         for(i=0; i<7; i++)//每次循環給一個寄存器賦初值
  167.         {
  168.                 write_1302_byte(add_write[i],tim0[i]);
  169.         }
  170.         
  171.         write_1302_byte(0x8e,0x80);//給寄存器設置初始值后,需要加上寫保護
  172.         

  173. }



  174. /***************讀取時間并進行轉換*************/

  175. void read_1302time()
  176. {
  177.         uchar i;
  178.         for(i=0; i<7; i++)//每次循環讀一個寄存器內容,保存到tim_bcd[]數組中
  179.         {
  180.                 tim_bcd[i]=read_1302_byte(add_read[i]);
  181.         }
  182.         
  183.         for(i=0; i<7; i++)//將讀出的日期、時間分解為十位和個位
  184.         {
  185.                 tim[2*i]=tim_bcd[i]/16;
  186.                 tim[2*i+1]=tim_bcd[i]%16;
  187.         }
  188. }





  189. void Int_232()        //2323?ê??ˉ
  190. {
  191.   TMOD=0x20;
  192.   SCON=0x50;
  193.   TH1=0xFD;
  194.   TL1=0xFD;
  195.   TR1=1;
  196.   TI=0;
  197. }

  198. void TX(uchar TX_char)//′??ú·¢?íêy?Y
  199. {
  200.   SBUF=TX_char;
  201.   while(!TI);
  202.   TI=0;
  203. }

  204. void TXT()//′??ú·¢?í??êy?Y
  205. {
  206.                         uchar i;
  207.                         for(i=0;i<13;i++)
  208.                          {
  209.                                  TX(tim[i]);        
  210.                                        
  211.                          }
  212. }




  213. /***************顯示日期和時間**************/

  214. void display_1302()
  215. {
  216.         //Int_232();

  217.         LCD_Setaddress(1,1);
  218.         write_data(0x30+tim[0]);//年
  219.         write_data(0x30+tim[1]);
  220.         write_data('-');
  221.         write_data(0x30+tim[4]);//月
  222.         write_data(0x30+tim[5]);
  223.         write_data('-');
  224.         write_data(0x30+tim[6]);//日
  225.         write_data(0x30+tim[7]);
  226.         write_data(' ');
  227.         write_data(0x30+tim[2]);//周
  228.         write_data(0x30+tim[3]);
  229.         

  230.         LCD_Setaddress(2,1);
  231.         write_data(0x30+tim[8]);
  232.         write_data(0x30+tim[9]);
  233.         write_data(':');
  234.         write_data(0x30+tim[10]);
  235.         write_data(0x30+tim[11]);
  236.         write_data(':');
  237.         write_data(0x30+tim[12]);
  238.         write_data(0x30+tim[13]);
  239. //        TXT();
  240. }



  241. void main()
  242. {
  243.         initial_12864();
  244.         ds1302_initial();
  245.         while(1)
  246.         {        
  247.                 read_1302time();
  248.                 display_1302();

  249.         }

  250. }
復制代碼

ds1302.zip

6.28 KB, 下載次數: 6

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:254046 發表于 2022-2-19 21:02 | 只看該作者
加載字庫的問題吧
回復

使用道具 舉報

板凳
ID:997450 發表于 2022-2-20 08:05 | 只看該作者
cql1980 發表于 2022-2-19 21:02
加載字庫的問題吧

但是?之間的“-”和“:”都是正常顯示
回復

使用道具 舉報

地板
ID:997450 發表于 2022-2-20 16:51 | 只看該作者
已確認,找到問題了,是我1302壞了,板上一個壞了,備用的一個也壞了,剛才試第三個的時候突然就好了,運氣背到家了
回復

使用道具 舉報

5#
ID:96682 發表于 2022-2-20 21:39 來自手機 | 只看該作者
這個什么板那么多短接帽?還數碼管、LCD 同時顯示
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品一 | 国产精品一区二区在线观看 | 在线不卡一区 | 久久人人网 | 99热播放| 午夜免费网站 | 国产日产精品一区二区三区四区 | 中文字幕在线免费视频 | 欧美成人a | 精品国产高清一区二区三区 | 99免费在线视频 | 一级免费在线视频 | 99亚洲精品| 一级毛片在线播放 | 久久精品国产一区 | 99久久精品一区二区毛片吞精 | 日韩亚洲欧美一区 | 天天干天天插 | 国产精品国产精品 | 国产精品久久久久久一区二区三区 | 日本精品在线观看 | 国产精品精品视频 | 亚洲一区中文 | 一本一道久久a久久精品蜜桃 | 欧美一区二区三区四区视频 | 国产精品一区在线观看 | 日韩色视频 | 午夜日韩| 国产中文视频 | 五月天婷婷丁香 | 成人水多啪啪片 | 日本精品一区二区三区在线观看视频 | 精品国产女人 | 99精品久久久国产一区二区三 | 久久久久资源 | 91免费视频观看 | 免费v片| 久久亚洲一区二区三区四区 | 亚洲国产精品99久久久久久久久 | 成年人网站国产 | 国产一区二区三区免费 |