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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1307+LCD12864調通的單片機源程序,帶大字庫

[復制鏈接]
跳轉到指定樓層
樓主
3.5元買到一個I2C器件(ds1307+AT24C32),用12864LCD顯示。內有大字字庫,和一個大字,占兩行的顯示程序。


單片機源程序如下:
  1. /********************************************************************
  2. * 文件名  : 串行12864顯示.c
  3. * 描述    :  該程序實現了12864以串行的方式進行通信。用DS1307計時
  4. * 創建人  :  田*
  5. * 版本號  : 2.0
  6. ***********************************************************************/
  7. #include <reg52.h>
  8. #include <intrins.h>
  9. #include <stdio.h>
  10. #define uchar unsigned char
  11. #define uint  unsigned int
  12.          uchar code pic0[];
  13.            uchar code pic1[];
  14.          uchar code IC_DAT1[12];
  15.          uchar code IC_DAT2[];
  16.          uchar code IC_DAT3[];
  17.         uchar code IC_DAT4[];
  18.     uchar code IC_DAT5[];
  19.     uchar code IC_DAT6[];
  20.     uchar code IC_DAT7[];
  21.         uchar code IC_DAT8[];
  22.     uchar code IC_DAT9[];
  23.                            uchar code dazhi [][48];
  24.                                   uchar code IC_DAT[12]= "0123456789- ";
  25.                           uchar x,y,z,n1,n2,y1,y2,r1,r2;
  26. void DisplayGraphic(uchar code *adder);
  27. void DisplayGraphic1(uchar code *adder);
  28. void DisplayGraphic2(uchar code *adder);
  29.                         
  30. sbit CS=P2^0;            //片選信號
  31. sbit SID=P2^1;                //數據信號
  32. sbit SCLK=P2^2;                //時鐘信號
  33. sbit RST=P2^4;                //復位信號
  34. sbit CH = P2^3;                //并行、串行選擇信號


  35. sbit SQ=P1^1;                //一Hz輸入端
  36. sbit DS=P1^2;            //溫度輸入端
  37. sbit SCL=P1^3;                 //I2C時鐘輸出端
  38. sbit SDA=P1^4;                 //I2C數據線


  39. sbit S1 = P3^5;


  40.   /********************************************************************
  41. * 名稱 : I2C模塊程序
  42. * 功能 : 延時,延時時間為 100us * t。這是通過軟件延時,有一定誤差。
  43. * 輸入 : t
  44. * 輸出 : 無
  45. ***********************************************************************/

  46. /********************************************************************
  47. * 名稱 : delay()
  48. * 功能 : 延時,延時時間為 100us * t。這是通過軟件延時,有一定誤差。
  49. * 輸入 : t
  50. * 輸出 : 無
  51. ***********************************************************************/


  52.           void delay(uint time)
  53.         {
  54.                 uint i,j;
  55.                 for(i=0;i<time;i++)
  56.                         for(j=0;j<10;j++);
  57.         }




  58.           void I2c_start()
  59.         {
  60.                 SDA=1;
  61.                 delay(1);
  62.                 SCL=1;
  63.                 delay(1);           
  64.                 SDA=0;
  65.                 delay(1);      
  66.                 SCL=0;
  67.                 delay(1);
  68.         }
  69.         
  70.         
  71.         void I2c_stop()
  72.         {
  73.                 SDA=0;
  74.                 delay(1);
  75.                 SCL=1;
  76.                 delay(1);      
  77.                 SDA=1;
  78.                 delay(1);
  79.         }
  80.         
  81.         //·¢?íack
  82.         void I2c_sendAck(bit ack)
  83.         {
  84.             SDA = ack;      
  85.             SCL = 1;      
  86.             delay(1);   
  87.             SCL = 0;
  88.                 delay(1);
  89.                         
  90.         }
  91.         
  92.         //"?è?ack
  93.         bit I2c_getAck(void)
  94.         {
  95.             bit ack;        
  96.             SDA = 1;        
  97.             SCL = 1;        
  98.             delay(1);   
  99.             ack = SDA;      
  100.             SCL = 0;
  101.             return ack;
  102.         }
  103.         
  104.         uchar I2c_read()
  105.         {
  106.                 uchar i,dat=0;
  107.                 SDA=1;
  108.                 delay(1);
  109.                 for(i=0;i<8;i++)
  110.                 {
  111.                         SCL=1;
  112.                         delay(1);
  113.                         dat<<=1;
  114.                         dat|=SDA;
  115.                         delay(1);
  116.                         SCL=0;
  117.                 }
  118.                 return dat;
  119.         }
  120.         
  121.         void I2c_write(uchar dat)
  122.         {
  123.                 uchar i;
  124.                 for(i=0;i<8;i++)
  125.                 {
  126.                         SDA=dat>>7;
  127.                         dat<<=1;
  128.                 delay(1);
  129.                 SCL=1;
  130.                         delay(1);
  131.                         SCL=0;
  132.                 delay(1);

  133.                 }                I2c_getAck();
  134.         }        
  135.         void I2c_toDevice(uchar deviceAdd,uchar datAdd,uchar dat)
  136.         {
  137.                 I2c_start();
  138.                 I2c_write(deviceAdd);
  139.                 I2c_write(datAdd);
  140.                 I2c_write(dat);
  141.                 I2c_stop();
  142.         }
  143.         uchar I2c_fromDevice(uchar deviceAdd,uchar datAdd  )
  144.         {
  145.                 uchar dat;
  146.                 I2c_start();
  147.                 I2c_write(deviceAdd);
  148.                 I2c_write(datAdd);
  149.                 I2c_start();
  150.                 I2c_write(deviceAdd+1);
  151.                 dat=I2c_read();
  152.                 I2c_sendAck(1);
  153.                 I2c_stop();
  154.                 return dat;
  155.         }







  156. /********************************************************************
  157. * 名稱 : sendbyte()
  158. * 功能 : 按照液晶的串口通信協議,發送數據
  159. * 輸入 : zdata
  160. * 輸出 : 無
  161. ***********************************************************************/
  162. void sendbyte(unsigned char zdata)
  163. {
  164.         unsigned int i;
  165.         for(i=0; i<8; i++)
  166.         {
  167.                 if((zdata << i) & 0x80)
  168.                 {
  169.                         SID = 1;
  170.                 }
  171.                 else
  172.                 {
  173.                         SID = 0;
  174.                 }
  175.                 SCLK = 0;
  176.                 SCLK = 1;
  177.         }
  178. }

  179. /********************************************************************
  180. * 名稱 : write_com()
  181. * 功能 : 寫串口指令
  182. * 輸入 : cmdcode
  183. * 輸出 : 無
  184. ***********************************************************************/
  185. void write_com(unsigned char cmdcode)
  186. {
  187.         CS = 1;
  188.         sendbyte(0xf8);
  189.         sendbyte(cmdcode & 0xf0);
  190.         sendbyte((cmdcode << 4) & 0xf0);
  191.         delay(2);
  192. }

  193. /********************************************************************
  194. * 名稱 : write_data()
  195. * 功能 : 寫串口指令
  196. * 輸入 : cmdcode
  197. * 輸出 : 無
  198. ***********************************************************************/
  199. void write_data(unsigned char Dispdata)
  200. {
  201.         CS = 1;
  202.         sendbyte(0xfa);
  203.         sendbyte(Dispdata & 0xf0);
  204.         sendbyte((Dispdata << 4) & 0xf0);
  205.         delay(2);
  206. }

  207. /********************************************************************
  208. * 名稱 : lcdinit()
  209. * 功能 : 初始化函數
  210. * 輸入 : cmdcode
  211. * 輸出 : 無
  212. ***********************************************************************/
  213. void lcdinit()
  214. {  
  215.         RST = 0;
  216.         delay(100);
  217.         RST = 1;
  218.         delay(20000);
  219.         write_com(0x30);
  220.         delay(50);
  221.                   
  222.         write_com(0x0c);
  223.         delay(50);
  224. }
  225.                                    /********************************************************************
  226. * 名稱 : lcdinit1()
  227. * 功能 : 初始化函數
  228. * 輸入 : cmdcode
  229. * 輸出 : 無
  230. ***********************************************************************/
  231. void lcdinit1()
  232. {  
  233.         RST = 0;
  234.         delay(100);
  235.         RST = 1;
  236.         delay(20000);
  237.         write_com(0x34);
  238.                          delay(50);
  239.                   write_com(0x36);

  240.         delay(50);

  241. }


  242. /********************************************************************
  243. * 名稱 : hzkdis()
  244. * 功能 : 顯示字符串
  245. * 輸入 : *s
  246. * 輸出 : 無
  247. ***********************************************************************/
  248. void hzkdis(unsigned char code *s)
  249. {  
  250.         while(*s > 0)
  251.     {
  252.                 write_data(*s);
  253.                 s++;
  254.                 delay(50);
  255.     }
  256. }





  257.   



  258. /********************************************************************
  259. * 名稱 : Test()
  260. * 功能 : 顯示子函數
  261. * 輸入 : 無
  262. * 輸出 : 無
  263. ***********************************************************************/
  264. void Test()
  265. {  
  266.         write_com(0x03);
  267.                           delay(50);   
  268.         write_com(0x88);
  269.         if(I2c_fromDevice(0xd0,0x02) & 0x20 =0x20)
  270.         hzkdis("PM");
  271.         else
  272.                 hzkdis("AM");
  273.         delay(50);   
  274.         write_com(0x98);
  275.                    hzkdis("20");
  276.                 delay(20);
  277.                 write_data(0x30+n2);
  278.                                 delay(20);
  279.                 write_data(0x30+n1);
  280.                  delay(20);

  281.                          write_data(0x2d);
  282.                  delay(20);
  283.                                  write_data(0x30+y2);
  284.                                 delay(20);
  285.                 write_data(0x30+y1);
  286.                  delay(20);

  287.                                 write_data(0x2d);
  288.                  delay(20);

  289.                    write_data(0x30+r2);
  290.                                 delay(20);
  291.                 write_data(0x30+r1);
  292.                  delay(20);

  293. switch (z)
  294.     { case 0:         hzkdis("  周日") ;break;
  295.          case 1:         hzkdis("  周一") ;break;
  296.          case 2:         hzkdis("  周二") ;break;
  297.          case 3:         hzkdis("  周三") ;break;
  298.          case 4:         hzkdis("  周四") ;break;
  299.          case 5:         hzkdis("  周五") ;break;
  300.          case 6:         hzkdis("  周六") ;break;  }
  301. }


  302. /********************************************************************
  303. * 名稱 : Main()
  304. * 功能 : 主函數
  305. * 輸入 : 無
  306. * 輸出 : 無
  307. ***********************************************************************/
  308. void Main()
  309. {
  310.          while(1)
  311.    //以下從DS1307讀數據
  312. {                   uchar ii,num,num1,num2,num00,num01,num02 ,num3,num4,num5,num6;
  313.                 I2c_toDevice(0xd0,0x00,0x04);
  314.                         delay(20);
  315.                           
  316.                           I2c_toDevice(0xd0,0x07,0x010);
  317.                 delay(30);




  318.                   
  319.                            

  320.         //以下將數據送LCD顯示


  321.         CH = 0;
  322.         delay(1);
  323.         lcdinit();
  324.         delay(10);
  325.                 write_com(0x01);
  326.                    z=I2c_fromDevice(0xd0,0x03);
  327.                         
  328.           //
  329.                 num4=I2c_fromDevice(0xd0,0x04);

  330.                 r1=num4 & 0x0f;
  331.                   r2=(num4 >> 4) & 0x0f;

  332.                   num5=I2c_fromDevice(0xd0,0x05);

  333.                 y1=num5 & 0x0f;
  334.                   y2=(num5 >> 4) & 0x0f;

  335.                    num6=I2c_fromDevice(0xd0,0x06);

  336.                 n1=num6 & 0x0f;
  337.                   n2=(num6 >> 4) & 0x0f;

  338.                  



  339.                            
  340.                  Test();

  341.                          lcdinit1();
  342.         delay(10);
  343.          
  344.                           DisplayGraphic(pic1);
  345.                         
  346.                           num01=1;

  347.    while (num01+num02>0)

  348.          { num00=I2c_fromDevice(0xd0,0x02);

  349.                  num01=num00 & 0x0f;
  350.                   num02=(num00 >> 4) & 0x01;

  351.                          num1=1;
  352.         while(num1+num2>0)
  353. {           

  354.                  


  355.                 num=I2c_fromDevice(0xd0,0x01);

  356.                  num1=num & 0x0f;
  357.                   num2=(num >> 4) & 0x0f;
  358.                           

  359.            x=0;        
  360.                         
  361.                  z=13;
  362.      DisplayGraphic1(dazhi);  //顯示圖片(負號)

  363.                 x=1;        
  364.                         
  365.                  z=2;
  366.      DisplayGraphic1(dazhi);  //顯示圖片(2)
  367.           x=2;        
  368.                         
  369.                  z=5;
  370.      DisplayGraphic1(dazhi);  //顯示圖片(5)

  371.            x=1;        
  372.                  if(num02==1)        
  373.                 z=1;
  374.                 else  
  375.             z=15;
  376.      DisplayGraphic2(dazhi);  //顯示圖片(1)
  377.                  x=2;        
  378.                         
  379.             z=num01;
  380.      DisplayGraphic2(dazhi);  //顯示圖片2
  381.                
  382.                  
  383.                    x=4;        
  384.                         
  385.             z=num2;

  386.      DisplayGraphic2(dazhi);  //顯示圖片2

  387.                    x=5;        
  388.                         
  389.             z=num1;
  390.      DisplayGraphic2(dazhi);  //顯示圖片2
  391.                 x=7;        
  392.                         
  393.             z=14;
  394.      DisplayGraphic2(dazhi);  //顯示圖片2
  395.                
  396.                  x=6;        
  397.                         
  398.                  z=6;



  399.      DisplayGraphic1(dazhi);  //顯示圖片2


  400.                  x=3;        
  401.                         
  402.                  z=10;
  403.      DisplayGraphic1(dazhi);  //顯示圖片2

  404.                 x=5;        
  405.                         
  406.                  z=5;
  407.      DisplayGraphic1(dazhi);  //顯示圖片2
  408.            x=6;        
  409.                         
  410.                  z=6;
  411.      DisplayGraphic1(dazhi);  //顯示圖片2
  412.                   x=7;        
  413.                         
  414.                  z=11;
  415.      DisplayGraphic1(dazhi);  //顯示圖片2
  416.                   
  417.                            
  418.                                                 delay(10);        
  419.                                    
  420.           for (ii=0;ii<29;ii++)
  421.           {
  422.                   while(SQ) ;
  423.                    while (!SQ) ;
  424.         
  425.         delay (5);
  426.                 x=3;        
  427.                         
  428.             z=12;
  429.      DisplayGraphic2(dazhi);  //顯示圖片2

  430.                          while(SQ) ;
  431.         
  432.                    while (!SQ) ;

  433.            x=3;        
  434.                         
  435.             z=15;
  436.      DisplayGraphic2(dazhi);  //顯示圖片2

  437.             if (         S1 == 0 )
  438.         {
  439.         delay (5);
  440.                 if ( S1 ==0 )
  441.                 {  while ( !S1 );
  442.                 }
  443.                   
  444.                 I2c_toDevice(0xd0,0x01,0x045);
  445.                         delay(20);
  446.                                 I2c_toDevice(0xd0,0x02,0x46);
  447.                         delay(20);
  448.                          I2c_toDevice(0xd0,0x03,0x06);
  449.                         delay(20);
  450.                                 I2c_toDevice(0xd0,0x04,0x07);
  451.                         delay(20);
  452.                          I2c_toDevice(0xd0,0x05,0x04);
  453.                         delay(20);
  454.                                 I2c_toDevice(0xd0,0x06,0x18);
  455.                         delay(20);
  456.                                  
  457.                            }




  458.           }
  459.          

  460.                 }


  461.                   }         
  462.            
  463.                  }
  464.            
  465.                  }


  466.          

  467.   //*******顯示第行的內容設置
  468.     void DisplayGraphic1(unsigned char code *adder)
  469. {
  470.          int i,j;

  471.                   adder= adder+48*z;
  472.                            
  473.    for(i=0;i<24;i++)              //
  474.     {
  475.       write_com(0x80 + i); //SET  垂直地址 VERTICAL ADD
  476.       write_com(0x80+x);       //SET  水平地址 HORIZONTAL ADD
  477.       for(j=0;j<2;j++)
  478.        {
  479.          write_data(*adder);
  480.          adder++;
  481.        }
  482.     }           
  483.         }


  484.     //顯示第二行內容
  485. void DisplayGraphic2(unsigned char code *adder)
  486. {
  487.          int i,j;

  488.                    adder= adder+48*z;
  489. //*******顯示上半屏內容設置
  490.                            
  491.    for(i=0;i<8;i++)              //
  492.     {
  493.       write_com(0x98 + i); //SET  垂直地址 VERTICAL ADD
  494.       write_com(0x80+x);       //SET  水平地址 HORIZONTAL ADD
  495.       for(j=0;j<2;j++)
  496.        {
  497.          write_data(*adder);
  498.          adder++;
  499.        }
  500.     }           
  501.                   
  502.         
  503.            
  504. //*******顯示下半屏內容設置
  505.   for(i=0;i<16;i++)              //
  506.     {
  507.       write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD
  508.       write_com(0x88+x);       //SET 水平地址 HORIZONTAL ADD
  509.       for(j=0;j<2;j++)
  510.        {
  511.          write_data(*adder);
  512.          adder++;
  513.        }
  514.     }         
  515. }





  516. //顯示全屏內容
  517. void DisplayGraphic(unsigned char code *adder)
  518. {
  519.          int i,j;


  520. //*******顯示上半屏內容設置
  521.                            
  522.    for(i=0;i<32;i++)              //
  523.     {
  524.       write_com(0x80 + i); //SET  垂直地址 VERTICAL ADD
  525.       write_com(0x80);       //SET  水平地址 HORIZONTAL ADD
  526.       for(j=0;j<16;j++)
  527.        {
  528.          write_data(*adder);
  529.          adder++;
  530.        }
  531.     }           
  532.                   
  533.         
  534.            
  535. //*******顯示下半屏內容設置
  536.   for(i=0;i<32;i++)              //
  537.     {
  538.       write_com(0x80 + i); //SET 垂直地址 VERTICAL ADD
  539.       write_com(0x88);       //SET 水平地址 HORIZONTAL ADD
  540.       for(j=0;j<16;j++)
  541. ……………………

  542. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
DS1307 LCD12864程序.rar (219.21 KB, 下載次數: 164)




評分

參與人數 2黑幣 +108 收起 理由
qq805838622 + 8
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:447180 發表于 2018-12-27 13:08 | 只看該作者
DS1307速率時鐘100khz。延時時間應為10微秒,程序中為延時時間為 100us 。如果延時不是100微秒。會不會出現通訊不成功?
回復

使用道具 舉報

板凳
ID:254687 發表于 2019-3-17 17:08 | 只看該作者
下載學習,好東西
回復

使用道具 舉報

地板
ID:759490 發表于 2020-5-23 22:37 | 只看該作者
不錯,我也在搞這個
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频一区二区三区 | 国产成人精品一区二区三区在线 | 亚洲一区日韩 | 日韩美女爱爱 | 亚洲精品综合一区二区 | 7777精品伊人久久精品影视 | 一区在线观看 | 超碰在线久| 亚洲精品视频久久 | 亚洲国产精品日韩av不卡在线 | 欧美精品网站 | 亚洲免费视频在线观看 | 国产精品美女久久久久久久久久久 | 午夜av电影 | 超碰97人人人人人蜜桃 | 久久久婷| www久久久| 伊人免费在线观看高清 | 在线观看中文字幕一区二区 | 亚洲精品久 | 黄色精品 | 精品一区二区三区中文字幕 | 黄色大片网站 | 亚洲三区在线观看 | 黄免费看 | av日韩在线播放 | av一区二区三区 | 九九久久国产 | 国产精品高潮呻吟 | 91在线视频免费观看 | 亚洲色图插插插 | 日日夜夜视频 | 久久亚洲春色中文字幕久久久 | 久久久91精品国产一区二区精品 | 亚洲精品国产精品国自产在线 | 亚洲啪啪一区 | 91精品国产乱码久久久久久久久 | 久久久久亚洲 | 亚洲成人激情在线观看 | 九九导航 | 99re国产 |