找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3642|回复: 3
收起左侧

DS1307+LCD12864调通的单片机源程序,带大字库

[复制链接]
ID:290752 发表于 2018-4-9 15:30 | 显示全部楼层 |阅读模式
3.5元买到一个I2C器件(ds1307+AT24C32),用12864LCD显示。内有大字字库,和一个大字,占两行的显示程序。
微信图片_20180409151647.jpg 微信图片_20180409152237.jpg 微信图片_20180409151703.jpg
微信图片_20180409151703.jpg 微信图片_20180409151647.jpg
单片机源程序如下:
  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, 下载次数: 163)

评分

参与人数 2黑币 +108 收起 理由
qq805838622 + 8
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表