蓝桥杯第11届模拟题中有按键长短按,这里提供了一种解决思路。
通过定时器实现硬件消抖,按键扫描函数里面增加变量实现长短按的判断。
https://blog.csdn.net/qq_34952376/article/details/81169122参考这篇文章,自己对实际调参做了一定修改。
1.main.c
(1)用到的变量:
u8 KEY_Flag = 0;
char num=0;
u32 TimingDelay = 0; //systick用到的
(2)用到的函数
main函数中:
key_init();
while(1)
{
/* KEY_Flag由时钟函数每50ms设置为1,相当于了按键消抖 */
if(KEY_Flag)
{
KEY_Flag = 0;
key_scan();
}
}
/* 把strm32f10x_it.c中的时钟处理函数放到main函数中了*/
void SysTick_Handler(void)
{
static u8 key_sum = 0;
TimingDelay--;
if(++key_sum == 50)
{
key_sum = 0;
KEY_Flag = 1;
}
}
2.Key.c
(1)用到的变量
extern char num; /* main函数中的num变量 */
#define key1 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)
#define key2 GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8)
#define key3 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define key4 GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_2)
(2)用到的函数
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void key_scan(void)
{
static u16 key1_sum = 0, key2_sum = 0, key3_sum = 0, key4_sum = 0;
if(key1 == 0 )
{
/* main函数中已经为我们消抖,这里只需要设置一个变量去加 */
key1_sum++;
/* 短按 */
if(key1_sum == 3)
{
num++;
}
/* 长按 */
if(key1_sum >=20 )
{
num++;
}
}
else
{
key1_sum = 0;
}
if(key2 == 0 )
{
key2_sum++;
if(key2_sum >=1 )
{
}
}
else
{
key2_sum = 0;
}
if(key3 == 0 )
{
key3_sum++;
if(key3_sum >=1 )
{
}
}
else
{
key3_sum = 0;
}
if(key4 == 0 )
{
key4_sum++;
if(key4_sum >=1 )
{
}
}
else
{
key4_sum = 0;
}
}