找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5777|回复: 0
收起左侧

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

[复制链接]
ID:85148 发表于 2015-7-9 01:06 | 显示全部楼层 |阅读模式
                  这期教程重点讲GPIO的按键实验。
准备材料
  • 带有按键的Stm32开发板一块
  • Stm32库函数参考,
按键实验和点灯实验其实差不多, GPIO点灯是向led的pin脚输出高低电平, 而按键则是向pin口输入高低电平。 对于按键有两种输入模式可以选择, 一,采用上拉输入模式,二,采用浮动浮空输入模式,上拉输入模式在没有按键按下的时候是默认是高电平。正好符合这个要求。电路原理图如图所示:
%E7%94%B5%E8%B7%AF.jpg
本实验采用了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库函数参考手册,
QQ%E5%9B%BE%E7%89%8720141119231632.jpg
可以看到, 该函数的的返回值即为输入端口额管脚值。注意:在按键中,必须要有一个防抖动的检测。判断按键是否真的被按下了。 如果真的被按下,则使led状态反转。
接下来我们来分析下这条语句GPIO_WriteBit(GPIOB, (BitAction)(1-(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5)))); 最外层GPIO_WriteBit函数功能如图所示,
WriteBit.jpg
功能为设置或清除该端口值, 还有要注意第三个参数的类型, BitAction 在代码中追踪下,
BitActipon.jpg
便可知道,这个是个枚举类型, 这条语句的具体意思就读取PB5的当前输出电平,然后再用1减去读取电平的数据状态, 相当于与当前的输出的状态相反。给开发板供电DC5V, 插上J-Link,将编译好的程序下载到开发板, LED1亮,按下按键时, LED1熄灭。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表