奋斗stm32开发板学习日记4——GPIO按键实验

作者: zhangjun150
上传时间为: 2014-11-25 12:56 AM
2014-11-25
阅读:

这期教程重点讲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熄灭。

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示