矩阵键盘的键值计算及编程[严选材料]
矩阵键盘的编程方法——读取键值

矩阵键盘的编程⽅法——读取键值矩阵键盘的使⽤在单品机的学习当中⼗分⼴泛,可是对于许多新⼿,包括本⼈有时也是搞不明⽩,昨天晚上和今天早上的思考和同⾏们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。
在单⽚机的学习版中,矩阵键盘通常如下图设计:下⾯就以按下S16键来讲解其思路:⾸先:P3的⾼位P3.4~P3.7输出为0,低位P3.0~P3.3输出为1;即P3=0x0F,当按下S16键后(有消抖动过程),P3.3的值为0,则P3的值更新为0x07;其次:P3的⾼位P3.4~P3.7输出为1,低位P3.0~P3.3输出为0;即P3=0xF0,当按下S16键后(有消抖动过程),P3.4的值为0,则P3的值更新为0xE0;最后将两个值相加得P3=0xE7;在keyscan()函数(假设我们的键盘扫描程序为unsigned char keyscan())返回其键盘的值供后续的程序调⽤,通常会有⼀个switch块根据其返回值来确定输出的是哪⼀个数值。
下⾯提供⼀段KeilC51语⾔的代码来解释⼀下:1. /*------------------------------------------------2. 键盘扫描程序3. ------------------------------------------------*/4. uchar keyscan( void ) //键盘扫描函数,使⽤⾏列反转扫描法5. {6. uchar cord_h,cord_l;//⾏列值中间变量7. P3 = 0x0f; //⾏线输出全为08. cord_h = P3 & 0x0f; //读⼊列线值9. if( cord_h != 0x0f ) //先检测有⽆按键按下10. {11. delay( 100 ); //去抖12. if( cord_h != 0x0f )13. {14. cord_h = P3 & 0x0f; //读⼊列线值15. P3 = cord_h | 0xf0; //输出当前列线值16. cord_l = P3 & 0xf0; //读⼊⾏线值17. return( cord_h + cord_l );//键盘最后组合码值18. }19. }20. return( 0xff ); //返回该值21. }22.⾸先把P3的⼝赋值为0x0f,同时把P3和0x0f赋值给cord_h(⾏的数值),倘若有按键按下,那么P3的值就会改变,随后cord_h的只也会随之变化,经过消抖之后记录cord_h的值,即cord_h = P3 & 0x0f;(若以S16为例,那么P3.3的值变为0,所以cord_h的值就会变为0x07;)接下来:P3 = cord_h | 0xf0;意在不改变P3的第四位,把P3的⾼四位赋为⾼电平,那么P3=0x0f7;到了关键的⼀步:cord_l = P3 & 0xf0;我当初以为cord_l=0xf0呢,结果就和程序运⾏的不⼀样喽,最后还是问了我的同⾏(⾮常感谢刘伟同志!指点迷津!),其实在第⼆个if语⾔内,S16已经被按下了的,所以P3的值⽴刻就变为0x0e的了,以⾄于cord_l=0x0e,最后返回⾏和列的和return( cord_h + cord_l );(0xe7)。
矩阵键盘0——15键值

delay(1);//延时消抖
key=7;
while((!PINA&0X08));//等待按键松开
}
}
PORTB=0xbf;
delay(1);//延时消抖
// 按键8
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
}
void main()
{
uchar i,ge,shi,num=0;
init();
while(1)
{ anjian();
shi=key/10;
ge=key%10;
write_com(0x85);
write_data(0x30+shi);
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{
delay(1);//延时消抖
key=8;
while((!PINA&0X01));//等待按键松开
}
}
// 按键9
{
delay(1);//延时消抖
key=11;
while((!PINA&0X08));//等待按键松开
}
}
PORTB=0x7f;
delay(1);//延时消抖
// 按键12
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
EN_1;
delay(3);
EN_0;
}
void write_data(uchar date)
{
RS_1;
单片机中用矩阵键盘实现计算器

num=num1/num2;
}
if(flag2==2&&flag1==2) //乘号和等号被按下
{
num=num1*num2;
}
if(flag2==3&&flag1==2) //减号和等号被按下
{
num=num1-num2;
}
if(flag2==4&&flag1==2) //加号和等号被按下
{
num=num1+num2;
display();//数据显示
}
}
void keyscan(void)
{
col_1=0;
col_2=0;
col_3=0;
col_4=0;
if ((P1&0x0f)!=0x0f) //判断行线是否全为1,不是则处理
{
col_1=0; //第一列输出'0'
col_2=1;
col_3=1;
col_4=1;
num2=7;
break;
case 2:if(flag==1)
num1=4;
if(flag==3)
num2=4;
break;
case 3:if(flag==1)
num1=1;
if(flag==3)
num2=1;
break;
case 5:if(flag==1)
num1=8;
if(flag==3)
num2=8;
case 15:
flag2=3;//“-”
break;
case 16:
flag2=4;//“+”
break;
}
keynum=0;//清除keynum的值
51单片机矩阵键盘C语言编程

/****************************************************************************** 函数名称:main() 函数功能:主函数,键值处理
******************************************************************************/
__ ____
KEY=HSM + LJC|0x0f 例如,“0”键处在第 1 行第 1 列,其 HSM=0xfe,LJC=0xe0,代入上式,可得“0” 键的键值为
__ ____ __ ____ KEY=HSM + LJC|0x0f = 0xfe + 0xe0|0x0f =0x01 + 0x10= 0x11 根据上述计算方法,可计算所有按键地键值,见下表
4
5
6
7
P11
8
9
A
Байду номын сангаас
B
P12
C
D
E
F
P13
原理图12
根据矩阵非编码键盘逐行扫描法处理流程,键盘扫描程序应包括以下内容。 (1)查询是否有键被按下。 首先单片机向行扫描口输出扫描码 F0H,然后从列检测口读取列检测信号,只要一列信 号不为“1”,即 P1 口的值不等于 F0H,则表示有键被按下;否则表示无键被按下。 键值译码公式如下: (2)查询闭合键所在的行列位置。 若有键按下,单片机将等到的列检测信号取反,列检测口中为 1 的位便是闭合键所在 的列。 列号确定后,还需要进行逐行扫描以确定行号。单片机首先向行扫描口输出第 1 行的 扫描码 FEH,按着读列检测口,若列检测信号全为“1”,则表示闭合键不在第 1 行。接着 向行扫描口输出第 2 行的扫描码 FDH,再读列检测品,……。以此类推,直到找到闭合键 所在的行,并将该行的扫描码取反保存。如果扫描完所有的行后仍没有找到闭合键,则结束 行扫描,判断本次按键是误动作。 (3)对得到的行号和列号进行译码,确定键值。 根据原理图 12 所示,1、2、3、4 行的扫描码分别为 0xfe、0xfd、0xeb、0xf7;1、2、3、 4 列的列检测数据分别为 0xe0、0xd0、0xb0、0x70。设行扫描码码子 HSM,列检测数据为 LJC,则键值为 KEY,则有
实例(6)-矩阵键盘

case 0xd7: key=13;break;
case 0xb7: key=14;break;
case 0x77: key=15;break;
}
while(P2!=0xf0);
}
}
return key;
}
//主函数 void main() {
unsigned char key=255,num=255; P0 &=~(1<<6); while(1) {
1
嵌入式学习——51 单片机篇
位。我们通过读入 P2 端口的值,只要发现有变化,就可知道有按键按下。
2.2、解码方法
要完成整个解码过程,分两步:行解码与列解码。 行解码:按照实验 2 的方法,我们如果先对 P2 口赋值 P2=0x0f;这时 P2 的高四位为高 电平,低四位为低电平。由于每个按键的两端,一端是连接到 P2 口的高四位,另一端是连 接到 P2 口的低四位,因此,当我们按下某个按键的时候,P2 口的高四位电平值就会发生变 化,我们可以把这时候的 P2 口电平值当作一个编码,叫做行编码。比方说,如果 P2.3 被拉 为低电平,行编码就是 0x07,我们就知道第一行(S1、S2、S3、S4)有键被按下。于是,按 下每一个键的时候,对有它对应的行编码值。 列解码:当我们完成行解码后,必须马上进行列解码,我们立刻对 P2 口赋值 P2=0xf0; 再按照类似于行解码的方法,就行可得出按键的列编码值。 行编码值与列编码值各有 4 种,组合起来就有 16 种。得出了行列编码值,就相当于完 成了矩阵键盘的解码了。但是我们往往都希望用一个简单的数字来表示一个按键,因此,当 我们得到行编码是 0x07,列编码是 0xe0 的时候,我们就知道按键 S1 被按下了。这时候就 把 key=1;其他的按键也按这种方法来解码。
最新单片机矩阵键盘的编程

单片机矩阵键盘的编程I/O端口输出1的端口与输出0的端口对接的时候会检验出原来的端口是0 第一个,这个是错误程序#include<reg52.h>void delay1ms(unsigned int i) //延时函数{unsigned char j;while(i--){for(j=0;j<115;j++) //1ms基准延时程序{;}}}void main(){while(1){P1=0xf0; //建立初始状态,每一行赋值0,每一列赋予1unsigned chars[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0 x86,0x8e}; //数码管灯unsigned int l; //分别代表作列与行unsigned int r;if(P1!=0xf0) //检验有没有按键被按下{delay1ms(15); //避免前沿抖动,延时大约15msswitch(P1) //检验有没有键盘被按下{ //如果按下了就检验是哪一列被按下了case 0x70: //p1^7被按下l=4;case 0xB0: //p1^6被按下l=3;case 0xD0: //p1^5被按下l=2;case 0xE0: //p1^4被按下l=1;default:break;}P1=0xf; 、 //每一列赋予1,每一行赋予0switch(P1) //检验哪一行的按键被按下{case 0xE: //p1^0被按下r=1;case 0xD: //p1^2被按下r=2;case 0xB://p1^3被按下r=3;case 0x7:r=4;//p1^4被按下default:break;}//已经知道哪一个按键被按下r=r*l; //得到的数在数值上等于要显示的数目P1=s8[r] //数码管亮}delay1ms(15); //避免后延抖动}}错误的地方在于P1=0xf; 、 //每一列赋予1,每一行赋予0switch(P1) //检验哪一行的按键被按下{这是因为如果没有再次判断当P1!=0XF的时候,就可能出现没有符合case之中的情况而直接运行default这种情况。
矩阵键盘编程

矩阵键盘编程键盘结构与类型独立式按键键盘由若干独立式按键组成。
独立式按键指每个按键作为一位占用一根I/O口线,直接用I/O口线构成单个按键电路。
独立式按键键盘可分为中断方式和查询方式两种。
独立式按键键盘优点是配置灵活,软件结构简单,操作速度快;缺点是按键多时I/O口浪费较大,故只在按键数目不多时采用。
行列式键盘(矩阵式键盘)用I/O口线组成行、列结构,按键设置在行列的交点上。
在按键较多时可节省I/O口线,如4×8行列结构可构成32个键的键盘。
行列式键盘键输入过程及接口软件应解决的任务键开关状态的可靠输入主要应解决抖动问题。
对按键编码以便识别对按键编码,使不同的按键有不同的键值或键号。
按键状态的输入方式有中断方式与查询方式两种。
编制键盘程序检测有无按键按下、去抖动、按键信息的逻辑处理、输出确定的键号等。
行列式键盘(矩阵式键盘)及接口程序设计行列式键盘的结构及键值赋值方法键盘行线的一端经上拉电阻接+5v电源,另一端接单片机的输入口(因而各输入口均被钳位于高电平)。
各列线的一端接单片机的输出口,另一端悬空。
按键设置在行列线的交点上,行、列线分别连接到按键的两端,按键按下则相应交点的行列线接通。
由图可见,矩阵式键盘接口的设计思想是把键盘既作为输入设备又作为输出设备对待的。
为了让CPU能识别是哪个按键被按下,必须给每个按键都分配一个键号(一般以十进制数表示)。
例如,4×4列矩阵式键盘共16个按键,键号依次按顺序排列为0~15。
对行列式键盘的每个按键,还有一个更重要的概念:键值或者说键码。
键值是一个可表征按键状态的8位数据,不同的按键有不同的键值。
按键后根据键值便能转到相应的键处理子程序,实现键盘的数据输入功能或命令处理功能。
同一个按键的键值和键号可以相同,也可以不相同,这主要取决于键盘的结构与采用的编码方法。
对行列式键盘来说,识别被按键的位置也就是找出被按键所在行和列的坐标值。
对于4行×4列行列式键盘,被按键所在行和列的坐标值为两个4位数据;而对于8行×8列行列式键盘,则为两个8位数据。
矩阵键盘的键值计算及编程

2 读取I/O口值的练习
.j
用程序控制单片机P2口工作,让高四位全高电平,低四位全低电平。 即:P2=0xf0; 具体实现见操作,结果如图。
P1口高四位是指:P1.7 P1.6 P1.5 P1.4
一般都是自高到低读出一个端口各脚电平 ,得到8位二进制数,再将8位二进制转换成2位十六进数。
P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
2 读取I/O口值的练习
.j
当 程序使P2=0x0f; 外接一个两脚开关到P2口只能让P2产生如下四个新的值: 0x0e, 0x0d,0x0b,0x07 0x0d 0x0b
找出行线值 置行线所处端口位置高电平
找出列线值 置列线所处端口位置高电平
行线值+列线值=键值
计算键值一般方法
3 键盘的键值
.j
先找出行线值,再找出列线值,最后绘出矩阵键盘的键值。
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是:
4 键盘扫描编程__线反转法
.j
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 { char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 { delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下 { value_h=P2&0xf0; //读出P2口值给变量value_h P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l return(value_l+value_h); //找到的键值返回给调用函数 } } }
4×4矩阵键盘的工作原理与编程

4×4矩阵键盘的工作原理与编程ME300B单片机学习开发系统应用之三---4×4矩阵键盘的工作原理与编程作者:山西太原贵国庆本文介绍如何在ME300B型51/AVR单片机学习开发系统上使用数码管显示4×4矩阵键盘的键值。
一、硬件工作原理的简单介绍该实验使用ME300B上的8位数码管显示电路和4×4矩阵键盘电路。
现将这二部分的电路工作原理进行简单的介绍:1、4×4矩阵键盘的工作原理矩阵键盘又称为行列式键盘,它是用4条I/O线作为行线,4条I/O线作为列线组成的键盘。
在行线和列线的每一个交叉点上,设置一个按键。
这样键盘中按键的个数是4×4个。
这种行列式键盘结构能够有效地提高单片机系统中I/O口的利用率。
图1为ME300B矩阵键盘电路图,行线接P1.4-P1.7,列线接P1.0-P1.3。
地显示。
图3 数码管电路数码管不同位显示的时间间隔可以通过调整延时程序的延时长短来完成。
数码管显示的时间间隔也能够确定数码管显示时的亮度,若显示的时间间隔长,显示时数码管的亮度将亮些,若显示的时间间隔短,显示时数码管的亮度将暗些。
若显示的时间间隔过长的话,数码管显示时将产生闪烁现象。
所以,在调整显示的时间间隔时,即要考虑到显示时数码管的亮度,又要数码管显示时不产生闪烁现象。
在ME300B单片机开发系统中使用数码管来显示信息时,要将JP2的2、3端短接。
见图3二、演示程序的编程方法1、4×4矩阵键盘的编程方法:1.1、先读取键盘的状态,得到按键的特征编码。
先从P1口的高四位输出低电平,低四位输出高电平,从P1口的低四位读取键盘状态。
再从P1口的低四位输出低电平,高四位输出高电平,从P1口的高四位读取键盘状态。
将两次读取结果组合起来就可以得到当前按键的特征编码。
使用上述方法我们得到16个键的特征编码。
举例说明如何得到按键的特征编码:假设“1”键被按下,找其按键的特征编码。
单片机 矩阵键盘实验 实验报告

实验五矩阵键盘实验一、实验内容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个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
矩阵键盘程序及原理

程序效果:按下任意键,LED显示P0读回的数据其中4*4的矩阵键盘接P0口*/#incl ude<r eg52.h> //头文件u nsign ed ch ar ke y=0xf f; //定义一个变量用于存放按键值void read key(); //读按键子函数,获取键值vo id ma in() //主函数{whil e(1){ readk ey(); //读按键值if(key!=0xff) //判断是否有按键按下P2=~ke y;//这里取反:是因为LED为共阴,显示所按下的值}}v oid r eadke y() //读键盘子函数{P0=0x fe; //将第一列拉低,扫描是否有按键按下,第一列键值为:0,4,8,C ke y=P0; //读取键盘值if(ke y!=0x fe) //若key!=0xf e,说明有按键按下,则返回r eturn; //否则继续扫描下一列P0=0xfd;key=P0;i f(key!=0xf d)re turn;P0=0xfb;key=P0;if(key!=0xfb)ret urn;P0=0x f7;k ey=P0;if(key!=0xf7)retu rn;k ey=0x ff;}键盘扫描程序:从以上分析得到键盘扫描程序的流程图所示。
程序如下SCAN: MOVP1,#0FHMOVA,P1AN L A,#0FH CJN E A,#0FH,N EXT1SJ MP NE XT3 NEX T1: A CALLD20MSM OV A,#0EFHN EXT2: MOVR1,AMO V P1,AMOV A,P1 ANL A,#0FHCJNE A,#0FH,KC ODE;MO V A,R1SETBCRLC AJ C NEX T2NEXT3: MO V R0,#00HRE TKCODE: MOV B,#0FBH NEX T4: R RC AIN C B JCNEXT4M OV A,R1SWAP ANEXT5: RR C A INC BINCBINC BI NC BJC NEXT5NEXT6: MOV A,P1A NL A,#0FHCJ NE A,#0FH,NEXT6M OV R0,#0FF HRET <2>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转法”。
单片机矩阵键盘实验

单片机独立按键和矩阵键盘操作[实验要求]独立按键操作: 试操作P3.4~P3.7控制的四个独立按键中的某一个, 每按一次, 数码管上显示数字作一次加1或减1变化, 显示数字在0~9之间.矩阵键盘操作: 依次按下4*4 矩阵键盘上从第1 到第20 个键,同时在六位数码管上依次显示0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
[实验原理](1) 按键识别去抖动原理:我们在手动按键的时候, 由于机械抖动或是其它一些非人为的因素很有可能造成误识别, 一般手动按下一次键然后接着释放, 按键两片金属膜接触的时间大约为50ms 左右,在按下瞬间到稳定的时间为5-10ms,在松开的瞬间到稳定的时间也为5-10ms,如果我们在首次检测到键被按下后延时10ms 左右再去检测,这时如果是干扰信号将不会被检测到,如果确实是有键被按下,则可确认,以上为按键识别去抖动的原理。
(2) 独立按键识别: 判断是否按下键盘,当单片机上电时所有I/O 口为高电平,参照实验电路图, S2 键一端接地另一端接P3.4,所以当键被按下时P3.4 口直接接地,此时检测P3.4 肯定为低电平。
(3) 矩阵键盘识别: 参照实验电路图, 矩阵键盘的四行分别与P3.0-P3.3 连接,四列分别与P3.4-P3.7 连接。
如识别第1列按键, 可给P3.4送低电平,其余为高电平, 把P3口数据读回, 判断其第4位是否全为1, 如果全为1,则该列无键按下, 可继续判断下1列, 如有某位为0, 则有键按下,并可根据其位置识别按键所在行,从而确定该按键位置和键值. 其它各列按键识别类同.[实验目的](1)掌握独立按键的识别方法.(2)掌握按键去抖动的基本原理。
(3)了解矩阵键盘检测的操作方法。
(4)进一步巩固掌握数码管的显示操作方法.[硬件电路]图1 独立键盘和矩阵键盘电路图图2 矩阵键盘接口图。
4×4矩阵键盘的键值计算及编程

.j
2 读取I/O口值的练习
❖ 一般都是自高到低读出一个端口各脚电平 ,得到8位二进制 数,再将8位二进制转换成2位十六进数。
P1口值=P1.7 P1.6 P1.5 P1.4P1.3 P1.2 P1.1 P1.0 =1101 1111=0x df P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
.j
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键
值。
.j
4 键盘扫描编程__线反转法
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 {
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
e0+0e=ee d0+0e=de b0+0e=be 70+0e=7e
e0+0d=ed d0+0d=dd b0+0d=bd 70+0d=7d
(3行,1列) (3行,2列) (3行,3列) (3行,4列)
e0+0b=eb
d0+0b=db b0+0b=bb 70+0b=7b
(4行,1列) (4行,2列) (4行,3列) (4行,4列)
e0+07=e7
d0+07=d7 b0+07=b7 70+07=77
实验七 矩阵式键盘

实验七矩阵式键盘一、实验目的1.掌握矩阵式键盘处理的方法。
二、实验内容1.用4×4键盘的键值定义为0~15,并在二位LED数码管上动态显示出来。
三、实验步骤说明用4×4键盘的键值定义为0~15,并在二位LED数码管上动态显示出来。
1) 硬件P0口为字形码,P2口为字选码。
P1控制键盘,其中P1.0~P1.3为输出扫描码,P1.4~P1.7为回复码。
2)程序框架定义函数和数组void DelayMS(uchar x) ;// 延时子程序void Display(uchar y); // 显示子程序uchar keys();// 求键值子程序uchar keyno();//判断是否有键按下uchar code DSY_CODE[] = {0x28, 0x7e, 0xa2, 0x62, 0x74, 0x61, 0x21, 0x7a, 0x20, 0x60};uchar key_value=99;//按键键值//-----------------------------------------------------------------// 主程序//-----------------------------------------------------------------void main(){while(1){设置P1.0~P1.3为输入口全1,P1.4~P1.7为列值,置全0。
调显示函数,显示键值key_value如果有键按下调键值函数并赋给key_value}}//-----------------------------------------------------------------// 延时子程序//-----------------------------------------------------------------void DelayMS(uchar x){}//-----------------------------------------------------------------// 显示子程序//-----------------------------------------------------------------void Display(uchar y){显示黑屏;显示十位延时显示黑屏;显示个位延时}//-----------------------------------------------------------------// 判断是否有键按下子程序,没有返回0,有返回1//-----------------------------------------------------------------uchar keyno(){}//-----------------------------------------------------------------uchar keys();// 求键值子程序,返回键值//-----------------------------------------------------------------uchar keys(){设置P1.0~P1.3为输入口全1,P1.4~P1.7为列值,置全0。
矩阵键盘操作说明

矩阵键盘操作说明一、系统复位1按数字键0后,按MON键2输入99后,按NEXT键二、键盘视频选择首先是监视器选择然后是摄像机选择1、按键盘上的CLEAR键,清除键盘数字输入ENTER区中的数字显示2、输入所选择的监视器号,该数字在键盘数字输入ENTER区中显示3、按MON键,该监视器号在键盘监视器MONITOR区中显示4、同时系统主机将返回该监视器对应的图像号,在键盘的摄像机CAMERA区中显示。
5、输入选择的摄像机号,该数字在键盘数字输入ENTER区中显示6、按CAM键7、系统主机将返回该图像号,在键盘的摄像机CAMERA区中显示则选择的图像再选择的监视器上显示三、图像区域切换在指定的监视器上运行一个指定区域的图像切换,该功能可以在任何一个监视上浏览切换所有的图像操作步骤如下:1、按键盘上CLERA键,清除数字输入ENTER区中的数字显示2、输入所选择的监视器号,该数字在键盘数字输入ENTER区中显示3、按MON键,该监视器号在键盘监视器MONITOR区中显示4、输入区域切换中的开始图像号5、按ON键,确认开始区域的开始图像6、输入区域切换中的结束图像号7按OFF键确定区域切换的结束图像完成后则该监视器开始区域切换依次按照设定的图像号进行切换如要添加一个图像到切换序列中则:1和设置区域切换的步骤一样重复1-3步,选择一个监视器,该监视必须已存在一个切换队列2、输入所希望添加的摄像机图像好,该摄像机图像号必须在系统的最大允许摄像机图像号的范围内3、按组合键ENTER-ON,ENTER键必须在前面,确定添加的图像。
如要在切换队列中删除一个图像:1、和设置区域切换的步骤一样重复1-3步,选择一个监视器,该监视必须已存在一个切换队列2输入所希望添加的摄像机图像好,该摄像机图像号必须在这个序列切换范围内。
3、按组合键ENTER-OFF,ENTER必须在前面,确认删除图像。
四、报警设置单布防针对需要布防的防区一个一个的布防,防区布防后,根据监视器与防区触点权限表,自动将该防区分配到与之对应的监视器上。
单片机矩阵键盘

按键抖动时间一般小于20ms,通常使用 延时的方法消除按键抖动,检测到“按 键按下”或“按键抬起”则延时20ms再 去检测该按键,若状态一致则说明有按 键按下或抬起
矩阵键盘信号线
行线(单片机写入到74HC573) 列线(单片机从74HC245读取) 片选线号 总线地址的计算
行线(单片机输出到573)
实验五
矩阵键盘
矩阵键盘
在键盘中按键数量较多时,为了减少I/O 口的占用,通常将按键排列成矩阵形式, 在矩阵式键盘中,每条水平线和垂直线 在交叉处不直接连通,而是通过一个按 键加以连接。这样,一个8位端口就可以 构成4*4=16个按键
4*4矩阵键盘
上拉电阻:给输入提供一个稳定的高电平
矩阵键盘工作原理
列线(单片机从245读取)
片选信号
总线地址的计算
当A15为1,A10-A8为0时74HC138的 Y0输出为0,即CS0为低电平。 则CS0地址为(二进制1XXXX000 XXXXXXXX),可取为0F8FFH,即为矩阵键盘 地址。
软件设计
获得按键
1. 2. 3. 4. 5.
判断是否有按键按下,没按键则结束 消抖动 获取键值 等待按键松开,进行松开时去抖动 结束
显示键值
将键值显示在数码管上
实验要求
编写按键处理显示程序
读取键值 将键值(1-16)显示在数码管上 包含按键消抖处理
参考资料
“MCS51单片机系统学习平台V1.1”原理图 实例代码
C51Pro\ lab5_asm
判断键盘中有无键按下
4根行线置为低电平,读取4根列线,只要列线中 有一根为低电平,则说明该列有按键按下,并得到列数n。
矩阵键盘键值的计算方法 (2)

矩阵键盘键值的计算方法矩阵键盘是一种常见的输入设备,广泛应用于计算机、手机、电子器件等。
它通过将按下的键映射为一个特定的键值,实现对应用程序的输入控制。
本文将介绍矩阵键盘键值的计算方法,帮助读者了解矩阵键盘的工作原理和键值计算的方法。
一、矩阵键盘的基本原理矩阵键盘由多个行和列的按键构成,这些按键被排列成一个矩阵,行与列之间形成交叉点。
按下某个按键时,会使得对应行和列之间形成闭合电路。
矩阵键盘通过扫描行和列,检测到闭合电路,从而确定所按下的按键。
二、矩阵键盘键值计算的方法1. 扫描行和列矩阵键盘首先需要扫描行和列,以检测闭合电路。
这个过程可以通过控制行和列的输入输出来实现。
首先将所有行设置为高电平输出状态,然后逐行将其设置为低电平状态,同时检测列的输入状态。
如果某一列为低电平,则说明该行和列之间的按键闭合,即键盘检测到按键按下的动作。
2. 确定键值在检测到按键闭合后,需要进一步确定对应的键值。
这个过程需要根据键盘的布局和键盘的编码规则来实现。
一般情况下,我们可以以行列号的方式对键盘按键进行编码。
假设有N 行M 列的键盘,按下的按键位于第i 行第j 列,则键值可表示为(i-1)*M + j。
通过这种方式,我们可以根据按下的行和列号计算出对应按键的键值。
假设有一个4 行4 列的矩阵键盘,按下的按键位于第3 行第2 列。
按照上述计算方法,我们可以得到键值为(3-1)*4 + 2 = 10。
因此,按下的按键对应的键值为10。
3. 键值的应用计算出按键的键值后,我们可以将其应用于对应的应用程序中。
键值可以作为输入信号传递给应用程序,根据键值的不同,应用程序可以执行相应的操作。
例如,将键值与预先定义的按键映射表进行匹配,可以实现不同按键对应的功能,如快捷键、功能键等。
矩阵键盘键值的计算方法涉及到扫描行和列,确定键值等关键步骤。
通过扫描行和列,可以检测到按键的闭合电路;通过确定键值,可以识别所按下的按键。
这种计算方法可以广泛应用于矩阵键盘的设计和开发中,帮助我们理解矩阵键盘的工作原理和键值计算的方法,并将其应用到实际的应用程序中。
矩阵键盘——精选推荐

矩阵键盘1.⾏扫描法⼯作原理(查询法)判别键盘中有⽆键按下。
向⾏线输出全0,读⼊列线状态。
如果有键按下,总有⼀列线被拉⾄低电平,从⽽使列输⼊不全为1。
查找按下键所在位置。
依次给⾏线送低电平,查列线状态。
全为1,则所按下的键不在此⾏;否则所按下的键必在此⾏且是在与零电平列线相交的交点上的那个键。
对按键位置进⾏编码。
找到所按下按键的⾏列位置后,对按键进⾏编码,即求得按键键值。
#includechar key(){char row,col, k =-1; //定义⾏、列、返回值P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回for(row=0;row<4;row++) //⾏扫描{ P1=~(1<k=P1&0xf0;if(k!=0xf0) //列线不全为1,{ while(k&(1<<(col+4))) //所按键在该列col++; //查找为0列号k=row*4+col; //计算键值P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放break;} }return k; //返回键值}3.⾏列反转法⼯作原理判别键盘中有⽆键按下。
(⽅法同⾏扫描法)输⼊变输出,再读。
将上⼀步读取到的列线输⼊值从列线输出,读取⾏线值。
定位求键值。
根据上⼀步输出的列线值和读取到的⾏线值就可以确定所按下键所在的位置,从⽽查表确定键值。
#includechar key(){char code keycode[]= {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}char row,col,k=-1,i;P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回-1 delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回-1 P1=0xf0;col=P1&0xf0; //⾏输出全0,读取列值P1=col|0x0f;row=P1&0x0f; //列值输出,读取⾏值//查找⾏列组合值在键盘表中位置for(i=0;i<16;i++)if((row|col)==keycode[i]) //找到,i即为键值,{ //否则,返回-1key=i; //对重复键,该⽅法break; //处理为⽆键按下}P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放return k; //返回键值}。
矩阵按键的原理及代码实现

矩阵按键的原理及代码实现
独⽴按键和矩阵按键:
矩阵按键扫描原理:
⽅法⼀、逐⾏扫描,我们可以通过⾼四位轮流输出低电平来对矩阵键盘进⾏扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪⼀位为0来判断是哪⼀个按键被按下。
⽅法⼆、⾏列扫描,我们可以通过⾼四位全部输出低电平,低四位输出⾼电平,当接收到的数据,低四位不全为⾼电平时,说明有按键按下,然后通过接受的数据值,判断是哪⼀列有按键按下,然后再反过来,⾼四位输出⾼电平,低四位输出低电平,然后根据接收到的⾼四位的值判断是哪⼀⾏有按键按下,这样就能够确定是哪⼀个按键按下了。
通常我们⽤到的是⾏列扫描
代码实现:(待更新)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义 Value_h 行值变量 Value_l 列值变量
特意置: 行线高电平,列线 低电平,去找行值
delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下
{ value_h=P2&0xf0; //读出P2口值给变量value_h
NO 行线高电平有 变化吗?
YES 延时,防抖
0x0d
0x0b
9
专业类别
2 读取I/O口值的练习
总结
开关接通后,如果两引脚上电平不同时,会将高电平引脚电压变 低。
10
专业类别
3 键盘的键值
P2口接有4×4 键盘,低四位做行线,高四位做列线。
11
专业类别
3 键盘的键值
找行线值时,程序使P2=0x0f; P2.0行线上开关按下会使P2口值变为 0x0e, 其余同理。
低。
5
专业类别
2 读取I/O口值的练习
❖ 一般都是自高到低读出一个端口各脚电平 ,得到8位二进制 数,再将8位二进制转换成2位十六进数。
P1口值=P1.7 P1.6 P1.5 P1.4P1.3 P1.2 P1.1 P1.0 =1101 1111=0x df P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
if((P2&0xf0)!=0xf0) //判断是否有键按下
{
delay(10); //延时防抖
if((P2&0xf0)!=0xf0) //仍有键按下
{
value_h=P2&0xf0; //读出P2口值给变量value_h
P2=0x0f; //将列线所处位置置高电平
value_l=P2&0x0f; //读出P2口值给变量value_l
线反转法
4×4矩阵键盘的键值计算及编程
51单片机C语言编程及Proteus仿真
本讲主要内容
1
键值计算基本原理
2
读取I/O口值的练习
3
键盘的键值计算
4
键盘扫描编程__线反转法
5
一个数码管显示矩阵键盘值的实验
2
专业类别
1 键值计算基本原理__“好人被带坏”
❖ 默认状态:单片机通电复位后P1 P2 P3口每个脚 都输出高电平,P0口要接上拉电阻才能输出高电平。
a 各脚状态标记都是红色方块。 b 用电压测量都是5V。
3
专业类别
1 键值计算基本原理__“好人被带坏”
❖ 要使一个引脚变为低电平有如下方法:
a 接地。 b 用逻辑状态信号人为改变。 c 编写程序使其输出低电平。
4
专业类别Biblioteka 1 键值计算基本原理__“好人被带坏”
❖ 一个低电平引脚与高电平引脚相接,结果如何? 实验结果:“好人被带坏”,即高电平引脚电压被变
❖ 当 P2=0xf0; 外接一个两脚开关到P2口只能让P2产生如 下四个新的值: 0xe0, 0xd0,0xb0,0x70
0xe0
0x70
8
专业类别
2 读取I/O口值的练习
❖ 当 程序使P2=0x0f; 外接一个两脚开关到P2口只能让P2 产生如下四个新的值: 0x0e, 0x0d,0x0b,0x07
return(value_l+value_h); //找到的键值返回给调用函数
}
}
}
17
专业类别
4 键盘扫描编程__线反转法流程分析
/************键盘扫子描函数*******************/
char keyscan(void) //键盘扫描函数,键盘使用P2口
开始
{ char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 {
P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l
NO 行线高电平有 变化吗?
3 键盘的键值
注:行列线的排列不同,键值分布也不同
14
专业类别
计算键值一般方法
找出行线值
置行线所处端口位置高电平
找出列线值
置列线所处端口位置高电平
行线值+列线值=键值
3 键盘的键值
15
键盘的键值
位置
键值
(1行,1列) e7 (1行,2列) eb (1行,3列) ed (1行,4列) ee
(2行,1列) d7 (2行,2列) db (2行,3列) dd (2行,4列) de
值。
16
专业类别
4 键盘扫描编程__线反转法
/************键盘扫子描函数*******************/
char keyscan(void) //键盘扫描函数,键盘使用P2口
{
char value_h,value_l; //value_h行值变量,value_l列值变量
P2=0xf0; //将行线所处位置置高电平
P1口高四位是指:P1.7 P1.6 P1.5 P1.4 P1口低四位是指:P1.3 P1.2 P1.1 P1.0
6
专业类别
2 读取I/O口值的练习
❖ 用程序控制单片机P2口工作,让高四位全高电平,低四位 全低电平。 即:P2=0xf0;
具体实现见操作,结果如图。
7
专业类别
2 读取I/O口值的练习
12
专业类别
3 键盘的键值
找列线值时,程序使P2=0xf0; P2.7列线上开关按下会使P2口值变为 0x70, 其余同理。
13
专业类别
键盘的键值
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
e0+0e=ee d0+0e=de b0+0e=be 70+0e=7e
(3行,1列) b7 (3行,2列) bb (3行,3列) bd (3行,4列) be
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
专业类别
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键
e0+0d=ed d0+0d=dd b0+0d=bd 70+0d=7d
(3行,1列) (3行,2列) (3行,3列) (3行,4列)
e0+0b=eb
d0+0b=db b0+0b=bb 70+0b=7b
(4行,1列) (4行,2列) (4行,3列) (4行,4列)
e0+07=e7
d0+07=d7 b0+07=b7 70+07=77