打印
[应用相关]

【转】STM8L之自定义长短按键

[复制链接]
897|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
四、实验前提
1、在进行本文步骤前,请先阅读以下博文:



2、在进行本文步骤前,请先实现以下博文:

暂无



五、基础知识
暂无


六、硬件原理图



本文使用PB2作为按键引脚,PB2配置为内部上拉输入,当KEY1按键按下时,PB2被拉低。



七、实验步骤


1、工程中添加长短按键的驱动

1)写一个长短按键的驱动GUA_Key.c (存放在工程的USER文件夹中)

[cpp] view plain copy


  • //******************************************************************************                           
  • //name:             GUA_Key.c               
  • //introduce:        按键驱动        
  • //author:           甜甜的大香瓜                     
  • //email:            897503845@qq.com         
  • //QQ group          香瓜单片机之STM8/STM32(164311667)                     
  • //changetime:       2016.11.14      
  • //******************************************************************************   
  • #include "stm8l10x.h"  
  • #include "GUA_Key.h"  
  •   
  • /*********************宏定义************************/  
  • #ifndef U8   
  • typedef unsigned char U8;   
  • #endif   
  •   
  • #ifndef U32   
  • typedef unsigned long U32;   
  • #endif   
  •   
  • //按键引脚宏  
  • #define GUA_KEY_PORT               GPIOB  
  • #define GUA_KEY_PIN                GPIO_Pin_2  
  • #define GUA_KEY_MODE               GPIO_Mode_In_PU_No_IT  
  •   
  • //按键触发宏  
  • #define GUA_KEY_TRIGGER            RESET                                //低电平触发  
  •   
  • //按键消抖宏  
  • #define GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT           2000            //短按键消抖数,约20ms  
  • #define GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT            300000          //长按键消抖数,约3S  
  •   
  • /*********************内部变量************************/  
  • static U32 sGUA_Key_DisappearsShakes_TriggerCount = 0;                  //消抖时的触发状态计数值  
  •   
  • //******************************************************************************               
  • //name:             GUA_Key_Scan               
  • //introduce:        按键检测触发状态            
  • //parameter:        none      
  • //return:           GUA_KEY_STATUS_IDLE or GUA_KEY_STATUS_TRIGGER_SHORT or GUA_KEY_STATUS_TRIGGER_LONG or GUA_KEY_STATUS_NO_LOOSEN               
  • //author:           甜甜的大香瓜                     
  • //email:            897503845@qq.com         
  • //QQ group          香瓜单片机之STM8/STM32(164311667)                     
  • //changetime:       2016.11.14                        
  • //******************************************************************************   
  • U8 GUA_Key_Scan(void)      
  • {      
  •   //触发  
  •   if(GPIO_ReadInputDataBit(GUA_KEY_PORT, GUA_KEY_PIN) == GUA_KEY_TRIGGER)   
  •   {  
  •     //如果上一次按键是长按键结束的,需要检测到松开方可开始下一次计数  
  •     if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)  
  •     {      
  •       return GUA_KEY_STATUS_NO_LOOSEN;  
  •     }  
  •    
  •     //计数  
  •     sGUA_Key_DisappearsShakes_TriggerCount++;  
  •       
  •     //判断计数是否足够  
  •     while(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_SHORT_COUNT)  
  •     {  
  •       //检测到松开、超时的时候,则处理  
  •       if((GPIO_ReadInputDataBit(GUA_KEY_PORT, GUA_KEY_PIN) != GUA_KEY_TRIGGER) || (sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT))  
  •       {  
  •         //长按键时  
  •         if(sGUA_Key_DisappearsShakes_TriggerCount >= GUA_KEY_DISAPPEARS_SHAKES_LONG_COUNT)  
  •         {            
  •           return GUA_KEY_STATUS_TRIGGER_LONG;                           
  •         }  
  •         //短按键时  
  •         else  
  •         {           
  •           return GUA_KEY_STATUS_TRIGGER_SHORT;                           
  •         }  
  •       }  
  •    
  •       //继续计数用来判断长短按键  
  •       sGUA_Key_DisappearsShakes_TriggerCount++;        
  •     }      
  •   }  
  •   //未触发  
  •   else  
  •   {  
  •     sGUA_Key_DisappearsShakes_TriggerCount = 0;   
  •   }  
  •    
  •   return GUA_KEY_STATUS_IDLE;   
  • }   
  •   
  • //******************************************************************************               
  • //name:             GUA_Key_Init               
  • //introduce:        按键初始化            
  • //parameter:        none      
  • //return:           none            
  • //author:           甜甜的大香瓜                     
  • //email:            897503845@qq.com         
  • //QQ group          香瓜单片机之STM8/STM32(164311667)                     
  • //changetime:       2016.11.14                       
  • //******************************************************************************   
  • void GUA_Key_Init(void)  
  • {  
  •   //按键IO初始化  
  •   GPIO_Init(GUA_KEY_PORT, GUA_KEY_PIN, GUA_KEY_MODE);      
  • }  


2)写一个长短按键的驱动头文件GUA_Key.h(存放在工程的USER文件夹中)

[cpp] view plain copy


  • //******************************************************************************                           
  • //name:             GUA_Key.h               
  • //introduce:        按键驱动的头文件        
  • //author:           甜甜的大香瓜                     
  • //email:            897503845@qq.com         
  • //QQ group          香瓜单片机之STM8/STM32(164311667)                     
  • //changetime:       2016.11.14      
  • //******************************************************************************   
  • #ifndef _GUA_KEY_H_  
  • #define _GUA_KEY_H_  
  •    
  • /*********************宏定义************************/  
  • //按键的触发状态  
  • #define GUA_KEY_STATUS_IDLE                             0            //按键没触发  
  • #define GUA_KEY_STATUS_TRIGGER_SHORT                    1            //短按键触发  
  • #define GUA_KEY_STATUS_TRIGGER_LONG                     2            //长按键触发  
  • #define GUA_KEY_STATUS_NO_LOOSEN                        3            //长按键触发后未松开  
  •   
  • /*********************外部函数声明************************/   
  • unsigned char GUA_Key_Scan(void);   
  • void GUA_Key_Init(void);  
  •   
  • #endif  


3)工程中添加GUA_Key.c



4)添加驱动的路径


[cpp] view plain copy


  • $PROJ_DIR$\..\USER   

注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。



2、应用层中调用


3)编写测试代码(main.c的main函数中)



八、注意事项

暂无

九、实验结果


仿真并设置断点查看长短按键的处理,可发现:

1、3S以内的按键被判定为短按键,并跳转至短按键处理事件中处理。

2、3S以上的按键被判定为长按键,并跳转至长按键处理事件中处理。处理之后的下一次按键判定必须等待按键松开后才开始。


发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

116

帖子

0

粉丝