一.矩阵键盘原理

矩阵键盘是这个东西:

电路原理图

矩阵键盘的判断方式是:逐行逐列扫描。

P10、P11、P12、P13为一组(记为A组),属于“列”;
P14、P15、P16、P17为一组(记为B组),属于“行”。
通过扫描,确定是哪一行哪一列的按键被按下了。
起初,先给全体赋予高电平1(P1=0xFF),然后每次赋予A组的其中一个端口为低电平0,随后再遍历判断B组所有端口的电平情况,如果出现一个端口为低电平0,说明这条线路导通了,那么就可以判断是哪个按键按下了。

说起来有点复杂,还是用程序来说话吧!


二.矩阵键盘扫描(用LCD1602显示)

我们将矩阵键盘每个电键看成一个数字(S1就是1,S2就是2),当我们按下时,我们用LCD1602来显示这个按键的值。这样就能测试我们遍历程序正确与否。
【顺便封装一下MatrixKey呗】

MatrixKey.h:

#ifndef __MatrixKey_H__
#define __MatrixKey_H__int MatrixKey();#endif

MareixKey.c:【遍历的程序在这】

#include<regx52.h>void Delay(int x)
{while(x!=0)  {x--;}
}int MatrixKey()
{int keynumber=0;P1=0xFF;   //initialize:1111 1111P1_3=0;   if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=1;}if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=5;}if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=9;}if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=13;}P1=0xFF;   //initialize:1111 1111P1_2=0;   if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=2;}if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=6;}if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=10;}if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=14;}P1=0xFF;   //initialize:1111 1111P1_1=0;   if(P1_7==0)  {Delay(100); while(P1_7==0); Delay(100); keynumber=3;}if(P1_6==0)  {Delay(100); while(P1_6==0); Delay(100); keynumber=7;}if(P1_5==0)  {Delay(100); while(P1_5==0); Delay(100); keynumber=11;}if(P1_4==0)  {Delay(100); while(P1_4==0); Delay(100); keynumber=15;}P1=0xFF;   //initialize:1111 1111P1_0=0;   if(P1_7==0)  {Delay(10000); while(P1_7==0); Delay(100); keynumber=4;}if(P1_6==0)  {Delay(10000); while(P1_6==0); Delay(100); keynumber=8;}if(P1_5==0)  {Delay(10000); while(P1_5==0); Delay(100); keynumber=12;}if(P1_4==0)  {Delay(10000); while(P1_4==0); Delay(100); keynumber=16;}return keynumber;
}

main:

#include<regx52.h>
#include"LCD1602.h"
#include"MatrixKey.h"int number;void main()
{LCD_Init();while(1){number=MatrixKey();if (number!=0)    {LCD_ShowNum(1,1,number,3);}}
}

显示结果如下(当前按下S8):


三.矩阵键盘小应用——密码锁

学了矩阵键盘的扫描方法,不如来用用看吧~

规定S1~S10分别表示1,2,3,4,5,6,7,8,9,0。
另外,S11为“确认键”,S12为“回退键”(删除上一个输入的数字)。

请看代码:

#include<regx52.h>
#include"LCD1602.h"
#include"MatrixKey.h"int keynumber;
int scanfpassword;
int staticpassword;
int ws;void main()
{LCD_Init();LCD_ShowString(1,1,"Password:");ws=1;//staticpassword=xxx;   先规定正确的密码while(1){keynumber=MatrixKey();if (keynumber!=0){if(ws==16)  break;     //输入的密码超出了LCD1602能显示的范围,清空区域if (keynumber<=10){LCD_ShowNum(2,ws++,keynumber,1);if (keynumber!=10)  scanfpassword=scanfpassword*10+keynumber;      //看作多位整数,计算输入的密码else  scanfpassword=scanfpassword*10;      //输入10,显示0,另作讨论}else if (keynumber==11)   //S11确认,比较两数{if(scanfpassword==staticpassword)   LCD_ShowString(2,1,"Right!");else  LCD_ShowString(2,1,"Wrong!");while(1);}else if (keynumber==12)  //S12回退{if(ws>=1) { LCD_ShowString(2,--ws," ");  scanfpassword=scanfpassword/10; }else  ws=1;       //当回退到头,ws不能再自减了}}}
}

【51单片机】(五)矩阵键盘相关推荐

  1. 【51单片机】矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤

    [51单片机]矩阵键盘逐行扫描法仿真实验+超详细Proteus仿真和Keil操作步骤 一.环境 二.硬件部分 1. Proteus新建工程 2. 添加元件 3.连接线路 4.硬件效果 三.软件部分 1 ...

  2. 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真

    51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真 文章目录 51单片机开发 矩阵键盘中断实验与简易计算器及proteus仿真 实验内容 一.实验一 矩阵键盘中断实验 数码管显示 1.仿 ...

  3. 51单片机4x4矩阵键盘扫描+数码管显示

    51单片机4x4矩阵键盘扫描+数码管显示 个位闪烁感在这篇文章已经修复<51单片机4x4矩阵键盘扫描+数码管显示(二)(修bug篇)> 材料:AT89C52.2位数码管.74HC595. ...

  4. (五)51单片机基础——矩阵键盘

    矩阵键盘介绍: 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的"扫描",就可以读出任何位置按键的状态 扫描: 数码管扫描(输出扫描) 原 ...

  5. 51单片机开发实例 基于51单片机的矩阵键盘+显示

    一.系统设计 通过在矩阵键盘内输入数字并在LCD1602上进行显示,可以输入的数字有16个,分别是0-15.按下矩阵键盘就会上LCD1602上显示对应的数字,整个系统使用STC89C52单片机进行主控 ...

  6. 使用51单片机的矩阵键盘和LCD1602做一个密码锁

    文章目录 前言 一.工具准备 工具一:51单片机 工具二:LCD1602液晶显示屏 工具三:Keil软件 二.开始操作 1.LCD1602的程序调试 2.矩阵键盘的程序调试 3.密码锁程序设计 总结 ...

  7. 单片机学习笔记————51单片机实现矩阵键盘的组合按键触发

    一.使用proteus绘制简单的电路图,用于后续仿真 二.编写程序 /***************************************************************** ...

  8. 51单片机入门——矩阵键盘(附51代码)

    1.硬件介绍 矩阵键盘电路图 硬件如图非常简单,将一个4*4的矩阵键盘的8个管脚引到端子上,在连接到8个I/O口上,ARRAY_H代表着行,ARRAY_L代表着列,当行与列的电平都置低的时候,就选中的 ...

  9. 51单片机之矩阵键盘多按键检测和松手检测

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 文章目录 前言 一.矩阵键盘是什么? 二.多按键检测 1.基本思想 三.松手检测 四.你如何拿去使用? 其他的随便,但是这玩 ...

  10. 利用51单片机,矩阵键盘按键显示0--F在数码管

    代码如下: #include <reg52.h> #define uchar unsigned char #define uint  unsigned int sbit we = P2^7 ...

最新文章

  1. 深度分析蔡徐坤的百万流量数据,揭底哪些是假的!
  2. 大学计算机信息技术一级考题,大学计算机信息技术一级试题新.pdf
  3. 基于HTML5实现3D热图Heatmap应用
  4. linux内核中等待队列
  5. Castle.ActiveRecord的嵌套事务处理
  6. java 中 a = a++ 的分析
  7. 在Java中异步编程,同事非要用rxJava,被我一顿吐槽!
  8. (1)dotnet开源电商系统-brnshopbrnMall 和老外开发的nopCommerce(dotnet两套电商来PK--第一篇)...
  9. 如何解决NLP分类任务的11个关键问题:类别不平衡低耗时计算小样本鲁棒性测试检验长文本分类 JayLou娄杰
  10. HTML单页营销宣传专题页源码
  11. 隐藏方法不能实现多态性
  12. winform mysql 客户端_Winform+Mysql登录
  13. C++, “包含类的头文件”还是“对类进行前置声明”?
  14. CNDS-Markdown之公式编辑(二)
  15. 关闭迅雷极速版自动更新功能
  16. C#Socket编程TCP实例(四)
  17. 【MapGIS必备】常见问题处理(第十四期)
  18. paypal 支付接口 php,PHP整合PayPal支付
  19. Element el-cascader 级联选择器详解
  20. 用U盘与移动硬盘制作WIN7启动盘(亲自实践)

热门文章

  1. bmi055六轴传感器获取数据
  2. VUE项目中使用阿里图标iconfont
  3. 服务器fs改变文件内容,SeaweedFS文件系统
  4. java错误代码1061_求助java大神,看下这是哪里出错了
  5. 2022年低压电工考试题模拟考试题库及模拟考试
  6. Acer E1-471G DMI信息修改案例(硬刷)
  7. 西门子PLC 和v90 伺服变频器G120通讯
  8. 视频教程-Excel项目实战从入门到精通(兼容2007、2010、2013、2016)-Office/WPS
  9. Delta并联机构运动学分析
  10. 【iOS与EV3混合机器人编程系列之一】iOS要干嘛?EV3可以更酷!