目录
一、按键硬件图
1、硬件原理
2、输入方式选择
二、功能实现
1、按键GPIO配置
2、按键扫描函数
3、LED翻转宏定义
4、主程序
参考
一、按键硬件图
1、硬件原理
按键的硬件原理图如图,右侧接3.3V,有电容并联作为硬件消抖,非按下状态时PA0接地为低电平,按下状态时导通接高电平。
2、输入方式选择
GPIO端口基本结构如图,共有四种输入类型:模拟输入、浮空输入、上拉输入、下拉输入。
模拟输入:外部的电压真实的读取到单片机的AD模块,我们既不能闭合上拉和下拉的开关,也不能让信号经过施密特触发器。
浮空输入:VDD和VSS所在路径的两个开关同时断开,通过施密特触发器读取数字信号,此时没有上拉和下拉的情况,所以当IO口没有接输入的时候,此时的电平会是一个不确定的值,也就是我们所说的浮空。电平会处于一个跳变的状态,一会高,一会低。只有输入了一个高/低电平才会确定下来。因此一般有外部电路时使用浮空输入,比如此次用到的按键电路。
上拉输入:VDD的开关闭合,VSS的开关断开,没有输入信号时一直读取到高电平。输入高电平,读取仍然是高电平,输入低电平时,由于上拉电阻存在,读取到低电平。好处是输入的电平不会上下浮动而导致输入信号不稳定,没有输入时稳定在高电平。
下拉输入:VDD的开关断开,VSS的开关闭合,原理与上拉相反,用来读取高电平。好处也是不会受浮动影响,没有输入时稳定在低电平。
二、功能实现
1、按键GPIO配置
与LED的GPIO配置函数相同,对于按键1对应的PA0口也需要进行GPIO的初始化配置,包括初始化结构体变量、开启RCC对应APB2的时钟、引脚号配置、端口输入输出模式配置、最后调用初始化函数。
void Button_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //初始化结构体变量
RCC_APB2PeriphClockCmd(BUTTON_GPIO_CLK, ENABLE); //RCC时钟使能
GPIO_InitStruct.GPIO_Pin = BUTTON_GPIO_PIN; //引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(BUTTON_GPIO_PORT, &GPIO_InitStruct); //初始化函数调用
}
2、按键扫描函数
此处用到while函数作为松手检测,按下时PA0为1,不松手则退不出while循环,松手后退出循环返回1。
uint8_t Button_scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
{
//松手检测
while(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON);
return KEY_ON;
}
else return KEY_OFF;
}
3、LED翻转宏定义
和0异或保持不变,和1异或翻转,因为LED_G_GPIO_PIN的宏定义就是0x0001,利用这点,把ODR和引脚号异或,可以实现翻转操作。文章来源:https://www.toymoban.com/news/detail-688701.html
#define LED_G_TOGGLE {LED_G_GPIO_PORT->ODR ^= LED_G_GPIO_PIN;}
4、主程序
int main(void)
{
Button_GPIO_Config();
LED_GPIO_Config();
GPIO_SetBits(GPIOB, GPIO_Pin_0);
while(1)
{
if(Button_scan(BUTTON_GPIO_PORT,BUTTON_GPIO_PIN))
LED_G_TOGGLE;
}
}
参考
[野火®]STM32库开发实战指南——基于野火指南者开发板 — [野火]STM32库开发实战指南——基于野火指南者开发板 文档文章来源地址https://www.toymoban.com/news/detail-688701.html
到了这里,关于笔记(STM32篇)day6——按键控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!