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();
}
}