蓝桥杯嵌入式stm32G431rbt6学习笔记-----按键篇

目录

按键处理

按键消抖

代码:

key.c

main.c


测试平台:STM32G431RBT6

按键处理

按键:机械按键(需消除抖动影响)或触摸按键

按键按下为低电平,按键弹起为高电平

 开发板上四个按键分别对应

B1------PB0

B2------PB1

B3------PB2

B4------PA0

按键消抖

思路

在while(1)中循环

1:读取P33的状态。

2:如果是0,则等待10ms,再读取P33的状态;

如果不是0,返回第一步。

3:如果第二步满足,还是0,确定有按键按下,则执行number++程序,让数码管+1;

如果不是0,则说明是抖动,则不执行任何程序,返回第一步。

4:等待按键弹起后,再等待10ms,那么则可以返回第一步重复执行循环;

(如果不等待的话,则会在循环1—3会一直执行,让数字疯狂+1)(手一直按在按键上不松开))。

代码:

key.c

#define HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
#define KEYPORT KB1 | (KB2<<1) | (KB3<<2) | (KB4<<3) | 0xf0
unsigned char Trg;
unsigned char Cont;
void Key_Read(void)
{
    unsigned char ReadData = (KEYPORT)^0xff; //1
    Trg = ReadData & (ReadData ^ Cont);      //2
    Cont = ReadData;                         //3
}
          //该按键函数使用了定时器,10ms执行一次
          //Trg为单次触发,cont为长按判断
          //异或^,不同即为1 0x00&任何值均为0

HAL_GPIO_ReadPin        io读取函数

Trg:   单次触发  Cont:长按判断

KEYPORT 设置为八位的变量, | 0xf0 将前四位置为1,后四位设置为依次设置为KB4-1

这样做是为了当B1按下时变量变为0xfe,即可知道按键1按下,以此类推

每10ms执行一次,假如无按键按下

进入函数中ReadData的值为0x00,在第一步中异或0xff后仍为0x00

第二步赋值Trg为ReadData 按位与 ()后仍是0x00

第三步cont赋值ReadData

假如第一个按键按下

进入函数中ReadData的值0xfe,在第一步中异或0xff后为0x01

第二步赋值Trg为ReadData按位与(0x01异或0x00(没有按下按键时赋值为0x00)=(0x01按位与0x01)=0x01

第三步再将ReadData的值0x01复制给cont

main.c

__IO uint32_t keyTick;
void KEY_Process(void)
{
    if(uwTick - keyTick <10) return ;
    keyTick = uwTick ;

    Key_Read ();
    if(Trg & 0x01)
    {
        LED_Control (0x01);
    }
    if(Trg & 0x02)
    {
        LED_Control (0x02);
    }

    if(Trg & 0x04)
    {
        LED_Control (0x04);
    }

    if(Trg & 0x08)
    {
        LED_Control (0x08);
    }

}

结合系统定时器进行延时 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值