STM32G431RBT6之按键模块04

按键用法:

  •  短按
  • 长按
  • 双击/三击

按键电平变化:按下为0,弹起为1

  1. cubeMX中配置按键引脚并将其设置为上拉

     

  2. 设置定时器,时钟源,分频系数,重装载值

     时钟源:Internal Clock; Prescaler:79; Counter Period:9999 ;  这样的设置是10ms中断一次

  3. 使能中断

     

  4. interrupt.c && interrupt.h
    重写中断处理函数

     

  5. interrupt.h
    #ifndef _INTERRUPT_H
    #define _INTERRUPT_H
    #include "main.h"
    #include "stdbool.h"
    struct keys
    {
        uchar judge_sta;
        bool key_sta;
        bool single_flag;
    };
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
    
    #endif 

     

  6. interrupt.c

     

     

    #include "interrupt.h"
    
    struct keys key[4]={0,0,0};
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        if(htim->Instance==TIM3)
        {
            key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
            key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
            key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
            key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
        }
        
        for(int i=0;i<4;i++)
        {
            switch(key[i].judge_sta)
            {
                case 0:
                {
                    if(key[i].key_sta==0)
                        key[i].judge_sta=1;
                }
                break;
                case 1:
                {
                    if(key[i].key_sta==0)
                    {
                        key[i].judge_sta=2;
                        key[i].single_flag=1;
                    }else{
                        key[i].judge_sta=0;
                    }
                }
                break;
                case 2:
                {
                    if(key[i].key_sta==1)
                        key[i].judge_sta=0;
                }
                break;
            }
        }
    }
    

      

  7. main.c
    用extern导入外部变量
    注意格式不是:struct keys key[4]={0,0,0};
    而是:struct keys key[4];

     开中断

     

  8. 注意LED对应的数据
    LED1 0X01
    LED2 0X02
    LED3 0X04
    LED4 0X08
    LED5 0X10
    LED6 0X20
    LED7 0X40
    LED8 0X80
posted @ 2024-03-22 21:31  丢丢八八  阅读(175)  评论(0)    收藏  举报