第一步 : 首先在key.h定义几个变量
- / 按键的键值
- #define KEY1_Press 1
- #define KEY2_Press 2
- #define KEY3_Press 3
- #define KEY4_Press 4
- / 读取IO口的电平
- #define KEY1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
- #define KEY2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
- #define KEY3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
- #define KEY4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)
复制代码
第二步: 在key.c 中编写按键扫描函数
- <font color = blue size = 5> 编写的按键扫描函数, 只需要返回键值即可, 不需要我们判断按键是否松开这些情况
- uint8_t KEY_Scan()
- {
- if ((KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)) 判断是否有按键按下
- {
- HAL_Delay(10); 消抖
- if((KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))/// 判断按键是否按下
- {
- if (!KEY1) return KEY1_Press;/ 返回键值
- else if (!KEY2) return KEY2_Press;
- else if (!KEY3) return KEY3_Press;
- else if (!KEY4) return KEY4_Press;
- }
-
- }
- return 0; / 如果没有按键按下 返回0
- }
复制代码
三 编写定时器(1ms)
这里我们认为 当按下按键的时间持续 0.8s 认为是长按 !!!!, 需要开启一个定时器和2个记录时间的变量(key_last_time, key_now_time), 为了快速配置, 这里我们使用 Stm32cubemx 配置 我们还可以设置长按的时间来设置不同的状态, 这也是实现仅一个按键可以实现控制多个状态的方法 我使用的板子时钟配置为80MHz, 配置 1ms的中断,
接下来, 我们只需要 让key_now_time变量在这一个定时器中断里面加1即可
- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 1ms的中断
- {
- key_now_time++;
- }
复制代码
四 编写按键处理函数
按键处理函数:
- void Deal_Key(void)
- {
- uint8_t key_value;
- key_value = KEY_Scan(); 获取键值
-
-
- if (key_value !=key_old )
- 与上一次的键值比较 如果不相等,表明有键值的变化,开始计时
- {
-
- key_old = key_value; 更新旧键值
- key_last_time = key_now_time; 让2者相等,
- }
- else
- key_value = 0; 如果没有键值的改变 说明没有按键按下或松开
-
-
- if (key_value)/ 短按处理
- {
- switch(key_value)
- {
- case 1 : printf("KEY1 按下\r\n"); break;
- case 2 : printf("KEY2 按下\r\n"); break;
- case 3 : printf("KEY3 按下\r\n"); break;
- case 4 : printf("KEY4 按下\r\n"); break;
- }
- key_value = 0; /// 该语句可有可无, 为了保险, 最好加上
- }
-
-
- if ((key_now_time- key_last_time > 800))/ 如果按键按下超过0.8s 判断按键
- {
- if(key_old) / 注意 一定是判断旧键值, 因为当按键一直按下未松开时, 即key_old == key_value,
- 此时key_value 0 ;
- {
- switch(key_old)
- {
- case 1 : printf("KEY1 长按\r\n"); break;
- case 2 : printf("KEY2 长按\r\n"); break;
- case 3 : printf("KEY3 长按\r\n"); break;
- case 4 : printf("KEY4 长按\r\n"); break;
- }
- }
- }
- }
复制代码
接下来, 我们只需要把按键处理函数放入while(1) 大循环中即可!!!!
————————————————
版权声明:YELLOW_YELLOW_YELOW
如有侵权请联系删除
|