当前位置:   article > 正文

STM32学习笔记(白话文理解版)—按键控制_stm32按键控制原理

stm32按键控制原理

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

三、无锁存按键方式

(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);}	
		}		
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

四、有锁存按键方式

(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)); //等待按键松开,如果按键按下,一直循环在这条语句,防止在按下后反复执行前面的程序
			}
		}			
		}		
}	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 单片机读取速度很快,如果按下瞬间读取,则按键可能是或高或低的不稳定状态,故延迟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);			
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/代码探险家/article/detail/752334
推荐阅读
相关标签
  

闽ICP备14008679号