当前位置:文档之家› 矩阵键盘扫描程序加原理图

矩阵键盘扫描程序加原理图

矩阵键盘扫描程序加原理图
矩阵键盘扫描程序加原理图

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6; //申明U1锁存器的锁存端

sbit wela=P2^7; //申明U2锁存器的锁存端

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒for(j=110;j>0;j--);

}

void display(uchar num)

{

P0=table[num]; //显示函数只送段选数据

dula=1;

dula=0;

}

void matrixkeyscan() //矩阵键盘扫描函数

{

uchar temp,key;

P3=0xfe;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xee:

key=0;

break;

case 0xde:

key=1;

break;

case 0xbe:

key=2;

break;

case 0x7e:

key=3;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xed:

key=4;

break;

case 0xdd:

key=5;

break;

case 0xbd:

key=6;

break;

case 0x7d:

key=7;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xfb;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xeb:

key=8;

break;

case 0xdb:

key=9;

break;

case 0xbb:

key=10;

break;

case 0x7b:

key=11;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

delayms(10);

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

temp=P3;

switch(temp)

{

case 0xe7:

key=12;

break;

case 0xd7:

key=13;

break;

case 0xb7:

key=14;

break;

case 0x77:

key=15;

break;

}

while(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

}

display(key);

}

}

}

void main()

{

P0=0; //关闭所有数码管段选

dula=1;

dula=0;

P0=0xc0;//位选中所有数码管

wela=1;

wela=0;

while(1)

{

matrixkeyscan();//不停调用键盘扫描程序}

}

笔记本16乘8矩阵键盘原理

键盘工作的主要原理:计算机键盘通常采用行列扫描法来确定按下键所在的行列位置。所谓行列扫描法是指,把键盘按键排列成n行×m列的n*m行列点阵,把行、列线分别连接到两个并行接口双向传送的连接线上,点阵上的键一旦被按动,该键所在的行列点阵信号就被认为已接通。按键所排列成的矩阵,需要用硬件或软件的方法轮转顺序地对其行、列分别进行扫描,以查询和确认是否有键按动。如有键按动,键盘就会向主机发送被按键所在的行列点阵的位置编码,称为键扫描码。单片机通过周期性扫描行、列线,读回扫描信号结果,判断是否有键按下,并计算按键的位置以获得扫描码。键被按下时,单片机分两次将位置扫描码发送到键盘接口:按下一次,叫接通扫描码;按完释放一次,叫断开扫描码。这样,通过硬件或软件的方法对键盘分别进行行、列扫视,就可以确定按下键所在位置,获得并输出扫描位置码,然后转换为ASCII码,经过键盘I/O电路送入主机,并由显示器显示出来。 我們的應用是EC有KSI/KSO接鍵盤,EC確認鍵盤某個鍵有作用,才會通知系統來減少系統資源浪費,此外每一列会间断性发low讯号 請問一秒內,一個固定的列(KSO)會發1000次Low Pulse. 笔记本EC中使用到了16*8矩阵键盘,其中16根列线输入端为KSO0~KSO15,8根行线输出端为KSI0~KSI7。16根列线和8根行线可以确定16*8=128个坐标点。键按矩阵排列,各键处于矩阵行/列的结点处,CPU通过对连在行(列)的I/O线送已知电平的信号,然后读取列(行)线的状态信息。逐线扫描,得出键码。下图给出了4*4的矩阵键盘的电路具体加以说明。 矩阵式键盘中,行、列线分别连接到按键开关的两端,行线X0、X1、X2、X3通过上拉电阻接到+5 V上。当无键按下时,行线处于高电平状态,显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平,只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这一点是识别矩阵按键是否被按下的关键。 按键按下时,与此键相连的行线与列线导通,对应的行线被拉低,CPU根据行平电的变化,便能判定相应的行有键按下。例如8号键按下时,第X2行一定为低电平,然而,第2行为低电平时,不能确定一定是8号键按下的,因为9、10、11号键按下同样使第2行为低电平。为进一步

单片机矩阵式键盘连接方法及工作原理

矩阵式键盘的连接方法和工作原理 什么是矩阵式键盘?当键盘中按键数量较多时,为了减少I/O 口线的占用,通常将按键排列成矩 阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样做有什么好处呢?大家看下面的电路图,一个并行口可以构成4*4=16 个按键,比之直 接将端口线用于键盘多出了一倍,而且线数越多,区别就越明显。比如再多加一条线就可以构成20 键 的键盘,而直接用端口线则只能多出一个键(9 键)。由此可见,在需要的按键数量比较多时,采用矩 阵法来连接键盘是非常合理的。 矩阵式结构的键盘显然比独立式键盘复杂一些,识别也要复杂一些,在上图中,列线通过电阻接 电源,并将行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O 口则作为输入端。这样,当按 键没有被按下时,所有的输出端都是高电平,代表无键按下,行线输出是低电平;一旦有键按下,则输 入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了,具体的识别及编程方法如下 所述: 二.矩阵式键盘的按键识别方法 确定矩阵式键盘上任何一个键被按下通常采用“行扫描法”或者“行反转法”。行扫描法又称为 逐行(或列)扫描查询法,它是一种最常用的多按键识别方法。因此我们就以“行扫描法”为例介绍矩 阵式键盘的工作原理: 1.判断键盘中有无键按下 将全部行线X0-X3 置低电平,然后检测列线的状态,只要有一列的电平为低,则表示键盘中有键 被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中;若所有列线均为高电平,则表 示键盘中无键按下。 2.判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平(即在 置某根行线为低电平时,其它线为高电平),当确定某根行线为低电平后,再逐行检测各列线的电平状 态,若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。 下面给出一个具体的例子: 单片机的P1 口用作键盘I/O 口,键盘的列线接到P1 口的低4 位,键盘的行线接到P1 口的高4

扫描矩阵键盘简介以及其FPGA设计思路

扫描键盘的设计思想和代码技巧非常值得学习。 首先扫描键盘可以节省FPGA 的引脚资源,例如一个4x4的扫描键盘有16个按键,如果不用扫描方式而是直接把16跟控制线接入FPGA ,就要16个引脚,而用扫描方式只需要4+4=8个引脚。尤其是随着键盘的增大,比如8x9=72的键盘,用扫描方式只需要17个引脚。 要想了解扫描键盘的原理,首先要知道矩阵键盘的电路结构。 如上图所示,矩阵键盘的某一个按钮按下会使对应的一条行线和列线导通,为了便于分析扫描过程做如下简化: 3.3v Row0 Row1 Row2 Row3 Col 0 Col 1 Col 2 Col 3 Row0 Row1 Row2 Row3 Col 0 Col 1 Col 2 Col 3 3 5 A E D C 2 B 9 8 F 4 6 0 1 7 接高电平 由FPGA 输出给键盘高低电平的组合,即是扫描码 键盘行线 高低电平的变化输入给FPGA

扫描键盘的工作状态分为两种: 第一种状态是判断是否有键按下,该状态下四根列线对应的电平状态是{col 0,col 1,col 2,col 3}=0000 。四根行线左端都接高电平,没有键被按下时,四根行线右端的状态是{row0,row1,row2,row3}=1111 。假如上图中按键3被按下了,也就是说row0和col 0接通了。那么四根行线右端的状态将会是{row0,row1,row2,row3}=0111 。也就是说,在第一种状态下,只要键盘行线输入FPGA的状态不是1111,就说明有键被按下了。马上进入第二状态。 第二种状态是判断具体哪个键被按下了。该状态下四根行线左端接高电平不变,四根列线对应的电平状态不断变化,由FPGA的输出的扫描码控制四根列线的电平状态。由第一状态的行线输入已经可以确定按键所处的行了。接下来只要再确定按键所处的列就可以确定到底哪个键被按下了。 如何根据行线的输入确定按键所处的列,奥妙就在于扫描码了。让列线以1000、0100、0010、0001的电平状态不断循环。假设上一状态确定按键处于row0行,那么随着扫描的进行,行线输入的变化规律如下表: 1000 0100 0010 0001 1000 0100 0010 0001 1000 0100 0010 0001 扫描 码 Row0 1 0 0 0 1 0 0 0 1 0 0 0 Row1 1 1 1 1 1 1 1 1 1 1 1 1 Row2 1 1 1 1 1 1 1 1 1 1 1 1 Row3 1 1 1 1 1 1 1 1 1 1 1 1 观察上表可以发现,在row0是1的时候与之对应的扫描码可以体现出按键所在列。 一个随之而来的设计思路是在第一状态确定按键所在行,然后在第二状态捕捉特定行是高电平的时候所对应的扫描码。 但是这里有一个不可避免的实际问题,那就是机械键盘的抖动!这种抖动主要体现在两个方面:第一,我们手指按某个键的时候可能由于接触面积大无意中碰到周围的键。第二,在按着一个键的时候由于力度不均或者接触不良,行线和列线并不能时刻保持接通的状态。下图来自网络上,描述的是单片机的机械键盘,借用一下。

4X4扫描式矩阵键盘课程设计

4X4扫描式矩阵键盘课程设计 课程设计名称: 4_4扫描式矩阵键盘设计 姓名:DUKE 班级:电子1008班 学号:10086 成绩: 日期:2014年1月6日

摘要 随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。 矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。 4*4矩阵式键盘采用AT89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程。单片机将检测到的按键信号转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。

目录 第一章:系统功能要求-------------------------------------------------------- 1.1 4*4 矩阵式键盘系统概述------------------------------------------------ 1.2 本设计任务和主要内容--------------------------------------------------- 第二章:方案论证--------------------------------------------------------------- 第三章:系统硬件电路的设计------------------------------------------------ 3.1 单片机控制系统原理----------------------------------------------------- 3.2 原理图绘制说明---------------------------------------------------------- 3.3 画出流程图---------------------------------------------------------------- 3.4 原理图绘制--------------------------------------------------------------- 第四章:系统程序的设计------------------------------------------------------ 4.1 程序的编写步骤----------------------------------------------------------- 4.2 编写的源程序-------------------------------------------------------------- 第五章:调试及性能分析------------------------------------------------------ 第六章:心得体会--------------------------------------------------------------- 参考文献----------------------------------------------------------------------------

单片机矩阵键盘扫描程序

#include #include #define uint unsigned int #define uchar unsigned char sbit E=P2^7; //1602使能引脚 sbit RW=P2^6; //1602读写引脚 sbit RS=P2^5; //1602数据/命令选择引脚 uint keyflag ; //键盘正在读取标志位,如果Keyflag为1 ,表示正在读取键盘,停止其他功能; char x,y,m,n,c; //Keyflag为0,读取键盘结束,恢复其他功能 char flag1=0; //频率范围10~1000Hz uchar Hrate = 0; //一个周期内高点平占据时间 uchar Lrate = 0; //一个周期内低电平占据时间 uint FREQ0; //定时器T0的计数变量// uint FREQ1; //定时器T1的计数变量// sbit P2_1=P2^0; //设置P2.1,作为信号输出口// uint disbuf[3]; uint figure=0; int sum2=0; int sum1=0; int flag=0; uint count=0; uint max=0; uint disbuf_temp=0; /******************************************************************** * 名称: 1602显示延时函数delay() * 功能: 延时,延时时间大概为5US。

* 输出: 无 ***********************************************************************/ void delay() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /******************************************************************** * 名称: bit Busy(void) * 功能: 这个是一个读状态函数,读出函数是否处在忙状态 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ bit Busy(void) { bit busy_flag = 0; RS = 0; RW = 1; E = 1; delay(); busy_flag = (bit)(P0 & 0x80); E = 0; return busy_flag; } /******************************************************************** * 名称: wcmd(uchar del) * 功能: 1602命令函数 * 输入: 输入的命令值 * 输出: 无 ***********************************************************************/ void wcmd(uchar del) { while(Busy()); RS = 0; RW = 0; E = 0; delay(); P0 = del; delay(); E = 1;

矩阵键盘电路设计

课程设计 题目矩阵键盘电路设计教学院计算机学院 专业计算机应用技术班级 姓名 指导教师 2010 年01 月12 日

前言.................................................................... 第一章需求分析......................................................... 功能描述......................................................... 功能分析......................................................... 第二章系统的原理及分析................................................. 用到的知识点的介绍,知识点使用的总体思路 第三章详细设计......................................................... 硬件设计 系统结构图,元器件的选择等 软件设计 所设计的软件关键模块的程序流程 第四章测试............................................................ 运行结果分析等 第五章总结............................................................. 参考文献................................................................ 附录 关键程序代码........................................................

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

矩阵式键盘的结构与工作原理

矩阵式键盘的结构与工作原理 在键盘中按键数量较多时为了减少I/O 口的占用通常将按键排列成矩阵形式如图1 所 示在矩阵式键盘中每条水平线和垂直线在交叉处不直接连通而是通过一个按键加以连 接这样一个端口如P1 口就可以构成4*4=16 个按键比之直接将端口线用于键盘 多出了一倍而且线数越多区别越明显比如再多加一条线就可以构成20 键的键盘而 直接用端口线则只能多出一键9 键由此可见在 需要的键数比较多时采用矩阵法来做键盘是合理的 矩阵式结构的键盘显然比直接法要复杂一些识别也要复杂一些上图中列线通过电 阻接正电源并将行线所接的单片机的I/O 口作为输出端而列线所接的I/O 口则作为输入这样当按键没有按下时所有的输出端都是高电平代表无键按下行线输出是低电平 一旦有键按下则输入线就会被拉低这样通过读入输入线的状态就可得知是否有键按下 了具体的识别及编程方法如下所述 矩阵式键盘的按键识别方法 确定矩阵式键盘上何键被按下介绍一种行扫描法 行扫描法 行扫描法又称为逐行或列扫描查询法是一种最常用的按键识别方法如上图所示 键盘介绍过程如下 判断键盘中有无键按下将全部行线Y0-Y3 置低电平然后检测列线的状态只要有一 列的电平为低则表示键盘中有键被按下而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中若所有列线均为高电平则键盘中无键按下 判断闭合键所在的位置在确认有键按下后即可进入确定具体闭合键的过程其方法 是依次将行线置为低电平即在置某根行线为低电平时其它线为高电平在确定某根行 线位置为低电平后再逐行检测各列线的电平状态若某列为低则该列线与置为低电平的 行线交叉处的按键就是闭合的按键 下面给出一个具体的例子 图仍如上所示8031 单片机的P1 口用作键盘I/O 口键盘的列线接到P1 口的低4 位 键盘的行线接到P1 口的高4 位列线P1.0-P1.3 分别接有4 个上拉电阻到正电源+5V 并把列线P1.0-P1.3 设置为输入线行线P1.4-P.17 设置为输出线4 根行线和4 根列线形成16 个相交点 检测当前是否有键被按下检测的方法是P1.4-P1.7 输出全0 读取P1.0-P1.3 的状态 若P1.0-P1.3 为全1 则无键闭合否则有键闭合 去除键抖动当检测到有键按下后延时一段时间再做下一步的检测判断 若有键被按下应识别出是哪一个键闭合方法是对键盘的行线进行扫描P1.4-P1.7 按下 述4 种组合依次输出 P1.7 1 1 1 0 P1.6 1 1 0 1 P1.5 1 0 1 1 P1.4 0 1 1 1 在每组行输出时读取P1.0-P1.3 若全为1 则表示为0 这一行没有键闭合否则 有键闭合由此得到闭合键的行值和列值然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值 为了保证键每闭合一次CPU 仅作一次处理必须却除键释放时的抖动__

单片机实验报告——矩阵键盘数码管显示

单片机实验报告 信息处理实验 实验二矩阵键盘 专业:电气工程及其自动化 指导老师:高哲 组员:明洪开张鸿伟张谦赵智奇 学号:152703117 \152703115\152703118\152703114室温:18 ℃日期:2017 年10 月25日

矩阵键盘 一、实验内容 1、编写程序,做到在键盘上每按一个键(0-F)用数码管将该建对应的名字显示出来。按其它键没有结果。 二、实验目的 1、学习独立式按键的查询识别方法。 2、非编码矩阵键盘的行反转法识别方法。 3、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 4、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 5、掌握利用Keil51软件对程序进行编译。 6、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 三、实验原理 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然

后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.doczj.com/doc/ae6481902.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

4X4矩阵式键盘输入程序

4*4键盘程序readkeyboard: begin: acall key_on jnz delay ajmp readkeyboard delay:acall delay10ms acall key_on jnz key_num ajmp begin key_num:acall key_p anl a,#0FFh jz begin acall key_ccode push a key_off:acall key_on jnz key_off pop a ret key_on: mov a,#00h orl a,#0fh mov p1,a mov a,p1 orl a,#0f0h cpl a ret key_p: mov r7,#0efh l_loop:mov a,r7 mov p1,a mov a,p1 orl a,#0f0h mov r6,a cpl a jz next ajmp key_c next: mov a,r7 jnb acc.7,error rl a mov r7,a ajmp l_loop error:mov a,#00h ret key_c:mov r2,#00h mov r3,#00h mov a,r6

mov r5,#04h again1:jnb acc.0,out1 rr a inc r2 djnz r5, again1 out1: inc r2 mov a,r7 mov r5,#04h again2:jnb acc.4,out2 rr a inc r3 djnz r5,again2 out2: inc r3 mov a, r2 swap a add a,r3 ret key_ccode:push a swap a anl a,#0fh dec a rl a ;行号乘4 rl a mov r7,a pop a anl a,#0fh dec a add a,r7 ret delay10ms: anl tmod,#0f0h orl tmod,#01h mov th0,#0d8h mov tl0,#0f0h setb tr0 wait:jbc tf0,over ajmp wait clr tr0 over:ret 单片机键盘设计 (二)从电路或软件的角度应解决的问题 软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。通常采用软件延时的方法:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。(这种消除抖动影响的软件措施是切实可行的。)

修订矩阵键盘的工作原理

修订矩阵键盘的工作原 理 TPMK standardization office【 TPMK5AB- TPMK08- TPMK2C- TPMK18】

4×4矩阵键盘的工作原理与编程51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。 一、硬件工作原理的简单介绍 该实验使用的8位数码管显示电路和4×4矩阵键盘电路。现将这二部分的电路工作原理进行简单的介绍: 1、4×4矩阵键盘的工作原理 矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。 图1为矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。 图1 矩阵键盘电路 图2 按键排列 2、数码管动态扫描显示电路 在ME300B开发系统中,采用了8位数码管动态扫描显示。它将所有数码管的8个段线相应地并接在一起,并接到 AT89S51的P0口,由P0口控制字段输出。而

各位数码管的共阳极由AT89S51的P2口控制Q20-Q27来实现8位数码管的位输出控制。 这样,对于一组数码管动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。 由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。 虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。 图3 数码管电路 数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。若显示

矩阵键盘设计实验报告

南京林业大学 实验报告 基于AT89C51 单片机4x4矩阵键盘接口电路设计 课程机电一体化设计基础 院系机械电子工程学院 班级 学号 姓名 指导老师杨雨图 2013年9月26日

一、实验目的 1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 3、掌握利用Keil51软件对程序进行编译。 4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。 5、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 二、实验要求 通过实训,学生应达到以下几方面的要求: 素质要求 1.以积极认真的态度对待本次实训,遵章守纪、团结协作。 2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立 工作能力。 能力要求 1.模拟电路的理论知识 2.脉冲与数字电路的理念知识 3.通过模拟、数字电路实验有一定的动手能力 4.能熟练的编写8951单片机汇编程序 5.能够熟练的运用仿真软件进行仿真 三、实验工具 1、软件:Proteus软件、keil51。 2、硬件:PC机,串口线,并口线,单片机开发板 四、实验内容 1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格 元器件的作用。 2、用keil51测试软件编写AT89C51单片机汇编程序 3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。 4、运用仿真软件对电路进行仿真。 五.实验基本步骤 1、用Proteus绘制“矩阵键盘扫描”电路原理图。 2、编写程序使数码管显示当前闭合按键的键值。 3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状 态和按键开关的对应关系。 4、用keil51软件编写程序,并生成HEX文件。 5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。 6、用通用编程器或ISP下载HEX程序到MCU。 7、检查验证结果。

单片机4X4键盘扫描和显示课程设计

二、设计内容 1、本设计利用各种器件设计,并利用原理图将8255单元与键盘及数码管显示单元连接,扫描键盘输入,最后将扫描结果送入数码管显示。键盘采用4*4键盘,每个数码管可以显示0-F共16个数。将键盘编号,记作0-F,当没按下其中一个键时,将该按键对应的编号在一个数码管上显示出来,当在按下一个 键时,便将这个按键的编号在下一个数码管上显示,数码管上 可以显示最近6次按下的按键编号。 设计并实现一4×4键盘的接口,并在两个数码管上显示键盘所在的行与列。 三、问题分析及方案的提出 4×4键盘的每个按键均和单片机的P1口的两条相连。若没有按键按下时,单片机P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。单片机定时对P1口进行程序查询,即可发现键盘上是否有按键按下以及哪个按键被按下。 实现4×4键盘的接口需要用到单片机并编写相应的程序来识别键盘的十六个按键中哪个按键被按下。因为此题目还要求将被按下的按键显示出来,因此可以用两个数码管来分别显示被按下的按键的行与列

表示任意一个十六进制数)分别表示键盘的第二行、第三行、第四行;0xXE、0xXD、0xXB、0xX7(X表示任意一个十六进制数)则分别表示键盘的第一列、第二列、第三列和第四列。例如0xD7是键盘的第二行第四列的按键 对于数码管的连接,采用了共阳极的接法,其下拉电阻应保证芯片不会因为电流过大而烧坏。 五、电路设计及功能说明 4×4键盘的十六个按键分成四行四列分别于P1端口的八条I/O 数据线相连;两个七段数码管分别与单片机的P0口和P2口的低七 位I/O数据线相连。数码管采用共阳极的接法,所以需要下拉电阻 来分流。结合软件程序,即可实现4×4键盘的接口及显示的设计。 当按下键盘其中的一个按键时,数码管上会显示出该按键在4×4键 盘上的行值和列值。所以实现了数码管显示按键位置的功能 四、设计思路及原因 对于4×4键盘,共有十六个按键。如果每个按键与单片机的一个引脚相连,就会占用16个引脚,这样会使的单片机的接口不够用(即使够用,也是对单片机端口的极大浪费)。因此我们应该行列式的接法。行列式非编码键盘是一种把所有按键排列成行列矩阵的键盘。在这种键若没有按键按下时,单片机从P1口读得的引脚电平为“1”;若某一按键被按下,则该键所对应的端口线变为地电平。因此0xEX(X表示任意4×4键盘的第一行中的某个按键被按下,相应的0xDX、0xBX、0x7X(X 二、实验内容

4×4矩阵键盘的工作原理

4×4矩阵键盘的工作原理与编程 51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。 一、硬件工作原理的简单介绍 该实验使用的8位数码管显示电路和4×4矩阵键盘电路。现将这二部分的电路工作原理进行简单的介绍: 1、4×4矩阵键盘的工作原理 矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。在行线和列线的每一个交叉点上,设置一个按键。这样键盘中按键的个数是4×4个。这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。 图1为矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。 图1矩阵键盘电路 图2按键排列 2、数码管动态扫描显示电路 在ME300B开发系统中,采用了8位数码管动态扫描显示。它将所有数码管的8个段线相应地并接在一起,并接到AT89S51的P0口,由P0口控制字段输出。而各位数码管的共阳极由AT89S51的P2口控制Q20-Q27来实现8位数码管的位输出控制。 这样,对于一组数码管动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。 由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。 虽然这些字符是在不同时刻出现的,而且同一时刻,只有一位显示,其它各位熄灭,但由于数码管具有余辉特性和人眼有视觉暂留现象,只要每位数码管显示间隔足够短,给人眼的视觉印象就会是连续稳定地显示。 图3数码管电路 数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

单片机 矩阵键盘实验 实验报告

实验五矩阵键盘实验 一、实验内容 1、编写程序,做到在键盘上每按一个数字键(0-F)用发光二极管将该代码显示出来。按其它键退出。 2、加法设计计算器,实验板上有12个按键,编写程序,实现一位整数加法运算功能。可定义“A”键为“+”键,“B”键为“=”键。 二、实验目的 1、学习独立式按键的查询识别方法。 2、非编码矩阵键盘的行反转法识别方法。 三、实验说明 1、MCS51系列单片机的P0~P3口作为输入端口使用时必须先向端口写入“1”。 2、用查询方式检测按键时,要加入延时(通常采用软件延时10~20mS)以消除抖动。 3、识别键的闭合,通常采用行扫描法和行反转法。行扫描法是使键盘上某一行线为低电平,而其余行接高电平,然后读取列值,如读列值中某位为低电平,表明有键按下,否则扫描下一行,直到扫完所有行。 行反转法识别闭合键时,要将行线接一并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作于输入方式,程序使CPU通过输出端口在各行线上全部送低电平,然后读入列线值,如此时有某键被按下,则必定会使某一列线值为0。然后,程序对两个并行端口进行方式设置,使行线工作于输入方式,列线工作于输出方式,并将刚才读得的列线值从列线所接的并行端口输出,再读取行线上输入值,那么,在闭合键所在行线上的值必定为0。这样,当一个键被接下时,必定可以读得一对唯一的行线值和列线值。 由于51单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。 行反转法识别按键的过程是:首先,将4个行线作为输出,将其全部置0,4个列线作为输入,将其全部置1,也就是向P1口写入0xF0;假如此时没有人按键,从P1口读出的值应仍为0xF0;假如此时1、4、7、0四个键中有一个键被按下,则P1.6被拉低,从P1口读出的值为0xB0;为了确定是这四个键中哪一个被按下,可将刚才从P1口读出的数的低四位置1后再写入P1口,即将0xBF写入P1口,使P1.6为低,其余均为高,若此时被按下的键是“4”,则P1.1被拉低,从P1口读出的值为0xBE;这样,当只有一个键被按下时,每一个键只有唯一的反转码,事先为12个键的反转码建一个表,通过查表就可知道是哪个键被按下了。 四、接线方法 键盘连接成4×4的矩阵形式,占用单片机P1口的8根线,行信号是P1.0-1.3,列信号是P1.4-1.7。

相关主题
文本预览
相关文档 最新文档