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

STM32 按键输入 | V1.0.0

[复制链接]
STMCU小助手 发布时间:2021-1-15 15:08
STM32 按键输入 |V1.0.0
LED灯的程序已经差不多了,咱们接下来可以写写别的一些东西了,比如按键的采集。
说到这个按键输入呀,我一直觉得挺难做的。实际运用的时候,真的比学的时候难多了。
大家想想呀,按键,有单击,双击,甚至三击,多击。单击,又分短按,长按。
其中,除了单击,其他的都需要计算时间,双击的间隔多少时间才合适,短按和长按的时间也需要考虑。细想起来,这个按键采集真的不是简单的事。
今天呢,就从简单的单击开始设计。
一个键的单击功能,我想大家基本也知道该怎么写,就是读IO口的电平,IO有信号了,就处理相应的程序。
IO初始化时,我们需要将IO口的模式设置为输入模式,并需要定时去读取该IO的信号。
同样的,咱们依然用正点原子的硬件,这次咱们只用一个按键。
4.1.png
按键的硬件
4.2.png
按键挂载的IO口
从硬件上就知道,按键按下,IO口就是低电平,由于外部电路没有上拉电阻,我们要把IO口模式设为上拉输入。
  1. //按键初始化函数
  2. void KEY_Init(void) //IO初始化
  3. {
  4.    GPIO_InitTypeDef GPIO_InitStructure;

  5.    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PORTE时钟

  6.   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;//KEY0
  7.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  8.    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4
  9. }
复制代码

还有,读取IO的值,有信号输入时,输出1,
  1. /** @brief        读键值
  2.   * @param[in]    无
  3.   * @param[out]   无
  4.   * @retval       类型
  5.   * @note         10ms
  6.   */
  7. u8 sKEY_GetValue(void)
  8. {
  9.     u8 data = 0;   
  10.    
  11.     if(KEY0 == 0)
  12.         data |= 0x01;
  13.     return data;
  14. }
复制代码

然后,咱们设置一个循环函数,按一下按键,切换一次LED的模式。
我们把这个函数放在10ms的循环里,这样,就相当于每10ms读一次IO口的值,可以不需要延时来防抖。
  1. /** @brief        KEY循环
  2.   * @param[in]    无
  3.   * @param[out]   无
  4.   * @retval       类型
  5.   * @note         10ms
  6.   */
  7. void sKEY_Loop(void)
  8. {
  9.     static u8 LastValue;
  10.     static u8 LedType = 0;
  11.         
  12.     if( sKEY_GetValue() & 0x01 )
  13.     {
  14.         if(LastValue == 0)
  15.         {
  16.             LastValue = 1;
  17.         
  18.             LedType = (LedType +1) % 3;
  19.             sLED_SetType(LedType);
  20.         }
  21.     }
  22.     else
  23.         LastValue = 0;
  24. }
复制代码

当然,主函数也是要做相应的修改的,加入KEY的初始化函数,以及KEY的循环函数。
我们先设置LED使能,并设置LED的故障码为5。然后开始执行程序。
  1. int main(void)
  2. {   
  3.   delay_init();                                //延时函数初始化   
  4.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  5.    LED_Init();                                  //LED端口初始化
  6.     KEY_Init();
  7.   TIM3_Int_Init(99,7199);                         //10Khz的计数频率,计数到100为10ms
  8.    

  9.      
  10.      while(1)
  11.   {
  12.         sLED_Enable(ENABLE);
  13.         sLED_SetErrNum(5);
  14.         
  15.         if(GetTimerFlag()) //10ms
  16.         {
  17.             sLED_Loop();
  18.             sKEY_Loop();
  19.         }
  20.   }   
  21. }  
复制代码

这样就可以了。
今晚就不放视频了,先到这里,明天见。
文章出处: Yue無缺

收藏 评论0 发布时间:2021-1-15 15:08

举报

0个回答

所属标签

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