久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 假期新做,精巧高精度數碼管時鐘PCF8563+TM1637 附單片機程序 [打印本頁]

作者: 1qaz2wsx77    時間: 2019-10-8 08:35
標題: 假期新做,精巧高精度數碼管時鐘PCF8563+TM1637 附單片機程序
放假下雨,無事做了一個時鐘。洞洞焊接,很是費力喲。四位帶雙點0.56數碼管,廢微波爐上拆下來的,PCF8563,舊電表的拆下來的。加了一個STC15W104、TM1637及三個按鍵.做出來的時鐘小巧穩定,功能也還可以。上圖:

單片機源程序如下:
  1. #include <STC15.h>
  2. #include "intrins.h"

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5.        
  6. #include "TM1637.h"
  7. #include "PCF8563.H"


  8. uchar keyvalue,xs=0,LD=5,SetFlag=0,re_disp=0;
  9. uchar keydate;     //讀鍵盤參數
  10. bit Flash;       //閃爍標志位
  11. bit ReadTimeFlag;//定義讀時間標志

  12. void Init_Timer0(void);//定時器初始化
  13. void Displsy_Time();
  14. void Scan_Key();
  15. void Set(uchar sel,uchar selby);

  16. /*------------------------------------------------
  17.               主函數
  18. ------------------------------------------------*/
  19. void main()
  20. {
  21.         P3M0=0X00;
  22.         P3M1=0X00;

  23.   Init_Timer0();
  24.         while(1)
  25.         {
  26.    Scan_Key();
  27.         }
  28. }
  29. /*------------------------------------------------
  30.    顯示界面設置
  31. ------------------------------------------------*/
  32. void Displsy_Time()
  33. {
  34.         if(ReadTimeFlag==1)  //讀取時間
  35.         {
  36.                 ReadTimeFlag=0;
  37.                 Read8563();
  38.                 keydate=ScanKey();

  39.         }

  40.         if(SetFlag==0&&xs==0) TM1637_display((time_buf1[4]/10),(time_buf1[4]%10),(time_buf1[5]/10),(time_buf1[5]%10),Flash,(LD));  //非設置狀態,正常顯示  時:分
  41.         if(SetFlag==0&&xs==1)        TM1637_display((2),(0),(time_buf1[1]/10),(time_buf1[1]%10),0,(LD));                                  //20xx年
  42.         if(SetFlag==0&&xs==2)        TM1637_display((time_buf1[2]/10),(time_buf1[2]%10),(time_buf1[3]/10),(time_buf1[3]%10),1,(LD));      //月:日
  43.         if(SetFlag==0&&xs==3)        TM1637_display((time_buf1[7]),(21),(time_buf1[6]/10),(time_buf1[6]%10),1,(LD));                      //周空秒

  44.                
  45.         switch(SetFlag)        //以下是設置狀態
  46.         {
  47.                 case 1:
  48.                 {
  49.                 if(Flash)        TM1637_display((2),(0),(time_buf1[1]/10),(time_buf1[1]%10),0,(LD));
  50.           else TM1637_display((2),(0),(21),(21),0,(LD));
  51.                        
  52.                 if(keyvalue==2&&SetFlag==1) //年+
  53.            {
  54.              Set(1,0);
  55.              keyvalue=0;
  56.      }
  57.                 if(keyvalue==3&&SetFlag==1) //年-
  58.            {
  59.              Set(1,1);
  60.              keyvalue=0;
  61.            }
  62.                 }
  63.                 break;

  64.                 case 2:
  65.                 {
  66.                 if(Flash)        TM1637_display((11),(21),(time_buf1[2]/10),(time_buf1[2]%10),1,(LD));
  67.           else TM1637_display((11),(21),(21),(21),1,(LD));
  68.        
  69.                 if(keyvalue==2&&SetFlag==2) //月+
  70.            {
  71.              Set(2,0);
  72.              keyvalue=0;
  73.      }
  74.                 if(keyvalue==3&&SetFlag==2) //月-
  75.            {
  76.              Set(2,1);
  77.              keyvalue=0;
  78.            }
  79.                 }
  80.                 break;
  81.                
  82.                 case 3:
  83.                 {
  84.                 if(Flash)        TM1637_display((13),(21),(time_buf1[3]/10),(time_buf1[3]%10),1,(LD));
  85.           else TM1637_display((13),(21),(21),(21),1,(LD));
  86.        
  87.                 if(keyvalue==2&&SetFlag==3) //日+
  88.            {
  89.              Set(3,0);
  90.              keyvalue=0;
  91.      }
  92.                 if(keyvalue==3&&SetFlag==3) //日-
  93.            {
  94.              Set(3,1);
  95.              keyvalue=0;
  96.            }
  97.                 }
  98.                 break;
  99.                
  100.                 case 4:
  101.                 {
  102.                 if(Flash)        TM1637_display((16),(21),(time_buf1[4]/10),(time_buf1[4]%10),1,(LD));
  103.           else TM1637_display((16),(21),(21),(21),1,(LD));
  104.        
  105.                 if(keyvalue==2&&SetFlag==4) //時+
  106.            {
  107.              Set(4,0);
  108.              keyvalue=0;
  109.      }
  110.                 if(keyvalue==3&&SetFlag==4) //時-
  111.            {
  112.              Set(4,1);
  113.              keyvalue=0;
  114.            }
  115.                 }
  116.                 break;
  117.                
  118.                 case 5:
  119.                 {
  120.                 if(Flash)        TM1637_display((15),(21),(time_buf1[5]/10),(time_buf1[5]%10),1,(LD));
  121.           else TM1637_display((15),(21),(21),(21),1,(LD));
  122.        
  123.                 if(keyvalue==2&&SetFlag==5) //分+
  124.            {
  125.              Set(5,0);
  126.              keyvalue=0;
  127.      }
  128.                 if(keyvalue==3&&SetFlag==5) //分-
  129.            {
  130.              Set(5,1);
  131.              keyvalue=0;
  132.            }
  133.                 }
  134.                 break;
  135.                
  136.                 case 6:
  137.                 {
  138.                 if(Flash)        TM1637_display((5),(21),(time_buf1[6]/10),(time_buf1[6]%10),1,(LD));
  139.           else TM1637_display((5),(21),(21),(21),1,(LD));
  140.        
  141.                 if(keyvalue==2&&SetFlag==6) //秒+
  142.            {
  143.              Set(6,0);
  144.              keyvalue=0;
  145.      }
  146.                 if(keyvalue==3&&SetFlag==6) //秒-
  147.            {
  148.              Set(6,1);
  149.              keyvalue=0;
  150.            }
  151.                 }
  152.                 break;

  153.         }
  154.                
  155. }
  156. /*------------------------------------------------
  157.                     定時器初始化子程序
  158. ------------------------------------------------*/
  159. void Init_Timer0(void)
  160. {
  161. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  162. EA=1;            //總中斷打開
  163. ET0=1;           //定時器中斷打開
  164. TR0=1;           //定時器開關打開
  165. }
  166. /*------------------------------------------------
  167.                  定時器中斷子程序
  168. ------------------------------------------------*/
  169. void Timer0_isr(void) interrupt 1
  170. {
  171. static unsigned int num,a;
  172. TH0=(65536-50000)/256;                  //重新賦值 50ms
  173. TL0=(65536-50000)%256;

  174. num++;
  175. re_disp++;
  176. if(num==2)        //大致100ms
  177.    {
  178.     num=0;
  179.     ReadTimeFlag=1; //讀標志位置1
  180.           a++;
  181.         }
  182.          
  183.         if(a==5)
  184.         {
  185.                 a=0;
  186.                 Flash=~Flash;
  187.         }
  188.                 if(re_disp==200)
  189.         {
  190.                 re_disp=0;
  191.                 SetFlag=0;
  192.         }

  193. }
  194. /*------------------------------------------------
  195.             鍵盤檢測函數
  196. ------------------------------------------------*/
  197. void Scan_Key(void)    //鍵盤檢測函數
  198. {
  199.         keydate=0xff;

  200.   Displsy_Time();    //程序開頭調用顯示函數
  201.        
  202.         if(keydate==0xef)
  203.     {
  204.                  re_disp=0;    //清除記數,重新開始10s定時
  205.      SetFlag++;
  206.      if(SetFlag>6)SetFlag=0;
  207.     }

  208.         if(keydate==0xed)
  209.      {
  210.        re_disp=0;      //清除記數,重新開始10s定時
  211.        keyvalue=2;     //跳到加減判斷函數,下同
  212.                          
  213.                          if(SetFlag==0)
  214.                          {
  215.                                  xs++;
  216.                                  if(xs>3)xs=0;
  217.                          }
  218.      }
  219.    
  220.         if(keydate==0xee)
  221.      {
  222.        re_disp=0;
  223.        keyvalue=3;
  224.                          
  225.                          if(SetFlag==0)
  226.                          {
  227.                                  LD++;
  228.                                  if(LD>7)LD=0;
  229.                          }
  230.      }
  231. }

  232. /*-------------------------------------------------------
  233. //根據選擇調整相應項目并寫入DS3231
  234. --------------------------------------------------------*/
  235. void Set(unsigned char sel,unsigned char selby)  //執行調整項目的函數
  236. {
  237.     uchar max,mini;

  238.     if(sel==6)  {max=59;mini=0;}    //秒
  239.     if(sel==5)  {max=59;mini=0;}    //分鐘
  240.     if(sel==4)  {max=23;mini=0;}    //小時

  241.           if(time_buf1[2]==2)           //日
  242.                 {
  243.                         if(runnian())
  244.                         {
  245.                                 if(sel==3)  {max=29;mini=1;}
  246.                         }
  247.                         else
  248.                         {
  249.                                 if(sel==3)  {max=28;mini=1;}
  250.                         }
  251.                 }
  252.                  if(time_buf1[2]==1|time_buf1[2]==3|time_buf1[2]==5|time_buf1[2]==7|time_buf1[2]==8|time_buf1[2]==10|time_buf1[2]==12)
  253.                    {   
  254.                            if(sel==3)  {max=31;mini=1;}
  255.                    }
  256.                  if(time_buf1[2]==4|time_buf1[2]==6|time_buf1[2]==9|time_buf1[2]==11)
  257.                    {   
  258.                     if(sel==3)  {max=30;mini=1;}
  259.                    }
  260.                
  261.     if(sel==2)  {max=12;mini=1;}    //月
  262.     if(sel==1)  {max=25;mini=15;}    //年

  263.           if (selby==0) time_buf1[sel]++;  else time_buf1[sel]--;
  264.           if(time_buf1[sel]>max) time_buf1[sel]=mini;   
  265.           if(time_buf1[sel]<mini) time_buf1[sel]=max;
  266.     Write8563();
  267.                 autoweek();
  268. }
復制代碼

所有資料51hei提供下載:
TM1637PCF8563四數碼管時鐘.rar (55.25 KB, 下載次數: 198)


作者: jialishoushi    時間: 2019-11-29 02:09
不錯  樓主上個完整電路圖唄
作者: huangye-008    時間: 2019-11-30 22:14
看到電路板都暈了!!厲害啊
作者: yangfeng2068    時間: 2020-2-21 19:42
謝謝分享,正好需要研究一下,下載下來試試
作者: yangfeng2068    時間: 2020-2-21 19:44
非常給力,謝謝樓主,先看看
作者: 小分子    時間: 2020-7-2 10:14
這個真的挺好的。純手工
作者: XSBCL    時間: 2021-2-25 13:31
PCF變成了DS
作者: hzh173    時間: 2021-11-18 16:14
PCF8563和DS1302那個好用
作者: wgaopeng    時間: 2021-11-18 21:28
好資料,51黑有你更精彩!!!
作者: leezll    時間: 2022-1-25 06:10
這按鍵都沒有怎么玩
作者: lmn2005    時間: 2022-2-5 09:20
hzh173 發表于 2021-11-18 16:14
PCF8563和DS1302那個好用

應該是PCF8563吧,雖然我從來都沒有用過PCF8563。
作者: lc_007    時間: 2023-3-5 20:58
注釋里面怎么有這個型號://根據選擇調整相應項目并寫入DS3231,難道是通用的嗎?

作者: 1qaz2wsx77    時間: 2023-3-6 08:57
注釋里有沒有改徹底的。PCF與DS3231不能通用的,好多地址不一樣的。但也都差不多,改改就是了。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美日韩综合一区 | 成人av在线播放 | 韩日一区二区三区 | 中文字幕一区二区三区四区五区 | 成人av免费| 欧美精品一级 | 亚洲三级av | 日韩精品在线播放 | 自拍第一页 | 日本中文字幕日韩精品免费 | 91在线精品视频 | 热久久免费视频 | 中文字幕日韩一区二区 | 亚洲+变态+欧美+另类+精品 | 四虎影院新地址 | 国产在线视频99 | 久久一级大片 | 亚洲综合免费 | 日本精品一区二区三区在线观看视频 | 日本视频一区二区 | 成人在线视频免费观看 | 日韩免费一区二区 | 久久久激情视频 | 黑人巨大精品欧美一区二区免费 | 欧美一级免费片 | 日韩伦理一区二区三区 | 精品国产一区二区三区久久久四川 | 亚洲精品一二三 | 国产美女特级嫩嫩嫩bbb片 | 久热电影| 亚洲一二三区免费 | 国产精品一区一区三区 | 国产成人麻豆免费观看 | 国产日韩精品视频 | 欧美亚洲国产成人 | 色.com| 人妖一区 | 日韩精品在线播放 | 久久久91精品国产一区二区三区 | 999视频 | 久草网址 |