当前位置:网站首页>STM32F407ZG GPIO输入相关实验
STM32F407ZG GPIO输入相关实验
2022-08-10 05:35:00 【八个细胞】
STM32F407ZG开发板学习(3)
GPIO输入
此介绍在上一篇文章已有总结。
按键输入控制LED实验
按键原理图
KEY的I/O引脚如下:
WK_UP接在PA0,KEY0接在PE4,KEY1接在PE3,KEY2接在PE2。
电路原理图如下:
则可以看出,WK_UP是高电平有效,其他则是低电平有效。
在初始化中,WK_UP的引脚则要配置成下拉,其他配置成上拉。
具体如下:
void key_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//使能GPIOA和GPIOE时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //选择输入模式
//GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //输出类型不用配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //按键KEY0~2的三个引脚
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //100MHz,这个不配置也行
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //按键KEY_UP的引脚
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
}
获取按键值
没什么好说的,应用了GPIO_ReadInputDataBit(GPIOx, GPIO_Pin_x); 这个函数。
作用是返回选中的引脚的输入值,值为0或1。
由于按键按下会产生电压的抖动,因此这里利用延时函数延时10ms以消除抖动。
而两次延时夹着一个while循环的作用是只有当按下按键并松开后,此次按键才被视为操作成功,若一直不松手,这次按键将没有效果。
/************************************* *函数名:key_get *函数功能描述:获取按键 *函数参数:无 *函数返回值:按下的按键: 0 没有按下 1 KEY0 2 KEY1 3 KEY2 4 KEY_WKUP ***************************************/
u8 KEY_get(void)
{
uint8_t keyNum = 0;
//PE4即KEY0
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0)
{
delay_ms(10); //消抖
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4) == 0);
delay_ms(10);
keyNum = 1;
}
//PE3即KEY1
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0)
{
delay_ms(10); //消抖
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3) == 0);
delay_ms(10);
keyNum = 2;
}
//PE2即KEY2
if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0)
{
delay_ms(10); //消抖
while(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2) == 0);
delay_ms(10);
keyNum = 3;
}
//PA0即KEY_WKUP,且高电平有效
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
{
delay_ms(10); //消抖
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1);
delay_ms(10);
keyNum = 4;
}
return keyNum;
}
main函数
get_LED0以及get_LED1是返回了LED0和LED1两个引脚输出的值,使用GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin_x); 函数,从而做到用一个按键转换一个灯的亮灭状态。
while(1)
{
u8 keyNum = KEY_get();
//KEY0控制LED0
if(keyNum == 1)
{
if(get_LED0() == 1)
{
LED0_ON();
}
else{
LED0_OFF();
}
}
//KEY1控制LED1
if(keyNum == 2)
{
if(get_LED1() == 1)
{
LED1_ON();
}
else{
LED1_OFF();
}
}
//KEY2使LED全灭
if(keyNum == 3)
{
LED0_OFF();
LED1_OFF();
}
//KEY_WKUP使LED全亮
if(keyNum == 4)
{
LED0_ON();
LED1_ON();
}
}
边栏推荐
猜你喜欢
Chain Reading|The latest and most complete digital collection sales calendar-07.29
LeetCode 2011. Variable Value After Action (Simple)
STM32单片机手机APP蓝牙高亮RGB彩灯控制板任意颜色亮度调光
pytorch-07.处理多维特征的输入
Chain Reading Good Article: Jeff Garzik Launches Web3 Production Company
并查集原理与API设计
Convolutional Neural Network (CNN) for mnist handwritten digit recognition
机器学习——聚类——商场客户聚类
LeetCode 1351. Counting Negative Numbers in Ordered Matrices (Simple)
51单片机RS485远程双机多机温度采集主从机多节点蜂鸣器报警
随机推荐
A timeout error is reported when connecting to Nacos
IO流【】【】【】
Privatisation build personal network backup NextCloud
Notes for RNN and Decision Tree
I don't like my code
LeetCode 100.相同的树(简单)
[Difference between el and template]
Pytorch配置与实战--Tips
String常用方法
【目标检测】相关指标的引入与解析
cesium rotate image
【简易笔记】PyTorch官方教程简易笔记 EP4
Machine Learning - Clustering - Shopping Mall Customer Clustering
Day1 微信小程序-小程序代码的构成
LeetCode refers to offer 10-I. Fibonacci sequence (simple)
Timer (setInterval) on and off
泛型笔记()()()
菜谱小程序源码免费分享【推荐】
I don't like my code
network security firewall