嵌入式单片机基础篇(四)
stm32以及51单片机按键输入详解
第一部分 stm32 按键输入
1、问题:简述按键输入的基本原理?
回答:按键输入就是将GPIO口配置成输入模式,当芯片检测到IO口的电平状态改变了就执行一些其他功能,比如让led灯发光或者蜂鸣器发声等
2、按键开关的硬件电路图分析
如上图所示可以分析出当按键按下时,该引脚的电平变为低电平,也就是低电平有效
3、实现程序分析
(1)首先要配置按键的IO口状态
void KEY_Init(void) //IO 初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); //使能 PORTA,PORTE 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;//GPIOE.3~4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化 GPIOE3,4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //初始化 WK_UP-->GPIOA.0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 设置成输入,下拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
}
注意:既然是按键输入,那么IO口的状态要配置成输入模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
(2)IO口的状态配置好了之后,如果电平已经改变了,那么芯片如何接收该引脚的电平状态呢?
回答:调用下面的函数
GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //读取PE4的引脚电平状态
(3)芯片收到了引脚的电平状态后执行其他函数功能,比如使LED发光,那么需要配置led函数,led函数如下:
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|
RCC_APB2Periph_GPIOE, ENABLE); //使能 PB,PE 端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); /PE.5 输出高
}
4、问题:至此按键输入的总体思路就讲完了,那么具体如何实现按键输入呢?
回答:消抖以及程序优化
(1)消抖