你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0 按键程序

[复制链接]
STMCU小助手 发布时间:2021-11-21 21:00
  1. #define     HAVEKEY_PIN    0x0003            //
  2. #define     KEYPOP                0x0000
  3. #define        KEY_START_PRESSED            1            //
  4. typedef struct
  5. {
  6.     INT8U     bLastValue;                          //
  7.     INT8U     bDebunceTime;                        //
  8.     INT8U     bPressed;                                //
  9.     INT8U     bValue;                                    //
  10.     INT8U     bState;                                    //   
  11. } tKEY;
复制代码
1. 按键IO口配置
  1. void KEY_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStruct;
  4.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_KEY_PORT, ENABLE);
  5.         GPIO_InitStruct.GPIO_Pin = PAUSE_KEY_PIN | CLEAR_KEY_PIN ;//| ENTER_KEY_PIN | SET_KEY_PIN ;
  6.         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;  //GPIO_Mode_AF,GPIO_Mode_OUT
  7.         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
  8.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  9.         GPIO_Init(GPIO_KEY_PORT, &GPIO_InitStruct);
  10.         memset(    &KeyCtrl,0,sizeof(tKEY));
  11. }
复制代码
2. 按键debunce时间,在timer里调用
  1. void    KeyCtrlbDebunceTimeDec(void)
  2. {
  3.         if(KeyCtrl.bDebunceTime)
  4.         {
  5.                 KeyCtrl.bDebunceTime--;
  6.         }
  7.         else
  8.         {
  9.                 KeyCtrl.bDebunceTime = 20;
  10.         }
  11. }
复制代码
3. 扫描按键
  1. INT8U    KeyScan(u8  *bKeyValue)
  2. {
  3.         int TempKeyIn;
  4.         TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT);
  5.         TempKeyIn = GPIO_ReadInputData(GPIO_KEY_PORT) & HAVEKEY_PIN;    //get high 8 bit
  6.         TempKeyIn = (TempKeyIn ^ 0xffff) & HAVEKEY_PIN;
  7.         if(TempKeyIn == 0x0000)                                                                     //no key pressed
  8.         {
  9.                 memset(    &KeyCtrl,0,sizeof(tKEY));        
  10.                 return NOKEY_PRESSED;        
  11.         }
  12.         else
  13.         {
  14.                 if(KeyCtrl.bState != KEY_START_PRESSED)        //start key pressed
  15.                 {
  16.                     KeyCtrl.bState = KEY_START_PRESSED;
  17.                     KeyCtrl.bDebunceTime = 20;                            //10ms
  18.                     return     NOKEY_PRESSED;
  19.                 }
  20.                 else
  21.                 {
  22.                     if(TempKeyIn == KeyCtrl.bLastValue)        //lastkey
  23.                     {
  24.                         return     NOKEY_PRESSED;
  25.                     }
  26.                     else
  27.                     {
  28.                         if(KeyCtrl.bDebunceTime !=0)                //debunce time? 10ms
  29.                         {
  30.                             return     NOKEY_PRESSED;
  31.                         }
  32.                         else
  33.                         {
  34.                                 KeyCtrl.bLastValue = TempKeyIn;
  35.                                 KeyCtrl.bValue = TempKeyIn;
  36.                                 *bKeyValue = TempKeyIn;
  37.                                 return  KEY_PRESSED;
  38.                         }
  39.                     }
  40.                 }
  41.         }
  42. }
复制代码
4. 按键处理
  1. void    KeyPro(void)
  2. {
  3.     u8    KeyValue;
  4.     if(KeyScan(&KeyValue) == KEY_PRESSED)
  5.     {
  6.             if(KeyValue == CLEAR_KEY)
  7.             {
  8.                 ExtiCnt = 0;
  9.             }
  10.             else if(KeyValue == PAUSE_KEY)
  11.             {
  12.                     PauseFlag = ~PauseFlag;
  13.             }
  14.     }
  15. }
复制代码
收藏 评论0 发布时间:2021-11-21 21:00

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版