5.按键输入

news2024/11/19 5:29:17

1.按键介绍:

按键WK_UP接在低电平,当按键按下检测到高电平;KEY0和KEY1接在高电平,当按键按下检测到低电平;

2.本次实验步骤:

(1)GPIO输入操作:

  • 读取IO口输入电平的库函数:uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
  • 读取IO口输入电平操作的寄存器:GPIOx_IDR(端口输入寄存器);
  • 使用位带操作读取IO口输入电平:PBout(5) 读取GPIOB.5口电平,PEout(5)读取GPIOE.5口电平;

(2)按键输入步骤:

  1. 使能按键对应IO口时钟;
  2. 初始化IO口模式;
  3. 扫描IO口电平;

(3)按键扫描思路:

(4)static关键字介绍: 

static关键字声明的局部变量,存储在静态存储区中;它在函数调用结束后不会被释放,会一直保留其值;因此对于static声明的变量具有记忆功能;

3.实验:

当KEY0按下LE0亮,当KEY1按下LED1亮,WK_UP按下LED0和LED1都亮:

(1)主函数:

#include "delay.h"
#include "key.h"

int main(){
    
    u8 data=0; 
   
    delay_init();   //延时初始化
    LED_Init();   //LED初始化
    KEY_Init();   //按键初始化

    while(1){
        data=KEY_Scan(0);  //扫描按键->不支持连续按下
        if(data!=0){
           switch(data)
           {
              case 1:   //按键KEY0按下
                 LED0=!LED0;
                 break; 
              case 2:   //按键KEY1按下
                 LED1=!LED1;
                 break; 
              case 3:   //按键WK_UP按下
                 LED0=!LED0;
                 LED1=!LED1;
                 break; 
           }
       }
 }

}

(2)头文件

#ifndef __KEY_H
#define __KEY_H

#include "led.h"


#define LED0 PBout(5)
#define LED1 PEout(5)

//读取按键io的输入电平
#define KEY0     GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1     GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)
#define WK_UP    GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)

//定义数值,便于阅读
#define KEY0_down     1
#define KEY1_down     2
#define WK_UP_down    3

typedef unsigned  char u8; 

void KEY_Init(void);    //按键初始化

u8 KEY_Scan(u8 mode);   //按键扫描

#endif

(3)按键输入功能函数:

#include "stm32f10x.h"
#include "key.h"
#include "delay.h"


/*
    功能:按键初始化
    变量:无
    返回值:无
*/

void KEY_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    //1.使能时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
    
    //2.配置io    KEY0->PE4   输入模式不需要设置速度
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;    //输入上拉模式->由原理图可以看出,当接入高电平时按键工作
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4;    //PE4
    GPIO_Init(GPIOE,&GPIO_InitStruct);
    
    //配置io    KEY1->PE3
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;    //输入上拉模式->由原理图可以看出,当接入高电平时按键工作
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;    //PE3
    GPIO_Init(GPIOE,&GPIO_InitStruct);
    
    //配置io    WK_UP->PA0
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;    //输入下拉模式->由原理图可以看出,当接入低电平时按键工作
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;    //PA3
    GPIO_Init(GPIOE,&GPIO_InitStruct);
     
}

/*
   功能:按键扫描
   变量:mode=0 -> 单次按下  ;  mode=1 -> 连续按下
   返回值:扫描的按键值

*/
u8 KEY_Scan(u8 mode)
{
   static u8 key=1;  //使用静态变量定义按下的标志(保持被修改后的值,不会被重置) ,key=1没按下,key=0按下
   
   if(mode==1)    //当支持连续按下时,将key设置为1,使之一直处于被扫描状态
      key=1; 
   
   if((key==1)&&(KEY0==0||KEY1==0||WK_UP==1))   //判断是否具有按下的标志和检测哪一个按键被按下
   {
      delay_ms(10);  //消抖
      if(KEY0==0)
         return KEY0_down;    //KEY0按下则返回KEY0_down(KEY0_down在头文件中定义有特殊值)
      else if(KEY1==0)
         return KEY1_down;
      else if(WK_UP==1)
         return WK_UP_down;
   }
   else if(KEY0==1&&KEY1==1&&WK_UP==0)    //当按键都没有被按下时,设置key=1
   {
      key=1;   //没有按键按下的标志
   }

   return 0;   //当无按键按下返回0
}

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

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

相关文章

vue中实现将html导出为word文档

需求:将页面整成理想样式,将想要的那一部分页面导出成word,不用写模板,按照当前页面样式导出即可。(简易版) 保姆级别教程: 第一步:安装需要的依赖 npm install html-docx-js -Snpm install …

第11讲:使用ajax技术实现文件上传功能(jQuery)

软件项目开发过程中,文件上传功能是常用技术之一,经常需要上传文件过程中为了更好的体验,不允许刷新当前页面,这样就必须使用异步上传技术了,jQuery提供了异步上传的多种方法,下面跟大家一起探讨使用jQuery.form插件上传文件的功能,具体实现过程如下: 环境要求 序号资…

【单片机】MSP430 单片机 多路温度巡回检测仪的设计

多路温度巡回检测仪的设计 多路温度检测仪共有3个测温点,每个点连续检测8次,以平均值代表该点温度,并同时在 LCD 显示器.器任选,测量精度为1℃。系统每隔1秒完成一个点的测量。 设计以msp430g2553为核心的多路温度检测…

深度学习笔记之一看数据

最近在百度ai上跟了个“深度学习7日打卡营”的课程,目前看到人脸关键点检测章节,地址如下:飞桨AI Studio - 人工智能学习与实训社区 (baidu.com) 老师们讲解的很好,但是对于我这样的白菜来说,有些细节还是感觉略过去了…

Java-多线程

进程与线程 程序>进程>线程 程序是一段静止的代码,只有真正运行时的程序,才被称为进程。一个程序运行至少有一个进程 从操作系统底层来说,进程只是一个概念,真正执行的是线程。 进程是操作系统资源分配的基本单位&#x…

六、动画 - 旋转的应用例子,时钟

目录: 1.前期准备知识 2.实操 - 做时钟 3.完整代码 一、前期准备知识 因为旋转都是默认元素中心来旋转,所以,我们可以通过父元素包裹子元素。 通过父元素旋转,然后父带动子元素,到时候可以通过影藏父元素的背景颜色&a…

关于三元运算符强转的问题

1.int和char比较 public static void main(String[] args) {char x x;int i 10;char y 2;System.out.println(true? x: i);System.out.println(true? x: 1167);System.out.println(true?y:2);System.out.println((int)x);}JVM: public static void main(Stri…

CSS基础学习--23 CSS属性 选择器

一、定义 具有特定属性的HTML元素样式&#xff08;不仅仅是class和id&#xff09; 二、属性选择器 例子是把包含标题&#xff08;title&#xff09;的所有元素变为蓝色&#xff1a; <!DOCTYPE html> <html> <head> <style> [title] { color:blue; }…

Linux_CentOS_7.9修改更新默认时区

前言&#xff1a;近期一直在频繁部署虚拟机做系统测试发现Linux默认时区未做更改&#xff0c;这里做个记录留作参考。 查看服务器时区&#xff08;默认为纽约时间&#xff09; [rootorcl3 ~]# timedatectl 系统默认安装的所有时区&#xff0c;找到我们需要的时区 [rootor…

Proteus仿真之DAC(DAC0832)

1.数模/模数转换的目的&#xff1a;生活中常见的物理量如温度、流量、压力、位移、速度等都是一种模拟量。但是&#xff0c;计算机只能处理0、1的数字量&#xff0c;此时就需要将模拟量转为数字量。与此同时&#xff0c;MCU对模拟量设备进行控制时&#xff0c;如控制电动调节阀…

直播间自定义公屏视图的升级之路(View版)

目录 1.前言2.旧版设计的分析3.新版设计的分析4.代码实现&#xff08;View版本&#xff09;4.1.流式布局的实现4.1.1.测量4.1.2.布局 4.2针对需求优化流式布局4.2.1.测量4.2.2.布局 5.总结 1.前言 最近的版本呢&#xff0c;产品更新了一个直播间的需求&#xff0c;原本直播间的…

蓝库云|企业如何建立自己的供应商管理系统?零代码工具带来惊喜

在面对采购的物品和服务比较复杂多样的企业&#xff0c;都需要管理大量的供应商&#xff0c;因此需要更加有效和专业的供应商管理系统。随着数字化转型的意识不断增强&#xff0c;中小型企业也越来越意识到采用供应商系统的必要性&#xff0c;以提高采购效率和质量&#xff0c;…

LangChain 使用文本描述的方式操作MySQL中的数据

一、LangChain 使用文本描述的方式操作MySQL中的数据 在 LangChain 中提供了 SQLDatabaseChain &#xff0c;可以通过语义文本去操作 MySQL中的数据&#xff0c;例如在 MySQL 中有如下表数据&#xff1a; 用户表 CREATE TABLE user (id int NOT NULL AUTO_INCREMENT COMMENT…

HTML5 Canvas动画实例

在开发在线游戏时&#xff0c;绘制动画是非常重要的。本文介绍一个使用Canvas API实现的动画实例——游戏人物的跑步动画。 01、动画的概念及原理 1、动画 动画是通过一幅幅静止的、内容不同的画面(即帧)快速播放来呈现的&#xff0c;使人们在视觉上产生动的感觉。这是利用了…

如何让VSCode不生成 tempcoderunnerfile.py

原因 runcode插件默认包含执行选中文本功能&#xff0c;当运行程序时会优先执行光标选中的代码并生成temp文件 解决方法 方法一&#xff1a;删除生成文件 在setting.json中添加 "code-runner.executorMap": {"php": "php $fullFileName &&am…

【Linux】Ubuntu20.04使用xrdp远程桌面时,gnome桌面环境没有最小化、任务栏等问题

一、问题背景 如下图所示&#xff0c;终端窗口没有最小化&#xff0c;因此只能关闭或移到一边去。 二、解决办法 在安装任何扩展前&#xff0c;需要将xrdp的桌面尽量向原生桌面靠拢。 在~/.xsessionrc配置文件中添加下面三行。 export GNOME_SHELL_SESSION_MODEubuntu ex…

Mediapipe 人像分割;实时更换背景;人脸添加特效

参考&#xff1a; https://zhuanlan.zhihu.com/p/476351994 1、Mediapipe 人像分割 import cv2 import mediapipe as mp import numpy as np mp_drawing mp.solutions.drawing_utils mp_selfie_segmentation mp.solutions.selfie_segmentation # 图片人物抠图: IMAGE_FILES…

idea生成serialVersionUID序列号

设置idea file->settings,搜索serialVersionUID&#xff0c;勾选框起来的两项 实体类实现Serializable接口 Data public class User implements Serializable { }鼠标放到类名上 点击提示的uid 生成的uid 结束&#xff01; hy:17 生活是一面镜子&#xff0c;给予我们…

springboot 停车场管理系统-计算机毕设 附源码82061

springboot 停车场管理系统 2023年5月 摘要 由于数据库和数据仓库技术的快速发展&#xff0c;停车场管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。停车场管理系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都…

GO 基本配置

其他 IDEA 配置go语言环境 https://blog.csdn.net/weixin_45719444/article/details/121726325 关于IDEA的 plugins下找不到GO插件 点击安装 安装插件 Go 安装插件 Generate struct tags for golang