在前面学习了LED点灯实验,虽说实现灯工作的状态可以使亮灭,或者流水灯,以及未来的呼吸灯模式。关于呼吸灯模式需要将GPIO口采用定时器引脚,并且配置为PWM功能才能实现呼吸灯模式,这里暂不讲解。
控制灯点亮需要将GPIO口配置为输出模式,但是采集按键事件则需将按键配置成输入模式。关于输入模式一般有模拟输入,浮空输入,上拉输入和下拉输入。关于这些输入怎么选择呢。一般模拟输入一般用作模拟量信号的采集,诸如ADC引脚需要配置为模拟输入。浮空输入一般应用在通信的接收端,如I2C和USART的RX。上拉输入和下拉输入一般应用在一般的输入引脚。常见的如时钟信号,按键信号等等。
在这里,我们将按键信号配置为外部上拉模式。也就是说,在按键不导通的情况下,按键的连接引脚为高电平,按键导通的情况下,按键连接的引脚为低电平。这里选择PB12配置为按键的输入引脚。我们可以新建两个文件,KEY.C和KEY.H文件其中KEY.C文件中进行GOIO口初始化配置,具体如下:
void KEY_GPIO_Config(void)
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
//开启外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//配置GPIO口引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
//配置引脚模式为上拉输入
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//配置引脚速率
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//调用库函数
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
在KEY.H文件中包含void KEY_GPIO_Config(void)即可。
随后在main函数中需要写入使用按键的函数。一般在使用按键函数时,需要写一个KEY_Scan函数,该函数的作用是一个是进行按键延时消抖(俗称去抖动)和检测按键按下和确认按键按下,一般函数为:
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)
//该函数将返回一个unsigned char型变量,输入参数为GPIO寄存器结构体
{
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON );
//利用单个位读取函数读取按键的值
{
Key_Delay(10000); //延时,消抖
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) //再次确认按键按下
{
while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);//等待按键释放
return KEY_ON;
}
else
return KEY_OFF;
}
else
return KEY_OFF;
}
其中有两个宏定义#define KEY_ON 0和#define KEY_OFF 1可以定义也可以不定义,只要能表述按键按下或者没有按下信息就好。
一般在主函数中我们采用if( Key_Scan(GPIOB,GPIO_Pin_12) == KEY_ON )来判断按键是否按下。
在学习这篇中,我们主要是了解按键怎么判断和怎么去抖,尤其是是要关注KEY_SCAN函数。 |