STM32学习笔记(白话文理解版)—按键控制
一、按键原理
采用正点原子mini版,根据原理图得知:
KEY0 和 KEY1 是低电平有效的,而 WK_UP 是高电平有效的,除了KEY1 有上拉电阻(与 JTDI 共用),其他两个都没有上下拉电阻,所以,需要在 STM32 内部设置上下拉。
前置条件:
也就是KEY0按下,PC5为低电平;LED灯低电平有效,低电平时LED灯亮
二、初始化按键
- 原理:按键初始化也就是读取和按键相连接引脚的电平状态,故将GPIO引脚设置为输入模式,在根据按键的电路连接情况设置相应的GPIO口工作方式。
- 引脚介绍:按键引脚PC5;LED灯引脚PA8
程序:
#include "key.h"
void KEY_Init(void){ //微动开关的接口初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //选择引脚组C的5号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 输入模式无需设置
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
三、无锁存按键方式
(1)主函数
- 利用GPIO_ReadInputDataBit函数读取按键状态,也就是PC5引脚的状态,若按键为1,也就是按键按下,则熄灭LED灯,否则LED灯点亮
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "key.h"
int main (void)
{
KEY_Init();
LED_Init();
while(1)
{
//按键没按下,读取电平是1,则PA8置于低电平,LED点亮;按键按下,读取电平是0,PA8置于高点平,按键熄灭
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)){
GPIO_ResetBits(GPIOA,GPIO_Pin_8);}
else{
GPIO_SetBits(GPIOA,GPIO_Pin_8);}
}
}
(2)按键初始化函数
同部分二
#include "key.h"
void KEY_Init(void){ //微动开关的接口初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //选择引脚组C的5号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 输入模式无需设置
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
四、有锁存按键方式
(1)主函数
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "led.h"
#include "delay.h"
#include "key.h"
int main (void)
{
KEY_Init();
LED_Init();
while(1)
{
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5))
{ //按键按下为低电平,!0则执行
delay_ms(20); //延时去抖动,见图解
if(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5))
{ //按键还是按下的,继续执行
GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))); //LED取反,GPIO_ReadOutputDataBit读取灯输出电平
while(!GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)); //等待按键松开,如果按键按下,一直循环在这条语句,防止在按下后反复执行前面的程序
}
}
}
}
- 单片机读取速度很快,如果按下瞬间读取,则按键可能是或高或低的不稳定状态,故延迟20ms再读
(2)按键初始化函数
同部分二
#include "key.h"
void KEY_Init(void){ //微动开关的接口初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO的初始化枚举结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //选择引脚组C的5号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //选择IO接口工作方式 //上拉电阻
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz) 输入模式无需设置
GPIO_Init(GPIOC,&GPIO_InitStructure);
}