STM32—启用按键

这篇具有很好参考价值的文章主要介绍了STM32—启用按键。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章来源地址https://www.toymoban.com/news/detail-839579.html

目录

1 、电路构成及原理图 

2、编写实现代码

main.c 

main.h

 key.c

3、代码讲解

4、 烧录到开发板调试、验证代码

5、检验效果


本人使用的是朗峰 STM32F103 系列开发板,此笔记基于这款开发板记录。

1 、电路构成及原理图 

stm32使用key摁键,stm32,stm32,嵌入式硬件,单片机

stm32使用key摁键,stm32,stm32,嵌入式硬件,单片机stm32使用key摁键,stm32,stm32,嵌入式硬件,单片机

重要!一定先用短路帽短接板上P5的2-3引脚,否则KEY_WKUP按键无效

通过按键原理图我们可以看到,按键 KEY1 和按键 KEY2 的各一端接到了 GND 端低电平端,KEY1 的另一端连接到 STM32 的 PC8 引脚;KEY2 的另一端连接到 STM32 的 PC9 引脚。而 KEY_WKUP 按键的一端接到了 VCC3.3V 高电平端另一端连接到了 STM32 的 PA0 引脚
(WKUP/唤醒)。 

通过原理图可知,当 KEY1 按下时 PC8 会被拉低为低电平,KEY2按下时 PC9 会被拉低为低电平,KEY_WKUP 按下时 PA0 会被拉高为高电平。 我们把 PC8、PC9、PA0 引脚的模式初始为输入模式,那么通过判断 PC8、PC9、PA0 引脚的低、高电平我们就可以知道哪一个按键被按下了。

2、编写实现代码

实现效果:

当按下 KEY1 按键,LED1 亮起。放开按键时 LED1 熄灭。 
当按下 KEY2 按键,LED2 亮起。放开按键时 LED2 熄灭。 
当按下 KEY_WKUP 按键,蜂鸣器响起。放开按键时蜂鸣器停止发声。 

main.c 

#include "main.h"


int main(void)
{
	uint8_t i;
 /*HAL库初始化*/
  HAL_Init(); 
 /*初始化系统时钟频率为72MHz及延时函数初始化*/
  SystemClock_init(RCC_PLL_MUL9);
 /*初始化按键通用输入输出端口*/
  key_Init();
 /*初始化LED通用输入输出端口*/
  Led_Init();
 /*蜂鸣器IO初始化*/
  beep_init();

    while (1)
    {
     i=key_scan();          //检测按键按下情况
			switch(i){            
			case KEY_1_PUSH:      //如果KEY_1按下,LED1(红色)亮起
       LED1_L;
       break;
	  	case KEY_2_PUSH:      //如果KEY_2按下,LED2(绿色)亮起
       LED2_L;
				break;
			case KEY_WKUP_PUSH:   //如果KEY_WKUP按下,蜂鸣器响起
       beep_L;
				break;
      case 0:               //如果没有按键按下LED熄灭蜂鸣器不发声
				LED1_H;
				LED2_H;
				beep_H;
							 }
    }
}

main.h

#ifndef __main_H_
#define __main_H_

#include "stm32f1xx.h"
#include "stm32f1xx_hal.h"
#include "User_Settings.h"
#include "key.h"
#include "led.h"
#include "beep.h"

 key.c


/**
  * @brief   检测按键输入代码
  * @file    key.c
  * @Board   朗峰 STM32 F103RCT6系列开发板  
  */

#include "key.h"

/**
* @brief  初始化按键通用输入输出端口       
* @param  none
* @retval none
*/
void key_Init(void)
{
	GPIO_InitTypeDef GPIO_Init;          //GPIO_Init:GPIO_InitTypeDef结构体类型的变量
                                       //使用GPIO之前必须开启GPIO端口时钟
	__HAL_RCC_GPIOA_CLK_ENABLE();        //开启GPIOA时钟
	__HAL_RCC_GPIOC_CLK_ENABLE();        //开启GPIOC时钟


	GPIO_Init.Pin=GPIO_PIN_0;            //KEY_WUKP引脚PA0
	GPIO_Init.Mode=GPIO_MODE_INPUT;      //模式为输入模式
	GPIO_Init.Pull=GPIO_PULLDOWN;        //激活下拉
	GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;//端口速度选择高速
	HAL_GPIO_Init(GPIOA,&GPIO_Init);     //按以上设置初始化引脚PA0

	GPIO_Init.Pin=GPIO_PIN_8|GPIO_PIN_9; //KEY_1引脚PC8,KEY_2引脚PC9
	GPIO_Init.Mode=GPIO_MODE_INPUT;      //模式为输入模式
	GPIO_Init.Pull=GPIO_PULLUP;          //激活上拉
	GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;//端口速度选择高速
	HAL_GPIO_Init(GPIOC,&GPIO_Init);     //按以上设置初始化引脚PC8,PC9
}


/**
* @brief  检测按键输入       
* @param  none
* @retval KEY_1按下时返回 KEY_1_PUSH
          KEY_2按下时返回 KEY_2_PUSH
          KEY_WKUP按下时返回 KEY_WKUP_PUSH
          无按键按下时返回0
*/

uint8_t key_scan(void)
{
	delay_ms(15);
	if(KEY_1==0) return KEY_1_PUSH;
		else if(KEY_2==0) return KEY_2_PUSH;
			else if(KEY_WKUP==1) return KEY_WKUP_PUSH;              
				return 0;
							
}

 led.c


/**
  * @brief   led驱动代码
  * @file    led.c
  * @Board   朗峰 STM32 F103RCT6系列开发板  
  */

#include "led.h"

/**
* @brief  初始化LED通用输入输出端口     
* @param  none
* @retval none
*/
void Led_Init(void)
{
	GPIO_InitTypeDef GPIO_Init;             //GPIO_Init:GPIO_InitTypeDef 结构体类型的变量
                                          //使用GPIO之前必须开启GPIO端口时钟
	__HAL_RCC_GPIOB_CLK_ENABLE();           //开启GPIOB时钟
	__HAL_RCC_GPIOC_CLK_ENABLE();           //开启GPIOC时钟

	GPIO_Init.Pin=GPIO_PIN_9; 				      //LED2 IO引脚PB9
	GPIO_Init.Mode=GPIO_MODE_OUTPUT_PP;  	  //输出模式选择推挽输出
	GPIO_Init.Pull=GPIO_PULLUP;            	//激活上拉
	GPIO_Init.Speed=GPIO_SPEED_FREQ_HIGH;   //端口速度选择高速
	HAL_GPIO_Init(GPIOB,&GPIO_Init);        //按以上设置初始化引脚PB9

	GPIO_Init.Pin=GPIO_PIN_6|GPIO_PIN_13; 	//LED1 IO引脚PC6 PC13是LCD屏背光
	HAL_GPIO_Init(GPIOC,&GPIO_Init);
  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_12|GPIO_PIN_13,GPIO_PIN_RESET);//未使用LCD屏关闭背光以节电

	LED1_H;                                  //LED1置高电平。默认led1不亮起
  LED2_H;                                  //LED2置高电平。默认led2不亮起

}

3、代码讲解

源文件 main.c 只 include “main.h”一个头文件而没有
包含其它外设等的头文件,这样看起来页面很清爽简洁,那其它的头
文件都放在哪里了呐?答案是都放在了 main.h 中,其它地方也可以
这样使用哦。

先看按键的初始化函数 void key_Init(void),这里的第一个void 表示这是个无返回值的函数,第二个在括号的 void 表示这个函数无参数。 
按照流程,依旧是先开启端口 A 和端口 C 的时钟、端口模式为输入模式、速度为高速、其中 PA0 设置为下拉,PC8,PC9 设置为上拉 ,最后按以上设置初始化。 
再接着看检测按键输入函数 uint8_t  key_scan(void),这里的uint8_t 表示函数的类型,void 依旧说明该函数无参。 

 最后回头看一下主 main 函数:按照流程的初始化 HAL 库、设置系统时钟(72Mhz)、初始化按键、初始化 LED、初始化蜂鸣器。 
接下来进入 while()循环,首先就是循环检测是否有按键按下,之后使用了 switch 条件判断语句来判断具体是哪个按键被按下了而且实现对应的控制。 
具 体 看 , 当 被 key_scan() 返 回 值 赋 值 的 变 量 i 满 足 条 件KEY_1_PUSH:即 KEY1 按键被按下了,那就点亮 LED1:LED1_L;这句应该就很熟悉了; 

当 i 满足条件 KEY_2_PUSH:即 KEY2 按键被按下了,  那就点亮LED2:LED2_L; 
当 i 满足条件 KEY_WKUP_PUSH:即 KE_WKUP 按键被按下了,  那就驱动蜂鸣器发声。 
如果三个判断条件都不被满足,也就是没有按键按下那就将LED1、LED2、beep 都置高电平即 LED 不点亮蜂鸣器不发声。

4、 烧录到开发板调试、验证代码

编译一次,编译结果显示 0 错误 0 警告就 OK ,之后再按 将代码下载到开发板。 (具体可参考之前的内容,重复不赘述)

5、检验效果

连接好开发板电源并按下电源开关就可以通过分别按下KEY1,KEY2,KEY_WKUP 按键观察结果是否与代码中设置的结果一致了。 

检验效果:

当按下 KEY1 按键,LED1 亮起。放开按键时 LED1 熄灭。 
当按下 KEY2 按键,LED2 亮起。放开按键时 LED2 熄灭。 
当按下 KEY_WKUP 按键,蜂鸣器响起。放开按键时蜂鸣器停止发声。 


完美契合!

到了这里,关于STM32—启用按键的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式开发:使用STM32CubeMX 和 Keil uVision5实现两位数码管循环显示实验

    一、STM32CubeMx实现数码管 1、双击打开STM32CubeMX。 2、点击File选项,在File列表下选择New Project选项新建工程。 3、在图中所示位置的方框中输入我们使用的芯片型号来搜索芯片 4、与我们的搜索相关的芯片型号会在这里呈现,我们只需要选择我们需要的即可,这里我们双击第一个

    2024年02月08日
    浏览(54)
  • stm32嵌入式实验考核

    STM32 实验考核题目 1. 利用 STM32 小板实现:控制外接 LED 灯每隔 3 秒钟亮暗变换,同 时在 PC 机上显示 MCU 的计时时间,MCU 的初始时间由 PC 机 方设置。 2. 利用 STM32 小板实现:利用导线外接 GPIO 口模拟 2 个按键输入, 根据输入组合的四种情况,分别控制三色灯四种流水灯效果

    2024年02月03日
    浏览(53)
  • 【嵌入式学习笔记】嵌入式基础9——STM32启动过程

    程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系 删除映像未使用的程序段(Removing Unused input sections from the image):描述工程中未用到被删除的冗余程序段(函数/数据) 映像符号表(Image Symbol Table):描述各符号(程序段/数据)在存储器中的地址、类

    2024年02月15日
    浏览(87)
  • 蓝桥杯嵌入式基础模块——LCD显示器的基本使用(新板)STM32G431(HAL库开发)

            在蓝桥杯嵌入式官方给我们提供好了,LCD显示的底层源码,我们只需要,记住里面的API函数,会用这些函数就行。         在官方给的资料中找到这个文件名字DK117_G4 Data Packet-开发板驱动文件里面就是所有的底层文件有两种类型,一种是基于HAL库的一种是标准库

    2024年02月09日
    浏览(63)
  • 嵌入式 STM32 通讯协议--MODBUS

    目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议  二、MODBUS通信协议 1、概述 2、MODBUS帧结构  协议描述 3、MODBUS数据模型   4、MODBUS事务处理的定义 5、MODBUS功能码  6、功能码定义   7、MODBUS数据链路层 8、MODBUS地址规则  9、MODBUS帧描述 10、MODBUS两种

    2024年02月11日
    浏览(66)
  • STM32的时钟系统(嵌入式学习)

    时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此时钟对于计算机系统是至关重要的,通常时钟系

    2024年02月16日
    浏览(50)
  • 嵌入式——新建STM32工程(标准库)

    目录 一、初识标准库 1.CMSIS标准及库层级关系 2.库文件介绍 (1)Libraries文件夹 ①CMSIS文件夹 ②STM32F10x_Std_Periph_Driver文件夹 ③ 在用库建立一个完整的工程时,还需要添加stm32f10x_it.c、 stm32f10x_conf.h 和 system_stm32f10x.c文件 (2)Project文件夹 (3)Utilities文件夹 3.库各文件之间的关

    2024年01月23日
    浏览(59)
  • STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(69)
  • stm32毕设分享 Stm32酒驾检查系统 - 单片机 嵌入式 物联网

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月23日
    浏览(76)
  • stm32毕设分享 stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包