赞
踩
同时可实现 按键消抖 松手检测
① 包含正点原子的sys.h
② 制作.h .c文件 -源码见 “二”
③ 把 key_scan 函数 放入 5ms 的定时器中断,可自实现 按键消抖
④ 接线方法
⑤ 按键值keyval可这么用 :
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&htim1)) //1ms定时
{
ms++;
if (!(ms%5))
key_scan();
}
}
while (1)
{
if (Key_val == 1) //**按键扫描**
{
while (Key_val == 1); //**松手检测**
xxxxxxxxxx //自己的逻辑代码块
]
}
#include "matrix_key.h" #include "sys.h" #include "stm32f4xx.h" // Device header u8 Key_val = 0xff; void key_scan() { uint16_t temp, flag = 0; static u8 key_state = 0; switch (key_state){ case 0:{ /*=========================以下代码是按键扫描程序=========================*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态 /*----------------------------Scan the 1st ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET); // 设置PD0~2为1 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); // 设置PD3为0 二进制编码为 0111 if((GPIOD->IDR & 0xF0) != 0xF0) {key_state = 1;flag = 1;} HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 2nd ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0) {key_state = 1;flag = 1;} HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 3rd ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0) {key_state = 1;flag = 1;} HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 4th ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0) {key_state = 1;flag = 1;} if (flag == 0) Key_val = 0xff; }break; case 1:{ /*=========================以下代码是按键扫描程序=========================*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态 /*----------------------------Scan the 1st ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET); // 设置PD0~2为1 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); // 设置PD3为0 二进制编码为 0111 if((GPIOD->IDR & 0xF0) != 0xF0){ flag = 1; temp = (GPIOD->IDR & 0xF7); // GPIOD->IDR寄存器为端口输入数据寄存器 switch(temp){ // 用来读取GPIO口的电平状态 case 0xE7 : Key_val = 1;key_state = 2;break; case 0xD7 : Key_val = 2;key_state = 2;break; case 0xB7 : Key_val = 3;key_state = 2;break; case 0x77 : Key_val = 4;key_state = 2;break; default : Key_val = 0xff;key_state = 0;break; }} HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 2nd ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0){ flag = 1; temp = (GPIOD->IDR & 0xFB); switch(temp){ case 0xEB : Key_val = 5;key_state = 2;break; case 0xDB : Key_val = 6;key_state = 2;break; case 0xBB : Key_val = 7;key_state = 2;break; case 0x7B : Key_val = 8;key_state = 2;break; default : Key_val = 0xff;key_state = 0; break; }} HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 3rd ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0){ flag = 1; temp = (GPIOD->IDR & 0xFD); switch(temp){ case 0xED : Key_val = 9;key_state = 2;break; case 0xDD : Key_val = 10;key_state = 2;break; case 0xBD : Key_val = 11;key_state = 2;break; case 0x7D : Key_val = 12;key_state = 2;break; default : Key_val = 0xff;key_state = 0; break; }} HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 4th ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0){ flag = 1; temp = (GPIOD->IDR & 0xFE); switch(temp){ case 0xEE : Key_val = 13;key_state = 2;break; case 0xDE : Key_val = 14;key_state = 2;break; case 0xBE : Key_val = 15;key_state = 2;break; case 0X7E : Key_val = 16;key_state = 2;break; default : Key_val = 0xff; key_state = 0;break; }} if (!flag) Key_val = 0xff; }break; case 2:{ /*=========================以下代码是按键扫描程序=========================*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); // 先清空引脚状态 /*----------------------------Scan the 1st ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET); // 设置PD0~2为1 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_3, GPIO_PIN_RESET); // 设置PD3为0 二进制编码为 0111 if((GPIOD->IDR & 0xF0) == 0xF0) key_state = 0; HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 2nd ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0) key_state = 0; HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 3rd ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0) key_state = 0; HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); /*----------------------------Scan the 4th ROW----------------------------*/ HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_RESET); if((GPIOD->IDR & 0xF0) != 0xF0) key_state = 0; } } }
#ifndef __MATRIX_KEY_H
#define __MATRIX_KEY_H
void key_scan(void);
#endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。