STM32
直播中

哈哈哈

10年用户 794经验值
擅长:可编程逻辑
私信 关注
[问答]

stm32的按键是如何去实现长按及其短按的

STM32的按键是如何去实现长按及其短按的?具体实现过程是怎样的?

回帖(1)

刘琪琛

2021-12-1 14:18:28
一、具体实现过程:


1.CUBEMX配置 LED、 KEY、定时器:10ms(选用)、串口(调试打印)
(对这部分配置不熟悉的,可以去看看基础配置,)
2.点击生成代码:
二、具体使用函数:

代码如下(示例):

/*
        每10ms进入一次该函数,检查一下引脚状态
        可以用定时器,也可以用查询
*/
void Key_scan(void)
{
        //1 表示高电平,0表示低电平。低电平时按下       
        uint8_t  val = HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin);
        static uint16_t count=0;
        if(!val)//按键按下 记录按下的时间
        {
                count++;
        }
        else //按键松开 计数值清零并返回按下的时间值
        {
                if(count>100)//按下经过1s  10*10ms=100ms
                {
                    //长按
                        KEY_flag = 2;
                        printf("key_flag == 2rn");
                }
                else if(count>10 && count <100)//表示超过10ms
                {
                        //短按
                        KEY_flag = 1;
                        printf("key_flag == 1rn");
                }
                else
                {
                       
                        //消抖时间
                }
                count=0;
        }
}


/*
*依据标志位改变LED的状态
*/
void Led_scan()
{
        switch(KEY_flag)
        {
                case 1:
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
                break;
                case 2:
                        HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
                break;
                default:
                        break;
        }
}
三、主函数:
/*
*依据标志位改变LED的状态
*/
HAL_Delay(3000);                       //防止一上电定时器,就开始计数
HAL_TIM_Base_Start_IT(&htim4); //定时器使能
printf("正常rn");


  while (1)
  {
    /* USER CODE BEGIN 3 */
//1.查询方式扫描按键状态               
//                Key_scan();
//                Led_scan();
//                HAL_Delay(10);
//2.定时器方式扫描按键状态                       
                Led_scan();
  }
  /* USER CODE END 3 */


五、回调函数:


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
        Key_scan();
        HAL_TIM_Base_Start_IT(&htim4); //再次使能
}
六、串口重定向函数:

在uart.c中添加:

/**
  * 函数功能: 重定向c库函数printf到DEBUG_USARTx
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}
总结

  现在看看其实代码也挺好理解,可为什么当时没写出来呢,害,还需继续努力。在嵌入式这条路上我还是个菜鸡,路漫漫其修远兮,在这里主要是把我学习遇到的坑分享一下!
举报

更多回帖

发帖
×
20
完善资料,
赚取积分