关于STM32按键妙用详解

假设PB6、7、4  三个端口:

         按下为低电平(0)、否则为高电平(1)。

 

void ReadKey(void)

{

//1.获取GPIB->IDR寄存器值(获取键值)

         u16 ReadData = (GPIO_InputData( GPIOB )  &  0xD0)  ^  0xD0;  

        

         //2.判断哪一位发生改变(按键按下)

         Trg = ReadData & (ReadData ^ cont);

         //3.在按键按下后,哪一位发生改变(按键松开)

         Rel = ReadData ^ Trg ^ cont;

         //4.按键按下没有发生改变(长按) – 保存上一次 获取的按键值

         cont = ReadData;

}

解析:

         按键使用时,分为四种状态:

  1. 未按下
  2. 按下(短按)
  3. 长按
  4. 松开

在以上4总状态下,解析ReadKey()函数。

注意:

容易迷惑的地方在于 GPIO_InputDta()函数获取的值应该为多少

         由于知道 PB6、7、4 默认状态为1,按下为0 则获取的IDR 寄存器值为

1101 0000(0xD0)

         &/^ 两种逻辑运算符需要知道。

                   &:  0 & 1 = 0 ( 真 与 假 = 假)

                   ^:      0 ^ 1 = 1    1 ^ 1 = 0 ( 相同为0,不同为1)

 

  1. 按键未被按下
    1. ReadData = (GPIO_InputData( GPIOB ){ 0xD0 默认值}  &  0xD0)  ^  0xD0 =        0x00;
    2. Trg = ReadData & (ReadData ^ cont)  = 0x00 & (0x00 ^ 0x00) =                            0x00;
    3. Rel = ReadData ^ Trg ^ cont = 0x00 ^ 0x00 ^ 0x00 =                                              0x00;
    4. cont = ReadData =                                                                                                   0x00;

 

  1. 按键被按下(短按)

//这里GPIO_InputData 获取的是PB6 bit位为0    0x90

    1. ReadData = (GPIO_InputData( GPIOB ){ 0x90 默认值}  &  0xD0)  ^  0xD0 = 0x40;

 

    1. Trg = ReadData & (ReadData ^ cont)  = 0x40 & (0x40 ^ 0x00) =                                       0x40;
    2. Rel = ReadData ^ Trg ^ cont = 0x40 ^ 0x40 ^ 0x00 =                                                      0x00;
    3. cont = ReadData =                                                                                                                  0x40;

 

  1. 按键没有松开(长按)

//这里GPIO_InputData 获取的是PB6 bit位为0    则为0x90

    1. ReadData = (GPIO_InputData( GPIOB ){ 0x90 默认值}  &  0xD0)  ^  0xD0 = 0x40;

 

    1. Trg = ReadData & (ReadData ^ cont)  = 0x40 & (0x40 ^ 0x40) =                              0x00;
    2. Rel = ReadData ^ Trg ^ cont = 0x40 ^ 0x00 ^ 0x40 =                                                      0x00;
    3. cont = ReadData =                                                                                                                  0x40;

 

  1. 按键松开(释放)

//这里GPIO_InputData 获取的是PB6 bit位为1    则为0xD0

    1. ReadData = (GPIO_InputData( GPIOB ){ 0xD0 默认值}  &  0xD0)  ^  0xD0 = 0x00;

 

    1. Trg = ReadData & (ReadData ^ cont)  = 0x00 & (0x00 ^ 0x40) =                              0x00;
    2. Rel = ReadData ^ Trg ^ cont = 0x00 ^ 0x00 ^ 0x40 =                                                      0x40;
    3. cont = ReadData =                                                                                                                  0x00;

 

 

总结:

         根据4种按键状态,trg、rel、cont 三个参数都会发生改变。并且在不同的状态,这三个参数改变的也不同。

         Trg:决定了IDR寄存器中哪一位发生了改变  即:按键按下

         Rel:决定了在改变过后,哪一位再次发生变化  即:松开标志位

         Cont:保存上一次对应IO 的状态,当第二次程序运行函数时,使上一次和这一次进行对比,如果没改变对应标志 不变。发生改变(即保存上一次的ReadData) 也发生改变。即:按键长按标志。

 

 

 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值