找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4295|回复: 2
收起左侧

STC89C52RC控制不带字库LCD12864液晶显示器实现万年历仿真

[复制链接]
ID:371577 发表于 2018-7-22 16:56 | 显示全部楼层 |阅读模式
0.png

单片机万年历仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源码:
  1. #include<reg52.h>
  2. #include"LCD12864.h"
  3. #include"ds1302.h"
  4. #include"temp.h"
  5. sbit K1=P3^4;
  6. sbit K2=P3^5;
  7. sbit K3=P3^6;
  8. sbit K4=P3^7;
  9. sbit beep=P1^6;


  10. void LCD12864_Delay1ms(uint c);                                   //  延时
  11. void Delay10ms();
  12. uchar LCD12864_Busy(void);                                           //LCD忙检测
  13. void LCD12864_WriteCmd(uchar cmd);
  14. void LCD12864_WriteData(uchar dat);
  15. void LCD12864_Init();
  16. void LCD12864_ClearScreen();
  17. void hanzi(uchar ye,uchar lie,uchar *daima);         //LCD显示汉字
  18. void shuzi(uchar ye,uchar lie,uchar *daima);         //LCD显示数字
  19. void hanzif(uchar ye,uchar lie,uchar *daima);         //LCD显示汉字反白
  20. void shuzif(uchar ye,uchar lie,uchar *daima);         //LCD显示数字反白
  21. void tupiandisplay();                           //图片显示
  22. void display();                                                //LCD显示
  23. void IntConfiguration();                   //外部中断配置
  24. void zhuanhuan(int temp);                   //18B20  BCD码转换
  25. //void beepsound();                                   //蜂鸣器响           
  26. void clockdisplay();                           //闹钟界面显示
  27. unsigned char SetState,SetState1,flag;                //标志变量
  28. char SetPlace=-1,SetPlace1=-1;                                //设置参数,因为中断的时候就会先加1,所以开始设为-1
  29. unsigned char datas[]={0,0,0};                                //温度值存储参数
  30. extern  char TIME[7];          // 1302时间值存储参数,存储顺序是秒分时日月周年,存储格式是用BCD码
  31. char TIME1[4] = {0,0,12,0};         //闹钟时间值存储参数


  32. void main()
  33. {
  34.     unsigned char s;
  35.         LCD12864_Init();                 //LCD12864初始化
  36.     LCD12864_ClearScreen();         //清屏
  37. //        tupiandisplay();                 //开机图片显示
  38. //        LCD12864_Delay1ms(1000);
  39. //        LCD12864_ClearScreen();
  40.         Ds1302Init();                          //Ds1302初始化
  41.         IntConfiguration();                  //外部中断设置
  42.         while(1)
  43.         {
  44.                     if((SetState==0)&&(flag==0))                                                         
  45.                 {
  46.                         Ds1302ReadTime();
  47.                         display();
  48.                 }
  49.                         if((SetState==1)&&(flag==0))                                                          //调时,SetState是调时标志,SetState=1表示处于调时状态
  50.                 {
  51.                                                 
  52.                                          switch(SetPlace)                                                                  //反白显示处于的位置
  53.                                                         {
  54.                                                            
  55.                                                           case(0):
  56.                                                 
  57.                                                                                 Right(); //秒数反白,调秒
  58.                                                                                 shuzif(4,0,num[TIME[0]/16]);
  59.                                                                             shuzif(4,8,num[TIME[0]%16]);
  60.                                                                           break;
  61.                                                          
  62.                                                          
  63.                                                           case(1):
  64.                                                                         
  65.                                                                            Left(); //分数反白
  66.                                                                            shuzif(4,32,num[TIME[1]/16]);
  67.                                                   shuzif(4,40,num[TIME[1]%16]);
  68.                                                                           break;
  69.                                                            case(2):
  70.                                                                
  71.                                                                                   Left();         //小时反白
  72.                                                                                 shuzif(4,0,num[TIME[2]/16]);
  73.                                                     shuzif(4,8,num[TIME[2]%16]);
  74.                                                                           break;
  75.                                                             case(3):
  76.                                                                
  77.                                                                            Right(); //日期反白
  78.                                                                                   shuzif(0,16,num[TIME[3]/16]);
  79.                                                     shuzif(0,24,num[TIME[3]%16]);
  80.                                                                           break;
  81.                                                             case(4):
  82.                                                                
  83.                                                                            Left(); //月反白
  84.                                                                            shuzif(0,48,num[TIME[4]/16]);
  85.                                                    shuzif(0,56,num[TIME[4]%16]);  
  86.                                                                           break;
  87.                                                             case(5):
  88.                                                                            Left(); //星期反白
  89.                                                                          hanzif(2,32,num1[TIME[5]%16]);
  90.                                                                           break;
  91.                                                                  case(6):
  92.                                                                            Left(); //年反白
  93.                                                                           shuzif(0,16,num[TIME[6]/16]);
  94.                                                      shuzif(0,24,num[TIME[6]%16]);
  95.                                                                           break;
  96.                                                                         }        
  97.                         
  98.                                                 
  99.                                         if(K2==0)                //检测按键K2是否按下
  100.                                         {
  101.                                                 Delay10ms();        //消除抖动
  102.                                                 if(K2==0)
  103.                                                 {
  104.                                                         TIME[SetPlace]++;
  105.                                                         if((TIME[SetPlace]&0x0f)>9)                                         //        TIME[]是BCD码格式的,BCD码低四位最多到9,即00001001(0x09BCD),当再进一位时,变为00010000(0x10BCD)而不是00001010
  106.                                                         {                                                                                         //00001010十进制数实际为10,而00010000实际为16,相差了6。下面的情况同理
  107.                                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  108.                                                         }
  109.                                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //秒只能到59
  110.                                                         {
  111.                                                                 TIME[SetPlace]=0;
  112.                                                         }
  113.                                                 
  114.                                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  115.                                                         {
  116.                                                                 TIME[SetPlace]=0;
  117.                                                         }
  118.                                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  119.                                                         {
  120.                                                                 TIME[SetPlace]=0;        
  121.                                                         }
  122.                                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  123.                                                         {
  124.                                                                 TIME[SetPlace]=0;
  125.                                                         }        
  126.                                                         if((TIME[SetPlace]>0x6)&&(SetPlace==5))                //周只能到7
  127.                                                         {
  128.                                                                 TIME[SetPlace]=0;
  129.                                                         }
  130.                                                         if((TIME[SetPlace]>=0x99)&&(SetPlace==6))                //这里的年位数最多到99
  131.                                                         {
  132.                                                                 TIME[SetPlace]=0x99;
  133.                                                         }               
  134.                                                 
  135.                                                 }
  136.                                                 
  137.                                                 while((K2==0));         //检测按键是否松开
  138.                                                 
  139.                                         }
  140.                                        
  141.                                         if(K3==0)                //检测按键K3是否按下
  142.                                         {
  143.                                                 Delay10ms();        //消除抖动
  144.                                                 if(K3==0)
  145.                                                 {
  146.                                                         
  147.                                                         TIME[SetPlace]--;
  148.                                                         if((TIME[SetPlace]&0x0f)==0x0f)                                         //          比如BCD码为10的数二进制为0001 0000。再减1,则为0000 1111。此时BCD码应为09,但实际的为15,差了6.
  149.                                                         {
  150.                                                                 TIME[SetPlace]=TIME[SetPlace]-6;
  151.                                                         }
  152.                                                     if((TIME[SetPlace]<0x00)&&(SetPlace<2))                //分秒只能到59
  153.                                                         {
  154.                                                                 TIME[SetPlace]=89;                                                //59BCD的十进制为89.
  155.                                                         }
  156.                                                         if((TIME[SetPlace]<0x00)&&(SetPlace==2))                //小时只能到23
  157.                                                         {
  158.                                                                 TIME[SetPlace]=35;                                                //23BCD的十进制为35
  159.                                                         }
  160.                                                         if((TIME[SetPlace]==0x00)&&(SetPlace==3))                //日只能到31
  161.                                                         {
  162.                                                                 TIME[SetPlace]=49;                                                  //32BCD的十进制为49
  163.                                                         }
  164.                                                         if((TIME[SetPlace]==0x00)&&(SetPlace==4))                //月只能到12
  165.                                                         {
  166.                                                                 TIME[SetPlace]=18;                                                         //12BCD的十进制为18
  167.                                                         }        
  168.                                                         if((TIME[SetPlace]<0x00)&&(SetPlace==5))                //周只能到7
  169.                                                         {
  170.                                                                 TIME[SetPlace]=6;                                                        //7BCD的十进制为7
  171.                                                         }
  172.                                                         
  173.                                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==6))                //年只能到0-99
  174.                                                         {
  175.                                                                 TIME[SetPlace]=0x00;
  176.                                                         }                        
  177.                
  178.                                                 }
  179.                                                 
  180.                                                 while((K3==0));         //检测按键是否松开        
  181.                                         }
  182.                                        
  183.                                                 display();                                                                                                               
  184.                     }
  185.                
  186.                          if(flag==1)                                                                                                           //调闹钟,flag是闹钟标志,当flag=1表示进入闹钟界面
  187.              {
  188.                                           LCD12864_ClearScreen();
  189.                                           while(flag==1)
  190.                                           {
  191.                                               switch(SetPlace1)                                                                   //反白显示位置,与调时类似
  192.                                 
  193.                                                    {
  194.                                                           case(0):                                
  195.                                                                         
  196.                                                                         Right(); //秒数反白
  197.                                                      shuzif(2,16,num[TIME1[0]/10]);
  198.                                                                         shuzif(2,24,num[TIME1[0]%10]);
  199.                                                                     break;  
  200.                                                           case(1):
  201.                                                                         
  202.                                                                             Left(); //分数反白
  203.                                                                                 shuzif(2,48,num[TIME1[1]/10]);
  204.                                                     shuzif(2,56,num[TIME1[1]%10]);
  205.                                                                           break;
  206.                                                            case(2):
  207.                                                                
  208.                                                                                   Left();         //小时反白
  209.                                                                                 shuzif(2,16,num[TIME1[2]/10]);
  210.                                                     shuzif(2,24,num[TIME1[2]%10]);
  211.                                                                           break;
  212.                                                          
  213.                                                            case(3):
  214.                                                                                   Right();
  215.                                                      hanzif(0,0,num2[TIME1[6]]);
  216.                                                                              break;
  217.                                                                         }  


  218.                                                                 if(K2==0)
  219.                                                                 {
  220.                                                                                 Delay10ms();        //消除抖动
  221.                                                                                 if(K2==0)
  222.                                                                                 {
  223.                                                                                         TIME1[SetPlace1]++;

  224.                                                                                         if((TIME1[SetPlace1]==60)&&(-1<SetPlace1<2))         //秒分最多到59
  225.                                                                            {
  226.                                                                                       TIME1[SetPlace1]=0;                                       
  227.                                                                            }   
  228.                
  229.                                                                                         if((TIME1[SetPlace1]==24)&&(SetPlace1==2))
  230.                                                                            {
  231.                                                                                       TIME1[SetPlace1]=0;                                                //小时最多到23
  232.                                                                            }              
  233.                                                                                         if((TIME1[SetPlace1]==2)&&(SetPlace1==3))                //关和开,0表示关,1表示开
  234.                                                                            {
  235.                                                                                       TIME1[SetPlace1]=0;
  236.                                                                                                   LCD12864_Delay1ms(1);                                                        
  237.                                                                            }   
  238.                                                                                   }
  239.                                                                                         while((K2==0));         //检测按键是否松开                        
  240.                                                                  }
  241.                                                                
  242.                                                                 if(K3==0)
  243.                                                                 {
  244.                                                                                 Delay10ms();        //消除抖动
  245.                                                                                 if(K3==0)
  246.                                                                                 {
  247.                                                                                         TIME1[SetPlace1]--;
  248.                                                                                         if((TIME1[SetPlace1]<0)&&(SetPlace1==0))                           //秒减到0后变为59
  249.                                                                            {
  250.                                                                                       TIME1[SetPlace1]=59;                                       
  251.                                                                            }   
  252.                                                                                                 if((TIME1[SetPlace1]<0)&&(SetPlace1==1))                  //分
  253.                                                                            {
  254.                                                                                       TIME1[SetPlace1]=59;                                       
  255.                                                                            }   

  256.                                                                                         if((TIME1[SetPlace1]<0)&&(SetPlace1==2))                         //小时
  257.                                                                            {
  258.                                                                                       TIME1[SetPlace1]=23;                                       
  259.                                                                            }              
  260.                                                                                         if((TIME1[SetPlace1]<0)&&(SetPlace1==3))                         //关和开
  261.                                                                            {
  262.                                                                                       TIME1[SetPlace1]=1;
  263.                                                                                                      LCD12864_Delay1ms(1);                                                
  264.                                                                            }   
  265.                                                                                   }               
  266.                                                                                         while((K3==0));         //检测按键是否松开               
  267.                                                                 }
  268.                                                           clockdisplay();         //闹钟界面显示
  269.                                                         
  270.                                            }

  271.                                                    LCD12864_ClearScreen();        //清屏
  272.                          }
  273.                                          for(s=1;s<3;s++)
  274.                                         if((TIME[s]==TIME1[s])&&(TIME1[3]==1))
  275.                                         {
  276.                                     beep=0;
  277.                               LCD12864_Delay1ms(500);
  278.                                   beep=1;
  279.                                   LCD12864_Delay1ms(500);
  280.                                 }
  281.                                                         else{
  282.                                    beep=1;
  283.                                         }

  284.                         /*  for(s=1;s<3;s++)
  285.                           {
  286.                                 if((TIME[s]==TIME1[s])&&(TIME1[3]==1))                                 //闹钟到时,即小时和分相等时,显闹钟在开状态
  287.                                 {
  288.                                   beepsound();                                                                                 //响蜂鸣器,响1分钟,当分钟不相等时,自动退出
  289.                                  // LCD12864_Delay1ms(10000);  
  290.                                 }
  291.                             else;
  292.                           
  293.                           }*/
  294.              }
  295. }

  296. /*******************************************************************************
  297. * 函数名         : LcdDisplay()
  298. * 函数功能                   : 显示函数
  299. * 输入           : 无
  300. * 输出                  : 无
  301. *******************************************************************************/
  302. void display()
  303. {
  304.    
  305.         Left(); //左半屏
  306.     shuzi(0,0,num[2]);
  307.         shuzi(0,8,num[0]);                                                 //年
  308.         shuzi(0,16,num[TIME[6]/16]);
  309.         shuzi(0,24,num[TIME[6]%16]);
  310.         hanzi(0,32,nian);
  311.         shuzi(0,48,num[TIME[4]/16]);                        //月
  312.         shuzi(0,56,num[TIME[4]%16]);
  313.         
  314.         hanzi(2,0,xing);
  315.         hanzi(2,16,qi);
  316.         hanzi(2,32,num1[TIME[5]%16]);  //星期

  317.         shuzi(4,0,num[TIME[2]/16]);
  318.         shuzi(4,8,num[TIME[2]%16]);                                        //时
  319.         hanzi(4,16,shi);
  320.         shuzi(4,32,num[TIME[1]/16]);                           //分
  321.         shuzi(4,40,num[TIME[1]%16]);
  322.         hanzi(4,48,fen);

  323.         zhuanhuan(Ds18b20ReadTemp());            //显示温度
  324.         shuzi(6,0,num[datas[0]]);
  325.         shuzi(6,8,num[datas[1]]);
  326.         shuzi(6,16,dian);                                   //小数点
  327.         shuzi(6,24,num[datas[2]]);
  328.         hanzi(6,32,fuhao);                                   //℃

  329.         Right(); //右半屏
  330.         hanzi(0,0,yue);
  331.         shuzi(0,16,num[TIME[3]/16]);                //日期
  332.         shuzi(0,24,num[TIME[3]%16]);
  333.         hanzi(0,32,ri);

  334.         shuzi(4,0,num[TIME[0]/16]);                        //秒
  335.         shuzi(4,8,num[TIME[0]%16]);
  336.         hanzi(4,16,miao);
  337. }

  338. /*******************************************************************************
  339. * 函数名         : IntConfiguration()
  340. * 函数功能                   : 配置外部中断0和中断1
  341. * 输入           : 无
  342. * 输出                  : 无
  343. *******************************************************************************/

  344. void IntConfiguration()
  345. {
  346.         //设置INT0
  347.         IT0=1;//跳变沿出发方式(下降沿)
  348.         EX0=1;//打开INT0的中断允许。
  349.         //设置INT1
  350.         IT1=1;
  351.         EX1=1;
  352.         EA=1;//打开总中断        
  353. }


  354. /*******************************************************************************
  355. * 函数名         : Int0()
  356. * 函数功能                   : 外部中断0 中断函数
  357. * 输入           : 无
  358. * 输出                  : 无
  359. *******************************************************************************/

  360. void Int0() interrupt 0                 
  361. {
  362. //        Delay10ms();
  363.         if((K1==0)&&(flag==0))                // 调时
  364.                         {
  365.                                 Delay10ms();        //消除抖动
  366.                                 if((K1==0)&&(flag==0))
  367.                                 {
  368.                                     SetState=1;
  369.                             Ds1302Init();
  370.                   
  371.                                         SetPlace++;
  372.                                         if(SetPlace==7)                                        //时间选择键,按一次移一位,从0-7最多8位
  373.                                         {        
  374.                                             SetPlace=0;
  375.                                         }                                       
  376.                                 }                        

  377.                                 while(K1==0);         //检测按键是否松开
  378.                           }
  379.    
  380. }
  381. /*******************************************************************************
  382. * 函数名         : Int1()
  383. * 函数功能                   : 外部中断1 中断函数
  384. * 输入           : 无
  385. * 输出                  : 无
  386. *******************************************************************************/

  387. void Int1() interrupt 2
  388. {
  389.    
  390.             if((K4==0)&&(SetState==1))                //确定
  391.         {
  392.                         Delay10ms();        //消除抖动
  393.                         if((K4==0)&&(SetState==1))
  394.                         {
  395.                             SetState=0;
  396.                         Ds1302Init();
  397.                         }                        
  398.         
  399.                         while(K4==0);         //检测按键是否松开

  400.           }

  401.         if((K4==0)&&(SetState==0))                //调闹钟
  402.                 {
  403.                         Delay10ms();        
  404.                         if((K4==0)&&(SetState==0))
  405.                         {
  406.                                  flag=1;                     //闹钟标志

  407.                            SetPlace1++;
  408.                                 if(SetPlace1==4)
  409. ……………………

  410. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
不带字库.zip (100.61 KB, 下载次数: 138)
回复

使用道具 举报

ID:142383 发表于 2018-8-3 12:44 | 显示全部楼层
谢谢楼主分享,正在学习无字库屏。
回复

使用道具 举报

ID:98992 发表于 2019-11-6 09:20 | 显示全部楼层
下载了无数个 刷到我的系统上不是这问题就是那问题 我晕死
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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