找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2681|回复: 0
打印 上一主题 下一主题
收起左侧

Proteus仿真的LCD12864显示大数字时间的程序设计

[复制链接]
跳转到指定楼层
楼主
自己完成的设计,拿出来分享一下
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include "DS1302.h"
  3. #include "LCD12864.h"
  4. #include "string.h"

  5. char a;
  6. sbit KEY1=P3^4;        //LCD12864液晶显示,也就是屏幕上总共有64x128个点,
  7. sbit KEY2=P3^5;
  8. sbit KEY3=P3^6;//++
  9. sbit KEY5=P3^7;//--
  10. sbit KEY4=P2^7;
  11. sbit KEY6=P3^3;
  12. sbit beep=P2^6;
  13. int i;
  14. int riqi;
  15. uchar TIME1[7] = {0x12, 0x12, 0x12, 0x01, 0x07, 0x07, 0x21};
  16. uchar TIME3[7] = {0x12, 0x13, 0x12, 0x01, 0x07, 0x07, 0x21};
  17. bit  flag=1; //进入/退出设置标志
  18. bit  flag1=1;//显示名字的标志位
  19. bit  flag2=1; //显示日期标志位
  20. bit  flag3=1; //显示闹钟标志位
  21. uchar  choose=0x01; //切换标志
  22. void dela(int i)//100代表1ms,也就是每一个单位代表10us
  23. {while(i--);
  24. }
  25. void delay10(void) //延时10ms
  26. {
  27.         unsigned char i,j;
  28.         for(i=0;i<255;i++)
  29.         for(j=0;j<200;j++);
  30. }
  31. void delay5ms(void)   //误差 0us
  32. {
  33.     unsigned char a,b;
  34.     for(b=19;b>0;b--)
  35.         for(a=130;a>0;a--);
  36. }

  37. //设置时ds1302寄存器值循环 如秒寄存器59时加一变为00
  38. unsigned char conver(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
  39. {        
  40.                            //右边这个a为10的意思
  41.          if((a&0x0f)==0x0a) a=a+6; //进位为10进制 ,+
  42.     if(a==0xff)           a=d;        //限制255
  43.         if((a&0x0f)==0x0f) a=a-6; //进位为10进制, _
  44.         if(a==0x00&&c!=0x00) a=d;
  45.           if(a==b)  a=c; //还原
  46. //        ShowNumber(6,72,a/1000);
  47. //                                ShowNumber(6,80,a/100%10);
  48. //                                ShowNumber(6,88,a/10%10);
  49. //                                ShowNumber(6,96,a%10);
  50.         return a;  
  51. }

  52. void digplay() {

  53.         //时间,显示数组里面的时间数据
  54.                 ShowNumber16_32(2,0,TIME[2]>>4&0x03); //时 十位
  55.                 ShowNumber16_32(2,16, TIME[2]&0x0f);//时  个位
  56.                  ShowNumber16_32(2,48,TIME[1]>>4&0x07);//分  十位
  57.                 ShowNumber16_32(2,64, TIME[1]&0x0f);//分  个位
  58.                 ShowNumber16_32(2,96,TIME[0]>>4&0x07);//秒 十位
  59.                 ShowNumber16_32(2,112, TIME[0]&0x0f);//秒  个位
  60.                
  61.                
  62.                 //日期
  63.                 ShowNumber(0,0,2);
  64.                 ShowNumber(0,8,0);
  65.     ShowNumber(0,16,TIME[6]>>4&0x0f);//先移动4位然后屏蔽低4位
  66.           ShowNumber(0,24, TIME[6]&0x0f);//年
  67.                
  68.           ShowNumber(0,40,TIME[4]>>4&0x01);
  69.           ShowNumber(0,48, TIME[4]&0x0f);//月
  70.                
  71.                 ShowNumber(0,64,TIME[3]>>4&0x03);
  72.                 ShowNumber(0,72, TIME[3]&0x0f);//日

  73.           ShowChina(0,112,(TIME[5]&0x07)-1);//周
  74. }


  75. void digplaystart(void) {//开机显示
  76.         uchar i=0;
  77.                 ShowChina(2,64-16*1.5,19);
  78.                 delay10();
  79.                 ShowChina(2,64-16*0.5,20);
  80.                 delay10();
  81.                 ShowChina(2,64+16*0.5,21);
  82.                 delay10();
  83.                 ShowChina(2,64+16*1.5,22);

  84.                 delay10();
  85.                
  86.         for (i=0;i<10;i++) {
  87.         ShowNumber(4,32+8*i,16);           
  88.                 delay10();
  89.         
  90.         }
  91.         ClearScreen(0);//清屏
  92. }
  93. void alarm()
  94. { if(KEY6==0)//设置闹钟时间

  95. {                  choose==0;
  96.               flag3=1;
  97.                   for( i=0;i<16;i++){ShowNumber(2,8*i,15);}
  98.                   for( i=0;i<16;i++){ShowNumber(3,8*i,15);}
  99.                   for( i=0;i<16;i++){ShowNumber(4,8*i,15);}
  100.                   for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
  101.                   
  102.                   
  103.                           ClearScreen(0);
  104.                   ShowChina(6,48,13);
  105.                         ShowChina(6,0,16);//显示设置
  106.                                 ShowChina(6,16,17);
  107.                                 ShowNumber(6,32,10);
  108.                                 ShowChina(6,48,14);
  109.                                 ShowChina(4,0,48);
  110.                                 ShowChina(4,16,49);
  111.                                 ShowChinadog(0,0,0);//显示图案
  112.                
  113.                
  114.                   while(flag3)
  115.            {    ShowNumber(2,0,TIME3[2]>>4&0x03); //时 十位
  116.                      ShowNumber(2,8, TIME3[2]&0x0f);//时  个位
  117.                          ShowNumber(2,16,17);
  118.                       ShowNumber(2,24,TIME3[1]>>4&0x07);//分  十位
  119.                      ShowNumber(2,30, TIME3[1]&0x0f);//分  个位
  120.                         
  121.                
  122.                  if(KEY1==0)                                  //按键1--处理设定时间和返回
  123.                 {
  124.                         delay10();
  125.                         if(KEY1==1)
  126.                         {
  127.                                 delay10();
  128.                                 flag3=~flag3;
  129.                                 for( i=0;i<16;i++){ShowNumber(2,8*i,15);}//清除
  130.                         for( i=0;i<16;i++){ShowNumber(3,8*i,15);}
  131.                                 for( i=0;i<16;i++){ShowNumber(4,8*i,15);}
  132.                                 for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
  133.                                 for( i=0;i<16;i++){ShowNumber(6,8*i,15);}
  134.                                 ShowChina(2,64-16*1.5,50);
  135.                         delay10();
  136.                         ShowChina(2,64-16*0.5,51);
  137.                         delay10();
  138.                         ShowChina(2,64+16*0.5,52);
  139.                         delay10();
  140.                         ShowChina(2,64+16*1.5,53);
  141.                                 delay10();
  142.                                 for (i=0;i<5;i++)
  143.                                 {
  144.                     ShowNumber(4,32+8*i,16);           
  145.                         delay10();}
  146.                                 for( i=0;i<16;i++){ShowNumber(2,8*i,15);}//清除
  147.                         for( i=0;i<16;i++){ShowNumber(3,8*i,15);}
  148.                                 for( i=0;i<16;i++){ShowNumber(4,8*i,15);}
  149.                                 for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
  150.                                 for( i=0;i<16;i++){ShowNumber(6,8*i,15);}
  151.                                 ShowNumber16_32(2,32,10);//:
  152.                         ShowNumber16_32(2,80,10);//:还原原来的点号        
  153.                                 
  154.                                 
  155.                  }
  156.                
  157.                                 
  158.                                 
  159.                                 
  160.                                 if(flag3==0) {
  161.                                                 for( i=0;i<8;i++) {
  162.                                                         ShowNumber(6,8*i,15);
  163.                                         }
  164.                                 }
  165.                         }
  166.                 if(KEY2==0)                                  //按键2--处理选择设定时间的项目
  167.                 {
  168.                         delay10();
  169.                         if(KEY2==1)
  170.                         {
  171.                                 delay10();
  172.                                 choose++;
  173.                                 if(choose==2)
  174.                                         choose=0x00;
  175.                                 ShowChina(6,48,13+choose);
  176.                                        
  177.                         }        
  178.                 }
  179.           if(KEY3==0)//++                                 
  180.                 {                delay10();//这个必须有,否则检测不到高电平
  181.                                 if(KEY3==1)
  182.                                 {delay10();
  183.                                 switch(choose)
  184.                                 {
  185.                                        
  186.                                         case 0:        TIME3[2]++;        TIME3[2]=conver(TIME3[2],0x24,0x00,0x23);break;//时
  187.                                         case 1:        TIME3[1]++;        TIME3[1]=conver(TIME3[1],0x60,0x00,0x59);break;//分
  188.                                        
  189.                                 }
  190.                            }
  191.                 }
  192.                
  193.                 if(KEY5==0)//--                                 
  194.                 {        
  195.                                 delay10();
  196.                                 if(KEY5==1)
  197.                                 {delay10();
  198.                                 switch(choose)
  199.                                 {
  200.                                        
  201.                                         case 0:        TIME3[2]--;        TIME3[2]=conver(TIME3[2],0x24,0x00,0x23);break;//时
  202.                                         case 1:        TIME3[1]--;        TIME3[1]=conver(TIME3[1],0x60,0x00,0x59);break;//分
  203.                                        
  204.                                 }
  205.                                 
  206.                            }
  207.                                 
  208.                                 
  209.                                 
  210.                                        
  211.                                 
  212.                 }





  213.         }

  214. }
  215. }

  216. void main(void)
  217. {        
  218.         uchar i;
  219.         InitLCD();          //初始化LCD12864
  220. digplaystart();
  221.         ClearScreen(0);//清屏
  222.                 ShowChinaduolaameng(0,0,0);
  223.                 delay10();
  224.                 delay10();
  225.                 delay10();
  226.                 delay10();
  227.                 ClearScreen(0);
  228.                   for( i=0;i<16;i++){ShowNumber(0,8*i,15);}
  229.                   for( i=0;i<16;i++){ShowNumber(1,8*i,15);}
  230.                   for( i=0;i<16;i++){ShowNumber(5,8*i,15);}
  231.                   for( i=0;i<16;i++){ShowNumber(6,8*i,15);}
  232.                   

  233.         delay5ms();
  234.         Ds1302Init();//Ds1302初始化,并且附上设定的默认时间
  235.          
  236.                 ShowNumber(0,32,11);//-
  237.                 ShowNumber(0,56,11);//-
  238.                

  239.                 ShowChina(0,98,7);//汉字周
  240.             ShowNumber16_32(2,32,10);//:
  241.                 ShowNumber16_32(2,80,10);//:

  242.         while(1)
  243.         {        if(TIME3[1]==TIME[1]&&TIME3[2]==TIME[2]){beep=0;dela(10000000);beep=1;dela(100000000);beep=0;dela(100000000);beep=1;dela(10000);beep=0;}else beep=1;//蜂鸣器报警
  244.                         
  245.             
  246.             
  247.                                                                           
  248.                 if(KEY4==0){ for( i=0;i<5;i++)delay10();flag1=~flag1;
  249.                                 if(flag1==0){
  250.                                                    ShowChina(6,0,23);ShowChina(6,16,24);ShowChina(6,32,25);ShowChina(6,48,26);ShowChina(6,64,27);ShowChina(6,80,28);ShowChina(6,96,29);ShowChina(6,112,30);}
  251.                                              else for( i=0;i<16;i++) {ShowNumber(6,8*i,15);}
  252.                                          }
  253.          if(flag2==1)riqi=(TIME[3]>>4)*10+(TIME[3]&0x0f)+(TIME[4]>>4)*1000+(TIME[4]&0x0f)*100;//&比加号低级所以需要括号
  254.                 switch(riqi)//节日显示
  255.                                 {        case 0:break;
  256.                                         case 101:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,37);ShowChina(6,96,38);ShowChina(6,112,47);riqi=0;flag2=0;break;
  257.                                         case 308:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,39);ShowChina(6,96,40);ShowChina(6,112,47);riqi=0;flag2=0;break;
  258.                                         case 405:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,41);ShowChina(6,96,42);ShowChina(6,112,47);riqi=0;flag2=0;break;
  259.                                         case 501:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,45);ShowChina(6,96,46);ShowChina(6,112,47);riqi=0;flag2=0;break;
  260.                                         case 601:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,31);ShowChina(6,96,32);ShowChina(6,112,33);riqi=0;flag2=0;break;
  261.                                         case 910:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,43);ShowChina(6,96,44);ShowChina(6,112,47);riqi=0;flag2=0;break;
  262.                                         case 1001:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}ShowChina(6,80,34);ShowChina(6,96,35);ShowChina(6,112,36);riqi=0;flag2=0;break;

  263.                                         default:for( i=8;i<16;i++){ShowNumber(6,8*i,15);}riqi=0;flag2=0;
  264.                                 }
  265. //                                ShowNumber(6,72,riqi/1000);
  266. //                                ShowNumber(6,80,riqi/100%10);
  267. //                                ShowNumber(6,88,riqi/10%10);
  268. //                                ShowNumber(6,96,riqi%10);
  269.          
  270.          
  271. alarm();

  272. if(KEY1==0)                                  //按键1--处理设定时间和返回
  273.                 {
  274.                         delay10();
  275.                         if(KEY1==1)
  276.                         {
  277.                                 delay10();
  278.                                 flag=~flag;        
  279.                                 
  280.                                 if(flag==0) {
  281.                                 ShowChina(6,48,9);
  282.                                 ShowChina(6,0,16);//显示设置
  283.                                 ShowChina(6,16,17);
  284.                                 ShowNumber(6,32,10);
  285.                                 }
  286.                                 
  287.                                 if(flag==1) {
  288.                                                 for( i=0;i<8;i++) {
  289.                                                         ShowNumber(6,8*i,15);
  290.                                         }
  291.                                 }
  292.                         }
  293.                 }

  294.                 if(KEY2==0)                                  //按键2--处理选择设定时间的项目
  295.                 {
  296.                         delay10();
  297.                         if(KEY2==1)
  298.                         {
  299.                                 delay10();
  300.                                 choose++;
  301.                                 ShowChina(6,48,8+choose);
  302.                                         if(choose==7)
  303.                                         choose=0x00;
  304.                         }        
  305.                 }

  306.                 if(KEY3==0)//++                                 
  307.                 {        delay10();
  308.                         if(KEY3==1)
  309.                         {
  310.                                 //delay10();//降低
  311.                                 switch(choose)
  312.                                 {
  313.                                         case 1:        TIME[6]++; TIME[6]=conver(TIME[6],0xa0,0x00,0x59);break;//年
  314.                                         case 2:        TIME[5]++; TIME[5]=conver(TIME[5],0x08,0x01,0x07);break;//周
  315.                                         case 3:        TIME[4]++;        TIME[4]=conver(TIME[4],0x13,0x01,0x12);break;//月
  316.                                         case 4:        TIME[3]++;        TIME[3]=conver(TIME[3],0x32,0x01,0x31);break;//日
  317.                                         case 5:        TIME[2]++;        TIME[2]=conver(TIME[2],0x24,0x00,0x23);break;//时
  318.                                         case 6:        TIME[1]++;        TIME[1]=conver(TIME[1],0x60,0x00,0x59);break;//分
  319.                                         case 7:        TIME[0]++;        TIME[0]=conver(TIME[0],0x60,0x00,0x59);break;//秒
  320.                                 }
  321.                                 

  322.                                 
  323.                                 
  324.                                 
  325.                                         digplay();
  326.                         }        
  327.                 }
  328.                 if(KEY5==0)        //--                        
  329.                 {        delay10();
  330.                         if(KEY5==1)
  331.                         {
  332.                                  
  333.                                 switch(choose)
  334.                                 {
  335.                                         case 1:        TIME[6]--; TIME[6]=conver(TIME[6],0xa0,0x00,0x09);break;//年
  336.                                         case 2:        TIME[5]--; TIME[5]=conver(TIME[5],0x08,0x01,0x07);break;//周
  337.                                         case 3:        TIME[4]--;        TIME[4]=conver(TIME[4],0x13,0x01,0x12);break;//月
  338.                                         case 4:        TIME[3]--;        TIME[3]=conver(TIME[3],0x32,0x01,0x31);break;//日
  339.                                         case 5:        TIME[2]--;        TIME[2]=conver(TIME[2],0x24,0x00,0x23);break;//时
  340.                                         case 6:        TIME[1]--;        TIME[1]=conver(TIME[1],0x60,0x00,0x59);break;//分
  341.                                         case 7:        TIME[0]--;        TIME[0]=conver(TIME[0],0x60,0x00,0x59);break;//秒
  342.                                 }
  343.                                 

  344.                                 
  345.                                 
  346.                                 
  347.                                         digplay();
  348.                         }        
  349.                 }
  350.          if(TIME1[3]!=TIME[3]||TIME1[4]!=TIME[4]) flag2=1;
  351.            for(i=3;i<5;i++)TIME1[i]=TIME[i];
  352.                 if(flag==1)
  353.                 {Ds1302ReadTime();}                        //读取DS1302的时间
  354.                  else
  355.                    Ds1302WriteTime();  //写入DS1302的时间



  356.                                 digplay();
  357.         }
  358. }
复制代码

仿真程序资料51hei提供下载:
显示屏 整合 1.7z (102.09 KB, 下载次数: 44)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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