|
这期教程重点讲GPIO的按键实验。
准备材料
- 带有按键的Stm32开发板一块
- Stm32库函数参考,
按键实验和点灯实验其实差不多, GPIO点灯是向led的pin脚输出高低电平, 而按键则是向pin口输入高低电平。 对于按键有两种输入模式可以选择, 一,采用上拉输入模式,二,采用浮动浮空输入模式,上拉输入模式在没有按键按下的时候是默认是高电平。正好符合这个要求。电路原理图如图所示:
本实验采用了GPIO与RCC片上外设,因此要添加stm32f10x_gpio.h stm32f10x_rcc.h到工程模板中。
关键代码
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#define ON 1
#define OFF 0
#define KEY_ON 0
#define KEY_OFF 1
void Key_GPIO_Config() //按键初始化
{
GPIO_InitTypeDef GPIO_InitStructrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructrue.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructrue.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructrue.GPIO_Mode = GPIO_Mode_IPU; //使用上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructrue);
}
uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) //键盘扫描函数
{
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON) //读取电平状态
{
Delay(0x7ffff);
if(GPIO_ReadInputDataBit(GPIOx, GPIO_Pin) == KEY_ON)
{
return KEY_ON;
}
return KEY_OFF;
}
else
{
return KEY_OFF;
}
}
int main()
{
Led_GPIO_Config(); // led初始化
Key_GPIO_Config(); // 按键初始化
GPIO_SetBits(GPIOB, GPIO_Pin_5); //点亮led灯
while(1)
{
if(Key_Scan(GPIOC, GPIO_Pin_5) == KEY_ON) //键盘扫描函数
{
GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)))); //led状态反转
}
}
return 0;
}
代码分析
首先从main函数开始,Led_GPIO_Config该函数是初始化按键要点亮熄灭的led灯,Key_GPIO_Config函数为初始化按键的 GPIO口,这里要注意输入模式为上拉输入,接着进入键盘扫描函数Key_Scan, 不断扫描该按键对应的pin口, 判断其电平是否有变化。
进入该函数里面用了GPIO_ReadInputDataBit该函数来读取pin口电平状态。打开stm32库函数参考手册,
可以看到, 该函数的的返回值即为输入端口额管脚值。注意:在按键中,必须要有一个防抖动的检测。判断按键是否真的被按下了。 如果真的被按下,则使led状态反转。
接下来我们来分析下这条语句GPIO_WriteBit(GPIOB, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)))); 最外层GPIO_WriteBit函数功能如图所示,
功能为设置或清除该端口值, 还有要注意第三个参数的类型, BitAction 在代码中追踪下,
便可知道,这个是个枚举类型, 这条语句的具体意思就读取PB5的当前输出电平,然后再用1减去读取电平的数据状态, 相当于与当前的输出的状态相反。给开发板供电DC5V, 插上J-Link,将编译好的程序下载到开发板, LED1亮,按下按键时, LED1熄灭。 |
|