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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2043|回復: 1
打印 上一主題 下一主題
收起左側

單片機16位數碼管萬年歷程序 帶按鍵農歷溫度顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:520027 發表于 2022-1-12 17:05 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
手工做了個萬年歷放在工作臺前,仔細揀選ds1302模塊,竟然挺準,大約快一年不要校準。其中四個按鍵:1增鍵,2減鍵,3移位鍵,4設置鍵。長按4鍵進入設置,從年開始,設置位閃爍,1和2鍵點按增減,長按連續增減。短按4鍵切換到鬧鈴設置,時分位閃爍1,2鍵修改。再點按4鍵正常顯示并保存。在正常顯示時,短按4鍵,鬧鈴靜音,不按延時靜音。此按鍵只一個函數就完成四個鍵的長短和連發,以狀態機編寫,來源于網上大咖,妙極。

電路原理圖如下:


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

  3. #include "key.h"

  4. extern struct sTime pdata CurTime;             //ds1302定義  當前日期時間
  5. extern struct sTime pdata CurTimeDec;     //ds1302定義
  6. struct sTime pdata SetTimeBcd;             //ds1302定義  日期時間設置緩沖區  
  7. struct sTime pdata SetTimeDec; //本定義                轉換成十進制日期時間設置緩沖區


  8. extern enum eStaSystem staSystem ;      //定義枚舉并賦予初值系統運行狀態
  9. extern code uchar SEGweek[];
  10. extern code uchar  SEG[];
  11. extern uchar SetIndex=0 ;    //main.c定義  設置位索引
  12. extern uchar pdata DigShow[16];        //main.c定義  顯示中間變量
  13. extern uchar pdata DisplayData[16];  //main.c定義 顯示緩沖區
  14. uchar FlashLock=0; //設置閃爍原子鎖
  15. uint    FlashCnt=0;   //設置閃爍計數器
  16. #define Flash_half 100    //閃爍計數的半值
  17. #define Flash_all  200  //閃爍計數的全值 一定要比 半值大

  18. bit staMute = 0;  //靜音標志位
  19. uint8 AlarmHour = 7;  //鬧鐘時間的小時數
  20. uint8 AlarmMin  = 30;  //鬧鐘時間的分鐘數
  21. uint8 pdata SetAlarmHour;    //鬧鐘小時數設置緩沖
  22. uint8 pdata SetAlarmMin;     //鬧鐘分鐘數設置緩沖         
  23. bit staBuzzer = 0; //蜂鳴器狀態控制位,1-鳴叫、0-關閉        


  24. void DS1302SingleWrite(uchar reg, uchar dat);//ds1302.c定義的函數
  25. void WritinTime(struct sTime *time);
  26. void RefreshTime();


  27. sbit key1 = P3^0 ;
  28. sbit key2 = P3^1 ;
  29. sbit key3 = P3^2 ;
  30. sbit key4 = P3^3 ;
  31. #define key_value1  0x0e       //1110
  32. #define key_value2  0x0d       //1101
  33. #define key_value3  0x0b    //1011
  34. #define key_value4  0x07    //0111
  35. #define key_null       0x0f


  36. #define key_long_period    10
  37. #define key_continue_period    1

  38. #define key_down               0x80       //定義按鍵返回值狀態(按下,長按,連發,釋放)
  39. #define  key_long                0x40
  40. #define  key_continue         0x20
  41. #define  key_up                   0x10

  42. enum    key_state
  43.        {
  44.              key_state_init  ,
  45.              key_state_wobble   ,
  46.              key_state_press   ,
  47.              key_state_long  ,
  48.                                  key_state_continue   ,
  49.              key_state_release  
  50.           };
  51.    
  52. enum   key_state     KeyState  = key_state_init   ;
  53.                                                                         
  54. uchar KeyScan(void)  //執行按鍵掃描
  55.     {
  56.         if(key1 == 0)
  57.             return key_value1 ;
  58.         if(key2 == 0)
  59.             return key_value2 ;
  60.         if(key3 == 0)
  61.             return key_value3 ;
  62.         if(key4 == 0)
  63.             return key_value4 ;
  64.             return key_null  ; //無效
  65.     }

  66. void KeyInit(void)
  67.     {
  68.      key1 = 1 ;
  69.      key2 = 1 ;
  70.      key3 = 1 ;
  71.      key4 = 1 ;
  72.     }   



  73. void GetKey(uint8 *pKeyValue)
  74.   {
  75.      static uint8 KeyTimeCount = 0 ;
  76.      static uint8 LastKey = key_null ;                  //保存按鍵釋放時候的鍵值
  77.      uint8 KeyTemp =  key_null ;                        //鍵值變量賦初值  無效鍵值
  78.      KeyTemp = KeyScan() ;                              //獲取鍵值
  79.      switch(KeyState)
  80.         {
  81.         case  key_state_init :                                    //初始態S1
  82.                 {
  83.                   if( key_null != (KeyTemp))                 //鍵值不為無效  有鍵按下
  84.                     {
  85.                     KeyState = key_state_wobble    ;    //進入消抖態 state_init,
  86.                     }
  87.                  }
  88.                 break ;
  89.         case key_state_wobble :                                      //在消抖態S2
  90.                  {
  91.                   KeyState = key_state_press     ;       // 依舊按下態
  92.                  }
  93.               break ;
  94.          case key_state_press  :                                      //在按下態S3
  95.              {
  96.               if( key_null != (KeyTemp))                                 //鍵按下
  97.                   {
  98.                      LastKey = KeyTemp ; //保存鍵值,以便在釋放按鍵狀態返回鍵值
  99.                                                         KeyTemp |= key_down ;                           //////////////////0x80
  100.                       KeyState = key_state_long   ;//長按態  S4
  101.                       }
  102.                else
  103.                    {
  104.                                                    KeyState =  key_state_init ; //初始態
  105.                        }
  106.                    }
  107.                 break ;
  108.           case key_state_long   :  ////長按態
  109.               {
  110.                 if( key_null != (KeyTemp))  //
  111.                   {
  112.                       if(++KeyTimeCount > key_long_period    )//時間計數大于閥值300   3s
  113.                         {
  114.                                                                   KeyTimeCount = 0 ;                                       //計數清零
  115.                            KeyTemp |= key_long ;                  ////////////////////// //長按鍵事件發生0x40
  116.                           KeyState = key_state_continue    ;   //連發
  117.                             }
  118.                          }
  119.                                                 
  120.                          else
  121.                               {
  122.                                                                                   KeyState = key_state_release   ;  //釋放態
  123.                               }
  124.                                                                         }        
  125.                
  126.                 break ;
  127.            case key_state_continue :   // //連動態S5
  128.                {
  129.                if( key_null != (KeyTemp))   ///
  130.                   {
  131.                                                                
  132.                       if(++KeyTimeCount >key_continue_period     )  //連發態25階段一段時間
  133.                          {
  134.                           KeyTimeCount = 0 ;  //
  135.                            KeyTemp |= key_continue     ;   /////////////////////////連發事件發生0x20
  136.                           }
  137.                    }
  138.                                        
  139.                                  
  140.                 else
  141.                      {
  142.                                                          KeyState = key_state_release     ; ////釋放態
  143.                       }
  144.                 }
  145.                     break ;
  146.           case key_state_release :                                     ////釋放態S6
  147.                       {
  148.                         LastKey |= key_up ;                   /////////////////////////鍵彈起
  149.                         KeyTemp = LastKey ;               //
  150.                         KeyState =  key_state_init   ;                     //初始化
  151.                                                           }
  152.                      break ;
  153.                 default : break ;
  154.        }
  155.     *pKeyValue = KeyTemp ; //返回鍵值
  156.    }                                                                        
  157.                                                                         



  158.                  
  159. void RefreshTime()
  160.    {
  161.                 DigShow[0] =SEG[ CurTimeDec.year/10 ];   //年份
  162.                 DigShow[1] = SEG[CurTimeDec.year %10];
  163.                 DisplayData[0] =DigShow[0] ;
  164.                 DisplayData[1]=DigShow[1];
  165.                         
  166.        DigShow[2] = SEG[CurTimeDec.mon/10] ;    //月份
  167.        DigShow[3] = SEG[CurTimeDec.mon %10];
  168.             if(CurTimeDec.mon/10==0) DisplayData[2]=0xff;
  169.             DisplayData[2] =DigShow[2] ;
  170.                  DisplayData[3]=DigShow[3];
  171.                  
  172.                  DigShow[4] = SEG[CurTimeDec.day /10] ;  //日期
  173.         DigShow[5] = SEG[CurTimeDec.day %10];
  174.              if(CurTimeDec.day /10==0) DisplayData[4]=0xff;
  175.           DisplayData[4] =DigShow[4] ;
  176.                 DisplayData[5]=DigShow[5];
  177.                   
  178.        DigShow[10]=SEGweek[CurTimeDec.week%10];        
  179.                 DisplayData[10]=DigShow[10];
  180.                   
  181.      DigShow[6]=SEG[CurTimeDec.hour/10 ];     //時
  182.     DigShow[7]=SEG[CurTimeDec.hour%10];
  183. ……………………

  184. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

Keil代碼下載(不含仿真和原理圖):
Keil代碼.7z (38.71 KB, 下載次數: 45)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:102963 發表于 2022-1-13 10:09 | 只看該作者
這仿真圖太不清楚了,都看不清誰連接的誰!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美网站一区二区 | 女同av亚洲女人天堂 | 欧美精品一区二区三区在线四季 | 欧美视频一区 | 亚洲伊人精品酒店 | 少妇一区二区三区 | 91伦理片 | 久久国产美女视频 | 在线观看成人精品 | 久草热播 | 国产精品欧美一区喷水 | 精品视频一区二区三区在线观看 | 国产999精品久久久影片官网 | 精品国产一区三区 | www狠狠爱com | 成人在线免费视频 | 久久久91精品国产一区二区三区 | 亚洲精品久久久久avwww潮水 | 亚洲精品久久久一区二区三区 | 91精品国产综合久久福利软件 | 欧美激情在线精品一区二区三区 | 国产精品久久久久久久久大全 | 亚洲国产精品日韩av不卡在线 | 国产电影精品久久 | 日韩欧美一区二区三区免费观看 | 亚洲综合色视频在线观看 | 91色在线 | h视频免费在线观看 | 一级毛片视频 | 精品久久精品 | 成人av一区 | 国产传媒视频在线观看 | 一区二区三区在线播放 | 精品国产乱码久久久久久a丨 | 亚洲精品一区二区 | 在线永久看片免费的视频 | 91亚洲精华国产 | 东京av男人的天堂 | 亚洲成人综合在线 | 华丽的挑战在线观看 | 妖精视频一区二区三区 |