当前位置: 首页 > news >正文

江协科技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. 🍎结束

本文至此结束

相关文章:

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

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…...

grpc学习golang版( 四、多服务示例)

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 文章目录 一、前言二、定义proto文件三、编写server服务端四、编写Client客户端五、测试六、示例代码 一、前言 多服务&#xff0c;即一个rpc提供多个服务给外界调用…...

Linux安装jdk17

我们进入到cd /usr/lib/下然后创建一个jdk17的文件夹 mkdir jdk17 进入到jdk17目录下 下载jdk17包 上传到Linux 解压jar包 tar -zxvf jdk-17_linux-x64_bin.tar.gz压解完毕后 配置环境变量 vim/etc/profilei 修改 esc 退出 :wq保存 export JAVA_HOME/usr/lib/jdk17/jdk-1…...

Java家教系统小程序APP公众号h5源码

让学习更高效&#xff0c;更便捷 &#x1f31f; 引言&#xff1a;家教新选择&#xff0c;小程序来助力 在快节奏的现代生活中&#xff0c;家长们越来越注重孩子的教育问题。然而&#xff0c;如何为孩子找到一位合适的家教老师&#xff0c;成为了许多家长头疼的问题。现在&…...

PHP入门

一、环境搭建 无脑&#xff1a; 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01;phpStudy官网2019正式推出phpStudy V8.0版本PHP集成环境&#xff0c;支持Windows与Linux系统&#xff0c;支持WEB面板操作管理&#xff0c;一键网站开发环境搭建配置&#xff0c;…...

docker ce的使用介绍

docker docker17.03以后 docker ce&#xff0c;社区免费版&#xff0c;vscode的docker插件使用的该版本&#xff08;默认windows只支持windows容器&#xff0c;linux支持linux容器&#xff09;docker ee&#xff0c;企业版本 docker17.03以前 docker toolbox&#xff0c;基于…...

SpringCloud Alibaba Sentinel 流量控制之流控模式实践总结

官网文档&#xff1a;https://sentinelguard.io/zh-cn/docs/flow-control.html wiki地址&#xff1a;https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6 本文版本&#xff1a;spring-cloud-starter-alibaba&#xff1a;2.2.0.RELEASE 如下图所…...

【高考志愿】电子科学与技术

高考志愿选择电子科学与技术专业&#xff0c;无疑是向着科技创新的前沿迈出坚定步伐的明智之选。这一专业以其深厚的理论基础、前沿的技术应用和广泛的就业前景&#xff0c;吸引了众多有志于投身科技领域的学子。 首先&#xff0c;电子科学与技术专业所涵盖的内容丰富而深入。它…...

2024.06.26【读书笔记】|医疗科技创新流程(前言)【AI增强版】

目录 《BIODESIGN》第二版前言详细总结前言概述新增重要内容价值导向 (Value Orientation)全球视角 (Global Perspectives)更好的教学和学习方法 (Better Ways to Teach and Learn)全新视频集合 (New Videos)扩展的“实地”案例研究 (Expanded “From the Field” Case Studies…...

kubernetes Job yaml文件解析

一、yaml文件示例 apiVersion: batch/v1 kind: Job metadata:name: test-jobnamespace: mtactor spec:completions: 3parallelism: 1backoffLimit: 5activeDeadlineSeconds: 100template:spec:containers:- name: test-jobimage: centoscommand: ["echo","test…...

php goto解密脚本源码

php goto解密脚本源码 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89426171 更多资源下载&#xff1a;关注我。...

2023: 芒种集•序言

2023: 芒种集•序言 2023: 芒种集•序言 从西南旅游回来&#xff0c;一直忙着整理游记“2024&#xff1a;追寻红色足迹”&#xff0c;之后又应初建平索要刘桂蓉遗作“我们一起走过”&#xff0c;于是把“别了&#xff0c;老屋”和诗作“二月”一并合编&#xff0c;把我写的悼念…...

Camera定制修改

需求&#xff1a; Android13 MtkCamera右上角的前后摄切换点击范围小导致经常点击无反应&#xff0c;需增大view宽度 跟踪代码可找到对应资源文件&#xff1a;vendor\mediatek\proprietary\packages\apps\Camera2\feature\setting\cameraswitcher\res\ 根据vendor\mediatek\…...

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

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

SpringBoot优点达项目实战:获取系统配置接口(三)

SpringBoot优点达项目实战&#xff1a;获取系统配置接口&#xff08;二&#xff09; 文章目录 SpringBoot优点达项目实战&#xff1a;获取系统配置接口&#xff08;二&#xff09;1、查看接口2、查看数据库3、代码实现1、创建实体类SysConfig2、创建返回数据的vo3、创建control…...

【C语言】字符/字符串+内存函数

目录 Ⅰ、字符函数和字符串函数 1 .strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 11.字符函数 12. 字符转换函数 Ⅱ、内存函数 1 .memcpy 2.memmove 3.memcmp Ⅰ、字符函数和字符串函数 1 .strlen 函数原型&#xff1a;…...

上下文管理器在Python中的妙用

更多Python学习内容&#xff1a;ipengtao.com Python上下文管理器是一个非常强大的工具&#xff0c;它能够帮助开发者在特定代码块前后自动执行特定的操作&#xff0c;常用于资源管理&#xff0c;如文件操作、数据库连接和锁定等。本文将详细介绍Python上下文管理器的概念、使用…...

【PWN · TcachebinAttack | UAF】[2024CISCN · 华中赛区] note

一道简单的tcache劫持 一、题目 二、思路 存在UAF&#xff0c;libc版本2.31&#xff0c;经典菜单题 1.通过unsorted-bin-attack来leak-libc 2.通过uaf打tcache-bin-attack劫持__free_hook实现getshell 三、EXP from pwn import * context(archamd64,log_leveldebug)ioproce…...

Java数据脱敏

数据脱敏 敏感数据在存储过程中为是否为明文, 分为两种 落地脱敏: 存储的都是明文, 返回之前做脱敏处理不落地脱敏: 存储前就脱敏, 使用时解密, 即用户数据进入系统, 脱敏存储到数据库中, 查询时反向解密 落地脱敏 这里指的是数据库中存储的是明文数据, 返回给前端的时候脱…...

【Java Web】三大域对象

目录 一、域对象概述 二、三大域对象 三、域对象使用相关API 一、域对象概述 一些可用于存储数据和传递数据的对象被称为域对象&#xff0c;根据传递数据范围的不同&#xff0c;我们称之为不同的域&#xff0c;不同的域对象代表不同的域&#xff0c;共享数据的范围也不同。 二、…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...