历史上的今天
今天是:2025年03月28日(星期五)
2019年03月28日 | 关于STM32按键妙用详解
2019-03-28 来源:eefocus
假设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;
}
解析:
按键使用时,分为四种状态:
未按下
按下(短按)
长按
松开
在以上4总状态下,解析ReadKey()函数。
注意:
容易迷惑的地方在于 GPIO_InputDta()函数获取的值应该为多少
由于知道 PB6、7、4 默认状态为1,按下为0 则获取的IDR 寄存器值为
1101 0000(0xD0)
&/^ 两种逻辑运算符需要知道。
&: 0 & 1 = 0 ( 真 与 假 = 假)
^: 0 ^ 1 = 1 1 ^ 1 = 0 ( 相同为0,不同为1)
按键未被按下
ReadData = (GPIO_InputData( GPIOB ){ 0xD0 默认值} & 0xD0) ^ 0xD0 = 0x00;
Trg = ReadData & (ReadData ^ cont) = 0x00 & (0x00 ^ 0x00) = 0x00;
Rel = ReadData ^ Trg ^ cont = 0x00 ^ 0x00 ^ 0x00 = 0x00;
cont = ReadData = 0x00;
按键被按下(短按)
//这里GPIO_InputData 获取的是PB6 bit位为0 0x90
ReadData = (GPIO_InputData( GPIOB ){ 0x90 默认值} & 0xD0) ^ 0xD0 = 0x40;
Trg = ReadData & (ReadData ^ cont) = 0x40 & (0x40 ^ 0x00) = 0x40;
Rel = ReadData ^ Trg ^ cont = 0x40 ^ 0x40 ^ 0x00 = 0x00;
cont = ReadData = 0x40;
按键没有松开(长按)
//这里GPIO_InputData 获取的是PB6 bit位为0 则为0x90
ReadData = (GPIO_InputData( GPIOB ){ 0x90 默认值} & 0xD0) ^ 0xD0 = 0x40;
Trg = ReadData & (ReadData ^ cont) = 0x40 & (0x40 ^ 0x40) = 0x00;
Rel = ReadData ^ Trg ^ cont = 0x40 ^ 0x00 ^ 0x40 = 0x00;
cont = ReadData = 0x40;
按键松开(释放)
//这里GPIO_InputData 获取的是PB6 bit位为1 则为0xD0
ReadData = (GPIO_InputData( GPIOB ){ 0xD0 默认值} & 0xD0) ^ 0xD0 = 0x00;
Trg = ReadData & (ReadData ^ cont) = 0x00 & (0x00 ^ 0x40) = 0x00;
Rel = ReadData ^ Trg ^ cont = 0x00 ^ 0x00 ^ 0x40 = 0x40;
cont = ReadData = 0x00;
总结:
根据4种按键状态,trg、rel、cont 三个参数都会发生改变。并且在不同的状态,这三个参数改变的也不同。
Trg:决定了IDR寄存器中哪一位发生了改变 即:按键按下
Rel:决定了在改变过后,哪一位再次发生变化 即:松开标志位
Cont:保存上一次对应IO 的状态,当第二次程序运行函数时,使上一次和这一次进行对比,如果没改变对应标志 不变。发生改变(即保存上一次的ReadData) 也发生改变。即:按键长按标志。
上一篇:stm32按键 长按 短按 函数
史海拾趣
|
丑小鸭变成了白天鹅。丑陋的手工板,摇身一变,成了正式PCB: 10元一个的电机,一买就是10个,少了人家还不卖,心痛不如行动: 完美的结合: 指针板头上的项圈,可不是为了装饰哦,那是为了配重(平衡): 侧面看看,靓丽的身影: ...… 查看全部问答> |
|
; Set up the memory control registers. ; add r0, pc, #SMRDATA - (. + 8) ldr r1, =BWSCON  ...… 查看全部问答> |
|
对用于低电平测量的测试夹具有几个重要的要求: * 绝缘电阻[1]:所有连接器、内部连线、端子和插座等的绝缘电阻都应当尽可能地高。一般地说,在高质量的测试夹具中,所有的连接器和插座都使用聚四氟乙烯绝缘材料。 * 屏蔽[2]和保护:测试夹具 ...… 查看全部问答> |
|
int main(void){ // disable JTAG port DDPCONbits.JTAGEN = 0; // 3.2 initialization TRISB = 0; & ...… 查看全部问答> |
|
#define GPBCON (*(volatile unsigned long *)0x56000010) #define GPBDAT (*(volatile unsigned long *)0x56000014) # define GPB5_out (1… 查看全部问答> |
|
最近在学ucosii但遇到很多问题在此向大家请教 1、在可悬挂中断PENDSV的优先级为何要设为最低优先级? 2、systick优先级的设置有没要求,是不是只要比PENDSV高就行了? 2、在别人的移植程序里我看到对于systick的设置都是直接调用库函数里面的SysT ...… 查看全部问答> |




