江协科技51单片机学习- p16 矩阵键盘

🚀write in front🚀  
🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 

💬本系列哔哩哔哩江科大51单片机的视频为主以及自己的总结梳理📚 

前言:

本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记,在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。

引用:

51单片机入门教程-2020版 程序全程纯手打 从零开始入门_哔哩哔哩_bilibili

​​​​​​c51语言变量语句意思,C51中循环语句-CSDN博客

矩阵键盘引用:

【51单片机】矩阵键盘_51单片机4×4矩阵键盘-CSDN博客

51单片机学习笔记 ——(二)矩阵键盘_51单片机 矩阵键盘-CSDN博客

郭天祥:

(51单片机)第三章-数码管显示原理及应用实现-中断_51单片机数码管中断程序-CSDN博客

正文:

0. 🌿概述

在淘宝上购买了江协科技51单片机开发板套件(普中科技STC51单片机A2型号),就上在上一篇博文里说的自己计划学习下江协科技51单片机开发教程,通过STC51单片机这种MCU这种贴近于裸机的开发来增加对于系统硬件层面知识的了解和掌握。

1. 🚀矩阵键盘

  • 在键盘中当按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵的形式。
  • 采用逐行或逐列的“扫描”,就可以独处任何位置按键的状态。

矩阵键盘的目的是减少I/O口占用 

矩阵键盘采用的是矩阵的连接方式,目的是为了减少IO口的使用。

如果每一个按键都像独立按键一样专门使用一个IO口来控制,那么我们需要的IO口数量就是行×列个。

但是如果采用矩阵的连接方式,我们需要的IO口数目就会变成行+列个,矩阵的行列数越多,减小的程度就越明显。

但是按照矩阵形式排列也会出现一些不方便的结果,所以我们采用了类似之前数码管的解决方式——扫描。

但是与数码管的扫描略有不同,数码管是输出元件,所以数码管的扫描是输出扫描,我们不断循环输出不同的值,利用人眼的视觉暂留实现我们需要的操作。

而矩阵键盘是输入元件,所以我们矩阵键盘采用的扫描是输入扫描,以非常快的速度不断循环读取IO口的值,达到与正常按键相同的效果。这里还是利用了扫描速度远大于人操作的速度的原理。

那么如何实现上述操作呢?

与之前的独立按键进行比较,如果我们单独看矩阵键盘的一行或者一列,就会发现它们有着相同的结构,在此用列来进行比较(用行同理)

2. 🚀 单片机IO口(准双向口)

单片机的io口是一种弱上拉的模式~!又被称作是准双向口(input,output) 既可以输入又可以输出,这种就叫做是双向口。

  • 但是这种双向口有点问题:这么样才可以达到输入或者是输出呢 ?像我们这种矩阵键盘的话是不是给上,一端是0,然后读取另一头。
  • 但是另一头你怎么知道它是一种输入低电平)呢?它其实也是作为一种输出端(高电平),它既是输出(高电平)也是输入(低电平)。
  • 那么为什么单片机它的 io 口是默认为高电平呢?是因为它里面拥有一个上拉电阻把低电平变成高电平了 !所以才导致单片机是高电平,
  • 还有一个是当口输出为1的时候驱动能力很弱,允许外部装置将其拉低。当引脚的输出为低电平的时候,它的驱动能力很强,可以吸收相当大的电流。单片机中 P1、P2、P3 都是一种弱上拉的一种模式。

准双向口输出如下所示:

 单片机的io口是一种弱上拉的模式~!又被称作是准双向口(input,output) 既可以输入又可以输出,这种就叫做是双向口。此种双向口是弱上拉,强下拉,当将IO的输出当为1的时候驱动能力很弱,允许外部装置将其拉。当引脚的输出为低电平的时候,它的驱动能力很强,可以吸收相当大的电流。

单片机中 P1、P2、P3 都是一种弱上拉的一种模式。

单片机中 P0 口是开漏输出模式。

一般按键检测都是接地,检测第电平。为什么不接Vcc,检测高电平哪,因为I/O口配置为低电平要将其拉高为高电平需要比较大的电流。 

准双向口是一种弱上拉模式,可以用如下的示意图来解释:当IO口开关选择输出1 高电平时,通过电阻接Vcc进行弱上拉其上拉输出能力比较弱,此时I/O接口如果接地可以将其拉低为低电平。

 3. 🚀矩阵键盘扫描

 首先我们需要知道51单片机的引脚默认为高电平,所以我们需要对这8个引脚进行一个初始化,即P1 = 0xFF ;这样就和独立按键的操作基本一致了。

  • 可以发现,如果我们此时只给P13低电平,第一列就和独立按键一样了。
  • 接下来需要做的就是判断在P13为低电平时,P14、P15、P16、P17是否为低电平。如果是,则说明此时有按键按下,接通了电路,使原来是高电平的引脚变为了低电平。
  • 第一列扫描完后,重新初始化P1 = 0xFF ;然后给P12低电平,继续检测P14、P15、P16、P17是否为低电平。
  •  以此类推,不断循环读取按键是否按下,就达到了随时按下任意按键都可以检测出来的效果

 本实验使用的普中科技C51单片机开发板矩阵键盘扫描时需要注意的点,因为开发板的引脚复用冲突,本实验使用按列扫描的方式。

我们这个开发板 P1_5 口可能会有问题,P1_5口可能一会读到高电平一会读到第 电平,因为在此开发板是行 P1_5 连接到了 Beep ,会造成蜂鸣器鸣叫。

为了避免这个问题,此实验中使用逐列扫描的方式。

 4. 🚀源码编写

本次实验使用逐列扫描矩阵键盘的方式,来检测有哪个按键被按下。

matrix.h

#ifndef __MATRIX_H__
#define __MATRIX_H__unsigned char MatrixKey();#endif

matrix.c

#include <REGX52.H>
#include "Delay.h"
#include "matrix.h"/*** @brief  获取按下按键的键值* @param  无* @retval 按下按键的键值,没有按键按下时返回0*		    S1=1, S1=2, S3=3, S4=4, S5=5, S6=6, S7=7, S8=8*		    S9=9, S10=0, S3=3, S11=确认, S12=取消, S13=删除, S14=,*/
unsigned char MatrixKey()
{unsigned char keyNumber = 0;//每次扫描键盘之前,先把P1全部初始化为高电平P1=0xFF;P1_3 = 0;//delay(20)延时进行按键按下消抖, while循环检测松手, delay(20) 按键松开消抖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 <INTRINS.H>
#include "delay.h"
#include "lcd1602.h"
#include "matrix.h"void main()
{unsigned char keyNum = 0;LCD_Init();//LCD_ShowString(1, 1, "Matrix Key!");while(1){keyNum = MatrixKey();if(keyNum){LCD_ShowNum(1, 1, keyNum, 2);}}
}

5. 🚒总结

  • 🍒通过本实验了解了STC51单片机的I/O口准双向口,I/O口的为弱上拉,单片机的I/O口即是输出同时也是输入。因为单片机I/O口是弱上拉,当I/O口输出为1时允许通过外部输入将其下拉为低电平。
  • 🍒STC51单片机的 P1, P2, P3 口为准双向I/O口,弱上拉模式。
  • 🍒STC51单片机的 P0 口默认为开漏输出模式。
  • 🍒当按键较多时,使用矩阵键盘可以节省I/O口资源。
  • 🍒矩阵键盘的检测方式是按照行逐行扫描,或者按照列逐列扫描。
  • 🍒每次扫描之前需要先将所有的矩阵键盘行和列的I/O口置为1,然后给某一行或列低电平,然后按照行或列扫描,检测另一端的输入电平。

 6. 🍎结束

本文至此结束

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

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

相关文章

LeetCode 算法:验证二叉搜索树 c++

原题链接&#x1f517;&#xff1a;验证二叉搜索树 难度&#xff1a;中等⭐️⭐️ 题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于…

J1939与CAN标准报文的区别

J1939报文:J1939是在CAN2.0B(扩展CAN)的基础上,对仲裁场部分的29位ID的重新解释,其它部分完全一样。 29位ID分为:3位的优先级、8位的PF(帧格式)、8位的PS(帧扩展)、8位的SA(源地址)、1位的DP(Data Page数据页)、1位的保留位。 其中1位的DP、8位的PF、8位的PS组成…

数字化世界的守卫之防火墙

在这个数字化的时代&#xff0c;我们的电脑和手机就像是一座座繁华的城市&#xff0c;而病毒和黑客则是那些潜伏在暗处的敌人。但别担心&#xff0c;我们有一群忠诚的守卫——“防火墙”&#xff0c;它们日夜守护着我们的数字家园。 1. 病毒&#xff1a;数字世界的“瘟疫” 想象…

搞定求职难题:工作岗位列表+简历制作工具 | 开源专题 No.75

SimplifyJobs/New-Grad-Positions Stars: 8.5k License: NOASSERTION 这个项目是一个用于分享和跟踪美国、加拿大或远程职位的软件工作机会列表。该项目的核心优势和关键特点如下&#xff1a; 自动更新新岗位信息便捷地提交问题进行贡献提供一键申请选项 BartoszJarocki/cv…

MemManage_Handler 问题的解决思路

1、问题 在做一个安全类项目时发现&#xff0c;软件在运行一段时间后会进入"MemManage_Handler",遂开始了一系列查找。 2、解决 &#xff08;1&#xff09;查看堆栈数据 查堆栈的数据&#xff0c;发现堆栈也被破坏了&#xff0c;看不出来是执行哪个任务执行导致的…

Linux下vi文件的时候替换指定的内容

需要将nginx.conf中的192.168.222.188&#xff0c;替换为178.21.120.225 操作步骤&#xff1a; 1、vi 文件 vi nginx.conf2、输入 :%s/192.168.222.188/178.21.120.225/g3、最后保存 :wq

火车头采集器Discuz采集发布模块插件

火车头采集器怎么采集发布数据到Discuz系统的论坛帖子或门户文章&#xff1f; 可按照以下步骤配置&#xff1a; 1. 火车头采集器Discuz采集发布插件下载安装&#xff1a; 火车头采集器Discuz发布模块插件下载地址-CSDN 2. 在火车头采集器工具导入Discuz采集发布模块插件&am…

sheng的学习笔记-hadoop,MapReduce,yarn,hdfs框架原理

目录 搭建hadoop 下载hadoop JAVA 下载bin windows 改环境变量 将winutils.exe和hadoop.dll放到C:\Windows\System32下&#xff0c;然后重启 修改配置 vim core-site.xml vim hdfs-site.xml hadoop-env.sh mapred-site.xml yarn-site.xml 格式化命令 启动集群 …

排序算法(2)之选择排序----直接选择排序和堆排序

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序算法(2)之交换排序----冒泡排序和堆排序 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论…

51Sim核心参编!《中国智能网联汽车自动驾驶仿真测试白皮书》发布(附资源)

近日&#xff0c;《中国智能网联汽车自动驾驶仿真测试白皮书&#xff08;2023版&#xff09;》&#xff08;以下简称白皮书&#xff09;正式发布。 该白皮书由国汽&#xff08;北京&#xff09;智能网联汽车研究院有限公司、吉林大学、51Sim、中国第一汽车集团有限公司研发总院…

初阶 《操作符详解》11. 下标引用、函数调用和结构成员

11. 下标引用、函数调用和结构成员 1. [ ] 下标引用操作符 操作数&#xff1a;一个数组名 一个索引值 int arr[10];//创建数组 arr[9] 10;//实用下标引用操作符&#xff0c;[ ]的两个操作数是arr和9arr[7]-->*(arr7)-->*(7arr)-->7[arr] 7[arr] 9; //编译器不会…

postman忘记密码发邮件,久久收不到怎么办?

根本原因是需要FQ&#xff01;&#xff01;&#xff01; 重置密码的链接&#xff1a; https://identity.getpostman.com/trouble-signing-in 找个平台或者软件&#xff0c;访问这个链接即可完成修改密码后续操作&#xff0c;不用再傻傻等着验证码了。 有需要协助的朋友也可私信…

【Nginx】静态资源访问配置

nginx 静态资源访问配置 Nginx 静态资源访问配置 通过该片文章&#xff0c;你能了解图中的内容&#xff1a; 实际问题 Nginx 应该怎么写&#xff0c;才能匹配这个图片资源路径&#xff1f; http://47.120.10.110:7001/public/images/picture.jpg解决方案 你需要配置一个 N…

植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天要跟大家聊聊一款游戏&#xff0c;它不是那种让人眼花缭乱的大制作&#xff0c;也不是那种能让人回味无穷的艺术作品&#xff0c;但它在阿星心里&#xff0c;绝对是神作中的佼佼者。没错&#xff0c;它就是《植物大战…

经验分享,免费商标查询网站

有时候想快速查询商标状况&#xff0c;官方网站比较慢&#xff0c;这里分享一个免费快速的网站。 网址&#xff1a;https://www.sscha.com/ 截图&#xff1a;

深度之眼(二十六)——神经网络基础知识(一)

文章目录 一、前言二、神经网络与多层感知机2.1 人工神经元2.2 人工神经网络2.3 多层感知机2.4 激活函数 一、前言 看了下课程安排&#xff0c;自己还是没安排好&#xff0c;刚刚捋清了一下思路。 基础&#xff1a;python、数理 认识&#xff1a;神经网络基础、opencv基础、py…

sys.stdout.write()方法——标准输出打印

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 Sys.Stdout是sys模块中的标准输出对象&#xff0c;可以实现将数据向屏幕、文件等进行输出。Sys.Stdout通过write 方法实现数据的标准输出。…

RK3588 Android13 TvSetting 中性能浮窗RAM显示bug

前言 电视产品,客户发现在设备偏好设置->高级设置->性能浮窗菜单里显示的 RAM 大小是错误的, 要求改成正确的,并且屏幕密度修改后,这个浮窗显示不全,也需要一起处理。 效果图 TvSetting 部分修改文件清单 bug 原因在于 Formatter.formatFileSize 这个 API,我们…

华为---VRRP基本配置(一)

10、VRRP 10.1 VRRP基本配置 10.1.1 原理概述 随着Internet的发展&#xff0c;人们对网络可靠性的要求越来越高。对于用户来说&#xff0c;能够时刻与外部网络保持通信非常重要&#xff0c;但内部网络中的所有主机通常只能设置一个网关IP地址&#xff0c;通过该出口网关实现…

CVE-2020-26048(文件上传+SQL注入)

简介 CuppaCMS是一套内容管理系统&#xff08;CMS&#xff09;。 CuppaCMS 2019-11-12之前版本存在安全漏洞&#xff0c;攻击者可利用该漏洞在图像扩展内上传恶意文件&#xff0c;通过使用文件管理器提供的重命名函数的自定义请求&#xff0c;可以将图像扩展修改为PHP&#xf…