51单片机 05 矩阵键盘

devtools/2025/2/7 5:04:38/

嘻嘻,LCD在RC板子上可以勉强装上,会有一点歪。

一、矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式;采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。(IO口默认高电平1)

代码在文件夹中。我改了LCD代码的延时问题。

MatrixKey.c代码

#include <STC89C5xRC.H>
#include "Delay.h"unsigned char MatrixKey()
{// 按列扫描unsigned char KeyNumber=0;P1=0xFF;P13=0x00;if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=1;}if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=5;}if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=9;}if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=13;}P1=0xFF;P12=0x00;if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=2;}if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=6;}if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=10;}if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=14;}P1=0xFF;P11=0x00;if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=3;}if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=7;}if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=11;}if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=15;}P1=0xFF;P10=0x00;if(P17==0) {Delay(20);while(P17==0);Delay(20);KeyNumber=4;}if(P16==0) {Delay(20);while(P16==0);Delay(20);KeyNumber=8;}if(P15==0) {Delay(20);while(P15==0);Delay(20);KeyNumber=12;}if(P14==0) {Delay(20);while(P14==0);Delay(20);KeyNumber=16;}return KeyNumber;
}

main.c代码

#include <STC89C5xRC.H>
#include "Delay.h"
#include "LCD1602.h"unsigned char KeyNum;void main()
{LCD_Init();LCD_ShowString(1,1,"HelloRain");while(1){KeyNum=MatrixKey();if(KeyNum) LCD_ShowNum(2,1,KeyNum,2);}
}

二、矩阵键盘密码锁

main.c

#include <STC89C5xRC.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.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) //s1-s10按下,输入密码 {if(count<4){password*=10; //密码左移password+=KeyNum%10; count++;LCD_ShowNum(2,1,password,4);}}else if(KeyNum==11) {if(password==2345){LCD_ShowString(1,14,"OK ");password=0;count=0;LCD_ShowNum(2,1,password,4);}else {LCD_ShowString(1,14,"ERR");password=0;count=0;LCD_ShowNum(2,1,password,4);}}else if(KeyNum==12){password=0;count=0;LCD_ShowNum(2,1,password,4);}}}
}


http://www.ppmy.cn/devtools/156721.html

相关文章

吴恩达深度学习——卷积神经网络实例分析

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层&#xff1a;输入为一张尺寸是 32 32 1 32321 32321的图像&#xff0c;其中 32 32 3232 3232是图像的长和宽&…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

项目中常用中间件有哪些?分别起什么作用?

在项目开发中&#xff0c;常用的中间件包括消息中间件、缓存中间件、数据库中间件等&#xff0c;以下是一些常见的中间件及其作用&#xff1a; 消息中间件 Kafka&#xff1a;一般用于处理大规模的消息数据&#xff0c;具有高吞吐量、低延迟的特点&#xff0c;适用于日志收集、…

UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理

UE虚幻引擎No Google Play Store Key&#xff1a;No OBB found报错如何处理&#xff1f; 问题描述&#xff1a; UE成功打包APK并安装过后&#xff0c;启动应用时提示&#xff1a; No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …

ubuntu20.04自动升级为ubuntu22.04

在Ubuntu中&#xff0c;你可以通过命令行将系统从Ubuntu 20.04 LTS&#xff08;Focal Fossa&#xff09;升级到Ubuntu 22.04 LTS&#xff08;Jammy Jellyfish&#xff09;。以下是升级步骤&#xff1a; 1. 备份重要数据 在升级之前&#xff0c;建议备份重要数据&#xff0c;以…

AWS门店人流量数据分析项目的设计与实现

这是一个AWS的数据分析项目&#xff0c;关于快消公司门店手机各个门店进店人流量和各个产品柜台前逗留时间&#xff08;利用IoT设备采集&#xff09;和销售数据之间的统计分析&#xff0c;必须用到但不限于Amazon Kensis Data Stream&#xff0c;Spark Streaming&#xff0c;Sp…

如何优化垃圾回收机制?

垃圾回收机制 掌握 GC 算法之前&#xff0c;我们需要先弄清楚 3 个问题。第一&#xff0c;回收发生在哪里&#xff1f;第二&#xff0c;对象在 什么时候可以被回收&#xff1f;第三&#xff0c;如何回收这些对象&#xff1f; 回收发生在哪里&#xff1f; JVM 的内存区域中&…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…