07节-51单片机-矩阵键盘

文章目录

    • 1矩阵键盘原理
    • 2.扫描的概念
    • 3.弱上拉
    • 4.实战-实现矩阵键盘对应按钮按下显示对应值
        • 4.1配置代码模板
    • 5.键盘锁

1矩阵键盘原理

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
按行扫描:
例如,我将P1赋初值为0xFF,如果我们需要按行扫描,我选择将P1_7赋值为0,就是选择了P17所在的第一行按键(即S1,S2,S3,S4),那么我如果再要选择这一行的某个按键,则只需要将按列选择就行了,比如我要表示按下S1出发的反应,那么P1_3=0,即可表示按下了S1,其他的同理可得
按列扫描也不过是先将P_3赋初值为0,再选择某行,从而来定位某个按键。
在这里插入图片描述
根据情况选择按行,还是按列扫描,如果按行扫描存在和其他模块的引脚存在强烈冲突,那么就选择按列。

2.扫描的概念

数码管扫描(输出扫描)
原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果
矩阵键盘扫描(输入扫描)
原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果
以上两种扫描方式的共性:节省I/O口

3.弱上拉

弱上拉,即输出的1驱动能力是有限的
弱上拉内部简单模型:
在这里插入图片描述
如果内部接高电平,外界也是高电平,那么读入的肯定是高电平;
如果内部接高电平,外界接地,是一种强GND,保持不了高电平,会被外界的强下拉拉到低电平,即输出1外界输入0,读进来的是0。
其他高系列的单片机,还有推挽输出,没有上拉电阻,高电平直接接到VCC,低电平直接接到GND,只能输出不能输入。
高阻输入:仅作为输入开漏输出:PO口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
有源蜂鸣器和无源蜂鸣器的区别
有无振荡源,有源蜂鸣器内部带振荡源,所以只要一通电就会叫;而无源蜂鸣器内部不带振荡源,所以如果用直流信号无法令其鸣叫。

4.实战-实现矩阵键盘对应按钮按下显示对应值

目录结构:(仍然需要将之前的延时模块和LCD1602模块添加进来)
在这里插入图片描述

4.1配置代码模板

在这里插入图片描述
在这里插入图片描述
双击即可添加模板,方便快速写代码
在这里插入图片描述
MatrixKey.h

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__
unsigned char MatrixKey();
#endif

MatrixKey.c

/*** @brief  矩阵键盘读取按键键码* @param  无参* @retval  KeyNumber 按下按键的键码值*          按下按键如果不放,那么程序将停留在该程序中,松手的一瞬间,返回按键键码:*/
#include <REGX52.H>
#include "Delay.h"
unsigned char MatrixKey()
{unsigned char KeyNumber=0;P1=0xFF;P1_3=0; //选择第一列if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}P1=0xFF;P1_2=0; //选择第二列if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}P1=0xFF;P1_1=0; //选择第三列if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}P1=0xFF;P1_0=0; //选择第四列if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}return KeyNumber;
}

main.c

#include <REGX52.H>  //安装目录下找
#include "Delay.h"  //本文件目录找
#include "LCD1602.h"
#include "MatrixKey.h"
unsigned char KeyNum;
void main()
{LCD_Init();LCD_ShowString(1,1,"MatrixKey-wind:");while(1){KeyNum=MatrixKey();if(KeyNum){LCD_ShowNum(2,1,KeyNum,2);}}
}

其他的延时函数和LCD1602见前面的文章。

5.键盘锁

通过设计一个密码锁,其中键1-10,作为输入密码按键,表示数字1-9和0,11按键作为确认键,12作为取消键。
注意:除了main.c文件,其他的和上一个文件相同,可直接复制上一个工程的文件。
main.c

#include <REGX52.H>
#include "LCD1602.h"
#include "MatrixKey.h"
#include "Delay.h"
unsigned char KeyNum;
unsigned int Password,Count;
void main()
{LCD_Init();LCD_ShowString(1,1,"PassWord:");while(1){KeyNum=MatrixKey();if(KeyNum){if(KeyNum<=10) //如果键码值小于等于10,作为按键,密码输入。{if(Count<4){Password*=10;Password+=KeyNum%10;Count++;LCD_ShowNum(2,1,Password,4);}}if(KeyNum==11)  //如果键码值为11,则,表示确认密码{if(Password==2345)  //如果密码正确{Count=0;   //计数器和密码都清零Password=0;LCD_ShowString(1,14,"OK "); //显示ok}else{Count=0;Password=0;LCD_ShowString(1,14,"ERR");}LCD_ShowNum(2,1,Password,4); //清零之后显示}if(KeyNum==12)  //如果按键12,则取消,即清零。{Count=0;Password=0;LCD_ShowNum(2,1,Password,4);}}}
}

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

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

相关文章

深浅拷贝及其现代写法

#include<iostream> using namespace std; class Person { public://默认构造Person(){cout << "Person()" << endl;}//有参构造函数Person(int age,int height){m_age age;m_height new int(height);cout << "Person(int age, int h…

【ZYNQ】zynq启动模式及程序固化

一、前言 由于zynq含有arm cpu ,其启动模式由ps主导&#xff0c;与纯逻辑的fpga不相同&#xff0c;此处做一个记录。 二、zynq启动模式 关于zynq的启动模式详细内容可以参考官方文档&#xff1a;ug585-Zynq 7000 SoC Technical Reference Manual&#xff0c;第六章。 2.1 启…

12(第十一章,数据仓库和商务智能)

目录 概述 目标和原则 基本概念 商务智能 数据仓库 数据仓库建设方法 数据仓库架构组件 加载处理方式 1、历史数据 2、批量变更数据捕获&#xff08;CDC&#xff09; 3、准实时和实时数据加载 活动 运营分析应用 方法 数据仓库构建 架构演进 数据处理过程 数…

Nacos分布式配置中心和服务注册中心

分布式配置中心 Nacos Spring Cloud 快速开始 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

第一届长城杯半决赛wp和AWD笔记

目录 AWD 渗透 cfs 单节点1 AWD笔记 AWD工具 文件比较工具 Web漏洞扫描工具 waf工具 代码审计工具 批量网站备份文件泄露扫描工具 cms通杀漏洞的利用 通杀脚本和批量提交flag脚本 防御流程 攻击流程 注意 AWD 解题思路] 首先就是fscan快速扫描对应C段&#xf…

【重学C语言】十、指针入门

【重学C语言】十、指针入门 地址和存储单元内存四区地址存储单元存储区首地址地址和存储单元的关系怎么获得地址指针定义指针初始化指针使用指针修改指针指向的值`类型 *` 的含义取地址符和解引用符取地址符(&)解引用符(*)

pipeline流水线语法

Pipeline 常用语法_pipline语法-CSDN博客 jenkins-pipeline语法详解 最新最全 &#xff08;声明式Pipeline和脚本式&#xff09;_pipeline脚本脚本式-CSDN博客

递归基础-汉诺塔(仅用于复习和交流)

观察上图发现&#xff0c;从N2开始图形都按一定的规律步骤进行位置移动&#xff0c;这个观点是否认同&#xff1f; 那再看N2时&#xff0c;为了方便大家理解&#xff0c;将两个板定义为板1&#xff08;小&#xff09;&#xff0c;板2&#xff08;大&#xff09;&#xff0c;最上…

leaftjs+turfjs+idw纯前端实现等值面绘图

最近有个绘制等值面图的需求。我们一般的实现路径是&#xff1a; 1.后台绘图&#xff0c;用surfer绘制好&#xff0c;给前端调用叠加到地图。 2.后台用python绘图&#xff0c;绘制好给前端调用&#xff0c;叠加到地图。 3.后台进行插值计算、地图裁剪、最终生成geojson文件或…

【Webgl_glslThreejs】搬运分享shader_飘落心形

来源网站 https://www.shadertoy.com/view/4sccWr效果预览 代码演示 将shadertory上的代码转成了threejs可以直接用的代码&#xff0c;引入文件的material&#xff0c;并在创建mesh或已有物体上使用material即可&#xff0c;使用时请注意uv对齐。 import { DoubleSide, Shad…

Facebook的魅力魔法:探访数字社交的奇妙世界

1. 社交媒体的演变与Facebook的角色 在数字化时代&#xff0c;社交媒体已经成为我们日常生活中不可或缺的一部分。而在众多的社交媒体平台中&#xff0c;Facebook 以其深厚的历史和广泛的影响力&#xff0c;成为了全球数亿用户沟通、分享和互动的主要场所。从其初创之时起&…

微软发布!提示工程进化为位置工程,有效提升RAG与上下文学习

别再光顾着优化提示工程啦&#xff01;微软最近推出位置工程研究思路&#xff0c;只需调整token的索引位置&#xff0c;而不修改文本本身&#xff0c;就能显著提高任务性能。 提示工程通过添加、替换或删除段落和句子改变提示&#xff0c;调整语义信息&#xff0c;激发LLMs的推…

javaWeb项目-校园志愿者管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、SpringBoot框架 …

docker容器搭建chatglm2-6b

服务器环境&#xff1a; 显卡驱动&#xff1a;Driver Version: 530.30.02 CUDA版本&#xff1a;CUDA Version: 12.1 显卡&#xff1a;NVIDIA GeForce RTX 3090共4张 注意&#xff1a;最好把显卡驱动升级到530&#xff0c;CUDA版本之前使用11.7有问题。 docker-compose.yml…

运动学与动力学基础知识导读

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言一、运动学基础--坐标转换&#xff08;1&#xff09;Eigen的使用及常用的位姿变换实现&#xff08;2&#xff09;小车底盘运动…

“生成元”问题——穷举生成“查找表”

【题目描述】 如果x加上x的各个数字之和得到y&#xff0c;就说x是y的生成元。给出n&#xff08;1≤n≤100000&#xff09;&#xff0c;求最小生成元。无解输出0。例如&#xff0c;n216&#xff0c;121&#xff0c;2005时的解分别为198&#xff0c;0&#xff0c;1979。 【题目…

【运维基础一】 Linux Centos 常用命令

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于Red Hat Enterprise Linux源代码构建的开源企业级Linux发行版。在CentOS系统中&#xff0c;有很多常用的命令可以帮助用户进行系统管理、文件操作、网络配置等任务。以下是一些CentOS中常用的命…

Java程序员必须掌握的数据结构:HashMap

HashMap底层原理实现是每个Java Boy必须掌握的基本技能&#xff0c;HashMap也是业务开发每天都需要遇到的好伙伴。如此基础且核心的底层数据结构&#xff0c;JDK也给其赋予了线程安全的功能类&#xff0c;我们来看看~ 文章目录 1. HashMap内部结构1.1 键值的添加流程1.2 红黑树…

蚂蚁 2025届暑期实习 多模态LLM 面经

文章目录 写在前面一面/技术面 2024/4/7 晚上19:00-20:00二面/技术面 2024/4/23 早上11:15-12:15三面/HR面 2024/4/25 11:00-11:50 写在前面 学校情况&#xff1a;211本中9硕&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况…

垃圾分类子项目-识别垃圾类型

思路: 阿里云图像识别 语音模块实现 主程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // access() #include <error.h> // remove() #include "uartTool.h" #include "garbage.h&qu…