关于Stm32 Hal库 矩阵按键 的 一个 学习历程
本次使用的 矩阵按键是 4X4
这是 Cubemx 内 对矩阵按键的一个 配置 ,GPIO_OutPut 为 矩阵按键的行
GPIO_Input 为列
同时 将 行 即 PA7 PB2 PG0 PF12 全部设置为高电平
输入 PE7 PE10 PE12 PE14全部设置为输入上拉模式 (上拉的意思是 按键为按下的时候默认为高电平,按下的时候变成低电平)
即上图的一个配置方式
然后其他的我自己就结合了下串口 做了一个上位机反馈 查看按键数值
其他的配置就是一个基础的一个配置了 我自己应该都知道 也就不写了
然后关于是代码部分
首先默认行全部拉高
然后使用 行列扫描法 去判断 是哪个按键发生的
uint8_t Flag;
void Scan_check(uint8_t *key)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET);
if(KEY1_Input == GPIO_PIN_RESET || KEY2_Input == GPIO_PIN_RESET || KEY3_Input == GPIO_PIN_RESET || KEY4_Input == GPIO_PIN_RESET)
{
HAL_Delay(10);
if(KEY1_Input == GPIO_PIN_RESET)
{
Flag = 1;
*key = 1;
printf("1");
while(!HAL_GPIO_ReadPin(GPIOE,KEY1));
}
if(KEY2_Input == GPIO_PIN_RESET)
{
Flag = 1;
*key = 2;
printf("1");
while(!HAL_GPIO_ReadPin(GPIOE,KEY2));
}
if(KEY3_Input == GPIO_PIN_RESET)
{
Flag = 1;
*key = 3;
printf("1");
while(!HAL_GPIO_ReadPin(GPIOE,KEY3));
}
if(KEY4_Input == GPIO_PIN_RESET)
{
Flag = 1;
*key = 4;
printf("1");
while(!HAL_GPIO_ReadPin(GPIOE,KEY4));
}
}
else
{
Flag = 0;
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_SET);
}
}
本段代码的 模块化部分
第一段 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,GPIO_PIN_RESET); 是把第一行拉低 然后判断是哪个按键发生的
用串口上传至上位机
主函数内大致为
uint8_t Key;
int fputc(int ch, FILE *f) //printf 编译烧录之前,需在魔术棒按钮中勾选Use MicroLib,不勾鿉将无法执行printf
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_IT(&huart1,receiveData1,sizeof(receiveData1));
HAL_UART_Receive_IT(&huart1,receiveData1,sizeof(receiveData1));
}
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,receiveData1,sizeof(receiveData1));
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
// printf("1");
// HAL_Delay(500);
/* USER CODE BEGIN 3 */
Scan_check(&Key);
printf("%d\r\n",Key);
//printf("2");
}
/* USER CODE END 3 */
}
目前就可以获取到 第一行的一个按键情况了