找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2797|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

LCD12864_DS32231單片機(jī)時(shí)鐘程序在設(shè)置時(shí)間參數(shù)時(shí)閃爍

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:21740 發(fā)表于 2020-2-27 12:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
用STC15F408AS單片機(jī)驅(qū)動(dòng)LCD12864的時(shí)鐘,現(xiàn)在還存在設(shè)置時(shí)間參數(shù)時(shí)閃爍問題沒有得到解決,希望壇友高手幫忙指導(dǎo)來解決。

單片機(jī)源程序如下:
  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()                                 //按鍵執(zhí)行程序
  12. {
  13.         uchar n1,n2;       
  14.         uchar A,B,C,D,E,F,G,X;
  15.         switch(B1)
  16.         {
  17.                 case 1:                           //短按鍵執(zhí)行程序
  18.                 if(K1 == 1)                        //調(diào)整 秒
  19.                 {
  20.                         A ++;
  21.                         if(A > 59)
  22.                         A = 0;
  23.                 }
  24.                 if(K1 == 2)                        //調(diào)整 分
  25.                 {
  26.                         B ++;
  27.                         if(B > 59)
  28.                         B = 0;
  29.                 }
  30.                 if(K1 == 3)                        //調(diào)整 時(shí)
  31.                 {
  32.                         C++;
  33.                         if(C > 23)
  34.                         C = 0;
  35.                 }
  36.                 if(K1 == 4)                        //調(diào)整 日
  37.                 {
  38.                         D ++;
  39.                         if(D > 31)
  40.                         D = 1;
  41.                 }
  42.                 if(K1 == 5)                        //調(diào)整 月               
  43.                 {
  44.                         E ++;
  45.                         if(E > 12)
  46.                         E = 1;       
  47.                 }
  48.                 if(K1 == 6)                        //調(diào)整 年               
  49.                 {
  50.                         F ++;
  51.                         if(F > 50)
  52.                         F = 20;       
  53.                 }
  54.                 if(K1 == 7)                        //調(diào)整 星期
  55.                 {
  56.                         G ++;
  57.                         if(G > 8)
  58.                         G = 1;
  59.                 }
  60.                 B1 = 0;                 
  61.                 break;                     
  62.                 case 2:                           //按鍵長(zhǎng)按程序
  63.                 if(bz2 == 0)                                                                                                //設(shè)置時(shí)預(yù)讀日期、時(shí)間數(shù)據(jù)
  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);            //時(shí) 24小時(shí)制               
  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 ++;                            //切換調(diào)整項(xiàng)目
  82.                 B1 = 0;   
  83.                 break;
  84.         }
  85.                 switch(K1)                                  //短按鍵執(zhí)行程序
  86.                 {
  87.                 case 1: //調(diào)整 秒                                
  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://調(diào)整 分
  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://調(diào)整 時(shí)
  126.                         sfm_rst(0x91,0x90,0x89,0x80); //清除時(shí)位置字符
  127.                         sfm_rst(0x90,0x90,0x88,0x80);  
  128.                         for(n1 = 0;n1 < 250;n1 ++)
  129.                         {
  130.                                 delay(1);
  131.                         }
  132.                         datafl(C);//時(shí)閃爍
  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: //調(diào)整 日
  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: //調(diào)整 月               
  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: //調(diào)整 年       
  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: //調(diào)整 星期
  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;                                 //退出設(shè)置狀態(tài)
  212.                         bz2 = 0;
  213.                         bz3 = 0;
  214.                         SetTime(F,E,D,C,B,A,G);        //修改年月日時(shí)分秒星期
  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. }
復(fù)制代碼

所有資料51hei提供下載:
LCD12864_DS32231時(shí)鐘程序.rar (88.23 KB, 下載次數(shù): 13)


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

使用道具 舉報(bào)

沙發(fā)
ID:584814 發(fā)表于 2020-2-27 13:36 | 只看該作者
在設(shè)置時(shí)間時(shí),被修改的對(duì)象反顯,是這個(gè)意思 ?
如果是,將新建個(gè)反顯漢字的函數(shù),或?qū)F(xiàn)有字庫(kù)求反使用。
如果正反顯來閃爍可用中斷來實(shí)現(xiàn),心痛閃存容量的同時(shí)感覺在脫放
回復(fù)

使用道具 舉報(bào)

板凳
ID:21740 發(fā)表于 2020-2-27 16:53 | 只看該作者
設(shè)置時(shí)間參數(shù)時(shí)閃爍的問題已解決了,增加閃爍延時(shí)。
回復(fù)

使用道具 舉報(bào)

地板
ID:21740 發(fā)表于 2020-2-27 16:55 | 只看該作者
設(shè)置時(shí)間參數(shù)時(shí)閃爍問題已解決,增加閃爍延時(shí)時(shí)間,都改為10倍。
回復(fù)

使用道具 舉報(bào)

5#
ID:280014 發(fā)表于 2020-2-27 17:11 | 只看該作者
閃爍代表刷新頻率低于人眼的感受了,直接用定時(shí)刷新數(shù)據(jù)就不會(huì)閃了
回復(fù)

使用道具 舉報(bào)

6#
ID:462827 發(fā)表于 2020-2-28 09:31 | 只看該作者
你這個(gè)閃爍處理的框架不夠好
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表