复习顺便重新学习Stm32代码(2) 关于矩阵按键

关于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 */
}
 

目前就可以获取到 第一行的一个按键情况了  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值