1、实物图

2、原理图

3、基本原理

使用8个I/O口来进行16个按键的控制读取,用4条I/O线作为行线,4条I/O线作为列线组成键盘,当某个按键按下时,进行行列扫描,从而判断是第几行第几列的按键,进而进行整体按键值的确定。

4、优点

使用8个I/O口来进行16个按键的控制读取,可以减小I/O口的使用,有效地提高单片机系统中I/O口的利用率

5、扫描方式——行列扫描

定义一组IO口作为矩阵键盘的引脚,高四位连接列,低四位连接行。先令IO口的高四位(四个列)输出低电平,低四位(四个行)输出高电平,假设有按键按下,从I/O口的低四位读取键盘状态,判断低四位的四行哪一行变成了低电平,就知道是第几行;再令I/O口的高四位(四个列)输出高电平,低四位(四个行)输出低电平,从I/O口的高四位读取键盘状态,判断高四位的四列哪一列变成了低电平,就知道是第几列,将两次读取结果相加组合起来就可以得到当前按键的特征编码,使用上述方法就可以得到16个按键的特征编码,然后再利用特征编码重新给每个按键赋一个对应的键值。

6、程序

/****

*******矩阵键盘扫描函数

*******返回值:键值

*****/

uchar matrix_keyboard_pro(void)  //键盘扫描函数,使用行列反转扫描法

{

uchar cord_h,cord_l;                                                                              //行列值中间变量

MATRIX_KEYBOARD_DATA=0x0f;                //列线输出全为0

cord_h=MATRIX_KEYBOARD_DATA&0x0f;  //读入行线值

if(cord_h!=0x0f)                                                                                 //先检测有无按键按下

{

Delay_function(10);                                          //去抖

if((MATRIX_KEYBOARD_DATA&0x0f)!=0x0f)

{

cord_h=MATRIX_KEYBOARD_DATA&0x0f; //读入行线值

MATRIX_KEYBOARD_DATA=cord_h|0xf0; //输出当前列线值

cord_l=MATRIX_KEYBOARD_DATA&0xf0; //读入列线值

while((MATRIX_KEYBOARD_DATA&0xf0)!=0xf0);   //等待松开并输出

return(cord_h+cord_l);                                 //返回组合码值

}

}

return(0xff);                                  //没有按键按下,返回0xff

}

/****

*******矩阵键盘键值编码为数值函数

*******返回值:键值数值

*****/

uchar Matrix_Keyboard_Scan(void)

{

switch(matrix_keyboard_pro())

{

case (0xee): return 1;       break;                       //K1按下

case (0xde): return 2;      break;                       //K2按下

case (0xbe): return 3;      break;                       //K3按下

case (0x7e): return 'A';    break;                       //K4按下

case (0xed): return 4;      break;                       //K5按下

case (0xdd): return 5;      break;                       //K6按下

case (0xbd): return 6;      break;                       //K7按下

case (0x7d): return 'B';    break;                       //K8按下

case (0xeb): return 7;      break;                       //K9按下

case (0xdb): return 8;      break;                       //K10按下

case (0xbb): return 9;      break;                       //K11按下

case (0x7b): return 'C';    break;                       //K12按下

case (0xe7): return '*';     break;                       //K13按下

case (0xd7): return 0;      break;                       //K14按下

case (0xb7): return '#';    break;                       //K15按下

case (0x77): return 'D';    break;                       //K16按下

default:     return 0xff;  break;                        //没有按键按下

}

}

7、软件流程

定义一组IO口作为矩阵键盘的引脚,高四位连接列,低四位连接行。先令IO口的高四位(四个列)输出低电平,低四位(四个行)输出高电平,判断低四位是否发生改变即是否有按键按下,如果改变,则进行延时消抖,再判断低四位是否发生改变,如果改变,则保存此时行状态值,接下来,令IO口的高四位(四个列)输出高电平,低四位(四个行)输出低电平,保存此时列状态值,等待列状态值恢复,再返回两次读取结果相加组合起来值即当前按键的特征编码,最后再利用特征编码重新给每个按键赋一个对应的键值。

【mcuclub】矩阵键盘相关推荐

  1. 4*4按键扫描程序c语言,【资料】单片机4*4矩阵键盘扫描程序(c语言+汇编语言2个版本)...

    ;4X4矩阵键盘程序.主要原理为扫描键盘矩阵时,每次只有一行电平拉低.在逐次扫描拉低的这些行的同时,去读那些列的电平. ;被拉低的行上,按下的键对应的列的电平为0 ,其它为1. 用左移位的指令,在进位 ...

  2. 单片机入门-矩阵键盘控制数码管显示

    任务简述:通过按下4X4矩阵键盘实现数码管对应显示数字 实现方式:通过行列分接法,可以节省使用单片机的I/O口,扫描矩阵键盘是否有按下,判断P2端口得到的值. protues 硬件系统 单片机晶振复位 ...

  3. 4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘

    介绍 什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和 ...

  4. PIC16F877矩阵键盘的识别

    原文地址:http://blog.sina.com.cn/s/blog_4a3946360100mwqh.html 关于矩阵键盘的识别方法在51矩阵键盘识别中已经说过,现在要说的是PIC单片机与51单 ...

  5. 矩阵键盘程序_独立按键与矩阵按键

    一.独立按键原理 按键在闭合和断开时,触点会存在抖动现象 硬件消抖电路 独立按键控制程 二.独立按键控制程序 #include "reg52.h" typedef unsigned ...

  6. vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...

    按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式.我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果.51单片机的按键输入主要有两种,一种是独立按键 ...

  7. c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作

    1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...

  8. 51单片机独立键盘和矩阵键盘

    独立键盘代码: #include<reg52.h> #include<intrins.h>#define uint unsigned int #define uchar uns ...

  9. c语言键盘控制数码管显示,3*4矩阵键盘控制4位数码管显示的C程序

    这个很简单 ;******************************************************************************** ;*  标题:  伟纳电 ...

最新文章

  1. python冒泡排序
  2. linux c++ 得到 指定进程名 线程数
  3. 算法导论读书笔记(7)
  4. [WPF] 动画Completed事件里获取执行该动画的UI对象
  5. 如何编写优秀的单元测试用例
  6. 大学计算机基础教程大纲
  7. 深入理解逻辑回归算法(Logistic Regression)
  8. linux电子相册设计,电子相册设计报告
  9. 看懂影片标题,各种电影视频格式标题的含义
  10. firefox os android,若能同时使用Android应用,那么你可以接受Firefox OS手机了吗?
  11. 【软件工程】需求规格说明书
  12. “一把梭:REST API 全用 POST”
  13. Android-蓝牙sco通话
  14. oracle 按天数 均值,oracle 按天数统计数据
  15. BDB的Btree结构以及影响Btree性能的各种配置和方法
  16. CCF-201409-5-拼图
  17. Linux命令:dpkg【dpkg命令的英文全称是“Debian package”,故名意思是Debian Linux系统用来安装、创建和管理软件包的实用工具】
  18. HDMI 2.1的traning流程
  19. 智慧城市/数字政府/城市大脑
  20. 电池工况测试 matlab,一种电动汽车用动力蓄电池脉冲工况测试方法与流程

热门文章

  1. C语言 itoa函数及atoi函数
  2. 选择DC-DC开关电源控制器的实战过程
  3. shell切分字符串到数组
  4. linux设置开机自启某个命令
  5. OSGi跨bundle调用,jaxb-impl异常
  6. IDEA快捷键大全,各类IDEA快捷键
  7. CMU 11-785 L16 Connectionist Temporal Classification
  8. 数据结构与算法 实验5 树、二叉树和森林的基本操作
  9. C语言通过QR分解计算矩阵的特征值和特征向量
  10. 系统辨识的几种方法实现MATLAB代码