找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2096|回复: 5
收起左侧

LCD12864_DS32231单片机时钟程序在设置时间参数时闪烁

[复制链接]
ID:21740 发表于 2020-2-27 12:17 | 显示全部楼层 |阅读模式
用STC15F408AS单片机驱动LCD12864的时钟,现在还存在设置时间参数时闪烁问题没有得到解决,希望坛友高手帮忙指导来解决。

单片机源程序如下:
  1. #include<INC\STC15F.H>
  2. #include<intrins.h>
  3. #include <INC\DS3231.h>
  4. #include<DS32231.c>
  5. #include<LCD12864.c>
  6. #include <KEY.c>                                        //按键
  7. #define uint unsigned int
  8. #define uchar unsigned char

  9. uchar K1;
  10.    
  11. void key_zx()                                 //按键执行程序
  12. {
  13.         uchar n1,n2;       
  14.         uchar A,B,C,D,E,F,G,X;
  15.         switch(B1)
  16.         {
  17.                 case 1:                           //短按键执行程序
  18.                 if(K1 == 1)                        //调整 秒
  19.                 {
  20.                         A ++;
  21.                         if(A > 59)
  22.                         A = 0;
  23.                 }
  24.                 if(K1 == 2)                        //调整 分
  25.                 {
  26.                         B ++;
  27.                         if(B > 59)
  28.                         B = 0;
  29.                 }
  30.                 if(K1 == 3)                        //调整 时
  31.                 {
  32.                         C++;
  33.                         if(C > 23)
  34.                         C = 0;
  35.                 }
  36.                 if(K1 == 4)                        //调整 日
  37.                 {
  38.                         D ++;
  39.                         if(D > 31)
  40.                         D = 1;
  41.                 }
  42.                 if(K1 == 5)                        //调整 月               
  43.                 {
  44.                         E ++;
  45.                         if(E > 12)
  46.                         E = 1;       
  47.                 }
  48.                 if(K1 == 6)                        //调整 年               
  49.                 {
  50.                         F ++;
  51.                         if(F > 50)
  52.                         F = 20;       
  53.                 }
  54.                 if(K1 == 7)                        //调整 星期
  55.                 {
  56.                         G ++;
  57.                         if(G > 8)
  58.                         G = 1;
  59.                 }
  60.                 B1 = 0;                 
  61.                 break;                     
  62.                 case 2:                           //按键长按程序
  63.                 if(bz2 == 0)                                                                                                //设置时预读日期、时间数据
  64.                 {                                                       
  65.                         X = read_random(DS3231_SEC);;                  //秒
  66.                   A = BCD2HEX(X);
  67.                         X = read_random(DS3231_MIN);                  //分
  68.                         B = BCD2HEX(X);
  69.                         X = read_random(DS3231_HOUR);            //时 24小时制               
  70.                         C = BCD2HEX(X);
  71.                         X = read_random(DS3231_DATE);     //日
  72.                         D = BCD2HEX(X);
  73.                         X = read_random(DS3231_MONTH);    //月
  74.                         E = BCD2HEX(X);
  75.                         X = read_random(DS3231_YEAR);     //年
  76.                         F = BCD2HEX(X);
  77.                         G = read_random(DS3231_DAY);                        //星期;
  78.                         bz2 = 1;
  79.                 }
  80.                 bz3 = 1;
  81.                 K1 ++;                            //切换调整项目
  82.                 B1 = 0;   
  83.                 break;
  84.         }
  85.                 switch(K1)                                  //短按键执行程序
  86.                 {
  87.                 case 1: //调整 秒                                
  88.                         sfm_rst(0x97,0x90,0x8f,0x80); //清除秒位置字符
  89.                         sfm_rst(0x96,0x90,0x8e,0x80);  
  90.                         for(n1 = 0;n1 < 250;n1 ++)
  91.                         {
  92.                                 delay(1);
  93.                         }
  94.                         datafl(A);  //秒闪烁
  95.                         a1 = 0x96;
  96.                         a3 = 0x8e;
  97.                         lcd_disdata(sw);
  98.                         a1 = 0x97;
  99.                         a3 = 0x8f;
  100.                         lcd_disdata(gw);
  101.                         for(n2 = 0;n2 < 250;n2 ++)
  102.                         {
  103.                                 delay(1);
  104.                         }
  105.                         break;
  106.                 case 2://调整 分
  107.                         sfm_rst(0x94,0x90,0x8c,0x80); //清除分位置字符
  108.                         sfm_rst(0x93,0x90,0x8b,0x80);  
  109.                         for(n1 = 0;n1 < 250;n1 ++)
  110.                         {
  111.                                 delay(1);
  112.                         }
  113.                         datafl(B);  //分闪烁
  114.                         a1 = 0x93;
  115.                         a3 = 0x8b;
  116.                         lcd_disdata(sw);
  117.                         a1 = 0x94;
  118.                         a3 = 0x8c;
  119.                         lcd_disdata(gw);
  120.                         for(n2 = 0;n2 < 250;n2 ++)
  121.                         {
  122.                                 delay(1);
  123.                         }
  124.                         break;
  125.                 case 3://调整 时
  126.                         sfm_rst(0x91,0x90,0x89,0x80); //清除时位置字符
  127.                         sfm_rst(0x90,0x90,0x88,0x80);  
  128.                         for(n1 = 0;n1 < 250;n1 ++)
  129.                         {
  130.                                 delay(1);
  131.                         }
  132.                         datafl(C);//时闪烁
  133.                         a1 = 0x90;
  134.                         a3 = 0x88;
  135.                         lcd_disdata(sw);
  136.                         a1 = 0x91;
  137.                         a3 = 0x89;
  138.                         lcd_disdata(gw);
  139.                         for(n2 = 0;n2 < 250;n2 ++)
  140.                         {
  141.                                 delay(1);
  142.                         }
  143.                         break;
  144.                 case 4: //调整 日
  145.                         lcd_addr(0x85);
  146.                         lcd_data(0xa1);
  147.                         lcd_data(0xa0);
  148.                         for(n1 = 0;n1 < 250;n1 ++)
  149.                         {
  150.                                 delay(1);
  151.                         }
  152.                         datafl(D);//日闪烁
  153.                         lcd_addr(0x85);
  154.                         lcd_data(0x30+sw);
  155.                         lcd_data(0x30+gw);
  156.                         for(n2 = 0;n2 < 250;n2 ++)
  157.                         {
  158.                                 delay(1);
  159.                         }
  160.                         break;                     
  161.                 case 5: //调整 月               
  162.                         lcd_addr(0x83);
  163.                         lcd_data(0xa1);
  164.                         lcd_data(0xa0);
  165.                         for(n1 = 0;n1 < 250;n1 ++)
  166.                         {
  167.                                 delay(1);
  168.                         }
  169.                         datafl(E);//月闪烁
  170.                         lcd_addr(0x83);
  171.                         lcd_data(0x30 + sw);
  172.                         lcd_data(0x30 + gw);
  173.                         for(n2 = 0;n2 < 250;n2 ++)
  174.                         {
  175.                                 delay(1);
  176.                         }                
  177.                         break;
  178.                 case 6: //调整 年       
  179.                         lcd_addr(0x81);
  180.                         lcd_data(0xa1);
  181.                         lcd_data(0xa0);
  182.                         for(n1 = 0;n1 < 250;n1 ++)
  183.                         {
  184.                                 delay(1);
  185.                         }
  186.                         datafl(F);//年闪烁
  187.                         lcd_addr(0x81);
  188.                         lcd_data(0x30 + sw);
  189.                         lcd_data(0x30 + gw);
  190.                         for(n2 = 0;n2 < 250;n2 ++)
  191.                         {
  192.                                 delay(1);
  193.                         }                
  194.                         break;
  195.                 case 7: //调整 星期
  196.                         lcd_addr(0x9a);
  197.                         lcd_data(0xa1);
  198.                         lcd_data(0xa0);
  199.                         for(n1 = 0;n1 < 250;n1 ++)
  200.                         {
  201.                                 delay(1);
  202.                         }
  203.                         datafl(G);
  204.                         week_disp(G);
  205.                         for(n2 = 0;n2 < 250;n2 ++)
  206.                         {
  207.                                 delay(1);
  208.                         }               
  209.                         break;
  210.                 case 8:                                
  211.                         K1 = 0;                                 //退出设置状态
  212.                         bz2 = 0;
  213.                         bz3 = 0;
  214.                         SetTime(F,E,D,C,B,A,G);        //修改年月日时分秒星期
  215.                         break;

  216.         }
  217. }

  218. void main(void)//
  219. {        
  220.         TMOD |= 0x01;
  221.         ET0 = 1;
  222.         TR0 = 1;
  223.         TL0 = 0xAE;                //
  224.         TH0 = 0xFB;                //
  225.   EA  = 1;                                                //开总中断
  226.         lcd_init();  //
  227.         lcd_clear(); //
  228.         lcd_disp(0x92,0x90,0x8a,0x80,tabm);//
  229.         lcd_disp(0x95,0x90,0x8d,0x80,tabm);//
  230.         nyrhz();//固定年月日周汉字显示
  231.         while(1)//
  232.         {
  233.                 if(bz3 == 0)
  234.                 {
  235.                         Readtime();
  236.                         ReadDate();
  237.                         ReadDtemp();
  238.                 }
  239.                         key_zx();
  240.         }
  241. }

  242. void tinme0() interrupt 1
  243. {
  244.                 TL0 = 0xAE;                //
  245.                 TH0 = 0xFB;                //
  246.           key_sm1();//按键处理

  247. }
复制代码

所有资料51hei提供下载:
LCD12864_DS32231时钟程序.rar (88.23 KB, 下载次数: 13)
回复

使用道具 举报

ID:584814 发表于 2020-2-27 13:36 | 显示全部楼层
在设置时间时,被修改的对象反显,是这个意思 ?
如果是,将新建个反显汉字的函数,或将现有字库求反使用。
如果正反显来闪烁可用中断来实现,心痛闪存容量的同时感觉在脱放
回复

使用道具 举报

ID:21740 发表于 2020-2-27 16:53 | 显示全部楼层
设置时间参数时闪烁的问题已解决了,增加闪烁延时。
回复

使用道具 举报

ID:21740 发表于 2020-2-27 16:55 | 显示全部楼层
设置时间参数时闪烁问题已解决,增加闪烁延时时间,都改为10倍。
回复

使用道具 举报

ID:280014 发表于 2020-2-27 17:11 | 显示全部楼层
闪烁代表刷新频率低于人眼的感受了,直接用定时刷新数据就不会闪了
回复

使用道具 举报

ID:462827 发表于 2020-2-28 09:31 | 显示全部楼层
你这个闪烁处理的框架不够好
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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