基于STM32F103的按键检测
仿真软件:
Proteus 8.17
编程软件:
Keil 5
仿真实现:
按键第一次按下LED灯亮,第二次按下LED灯灭,往复
按键检测原理:
按键在电路中一端接单片机的IO口,一端接GND,IO口默认设置成输入上拉状态,这样就导致按键未按下是IO口检测到的是高电平,按键一旦按下,IO口就变成低电平,但是,按键的按下往往会有按键抖动,抖动会导致IO口检测到的电平有高有低,所以在使用按键时,往往需要最按键进行消抖处理。一般的做法有硬件消抖和软件消抖两种,硬件消抖是在IO口端接滤波电容,使按键信号变得平缓,软件消抖一般是在程序里做检测,连续的一段时间内IO口检测到的都是低电平,认为按键确实是按下了,一般设定的时间是50ms。
电路介绍:
基于上一次的LED闪烁仿真的电路图上加了按键的检测电路。
程序介绍:
程序基于keil5开发,使用的是库函数开发。
STM32与51单片机不同,在使用GPIO时需要先使能对应的GPIO的时钟,然后设置对应的IO口的输入输出模式。本次仿真由于是驱动LED闪烁,所以将对应的IO口设置为推挽输出状态。按键IO口设置成上拉输入模式。
void F_GPIO_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//PA0 LED
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//设置成上拉输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;//PB0 按键
GPIO_Init(GPIOB,&GPIO_InitStruct);
}
按键检测部分:
void F_KeyScan(void)
{
if(P_KeyPort == 0x00)
{
if(V_KeyPressCounter < 250)//防止计数溢出
V_KeyPressCounter++;
}
else
{
if(V_KeyPressCounter >= 10)//50ms消抖
{
P_LEDPort ^= 1;
}
V_KeyPressCounter = 0x00;
}
}
Main函数:
int main(void)
{
F_GPIO_Init();
F_TIM3_Int_Init(1000-1,72-1); //1ms
while(1)
{
if(V_5msTimeCounter >= 5)
{
V_5msTimeCounter = 0;
F_KeyScan();
}
}
}
Main函数进入先对IO口以及定时器进行初始化,主循环设置的是5ms跑一次,连续扫描10次按键如果都是低电平(消抖),说明按键确实被按下,等按键抬起时再改变LED的状态。从而实现仿真要求!