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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

支持不同組IO口按鍵短按,長按 單片機按鍵掃描程序KEY.H KEY.C文件下載

[復制鏈接]
跳轉到指定樓層
樓主
ID:1059383 發表于 2022-12-29 11:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機按鍵掃描程序, 可移植,實用性高且穩定, 本人親測在多個項目上使用,暫時未發現問題,

支持短按,長按, 最大可支持八個按鍵, 支持不同組io口按鍵

如果需要修改按鍵IO或者增加/減少按鍵只需簡單修改頭文件里的幾個常量即可

MCU程序如下:
KEY.H
  1. #ifndef KEY_H_
  2. #define KEY_H_

  3. typedef unsigned char u8;
  4. typedef unsigned int  u16;

  5. #define                C_KEY_NUM                                (1)                                                                //定義按鍵數量
  6. #define                C_KEY_LONG_TIME                        (100-1)                                                        //按鍵長按時間        立即數*時基
  7. //#define                C_KEY_DBLCLICK_EN                (0)                                                                //雙擊使能,  1使能 0 關閉
  8. #define                C_KEY_DAT_BUF                        (0xff>>(8- C_KEY_NUM))                        //
  9. #define                C_PORTA                                        (PORTA)
  10. #define                C_PORTB                                        (PORTB)
  11. #define                C_PORTC                                        (PORTC)

  12. #define                CST_KEY1_BIT                        (C_PORTB & C_KEY_BIT6)                        //定義按鍵地址
  13. #define                CST_KEY2_BIT                        (C_PORTB & C_KEY_BIT_NULL)                //定義按鍵地址
  14. #define                CST_KEY3_BIT                        (C_PORTA & C_KEY_BIT_NULL)                //定義按鍵地址
  15. #define                CST_KEY4_BIT                        (C_PORTB & C_KEY_BIT_NULL)                //定義按鍵地址
  16. #define                CST_KEY5_BIT                        (C_PORTB & C_KEY_BIT_NULL)                //定義按鍵地址
  17. #define                CST_KEY6_BIT                        (C_PORTB & C_KEY_BIT_NULL)                //定義按鍵地址
  18. #define                CST_KEY7_BIT                        (C_PORTB & C_KEY_BIT_NULL)                //定義按鍵地址
  19. #define                CST_KEY8_BIT                        (C_PORTB & C_KEY_BIT_NULL)                //定義按鍵地址

  20. #define                C_KEY_BIT_NULL                        (0X00)
  21. #define                C_KEY_BIT0                                (0X01)
  22. #define                C_KEY_BIT1                                (0X02)        
  23. #define                C_KEY_BIT2                                (0X04)
  24. #define                C_KEY_BIT3                                (0X08)        
  25. #define                C_KEY_BIT4                                (0X10)
  26. #define                C_KEY_BIT5                                (0X20)        
  27. #define                C_KEY_BIT6                                (0X40)
  28. #define                C_KEY_BIT7                                (0X80)

  29. enum C_KEY_STATUS_SHORT
  30. {
  31.         C_KEY1_STATUS_SHORT = 1,
  32.         C_KEY2_STATUS_SHORT,
  33.         C_KEY3_STATUS_SHORT,
  34.         C_KEY4_STATUS_SHORT,
  35.         C_KEY5_STATUS_SHORT,
  36.         C_KEY6_STATUS_SHORT,
  37.         C_KEY7_STATUS_SHORT,
  38.         C_KEY8_STATUS_SHORT
  39. };
  40. enum C_KEY_STATUS_LONG
  41. {
  42.         C_KEY1_STATUS_LONG = 0X21,
  43.         C_KEY2_STATUS_LONG,
  44.         C_KEY3_STATUS_LONG,
  45.         C_KEY4_STATUS_LONG,
  46.         C_KEY5_STATUS_LONG,
  47.         C_KEY6_STATUS_LONG,
  48.         C_KEY7_STATUS_LONG,
  49.         C_KEY8_STATUS_LONG
  50. };

  51. #define                B_KEY_PRESS_BIT                        (r_key_step_status & 0X01)                //按鍵按下標志
  52. #define                B_KEY_WHILE_UP_BIT                (r_key_step_status & 0X02)                //等待按鍵抬起標志

  53. #define                C_SET_KEY_PRESS_H                r_key_step_status |= 0X01                //按鍵按下標志置1
  54. #define                C_SET_KEY_PRESS_L                r_key_step_status &= ~0X01                //按鍵按下標志置0
  55. #define                C_SET_KEY_WHILE_UP_H        r_key_step_status |= 0X02                //按鍵等待抬起標志置1
  56. #define                C_SET_KEY_WHILE_UP_L        r_key_step_status &= ~0X02                //按鍵等待抬起標志置0
  57. #define                clear_r_key_status                r_key_status = 0                                //清除按鍵值

  58. volatile u8 r_key_status;                                                                                        //        按鍵值        
  59. volatile u8 r_key_step_status;                                                                                //        按鍵步驟狀態                        
  60. volatile u8 r_key_time_cnt;                                                                                        //        長按計時
  61. volatile u8 r_port_temp;                                                                                        //        保存按鍵按下狀態
  62. volatile u8 r_key_dat;                                                                                                //        所有按鍵映射到這個變量里面,統一管理


  63. void key_scan(void);


  64. #endif
復制代碼

KEY.C
  1. #include <sc.h>
  2. #include "user.h"
  3. #include "KEY.h"

  4. void key_scan(void)
  5. {
  6.         r_key_dat = 0;        
  7.         //        映射 IO
  8. #if C_KEY_NUM > 0
  9.         if(CST_KEY1_BIT)
  10.         {
  11.                 r_key_dat |= C_KEY_BIT0;        
  12.         }
  13. #endif
  14. #if C_KEY_NUM > 1
  15.         if(CST_KEY2_BIT)
  16.         {
  17.                 r_key_dat |= C_KEY_BIT1;        
  18.         }
  19. #endif
  20. #if C_KEY_NUM > 2
  21.         if(CST_KEY3_BIT)
  22.         {
  23.                 r_key_dat |= C_KEY_BIT2;        
  24.         }
  25. #endif
  26. #if C_KEY_NUM > 3
  27.         if(CST_KEY4_BIT)
  28.         {
  29.                 r_key_dat |= C_KEY_BIT3;        
  30.         }
  31. #endif
  32. #if C_KEY_NUM > 4
  33.         if(CST_KEY5_BIT)
  34.         {
  35.                 r_key_dat |= C_KEY_BIT4;        
  36.         }
  37. #endif
  38. #if C_KEY_NUM > 5
  39.         if(CST_KEY6_BIT)
  40.         {
  41.                 r_key_dat |= C_KEY_BIT5;        
  42.         }
  43. #endif
  44. #if C_KEY_NUM > 6
  45.         if(CST_KEY7_BIT)
  46.         {
  47.                 r_key_dat |= C_KEY_BIT6;        
  48.         }
  49. #endif
  50. #if C_KEY_NUM > 7
  51.         if(CST_KEY8_BIT)
  52.         {
  53.                 r_key_dat |= C_KEY_BIT7;        
  54.         }
  55. #endif
  56.         if(!B_KEY_PRESS_BIT)                                                // 按鍵沒有按下狀態
  57.         {
  58.                 if(r_key_dat != C_KEY_DAT_BUF)                        // 判斷按鍵有沒有按下
  59.                 {
  60.                         C_SET_KEY_PRESS_H;                                        // 按鍵按下了
  61.                         C_SET_KEY_WHILE_UP_L;                                
  62.                         r_port_temp = r_key_dat;                        // 保存當前按鍵值
  63.                         r_key_time_cnt = 0;                                        // 清除按鍵計時
  64.                 }
  65.         }
  66.         else
  67.         {
  68.                 r_sleep_cnt = 0;                                                // 按鍵按下 清除休眠
  69.                 if(B_KEY_WHILE_UP_BIT)                                        // 等待按鍵抬起
  70.                 {
  71.                         if(r_key_dat == C_KEY_DAT_BUF)
  72.                         {
  73.                                 r_key_step_status = 0;                        // 清除所有狀態
  74.                         }
  75.                 }
  76.                 else
  77.                 {
  78.                         ++r_key_time_cnt;
  79.                         if(r_port_temp == r_key_dat)                //        按鍵一直按
  80.                         {
  81.                                 if(r_key_time_cnt > C_KEY_LONG_TIME)                //        長按
  82.                                 {
  83.                                         r_key_time_cnt = 0;
  84.                                         C_SET_KEY_WHILE_UP_H;
  85. #if C_KEY_NUM > 0
  86.                                         if(!(r_port_temp & C_KEY_BIT0))
  87.                                         {
  88.                                                 r_key_status = C_KEY1_STATUS_LONG;
  89.                                         }
  90. #endif
  91. #if C_KEY_NUM > 1
  92.                                         if(!(r_port_temp & C_KEY_BIT1))
  93.                                         {
  94.                                                 r_key_status = C_KEY2_STATUS_LONG;
  95.                                         }
  96. #endif
  97. #if C_KEY_NUM > 2
  98.                                         if(!(r_port_temp & C_KEY_BIT2))
  99.                                         {
  100.                                                 r_key_status = C_KEY3_STATUS_LONG;
  101.                                         }
  102. #endif
  103. #if C_KEY_NUM > 3
  104.                                         if(!(r_port_temp & C_KEY_BIT3))
  105.                                         {
  106.                                                 r_key_status = C_KEY4_STATUS_LONG;
  107.                                         }
  108. #endif
  109. #if C_KEY_NUM > 4
  110.                                         if(!(r_port_temp & C_KEY_BIT4))
  111.                                         {
  112.                                                 r_key_status = C_KEY5_STATUS_LONG;
  113.                                         }
  114. #endif
  115. #if C_KEY_NUM > 5
  116.                                         if(!(r_port_temp & C_KEY_BIT5))
  117.                                         {
  118.                                                 r_key_status = C_KEY6_STATUS_LONG;
  119.                                         }
  120. #endif
  121. #if C_KEY_NUM > 6
  122.                                         if(!(r_port_temp & C_KEY_BIT6))
  123.                                         {
  124.                                                 r_key_status = C_KEY7_STATUS_LONG;
  125.                                         }
  126. #endif
  127. #if C_KEY_NUM > 7
  128.                                         if(!(r_port_temp & C_KEY_BIT7))
  129.                                         {
  130.                                                 r_key_status = C_KEY8_STATUS_LONG;
  131.                                         }
  132. #endif
  133.                                 }                                
  134.                         }
  135.                         if(r_key_dat == C_KEY_DAT_BUF)                //        按鍵抬起
  136.                         {
  137.                                 if(r_key_time_cnt > 1)                        //        按鍵按下超過10ms才算按下
  138.                                 {
  139. #if C_KEY_NUM > 0
  140.                                         if(!(r_port_temp & C_KEY_BIT0))
  141.                                         {
  142.                                                 r_key_status = C_KEY1_STATUS_SHORT;
  143.                                         }
  144. #endif
  145. #if C_KEY_NUM > 1
  146.                                         if(!(r_port_temp & C_KEY_BIT1))
  147.                                         {
  148.                                                 r_key_status = C_KEY2_STATUS_SHORT;
  149.                                         }
  150. #endif
  151. #if C_KEY_NUM > 2
  152.                                         if(!(r_port_temp & C_KEY_BIT2))
  153.                                         {
  154.                                                 r_key_status = C_KEY3_STATUS_SHORT;
  155.                                         }
  156. #endif
  157. #if C_KEY_NUM > 3
  158.                                         if(!(r_port_temp & C_KEY_BIT3))
  159.                                         {
  160.                                                 r_key_status = C_KEY4_STATUS_SHORT;
  161.                                         }
  162. #endif
  163. #if C_KEY_NUM > 4
  164.                                         if(!(r_port_temp & C_KEY_BIT4))
  165.                                         {
  166.                                                 r_key_status = C_KEY5_STATUS_SHORT;
  167.                                         }
  168. #endif
  169. #if C_KEY_NUM > 5
  170.                                         if(!(r_port_temp & C_KEY_BIT5))
  171.                                         {
  172.                                                 r_key_status = C_KEY6_STATUS_SHORT;
  173.                                         }
  174. #endif
  175. #if C_KEY_NUM > 6
  176.                                         if(!(r_port_temp & C_KEY_BIT6))
  177.                                         {
  178.                                                 r_key_status = C_KEY7_STATUS_SHORT;
  179.                                         }
  180. #endif
  181. #if C_KEY_NUM > 7
  182.                                         if(!(r_port_temp & C_KEY_BIT7))
  183.                                         {
  184.                                                 r_key_status = C_KEY7_STATUS_SHORT;
  185.                                         }
  186. #endif
  187.                                 }
  188.                                 r_key_step_status = 0;                        //        清除所有狀態
  189.                         }
  190.                         
  191.                 }
  192.         }        
  193. }
復制代碼

評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区福利 | www.免费看片.com| 一级毛片免费完整视频 | japanhd成人| 国产精品一区二区在线 | 99re6在线视频| 国产一区二区三区色淫影院 | 91久久国产综合久久91精品网站 | 性高湖久久久久久久久 | 亚洲二区在线 | 日本三级在线网站 | 精品视频在线播放 | 久久i | 久久精品亚洲一区 | avmans最新导航地址 | 欧美视频二区 | 国产精品一区二区三区久久久 | 一区二区三区日韩精品 | 日韩三级一区 | 欧美精品在线一区 | 国产午夜在线 | 精品国产欧美 | 久久91| 天天综合日日夜夜 | 视频一区二区在线观看 | 精品国产免费一区二区三区演员表 | 人操人人干人 | 免费在线观看黄色av | 亚洲人成免费 | 国产精品激情小视频 | 嫩草视频免费 | h片在线看 | 欧美第一页 | 91福利网 | 日韩国产中文字幕 | 久久亚洲精品国产精品紫薇 | 色爱av| 国产伦精品一区二区三区四区视频 | 中文字幕黄色大片 | 一级毛片视频 | 成人不卡 |