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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2089|回復: 0
收起左側

單片機狀態機按鍵程序 支持短按和長按,可移植性好

[復制鏈接]
ID:196103 發表于 2022-9-29 11:55 | 顯示全部樓層 |閱讀模式
狀態機按鍵程序,可移植性好,支持短按和長按。親測可用。
單片機源程序如下:
  1. #include <iom16.h>
  2. #include <intrinsics.h>
  3. #include <stdbool.h>//位變量頭文件
  4. #include <iomacro.h>
  5. #include "keyboard.h"

  6. #define key_state_init 0   //按鍵的初始狀態
  7. #define key_state_ok 1   //按鍵被按下的狀態
  8. #define key_state_long 2   //按鍵被長按狀態
  9. //#define key_state_continue 3   //按鍵被連續按下狀態
  10. #define key_state_release 4   //按鍵釋放的狀態

  11. unsigned char KeyRead()
  12. {
  13.   static unsigned int key_timenum=0;//按鍵長按時間變量
  14.   static unsigned char key_state=0; //按鍵的狀態
  15.   static unsigned char key_num=0;//保存按鍵按鍵釋放時的值
  16.   static bool key_LONG=0;//記錄長按釋放
  17.   unsigned char  key_return=0;        //按鍵返回值       
  18.   unsigned char key_press; //保存按鍵按下的端口值       

  19.   key_press =(port^0xFF)&0XFF; // 讀按鍵I/O電平

  20.   switch (key_state)
  21.   {
  22.     case key_state_init://按鍵的初始狀態
  23.         if(key_press)//如果按鍵被按下
  24.         {
  25.           key_state=key_state_ok;//則把key_state按鍵狀態置為按鍵確認狀態
  26.         }
  27.          break;
  28.     case key_state_ok://按鍵確認狀態
  29.         if(key_press)//如果按鍵被按下
  30.         {
  31.           key_num=key_press;// 按鍵I/O電平保存
  32.           key_state=key_state_long;//則把key_state按鍵狀態置為按鍵被長按狀態
  33.         }
  34.         else
  35.           key_state=key_state_init;        //如果按鍵是抖動則返回按鍵的初始狀態
  36.         
  37.          break;
  38.     case key_state_long://按鍵被長按狀態
  39.         if(key_press)//如果按鍵被按下
  40.         {
  41.           if(!key_LONG)//如果上次有長按事件發生,長按時間就不再計時。
  42.           {
  43.               if (++key_timenum>=KEY_LONG_PERIOD)//達到長按設置值時
  44.               {
  45.                 key_timenum=0;
  46.                 key_return=(key_press+KEY_LONGSIGN);//返回按鍵值加個數來區別單按和長按
  47.                 key_LONG=1;//標記長按事件發生
  48.               }
  49.           }
  50.           else
  51.             key_return=(key_press+KEY_LONGSIGN);//返回按鍵值加個數來區別單按和長按
  52.         }
  53.         else
  54.           key_state=key_state_release;        //則把key_state按鍵狀態置為按鍵被釋放狀態       
  55.          break;               
  56.     case key_state_release://按鍵釋放狀態

  57.         if (key_LONG)//如果有長按事件發生
  58.         {
  59.           if(!key_press)//如果按鍵全部釋放
  60.           {
  61.             key_return=0;//返回值清0
  62.             key_state=key_state_init;//則把key_state按鍵狀態置為按鍵初始狀態
  63.             key_timenum=0;//計數清0
  64.             key_LONG=0;//長按標記清0
  65.           }
  66.           else//如果按鍵沒有釋放
  67.           {
  68.              key_state=key_state_release;//則繼續把key_state按鍵狀態置為按鍵被釋放狀態       
  69.           }  
  70.         }
  71.         else//如果沒有長按事件發生
  72.         {
  73.           if(!key_press)//如果按鍵全部釋放
  74.           {
  75.             key_return=key_num;
  76.             key_state=key_state_init;//則把key_state按鍵狀態置為按鍵初始狀態
  77.             key_timenum=0;//計數清0
  78.           }
  79.           else
  80.           {
  81.             key_state=key_state_release;//則繼續把key_state按鍵狀態置為按鍵被釋放狀態       
  82.           }  
  83.         }                       
  84.          break;
  85.     }
  86.     return key_return;                 
  87. }
復制代碼
  1. #ifndef __KEYBOARD_H__
  2. #define __KEYBOARD_H__

  3. #define K1 0X01//設定按鍵位置
  4. #define K2 0X02//設定按鍵位置
  5. #define K3 0X04//設定按鍵位置
  6. #define K4 0X08//設定按鍵位置
  7. #define K5 0X10//設定按鍵位置
  8. #define K6 0X20//設定按鍵位置
  9. #define K7 0X40//設定按鍵位置
  10. #define K8 0X80//設定按鍵位置
  11. #define L_K1 0X01+KEY_LONGSIGN//設定按鍵位置
  12. #define L_K2 0X02+KEY_LONGSIGN//設定按鍵位置
  13. #define L_K3 0X04+KEY_LONGSIGN//設定按鍵位置
  14. #define L_K4 0X08+KEY_LONGSIGN//設定按鍵位置
  15. #define L_K5 0X10+KEY_LONGSIGN//設定按鍵位置
  16. #define L_K6 0X20+KEY_LONGSIGN//設定按鍵位置
  17. #define L_K7 0X40+KEY_LONGSIGN//設定按鍵位置
  18. #define L_K8 0X80+KEY_LONGSIGN//設定按鍵位置
  19. #define port PINA//設定按鍵端口
  20. #define KEY_LONGSIGN 5//設定長按按鍵與普通按鍵差值
  21. #define KEY_LONG_PERIOD 150//定義長按鍵時間,消抖時間*時間數
  22. unsigned char KeyRead();
  23. #endif
復制代碼

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品成人久久 | 亚洲一区二区三区福利 | 国产精品特级毛片一区二区三区 | 黑人精品欧美一区二区蜜桃 | 狠狠操av| 日韩一区和二区 | 久久成人国产精品 | 日韩精品一区二区三区免费视频 | 在线亚洲精品 | 欧美精品一区二区免费 | 亚洲午夜在线 | 国产免费又色又爽又黄在线观看 | 日韩在线观看中文字幕 | 91久久综合亚洲鲁鲁五月天 | 影音先锋欧美资源 | 亚洲精品www. | 亚洲一区在线日韩在线深爱 | 久久伊人一区二区 | 中文字幕一区二区三区在线观看 | 久久草在线视频 | 在线视频一区二区 | 男人天堂999 | 日韩在线不卡视频 | 色资源在线观看 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 99精品99| 在线播放国产一区二区三区 | 午夜二区 | 在线日韩视频 | 欧美高清视频一区 | 国产精品区二区三区日本 | 亚洲精品久久久一区二区三区 | 久久精品二区亚洲w码 | 日韩在线小视频 | 国产日韩精品在线 | 超级乱淫av片免费播放 | 国产成人小视频 | 亚洲久草视频 | 天天操夜夜操 | 国产1区 | 伊人久久大香线 |