当前位置:网站首页>STM32学习笔记(白话文理解版)—按键控制
STM32学习笔记(白话文理解版)—按键控制
2022-08-11 05:25:00 【LaiGuo.】
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);
}
边栏推荐
猜你喜欢

梅科尔工作室-PR第三次培训笔记(效果与转场及插件使用)

网络七层结构(讲人话)

Robust 3D Object Detection in Cold Weather Conditions

浙江大学软件学院2020年保研上机真题练习

Waymo数据集使用介绍(waymo-open-dataset)

Waymo dataset usage introduction (waymo-open-dataset)

【调试记录1】提高MC3172浮点运算能力,IQmath库的获取与导入使用教程

LAGRANGIAN FLUID SIMULATION WITH CONTINUOUS CONVOLUTIONS

TAMNet:A loss-balanced multi-task model for simultaneous detection and segmentation

目标检测——Faster R-CNN 之 Fast R-CNN
随机推荐
梅科尔工作室-Pr第二次培训笔记(基本剪辑操作和导出)
CMT2380F32模块开发0-总览
Robust 3D Object Detection in Cold Weather Conditions
微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
目标检测——LeNet
Hard hat identification
KANO模型——确定需求优先级的神器
梅科尔工作室-PR第三次培训笔记(效果与转场及插件使用)
解决jupyter中import torch出错问题
CMT2380F32模块开发1-硬件
关于安全帽识别系统,你需要知道的选择要点
智慧工地 安全帽识别系统
Hard hat recognition algorithm
Use regex to verify whether the file name is legal
CMT2380F32模块开发2-IDE软件配置
EMQX企业版试用笔记
weex入门踩坑
目标检测——Faster-RCNN 之 RCNN
CMT2380F32模块开发6-flash例程
Pay “Attention” to Adverse Weather