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

(6)普中A2 51单片机矩阵键盘和密码锁 - 详解

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

在这里插入图片描述
例如现在16个,每个按钮都接入一个单独的IO口,就需要16个IO口,如果通过行列扫描,只需要4+4个,看似差距不大,但是将数量扩大一点,例如100x100个,每个都需要一个单独的IO口,就需要10000个,而采用行列扫描,只需要100+100,我们日常使用的显示器也是使用行列扫描的,这样就可以大大的减少IO口的数量。

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

然后下面是工程文件,总共五个。mk.h,mk.c,LCD1602.c,LCD1602.h,main.c。

  1. mk.c
#include <REGX52.H>#include <intrins.h>void Delay(unsigned char x)	//@11.0592MHz{while(x--){unsigned char data i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}}unsigned char mk(){unsigned char Kn=0;P1=0xFF;P1_3=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Kn=1;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Kn=5;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Kn=9;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Kn=13;}P1=0xFF;P1_2=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Kn=2;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Kn=6;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Kn=10;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Kn=14;}P1=0xFF;P1_1=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Kn=3;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Kn=7;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Kn=11;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Kn=15;}P1=0xFF;P1_0=0;if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);Kn=4;}if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);Kn=8;}if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);Kn=12;}if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);Kn=16;}return Kn;}
  1. mk.h
#ifndef __MK_H__
#define __MK_H__
unsigned char mk();
#endif
  1. main.c
#include <REGX52.H>#include <LCD1602.h>#include <intrins.h>#include "mk.h"unsigned char kn;int count=0;unsigned long ps=0;int temp1=0;int temp2=0;int main(){LCD_Init();LCD_ShowString(1,1,"hello");while(1){kn=mk();if(kn){if(kn<=10){if(count<6){ps=ps*10+(kn%10);}count++;temp1=ps%1000;temp2=ps/1000;LCD_ShowNum(2,4,temp1,3);LCD_ShowNum(2,1,temp2,3);}if(kn==11){if(ps==123456){LCD_ShowString(2,10,"YES");}else{LCD_ShowString(2,10,"ERR");}count=0;ps=0;LCD_ShowNum(2,1,0,6);}if(kn==12){count=0;ps=0;LCD_ShowNum(2,1,0,6);}}}}

LCD1602的.c文件和.h文件可以查看我前面写的LCD1602调试的文章。
mk的c文件和h文件写的是矩阵键盘扫描的逻辑,先选中一列,然后判断每一行,看是否被选中,然后对每一列都进行这样的判断,就可以扫描全部16个按键,同时也要用到我们前面学的独立按键消抖的知识,加入一定的延时。
先说一下主函数的功能,矩阵按键1-9对应数字1-9,按键10对应0,然后按键11是确认,按键12是取消重新输入,其他按键没有功能。
主函数通过ps存储密码,每次输入一个数字,就对原本的ps乘10,再加上这个数,就做到了移位的效果。同时设定一个count进行计数,密码设定为6位,到6位在确认和取消之前,再进行输入将不起作用。每次当我们确认或者取消的时候,需要将密码给重置,也就是将ps设置为0,count计数器也设置为0.然后当我们按下确认之后,就需要判断密码和设定的密码是否相同,根据结果在屏幕上显示YES或者ERR。
原本的教程是4位密码,我进行了一点改进,使用了long类型,可以存储更长的数据,然后那个LCD1602显示数字的函数,是使用的int型,传入的long类型数据会被自动类型转换为int型,也就会导致数据丢失,所以我选择使用temp1和temp2存储ps的前3位和后3位,然后进行显示。就没有问题了。

矩阵键盘密码锁

http://www.zskr.cn/news/71196.html

相关文章:

  • 12月最新推荐!宠物饮水机方案商权威排行榜:聚焦智能健康养宠,IoT平台与专业品牌深度解析
  • 2025年上海注册公司费用及收费标准TOP5推荐:注册公司流
  • 2025年五大乳化泵服务厂商推荐排行榜,实力乳化泵供应商选择
  • 2025年度中国3PE防腐无缝钢管公司排名:诚信的酸洗钝化无
  • Experimental results of RSDK method
  • P2184 贪婪大陆
  • PbootCMS 网站常见报错及解决方法汇总
  • 手机射频阻抗匹配调试方法 - 详解
  • 2025年长三角十大方矩管加工厂推荐,矩形方矩管与20#方矩
  • 无味羽绒被推荐哪家?这几款从源头告别异味,敏感肌放心囤
  • 2025年断桥铝门窗五大品牌推荐,断桥铝门窗知名品牌全解析
  • 神经网络之正交矩阵 - 教程
  • lock_guard 与 unique_lock:一对“保安”与“管家”的互斥锁双人舞
  • 寒冬保暖羽绒被怎么选?这 5 个专业品牌带你解锁温暖睡眠新体验
  • 备婚 _ 结婚 _ 陪嫁 _ 乔迁必看!重要时刻5 大高性价比羽绒被品牌推荐
  • 基于势场法的多智能体机器人编队控制
  • 2025年12月真空袋厂家选择指南:权威维度横向评测解析
  • pbootcms内页子栏目当前栏目如何实现高亮显示(PbootCMS 内页子栏目当前栏目高亮显示的实现方法)
  • 2026年X射线防护服源头厂家推荐:射线防护服/铅衣防护服/医用 x 射线防护服公司品牌推荐
  • ANSYS 2025 R1 仿真算力升级 电子研发提速!ANSYS 2025 R1 下载安装教程 新版本核心优势速递
  • 2025年靠谱的电动缸源头工厂五大推荐,电动缸工厂选哪家全解
  • 2025年销量领先认证机构推荐:哪家更值得信赖?多维评估与案例比对
  • 2025靠谱的冷水机厂家TOP5权威推荐:化工冷水机核心选型
  • 2025年银川专业祛痣机构排名推荐,易己弘美容详细介绍、研发
  • LINQ查询表达式基础
  • 2025 年羽绒蓬松度天花板!这 5 家羽绒供应商凭什么征服高端市场?
  • 2025除尘羽绒工厂怎么选?这 5 家实力派企业值得关注
  • MATLAB归一化随机共振代码
  • 全球雇佣好帮手!国际 EOR 服务商推荐Safeguard Global,企业跨境雇佣不踩坑
  • 2025年上海代办注册公司排行榜:注册公司代办要花多少钱?