Key_Lock按键锁防止按键连按

常用按键检测函数会出现按键按下连续触发的问题,在每次按键触发前判断按键所处的状态会避免这个问题。

函数如下:


void Read_Keyvalue()
{
/************************************/
if(KEY1 != 1) //按键未按下
{
key1_Lock = 0;
}
if(KEY1 == 1)
{
delay_ms(50); //消抖
if(KEY1 == 1)
{
if(key1_Lock == 0) //按键之前没有按下
{
printf("Key1 pressed \r\n"); //TestCode
key_num = 1;
}
}
key1_Lock = 1; //按键按下 上锁
}
/************************************/


/************************************/
if(KEY2 != 0)//按键未按下
{
key2_Lock = 0;
}
if(KEY2 == 0)
{
delay_ms(50);
if(KEY2 == 0)
{
if(key2_Lock == 0)
{
printf("Key2 pressed \r\n");
key_num = 2;
}
}
key2_Lock = 1;
}

}

每次按键按下前先检测按键状态,按键没有按下,将Lock置0。按键按下时先判断Lock的置值,当Lock=0时,表示之前的按键是没有按下的,可以进入按键触发,然后将Lock置1,按键没有抬起就一直为1。当Lock=1时,表示当前按键处于按下状态,即上一次按键按下还未抬起,就不进入按键触发。这样可以避免按键按下一次连续返回按键触发的动作。这种处理在按键按下一次返回一次值的需求时非常有效。




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于STM32的4x4矩阵按键电子的设计代码,你可以根据需要进行修改: ```c #include "stm32f10x.h" /* 定义按键所在的GPIO口和引脚 */ #define KEY_GPIO_PORT GPIOA #define KEY_GPIO_PIN GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 /* 定义的GPIO口和引脚 */ #define LOCK_GPIO_PORT GPIOB #define LOCK_GPIO_PIN GPIO_Pin_0 /* 定义按键的行列数 */ #define ROW 4 #define COL 4 /* 定义按键对应的字符 */ char keyChar[ROW][COL] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; /* 定义密码 */ char password[4] = {'1', '2', '3', '4'}; /* 定义密码输入计数器 */ uint8_t count = 0; /* 延时函数 */ void delay(uint32_t time) { uint32_t i; for (i = 0; i < time; i++); } /* 初始化GPIO口 */ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* 开启GPIOA和GPIOB时钟 */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); /* 配置的GPIO口为推挽输出 */ GPIO_InitStructure.GPIO_Pin = LOCK_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LOCK_GPIO_PORT, &GPIO_InitStructure); /* 配置按键所在的GPIO口为上拉输入 */ GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure); } /* 判断按键是否按下 */ uint8_t KeyDown(uint8_t i, uint8_t j) { /* 读取按键状态 */ uint8_t val = GPIO_ReadInputDataBit(KEY_GPIO_PORT, GPIO_Pin_0 << (i * ROW + j)); /* 消抖 */ delay(1000); /* 如果依然按下,则认为按键按下 */ if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, GPIO_Pin_0 << (i * ROW + j)) == val) return val ? 0 : 1; else return 0; } /* 获取按键对应的字符 */ char GetKeyChar(uint8_t i, uint8_t j) { return keyChar[i][j]; } /* 检查密码是否正确 */ uint8_t CheckPassword(char* input) { uint8_t i; for (i = 0; i < 4; i++) { if (input[i] != password[i]) return 0; } return 1; } int main(void) { /* 初始化GPIO口 */ GPIO_Configuration(); /* 无限循环 */ while (1) { uint8_t i, j; uint8_t keyDown = 0; /* 扫描按键 */ for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (KeyDown(i, j)) { /* 显示按下的字符 */ USART_SendData(USART1, GetKeyChar(i, j)); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); /* 输入密码 */ if (count < 4) password[count++] = GetKeyChar(i, j); /* 检查密码 */ if (count == 4) { if (CheckPassword(password)) { /* 解 */ GPIO_SetBits(LOCK_GPIO_PORT, LOCK_GPIO_PIN); delay(1000000); /* 上 */ GPIO_ResetBits(LOCK_GPIO_PORT, LOCK_GPIO_PIN); count = 0; } else { /* 密码错误 */ count = 0; } } keyDown = 1; break; } } if (keyDown) break; } } } ``` 请注意,这只是一个示例代码,你需要根据自己的实际需求进行修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值