找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2005|回复: 2
打印 上一主题 下一主题
收起左侧

单片机按键单击双击长按程序

  [复制链接]
跳转到指定楼层
楼主
ID:1053355 发表于 2022-12-20 12:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如何实现一个按键多种功能,这里介绍了按键单击,双击,长按,源代码,亲测有效,模块独立,包括.c和.h文件
my_key.c
  1. /**                                       
  2.   * @file    my_key.c                                       
  3.   * @author  xxb                                       
  4.   * @version V1.0                                       
  5.   * @date    07/29/                                      
  6.   * @brief   This file provides all the KEY firmware functions.                                       
  7.   */                                         
  8. #define KEY_GLOBAL                                       
  9.                                        
  10. #include "..\inc\my_key.h"                                       
  11. #include "..\inc\my_led.h"                                       
  12.                                                                         
  13. /****************************************************************************                                       
  14. 【功能说明】按键扫描程序                                       
  15. ****************************************************************************/                                          
  16.                                        
  17. U8  Key_Scan(void)                                       
  18. {                                       
  19.                                        
  20.         U8 key_val=NO_KEY;                                
  21.                                        
  22.         //这里添加读口线的代码
  23. //        if(!_pa0)
  24. //        {
  25. //                key_val=MyKEY_NAME1;
  26. //        }
  27. //        else if(!_pa2)
  28. //        {
  29. //                key_val=MyKEY_NAME2;
  30. //        }                                
  31.         return (key_val);                                
  32.                                        
  33. }                                       
  34.                                        
  35. /****************************************************************************                                       
  36. 【功能说明】获取键值                                       
  37. ****************************************************************************/                                         
  38.                                        
  39. U8 Get_KeyValue(void)                                       
  40. {                                       
  41.         U8 new_val;                                
  42.         U8 ret=NO_KEY;                                
  43.         static U8  press_time=0;                                
  44.                                        
  45.         new_val=Key_Scan();                        //扫描按键               
  46.         switch (key_state)                                
  47.         {                                
  48.                 case 0:                        
  49.                 if(new_val<NO_KEY)   //如果有键按下,转到状态1。                        
  50.                 {                        
  51.                         old_val=new_val;               
  52.                         press_time=0;               
  53.                         key_state=1;               
  54.                 }                        
  55.                 break;                        
  56.                                        
  57.                 case 1:                        
  58.                 if (old_val==new_val)  //确实有键按下(消抖)                        
  59.                 {                        
  60.                         key_state=2;                                
  61.                 }                        
  62.                 else key_state=0;                        
  63.                 break;        

  64.                 case 2:                        
  65.                 if (old_val==new_val)                  //继续按着开始计时               
  66.                 {                                
  67.                         if(++press_time>=100)        //100x10=1000MS
  68.                         {        
  69.                                 ret=new_val+10;                //在短按键值基础上加10就是长按
  70.                                 key_state=3;
  71.                         }        
  72.                 }                        
  73.                 else                                                //松开了返回短按        
  74.                 {               
  75.                         ret=new_val;                        //返回短按        
  76.                         key_state=3;        
  77.                 }                        
  78.                 break;                        
  79.                                        
  80.                 case 3:                                                
  81.                 if (new_val==NO_KEY)         //如果松开键                        
  82.                 {                        
  83.                         key_state=4;                   //转到状态4 (消抖)               
  84.                 }                        
  85.                 break;                        
  86.                                        
  87.                 case 4:                        
  88.                 if (new_val==NO_KEY)         //如果确实松开                        
  89.                 {                        
  90.                 key_state=0;                   //转到状态0                        
  91.                 }                        
  92.                 else   key_state=3;                        
  93.                 break;                        
  94.         }                                
  95.         return (ret);                                
  96. }                                       
  97.                                        
  98. /**                                       
  99.   * @brief  KEY Process program        (10MS调一次,最短不能低于5MS,最长不大于32MS)                                
  100.   * @param  None                                       
  101.   * @retval None                                       
  102.   */                                       
  103. void Key_Process(void)                                       
  104. {                                       
  105.                                 
  106.         U8 key_val=Get_KeyValue();                                
  107.         switch(key_val)               
  108.         {
  109.                 case MyKEY_NAME1:
  110.                 //短按键1处理        
  111.                 break;
  112.                
  113.                 case MyKEY_NAME2:
  114.                 //短按键2处理               
  115.                 break;
  116.                
  117.                 case MyKEY_NAME1_LONG:
  118.                 //长按键1处理               
  119.                 break;
  120.         }               
  121.         
  122.                
  123. }                                          
复制代码


my_key.h
  1. /**
  2.   * @file    my_key.h
  3.   * @author  xxb
  4.   * @version V1.0
  5.   * @date    07/29/2017
  6.   * @brief   This file contains all the functions prototypes for the KEY firmware
  7.   */
  8. #ifndef __MY_KEY_H__
  9. #define __MY_KEY_H__



  10. #include "..\inc\cpu.h"


  11. #ifdef  KEY_GLOBAL
  12. #define KEY_EXT
  13. #else
  14. #define KEY_EXT     extern
  15. #endif

  16. #define NO_KEY     0xFF

  17. #define MyKEY_NAME1                        1
  18. #define MyKEY_NAME2                        2




  19. #define MyKEY_NAME1_LONG        MyKEY_NAME1+10



  20. KEY_EXT U8 key_state;
  21. KEY_EXT U8 old_val;


  22. void Key_Process(void);



  23. #endif
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:765927 发表于 2023-2-24 16:09 来自手机 | 只看该作者
51有你更精彩,收藏了
回复

使用道具 举报

板凳
ID:97678 发表于 2023-2-24 19:38 | 只看该作者
..\inc\my_led.h" 这个文件没有,可以发一下吗?
程序有错误!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表