矩阵键盘介绍

在矩阵键盘按键较多时为了减少IO口的运用,通过按键排列成矩阵的方式,采用逐行或者是逐列扫描,就可以读出按键的状态。

扫描的概念

数码管扫描(输出扫描)

原理:显示第一位>显示第二位>   ,然后循环这个过程,最终实现所有数码管同时点亮的效果。

矩阵按键扫描(输入扫描)

原理:扫描第一行>扫描第二行>>>>>扫描第一列>>扫描第二列>>得出按键位置

矩阵键盘模块通过八个IO口来控制矩阵键盘的输入,其中有四个IO口是用来控制按键的行的,另外四个控制按键的列,因此我们要实现按键的扫描就要选择先扫描列还是先扫描行;如果先扫描行的话先把行的四个IO口置为1;然后用Switch函数来检测是哪一行的按键被按下,知道哪一行按键被按下以后继续用扫描判断哪一列的按键被按下;

以下代码运用了矩阵按键和数码管两个模块;其中数码管实现了显示按键数值的功能

这里运用的全是if语句判断所以显得比较繁琐同时也占用了一定的CPU;

#include <REGX52.H>
#include <Delay.H>unsigned char a,KeyNumber;
unsigned char Table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//定义一个数组用来存放1-9用来显示按键数值
void Nixie(unsigned char Location,KeyNumber)//定义两个变量分别用来负责数码管的位选和段选{switch(Location)//用74HC595来减少IO口的输出,八种case分别代表数码管的八个位置{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=Table[KeyNumber];//将按键数值赋给P0Delay(1);//数码管消隐P0=0x00;}
void KeyScan()//按键扫描
{P1=0xff;//将P1口全部置1P1_3=0;//如果第一列按键被按下则继续扫描if(P1_7==0){Delay(20);while(P1_7==0);KeyNumber=1;}//如果第一行按键被按下if(P1_6==0){Delay(20);while(P1_6==0);KeyNumber=5;}//如果第二行按键被按下if(P1_5==0){Delay(20);while(P1_5==0);KeyNumber=9;}//如果第三行按键被按下if(P1_4==0){Delay(20);while(P1_4==0);KeyNumber=13;}//如果第四行按键被按下P1=0xff;//将P1口全部置一P1_2=0;//如果第二列按键按下则继续扫描if(P1_7==0){Delay(20);while(P1_7==0);KeyNumber=2;}//如果第一行按键被按下if(P1_6==0){Delay(20);while(P1_6==0);KeyNumber=6;}//如果第二行按键被按下if(P1_5==0){Delay(20);while(P1_5==0);KeyNumber=10;}//如果第三行按键被按下if(P1_4==0){Delay(20);while(P1_4==0);KeyNumber=14;} //如果第四行按键被按下P1=0xff;//将P1口全部置一P1_1=0;//如果第三列按键被按下则继续扫描if(P1_7==0){Delay(20);while(P1_7==0);KeyNumber=3;}//如果第一行按键被按下if(P1_6==0){Delay(20);while(P1_6==0);KeyNumber=7;}//如果第二行按键被按下if(P1_5==0){Delay(20);while(P1_5==0);KeyNumber=11;}//如果第三行按键被按下if(P1_4==0){Delay(20);while(P1_4==0);KeyNumber=15;}  //如果第四行按键被按下P1=0xff;//将P1口全部置一P1_0=0;//如果第四列按键被按下则继续扫描if(P1_7==0){Delay(20);while(P1_7==0);KeyNumber=4;}//如果第一行按键被按下if(P1_6==0){Delay(20);while(P1_6==0);KeyNumber=8;}//如果第二行按键被按下if(P1_5==0){Delay(20);while(P1_5==0);KeyNumber=12;}//如果第三行按键被按下if(P1_4==0){Delay(20);while(P1_4==0);KeyNumber=16;}  //如果第四行按键被按下}
/*
数码管显示按键数值原理:1先通过74HC595来减少IO口的输出;
2运用Nixie函数将数码管的位选和段选结合释放CPU,提高运算效率
3运用按键扫描的概念分别对按键的IO口进行扫描通过行扫描和列扫描来确定按键位置
4用KeyNumber来存放按键数值
*/
void  main()
{while(1){KeyScan();//按键扫描if(KeyNumber<=9){Nixie(1,0);Nixie(2,KeyNumber);}if(KeyNumber==10){Nixie(1,1);Nixie(2,0);}if(KeyNumber>10){Nixie(1,1);Nixie(2,KeyNumber-10);}}}

运用Switch函数简化代码,提高CPU的运行效率

原理:这段代码运用了两个Switch函数分别来扫描行和列最终实现了数码管显示按键数值的功能;

如果扫描行的话,第一行赋值给0,第二行1,第三行2,第四行3,如果是扫描列的话,第一列赋值1,第二列赋值2,第三列赋值3,第四列赋值4;这样通过按键数值=行数值*4+列数值;实现按键数值的计算。

main函数

#include <REGX52.H>
#include <Delay.H>
unsigned char keylinevalue,keycolvalue;//定义两个变量用来存放行和列
unsigned char keyNumber;//定义一个变量用来显示按键数值
unsigned char Table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//按键0-9的数值
void Nixie(unsigned char Location,keyNumber)//通过该函数实现数码管的段选和位选
{switch(Location)//74HC595配合Switch函数减少IO口使用{case 1:P2_4=1;P2_3=1;P2_2=1;break;case 2:P2_4=1;P2_3=1;P2_2=0;break;case 3:P2_4=1;P2_3=0;P2_2=1;break;case 4:P2_4=1;P2_3=0;P2_2=0;break;case 5:P2_4=0;P2_3=1;P2_2=1;break;case 6:P2_4=0;P2_3=1;P2_2=0;break;case 7:P2_4=0;P2_3=0;P2_2=1;break;case 8:P2_4=0;P2_3=0;P2_2=0;break;}P0=Table[keyNumber];//数码管显示按键数值Delay(1);//数码管消隐P0=0x00;
}void keyscan()//按键扫描函数
{P1=0Xf0;Delay(10);//按键消抖if(P1!=0xf0)//扫描行{switch(P1){case 0x70:keylinevalue=0;break;//第一行case 0xb0:keylinevalue=1;break;//第二行case 0xd0:keylinevalue=2;break;//第三行case 0xe0:keylinevalue=3;break;//第四行}}P1=0X0f;Delay(10);//按键消抖if(P1!=0x0f)//扫描列{switch(P1){case 0x07:keycolvalue=1;break;//第一列case 0x0b:keycolvalue=2;break;//第二列case 0x0d:keycolvalue=3;break;//第三列case 0x0e:keycolvalue=4;break;//第四列}keyNumber=keylinevalue*4+keycolvalue;//计算按键数值}
}
/*
通过两个if函数来判断按键的数值如果小于等于9,数码管第一位显示0第二位显示按键数值
如果按键数值大于9,数码管第一位显示一,然后将按键数值减去10以后显示在第二位
*/
void main()
{while(1){if(keyNumber<=9){keyscan();Nixie(1,0);Nixie(2,keyNumber);}if(keyNumber>9){keyscan();Nixie(1,1);Nixie(2,keyNumber-10);}}}

Delay.c

void Delay(unsigned char xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}}

Delay.H

#ifndef __DELAY_H__
#define __DELAY_H__
void Delay(unsigned char xms);#endif

51单片机矩阵按键模块相关推荐

  1. 自学51单片机 - 矩阵按键实验

    自学51单片机 - 矩阵按键实验 1.开发板原理图 2.程序 2.1 行列式扫描法 2.2 线翻转扫描法 3.结果 1.开发板原理图 2.程序 2.1 行列式扫描法 /**************** ...

  2. 51单片机 | 矩阵按键实验

    文章目录 一.矩阵按键介绍 二.硬件设计 三.软件设计 四.实验现象   开发板上板载了一个 4*4 矩阵键盘.本节所要实现的功能是:通过开发板上的矩阵键盘控制静态数码管显示对应的键值 0-F. 一. ...

  3. 51单片机——矩阵按键逐行扫描短按长按一直按方案1.2

    1.删减了<51单片机--独立按键.矩阵按键多种方案1.1>里的一些不怎么用的代码. 2.添加了逐行扫描按键(需要定时器20毫秒配合使用). 3.支持按键短按.长按.一直按,代码里只做了短 ...

  4. 51单片机矩阵按键详解,两位数码管显示(普中HC6800ESV2.0)

    一.简述 本人是一名在校生,这个学期刚好在学单片机,自己也挺有兴趣,前面在写数码管.时钟啥的程序时都没什么大问题,但是做到矩阵按键时碰到了一些问题,不过已经解决,下面我会把碰到的问题和解决方法都写出来 ...

  5. 51单片机控制LCD1602模块

    51单片机控制LCD1602模块 视频播放:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 ...

  6. 单片机与gsm通信c语言,实现51单片机与GSM模块通信介绍

    51单片机与GSM模块实现通信 1.检测串口线的好坏 1)将串口线插在电脑上,用短路子短接串口的2脚和3脚 2)打开串口调试助手 3)点击自动发送,在自动发送的窗口中随便发个数据,看看能不能接收到若能 ...

  7. 51单片机通过ESP8266模块与手机进行通讯

    51单片机通过ESP8266模块与手机进行通讯 WIFI 工作方式: 1.AP模式 提供热点 2.Station模式 作为设备接入热点 3.同时支持 配置 通过USB转TTL模块把ESP8266模块和 ...

  8. 天问51单片机结合WIFI模块上传温度数据到巴法云平台

    目 录 一.前言 二.项目准备 三.设计思路 四.项目主要代码 五.项目成果 六.项目不足 一.前言: 继前一个项目<天问51单片机结合WIFI模块上传温度数据到TCP服务器>,本次项目是 ...

  9. 51单片机-独立按键控制LED

    1.   51单片机独立按键的位置: 独立按键的定义:独立按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开: 在整个51开发板的左下 ...

  10. 用51单片机实现按键控制LED灯亮灭

    用51单片机实现按键控制LED灯亮灭 #include<reg51.h>//头文件 sbit LED=P2^0;//位定义LED灯 sbit k1=P3^1;//位定义按键 void de ...

最新文章

  1. python最新版下载教程-各种版本的Python下载安装教程
  2. MindMaster Pro中文版
  3. CentOS 7 解决丢失 nginx.pid 1
  4. 判断groupbox中所有的edit是否为空,并给出空的哪个edit为空
  5. Device eth0 does not seem to be present,delaying initialization的解决办法
  6. Java面试详解(2020版):500+ 面试题和核心知识点详解
  7. 魅族黄章坐不住了:下一代旗舰堆料足 主打性价比
  8. android点赞动画仿twritter,【点赞动画仿抖音】Android 自定义view动画--酷炫点赞动画...
  9. jQuery学习笔记--JqGrid相关操作 方法列表(上)
  10. jdbc连oracle dns报错,近期处理的oracle问题汇总
  11. 分层架构中各层之间关系如何界定,期待大家来讨论
  12. 会声会影如何使用覆叠滤镜
  13. 移动营销必备:App自动绑定的五大场景赋能
  14. Dev c++中文乱码,codeblocks运行结果乱码解决办法
  15. ubuntu20.04安装成功SecureCRT 9.0.1,全网首发!!
  16. 详解CheckStyle的检查规则(共138条规则)
  17. SSH The authenticity of host can’t be established Are you sure you want to continue connecting
  18. 三峡西陵庙会:“文”味重 年味浓
  19. 计网实验:单臂路由实现VLAN之间的通信详解(Cisco Packet Tracer)
  20. TSMaster软件使用一-基于14229的UDS-BootLoader多段多文件刷写(支持TSMaster/vector-canoe/Pcan/Kvaser/Zlg/InterpidCS驱动)

热门文章

  1. php 搜索多模型,基于迅搜(xunsearch) + Laravel Scout 实现 Laravel 学院全文搜索功能(支持多模型搜索)...
  2. 使用C语言判断一个数是否为素数
  3. 单片机音频谱曲软件_基于51单片机音乐播放仿真 乐谱制作软件 音乐资料
  4. 草莓派Raspberry3B
  5. 15款国内外知名优秀PHP集成环境推荐、PHP绿色集成环境推荐
  6. java mina 长连接_长连接神器Mina框架的使用
  7. 华为android7.0 root,华为荣耀畅玩6X EMUI5.0 7.0 root教程 荣耀6X获取7.0的root权限
  8. Python xlwt 操作 excel 表格基础(一):单元格写入、合并、插入位图等
  9. 在html css中加粗显示,HTML和CSS实现字体加粗的三种方法
  10. PowerShell,AnkhSVN和Subversion