当前位置:网站首页>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);			
}
原网站

版权声明
本文为[LaiGuo.]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_58326153/article/details/126199866