C8T6超绝模块–按键检测点亮LED
大纲
- 按键原理
- 初始化LED
- 初始化按键
- 编写main
具体案例
按键原理
(这里针对的是我的板子的原理图,具体的查看自己的板子)注意看,这里按键一端接到的是地,当我们没按下按键时,其默认是低电压,当我们按下按键时,电路连通时,这是高电平
初始化LED
具体在我的上一篇博客C8T6超绝模块–LED里面有具体的阐述,这里就不一一介绍了
初始化按键
当然,大概流程还是得先打开时钟,完成GPIO配置,我这里的按键K0外接在PA0上,所以要对GPIOA的Pin0引脚进行初始化配置
初始化按键的GPIO
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 打开对应的时钟
// 配置GPIO
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
这里就是正常的配置GPIO
下面是按键的电压扫描函数
本质上就是读取按键相连的那个GPIO的电压,然后根据高低电压对其进行处理
这里要注意的一点,有些板子在这里外接了一个电容器,当我们按下键位时,可以通过电容的充放电来实现硬件消抖,而如果没有外接电容器,当我们按下按键时,就会产生波纹抖动(高低电压变化不是一蹴而就的),导致按键没有达到我们预期的效果,我们要使用软件消抖(通过延时来判断电压,保证我们按下按键时,电压是处于稳定状态的)
#define KEY_ON 1
#define KEY_OFF 0
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
/*检测是否有按键按下 */
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )
{
/*延时消抖*/
Delay(50000);
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;
}
这里通过库函数 GPIO_ReadInputDataBit 来读取指定端口的指定引脚的电压,然后通过延时函数进行延时,再读取此刻的电压(因为经过延时之后的电压是处于稳定的,如果此时按键还是按下了,就继续执行后面的代码),此时按键是按下的,我们用while循环让其一直卡在按键按下时,当按键松开时,最后返回真值,否者直接返回按键没按下
第一个检测按键是否按下,如果按下了,我们通过延时判断是不是稳定的(否则就是抖动或误触),如果按键是真的按下,我们一直卡住按键按下,当按键松开时,循环结束,返回按键按下的真值
main函数
int main(void)
{
LED_GPIO_Config();
KEY_GPIO_Config();
while(1)
{
if(Key_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN) == KEY_ON)
{
LED_G_TOGGLE;
}
}
初始化LED,再初始化按键,然后死循环一直读取按键的电压,当按键按下时,就反转小灯此时的状态