STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法

软件方法就是在首次检测到低电平时加延时,通常延时5-10ms,让抖动先过去,然后再来检测是否仍为低电平,如果仍然是,说明确实按下。

硬件方法就是加RC滤波电路,硬件方法会增加成本,通常不采用。

本开发板的按键电路如下:

key up连接到+3.3V,是为了使用STM32的PA0引脚的唤醒功能。PA0片内配置成下拉电阻,平常为低电平,当按键按下时,检测到下拉电阻上有高电平,即表示按键按下。

K1-K3连到PE2-PE4,片内配置成上拉电阻,平常为高电平,按下按键为低电平。

按键控制实验:

使用开发板上的4个按键控制D2D3,D1指示灯

闪烁用于提示系统运行。程序框架如下

1)使能按键端口时钟、初始化GPIO

2)按键检测

        (3)主函数控制

main.c

#include "system.h"
#include "led.h"
#include "SysTick.h"
#include "beep.h"
#include "DigitalTube.h"
#include "key.h"int main()
{u8 key,i=0;SysTick_Init(72);LED_Init();
//	BEEP_Init();
//	DigitalTube_Init();key_Init();while(1){key=KEY_Scan(1);switch(key){case KEY_UP: 		led2=!led2;break;case KEY_DOWN: 	led3=!led3;break;			case KEY_LEFT: 	led4=!led4;break;	case KEY_RIGHT: led5=!led5;break;}i++;if(i%20 ==0){led1=!led1;//LED1闪}delay_ms(10);}
}

LED1闪,不使用直接在while里延时的方式 ,而是通过一个i做中间变量的方式 ,是因为假设直接使用延时,因为想看到灯闪,延时的时间就需要较长,而在延时的时间里,CPU等于延在那空等,这个时候按动按键,按键的检测可能反应就不够快!

key.c

#include "key.h"
#include "SysTick.h"void key_Init()
{GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//同时打开PA和PE端口时钟GPIO_InitStructure.GPIO_Pin=KEY_UP_Pin; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;	//配置成输入、下拉电阻模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//输入模式的频率配不配置不影响GPIO_Init(KEY_UP_Port,&GPIO_InitStructure);//初始化KEY_UP_PinGPIO_InitStructure.GPIO_Pin=KEY_LEFT_Pin|KEY_DOWN_Pin|KEY_RIGHT_Pin; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;	//配置成输入、上拉电阻模式GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;	//输入模式的频率配不配置不影响GPIO_Init(KEY_Port,&GPIO_InitStructure);//初始化KEY_LEFT_Pin|KEY_DOWN_Pin|KEY_RIGHT_Pin
}u8 KEY_Scan(u8 mode) mode =0--单次扫描,mode =1--连接扫描
{static u8 key=1;//key用来判断按键是否连续按下;定义成static可以保证程序中断恢复时仍然保持上一次的值if(key==1&&(K_UP==1||K_DOWN==0||K_LEFT==0||K_RIGHT==0))//检测是否有按键按下{key=0;delay_ms(10);if(K_UP==1){return KEY_UP;}else if (K_DOWN==0){return KEY_DOWN;}else if (K_LEFT==0){return KEY_LEFT;}	else if (K_RIGHT==0){return KEY_RIGHT;}	}else if (K_UP==0&&K_DOWN==1&&K_LEFT==1&&K_RIGHT==1)//检测是否松开按键{key=1;}if(mode==1)//如果调用Key_Scan传进来的mode=1,则强制key始终等于1,这等于取消了上条的松开按键检测{key=1;}return 0;}

key.h

#ifndef _key_H
#define _key_H#include "system.h"#define KEY_UP_Pin					GPIO_Pin_0
#define KEY_UP_Port					GPIOA#define KEY_LEFT_Pin					GPIO_Pin_2
#define KEY_DOWN_Pin					GPIO_Pin_3
#define KEY_RIGHT_Pin					GPIO_Pin_4
#define KEY_Port							GPIOE//使用位带的方式读取引脚电平
#define K_UP					PAin(0)
#define K_DOWN				PEin(3)
#define K_LEFT				PEin(2)
#define K_RIGHT				PEin(4)//直接使用库函数的方式读取引脚电平
//#define K_UP					GPIO_ReadInputDataBit(KEY_UP_Port,KEY_UP_Pin)
//#define K_DOWN				GPIO_ReadInputDataBit(KEY_Port,KEY_DOWN_Pin)
//#define K_LEFT				GPIO_ReadInputDataBit(KEY_Port,KEY_LEFT_Pin)
//#define K_RIGHT				GPIO_ReadInputDataBit(KEY_Port,KEY_RIGHT_Pin)#define KEY_UP					1
#define KEY_DOWN				2
#define KEY_LEFT				3
#define KEY_RIGHT				4void key_Init(void);
u8 KEY_Scan(u8 mode);#endif

以上代码经实际上机实验,测试通过!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

✌粤嵌—2024/4/3—合并K个升序链表✌

代码实现: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…

DNS服务器配置与管理(3)——综合案例

DNS服务器配置与管理 前言 在之前,曾详细介绍了DNS服务器原理和使用BIND部署DNS服务器,本文主要以一个案例为驱动,在网络中部署主DNS服务器、辅助DNS服务器以及子域委派的配置。 案例需求 某公司申请了域名example.com,公司服…

第七周学习笔记DAY.1-封装

学完本次课程后,你能够: 理解封装的作用 会使用封装 会使用Java中的包组织类 掌握访问修饰符,理解访问权限 没有封装的话属性访问随意,赋值也可能不合理,为了解决这些代码设计缺陷,可以使用封装。 面向…

vue快速入门(二十八)页面渲染完成后让输入框自动获取焦点

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用挂载完成的钩子函数用focus使输入框获取焦点 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"width…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用&#xff1a; 求解当前元素右边比该元素大的第一个元素&#xff08;左右、大小都可以&#xff09;。 单调栈的构成&#xff1a; 单调栈里存储数组的下标&#xff1b; 单调栈里的元素递增&#xff0c;求解当前元素右边比该元素大的第一个元素&#xff1b;元素递…

(十一)C++自制植物大战僵尸游戏客户端更新实现

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/cFP3z 更新检查 游戏启动后会下载服务器中的版本号然后与本地版本号进行对比&#xff0c;如果本地版本号小于服务器版本号就会弹出更新提示。让用户选择是否更新客户端。 在弹出的更新对话框中有显示最新版本更新的内容…

2024五一杯数学建模A题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

光学雨量计雨量传感器的工作原理与实时数据采集

光学雨量计雨量传感器的工作原理与实时数据采集 河北稳控科技光学雨量计是一种常用的雨量传感器&#xff0c;其工作原理基于光学原理和实时数据采集技术。它的主要作用是测量雨水的大小和强度&#xff0c;为气象、农业、水文等领域提供重要的数据支持。 光学雨量计的工作原理是…

单片机之ESP8266模块

目录 ESP8266简介 前言 ESP8266的工作模式 ESP8266引脚说明 ESP8266测试 步骤 单片机与esp8266交互 前言 收到数据的格式 AP模式 服务器模式 外部执行命令 代码内执行命令 代码部分 客户端模式 外部执行命令 内部执行命令 代码部分 STA模式 服务器模式 外…

10个常用的损失函数及Python代码实现

本文深入理解并详细介绍了10个常用的损失函数及Python代码实现。 什么是损失函数&#xff1f; 损失函数是一种衡量模型与数据吻合程度的算法。损失函数测量实际测量值和预测值之间差距的一种方式。损失函数的值越高预测就越错误&#xff0c;损失函数值越低则预测越接近真实值…

LUCF-Net:轻量级U形级联 用于医学图像分割的融合网络

LUCF-Net&#xff1a;轻量级U形级联 用于医学图像分割的融合网络 摘要IntroductionRelated WorkProposed MethodLocal-Global Feature ExtractionEncoder and DecoderFeature FusionLoss Function LUCF-Net: Lightweight U-shaped Cascade Fusion Network for Medical Image Se…

Android zxing库实现扫码识别

第一步 加库zxing库 //导入二维码识别库ZXingimplementation("com.journeyapps:zxing-android-embedded:4.2.0") 第二部获取摄像机权限 <uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="andro…

【日常记录】【CSS】利用动画延迟实现复杂动画

文章目录 1、介绍2、原理3、代码4、参考链接 1、介绍 对于这个效果而言&#xff0c;最先想到的就是 监听滑块的input事件来做一些操作 ,但是会发现&#xff0c;对于某一个节点的时候&#xff0c;这个样式操作起来比较麻烦 只看这个代码的话&#xff0c;发现他用的是动画&#x…

超详细!Python中 pip 常用命令

相信对于大多数熟悉Python的人来说&#xff0c;一定都听说并且使用过pip这个工具&#xff0c;但是对它的了解可能还不一定是非常的透彻&#xff0c;今天小编就来为大家介绍10个使用pip的小技巧&#xff0c;相信对大家以后管理和使用Python当中的标准库会有帮助。 安装 当然在…

【算法一则】编辑距离 【动态规划】

题目 给你两个单词 word1 和 word2&#xff0c; 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符 删除一个字符 替换一个字符 示例 1&#xff1a;输入&#xff1a;word1 "horse", word2 "…

16 - Debian如何配置vsftpd(1)实现匿名上传下载

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian如何配置vsftpd&#xff08;1&#xff09;实现匿名上传下载 《傅老师Debian小知识库系列之16》——原创 前言 傅老师Debian小知识库特点&#xff1a…

微信小程序获取蓝牙信标

/*** 搜索设备界面*/ import Dialog from vant/weapp/dialog/dialog; Page({data: {list: []},onPullDownRefresh: function () {wx.request({url: https://wwz.jingyi.icu/app/Explain/index,data: {scenic_id: 3},method: POST,success: (res) > {console.log(res);let th…

重磅!国内首个基于单张图片的3D人脸重建课程

3D人脸重建在计算机视觉和图形学中一直是一个经典且热门的研究方向&#xff0c;在游戏、影视、娱乐等众多行业也有着广泛的应用。早期人脸重建主要基于多视角相机或深度相机&#xff0c;随着深度学习的兴起&#xff0c;基于单张图片的人脸重建成为可能&#xff0c;且重建的精度…

数学建模---Matlab学习笔记

1.经典例题 &#xff08;1&#xff09;判断质数 给定一个大于100的数字&#xff0c;判断是否为质数 先设定布尔值是true,也就是假设这个数字是质数&#xff0c;利用for循环进行遍历直到n-1&#xff0c;如果被任意的数字整除&#xff0c;就说明不是质数&#xff0c;我们就把布…

2024 年排名前 5 的 CSS 框架

文章目录 1、Bootstrap2、Tailwind CSS3、Foundation4、Bulma5、UIKit 1、Bootstrap Bootstrap框架是由Twitter的设计师Mark Otto和Jacob Thornton合作开发的&#xff0c;于2011年8月在GitHub上发布。它是目前最受欢迎的前端框架之一&#xff0c;被广泛应用于各种Web项目中。Bo…