矩阵键盘单片机识别实验与程序
基于单片机的矩阵键盘操作实验
实验十二基于单片机的矩阵键盘操作实验12.1 实验目的1. 掌握单片机AT89C52与矩阵键盘的接口技术。
2. 用protues实现该接口的电路设计和程序设计,并进行实时交互仿真。
3. AT89C52单片机对4×4矩阵键盘进行动态扫描,当按完一次键盘时,可将相应按键值(0-F)实时显示在数码管上。
12.2 PROTUES电路设计单片机与矩阵键盘的接口电路原理图如图12-1所示。
图12-1 单片机与矩阵键盘的接口电路原理图12.3 实验内容键盘分编码键盘和非编码键盘。
键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘。
在单片机组成的各种系统中,用的最多的是非编码键盘,也有用到编码键盘的。
1.从PROTUES库中选取元器件① AT89C52:单片机;② RES:电阻;③ 7SEG-MPX2-CC-BLUE:七段共阴绿色数码管;④ CAP/CAP-ELEC:电容、电解电容;⑤ CRYSTAL:晶振;⑥ BUTTON:按键。
2.放置元器件3.放置电源和地(终端)4.连线5.元器件属性设置6.电气检测12.4 程序设计1. 流程图矩阵键盘操作程序流程图如图12-2所示。
图12-2 矩阵键盘操作程序流程图2.源程序设计C程序设计:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit we1=P1^0;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0};uchar num,temp,num1;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}uchar keyscan();void display(uchar aa);void main(){num=17;while(1){display(keyscan());}}void display(uchar aa){P2=table[aa-1];we1=0;}uchar keyscan(){P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:num=1;break;case 0xde:num=2;break;case 0xbe:num=3;break;case 0x7e:num=4;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:num=5;break;case 0xdd:num=6;break;case 0xbd:num=7;break;case 0x7d:num=8;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:num=9;break;case 0xdb:num=10;break;case 0xbb:num=11;break;case 0x7b:num=12;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:num=13;break;case 0xd7:num=14;break;case 0xb7:num=15;break;case 0x77:num=16;break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return num;}12.5 PROTUES仿真矩阵键盘仿真图如图12-3所示。
单片机 矩阵键盘实验 实验报告
单片机矩阵键盘实验实验报告一、实验目的本次实验的目的是掌握原理和方法,利用单片机识别矩阵键盘并编程实现键码转换功能,控制LED点亮显示。
二、实验原理矩阵键盘是一种由多路单向控制器输入行选择信号与列选择信号连接而形成的一一对应矩阵排列结构。
它广泛应用于电子游戏机、办公自动化设备、医疗仪器、家电控制及书籍检索机器等方面。
本次实验采用的矩阵键盘是一个4 x 4矩阵,用4段数码管显示按键编码,每个按键都可以输入一个代码,矩阵键盘连接单片机,实现一个软件算法来识别键码转化。
从而将键盘中的按键的按下信号转换成程序能够识别的代码,置于相应的输出结果中,控制LED点亮,从而可以实现矩阵键盘按键的转换功能。
三、实验方法1.硬件搭建:矩阵键盘(4行4列)与单片机(Atmel AT89C51)相连,选择引脚连接,并将数码管和LED与单片机相连以实现显示和点亮的功能。
2.程序设计:先建立控制体系,利用中断服务子程序识别和码值转换,利用中断服务子程序实现从按键的按下信号转换为程序能够识别的代码,然后将该代码段编写到单片机程序中,每次按下矩阵键盘按键后单片机给出相应的按键编码输出,用数码管显示,控制LED点亮。
四、实验结果经过实验,成功实现了矩阵键盘与单片机之间的连接,编写了中断服务子程序,完成了按键编码输出与LED点亮的功能。
实验完成后,数码管显示各种按键的编码,同时LED会点亮。
本次实验介绍了矩阵键盘的原理,论述了键码转换的程序设计步骤,并实验完成矩阵键盘与单片机的连接,实现用LED点亮以及数码管显示按键的编码。
通过本次实验,受益匪浅,使我对使用单片机编写算法与程序有了更深入的认识,同时丰富了课堂学习的内容,也使我更加热爱自己所学的专业。
单片机 矩阵键盘实验 实验报告
实验五矩阵键盘实验一、实验内容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个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
实验一 矩阵键盘检测
实验一矩阵键盘检测一、实验目的:1、学习非编码键盘的工作原理和键盘的扫描方式。
2、学习键盘的去抖方法和键盘应用程序的设计.二、实验设备:51/AVR实验板、USB连接线、电脑三、实验原理:键盘接口电路是单片机系统设计非常重要的一环,作为人机交互界面里最常用的输入设备。
我们可以通过键盘输入数据或命令来实现简单的人机通信。
1、按键的分类一般来说,按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。
前者造价低,后者寿命长.目前,微机系统中最常见的是触点式开关按键(如本学习板上所采用按键)。
按键按照接口原理又可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。
编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的识别.全编码键盘由专门的芯片实现识键及输出相应的编码,一般还具有去抖动和多键、窜键等保护电路,这种键盘使用方便,硬件开销大,一般的小型嵌入式应用系统较少采用。
非编码键盘按连接方式可分为独立式和矩阵式两种,其它工作都主要由软件完成.由于其经济实用,较多地应用于单片机系统中(本学习板也采用非编码键盘)。
2、按键的输入原理在单片机应用系统中,通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。
也就是说,它能提供标准的TTL 逻辑电平,以便与通用数字系统的逻辑电平相容。
此外,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。
当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能。
因此,键信息输入是与软件结构密切相关的过程。
对于一组键或一个键盘,通过接口电路与单片机相连.单片机可以采用查询或中断方式了解有无按键输入并检查是哪一个按键按下,若有键按下则跳至相应的键盘处理程序处去执行,若无键按下则继续执行其他程序。
单片机矩阵键盘
按键在闭合和断开时,触点会存在抖动现象:
数码管前三位显示一个跑表,从000到999之间以1%秒速度运行,当按下一个独立键盘时跑表停止,松开手后跑表继续运行。(用定时器设计表)。
在上题的基础上,用另外三个独立键盘实现按下第一个时计时停止,按下第二个时计时开始,按下第三个是计数值清零从头开始。
键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码
ANL A,#0FH
CJNE A,#0FH,KCODE;
MOV A,R1
SETB C RLC A JC NEXT2 NEXT3: MOV R0,#00H RET KCODE: MOV B,#0FBH NEXT4: RRC A INC B JC NEXT4 MOV A,R1 SWAP A NEXT5: RRC A INC B INC B INC B INC B 。
按下16个矩阵键盘依次在数码管上显示1-16的平方。如按下第一个显示1,第二个显示4...
识别方法
04
03
01
02
3、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。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”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值 4、为了保证键每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。
矩阵键盘过程及扫描程序
键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。
即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。
矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。
查找哪个按键被按下的方法为:一个一个地查找。
先第一行输出0,检查列线是否非全高;否则第二行输出0,检查列线是否非全高;否则第三行输出0,检查列线是否非全高;如果某行输出0时,查到列线非全高,则该行有按键按下;根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。
下面是具体程序:void Check_Key(void){unsigned char row,col,tmp1,tmp2;tmp1 = 0x10;//tmp1用来设置P1口的输出,取反后使P1.4~P1.7中有一个为0for(row=0;row<4;row++) // 行检测{P1 = 0x0f; // 先将p1.4~P1.7置高P1 =~tmp1; // 使P1.4~p1.7中有一个为0tmp1*=2; // tmp1左移一位if ((P1 & 0x0f) < 0x0f)// 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测{tmp2 = 0x01; // tmp2用于检测出哪一列为0for(col =0;col<4;col++) // 列检测{if((P1 & tmp2)==0x00)// 该列如果为低电平则可以判定为该列{key_val =key_Map[ row*4 +col ];// 获取键值,识别按键;key_Map为按键的定义表return; // 退出循环}tmp2*=2; // tmp2左移一位}}}} //结束。
单片机实验4 矩阵键盘实验
华南农业大学实验报告专业班次08电信1 组别200831120102 题目实验四矩阵键盘实验姓名陈建泽日期2010.11.03一、实验目的1. 学习非编码键盘的工作原理和键盘的扫描方式。
2. 学习键盘的去抖方法和键盘应用程序的设计。
二、实验设备:STC89C52单片机实验板、串口下载线、USB连接线、电脑三、实验原理键盘是单片机应用系统接受用户命令的重要方式。
单片机应用系统一般采用非编码键盘,需要由软件根据键扫描得到的信息产生键值编码,以识别不同的键。
本板采用4*4矩阵键盘,行信号分别为P1.0-P1.3,列信号分别为P1.4-P1.7。
具体电路连接见下图矩阵键盘电路原理图对于键的识别一般采用逐行(列)扫描查询法,判断键盘有无键按下,由单片机I/O口向键盘送全扫描字,然后读入列线状态来判断。
成绩:教师:日期:四、实验步骤1. 分析实验所用到的电路原理图,根据需要连接跳线帽(由于P1.3和P1.4管脚和实时时钟芯片DS1302复用,所有在做矩阵键盘实验的时候务必拔去板上的DS1302芯片,以免产生干扰)。
2.按不同的键,用数码管的最后一位显示按键的键值。
3. 画出流程图。
4.根据流程图编写实验程序,并完成调试。
五、实验流程图矩阵键盘实验流程图六、实验程序/******************实验四 矩阵键盘实验****************/;实验名称:矩阵键盘实验;功 能:4*4矩阵键盘,按不同的键,用数码管的最后一位显示按键的键值。
1.置所有行值为低电平2.读取列的状态,给 A 开始A !=0? 延时10ms ,去抖动 置行计数器R0=00H 列列计数器R1=00H 置行输出扫描初始值为0FEH 输出行扫描字,置某一行为低 有列被按下? 行计数器增1 行扫描字左移一位 最后一行? 判断具体是哪一列按下 存列号到R1 计算键值并显示;编写人:陈建泽;编写时间:2010年11月2日/**********************程序代码************************/ORG 0000H ;上电或复位后初始化引导程序地址AJMP MAIN ;跳转到主程序ORG 0000HAJMP MAINORG 0030HMAIN: MOV P2,#0F7H ;选通数码管最后一位MOV P1,#0F0H ;令所有行为低电平MOV R7,#100 ;让P1输出稳定DJNZ R7,$MOV A,P1 ;先确定是否有键按下ANL A,#0F0HXRL A,#0F0H ;与上一句作用,判断是否有按键按下JZ MAIN ;无则重新扫描LCALL D10MS ;延时10ms,去除抖;判断是否确实有按键按下MOV A,#00HMOV R0,A ;R0做行计数器,初始值为0MOV R1,A ;R1做列计数器,初始值为0MOV R2,#0FEH ;R2低4位为行扫描子,初始值为1111 1110B SKEY0:MOV A,R2MOV P1,A ;输出行扫描字,先扫第一行MOV R7,#10 ;让P1输出稳定DJNZ R7,$MOV A,P1 ;读列值ANL A,#0F0HXRL A,#0F0H ;取列值JNZ LKEY ;A不为零,则确实有按键按下了;然后转去判断具体是哪一列INC R0 ;增1,记录准备扫描的下一行MOV A,R2RL A ;不带进位位,左移一位,准备扫描下一行MOV R2,AMOV A,R0 ;判断是否已经四行都扫描完了CJNE A,#04H,SKEY0AJMP MAIN ;都扫描完则循环开始;判断具体列值LKEY: JNB ACC.4,NEXT1 ;若ACC.4为1,则是第一列有按键按下了MOV A,#00H ;存0列号到R1MOV R1,AAJMP DKEY ;去计算键值并显示NEXT1:JNB ACC.5,NEXT2MOV A,#01H ;存1列号到R1MOV R1,AAJMP DKEYNEXT2:JNB ACC.6,NEXT3MOV A,#02H ;存2列号到R1MOV R1,AAJMP DKEYNEXT3:JNB ACC.7,MAIN ;到第四列都检测不到,则从新开始MOV A,#03H ;存3列号到R1MOV R1,AAJMP DKEY;计算键值并显示键值DKEY: MOV A,R0 ;取行号给AMOV B,#04HMUL ABADD A,R1 ;根据键值=行号*4+列号计算出具体键值AJMP SQR ;根据键值查询字型码/*********************查表子程序***************************/SQR: MOV DPTR,#TAB ;表首地址给DPTRMOVC A,@A+DPTR ;查第一个字型的字型码MOV P0,A ;送段码,数码管显示具体值AJMP MAIN ;返回开始TAB: DB 0C0H,0F9H,0A4H,0B0H,99H, 92H, 82H, 0F8H ;共阳极字型码表0——7 DB 80H, 90H, 88H, 83H, 0C6H,0A1H,86H, 8EH ;共阳极字型码表8——F/*********************10ms延时子程序**********************/D10MS:MOV R6,#10L1:MOV R5,#248DJNZ R5,$DJNZ R6,L1RETEND/*********************程序编写结束*************************/根据实验流程图,编写出一下实验程序。
×4矩阵键盘51单片机识别实验与程序
4×4矩阵键盘51单片机识别实验与程序1.实验任务图2.硬件电路原理图图3.系统板上硬件连线(1.把“单片机系统“区域中的-端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;(2.把“单片机系统”区域中的AD0-AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:AD0对应着a,AD1对应着b,……,AD7对应着h。
4.程序设计内容(1.4×4矩阵键盘识别处理(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
5.程序框图图C语言源程序#include <>unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char temp;unsigned char key;unsigned char i,j;void main(void){while(1){P3=0xff;P3_4=0;temp=P3;temp=temp & 0x0f;if (temp!=0x0f){for(i=50;i>0;i--)for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f;if (temp!=0x0f){temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=7;break;case 0x0d:key=8;break;case 0x0b:key=9;break;case 0x07:key=10;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {temp=temp & 0x0f; }}}P3=0xff;P3_5=0;temp=P3;temp=temp & 0x0f; if (temp!=0x0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0x0f; if (temp!=0x0f) {temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=4;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {temp=P3;temp=temp & 0x0f; }}}P3=0xff;temp=P3;temp=temp & 0x0f; if (temp!=0x0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0x0f; if (temp!=0x0f) {temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=1;break;case 0x0d:key=2;break;case 0x0b:key=3;break;case 0x07:key=12;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0x0f; while(temp!=0x0f) {temp=P3;temp=temp & 0x0f; }}}P3=0xff;P3_7=0;temp=P3;temp=temp & 0x0f; if (temp!=0x0f) {for(i=50;i>0;i--) for(j=200;j>0;j--);temp=P3;temp=temp & 0x0f; if (temp!=0x0f) {temp=P3;temp=temp & 0x0f; switch(temp){case 0x0e:key=0;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}temp=P3;P1_0=~P1_0;P0=table[key];temp=temp & 0x0f; while(temp!=0x0f) {temp=P3;temp=temp & 0x0f; }}}}}。
单片机矩阵键盘实验
单片机独立按键和矩阵键盘操作[实验要求]独立按键操作: 试操作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 矩阵键盘接口图。
矩阵式键盘实验报告
矩阵式键盘实验报告矩阵键盘设计实验报告南京林业大学实验报告基于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。
51单片机的矩阵按键扫描的设计C语言程序
51单片机的矩阵按键扫描的设计C语言程序以下为一个基于51单片机的矩阵按键扫描的设计C语言程序:```c#include <reg51.h>//定义端口连接到矩阵键盘sbit col1 = P2^0;sbit col2 = P2^1;sbit col3 = P2^2;sbit row1 = P2^3;sbit row2 = P2^4;sbit row3 = P2^5;sbit row4 = P2^6;//声明按键函数char read_keypad(;void maiwhile (1)char key = read_keypad(; // 读取按键值//根据按键值进行相应操作switch(key)case '1'://第一行第一列按键逻辑//在此处添加相应的代码break;case '2'://第一行第二列按键逻辑//在此处添加相应的代码break;//继续处理其他按键//...default://未识别到按键break;}}//按键扫描函数char read_keypacol1 = 0; col2 = 1; col3 = 1; // 激活第一列if (row1 == 0) { // 第一行第一列按键被按下while (row1 == 0); //等待按键释放return '1'; // 返回按键值}if (row2 == 0) { // 第二行第一列按键被按下while (row2 == 0); //等待按键释放return '4'; // 返回按键值}if (row3 == 0) { // 第三行第一列按键被按下while (row3 == 0); //等待按键释放return '7'; // 返回按键值}if (row4 == 0) { // 第四行第一列按键被按下while (row4 == 0); //等待按键释放return '*'; // 返回按键值}col1 = 1; col2 = 0; col3 = 1; // 激活第二列//处理第二列的按键逻辑//...col1 = 1; col2 = 1; col3 = 0; // 激活第三列//处理第三列的按键逻辑//...return '\0'; // 返回空字符表示未检测到按键```以上代码中,我们使用51单片机的P2端口连接到矩阵键盘的列和行,通过扫描不同的列和检测行的状态来判断按键是否被按下。
单片机 矩阵键盘实验 实验报告
单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。
2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。
3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。
4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。
5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。
实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。
实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。
单片机矩阵式键盘连接方法及工作原理
矩阵式键盘的连接方法和工作原理什么是矩阵式键盘?当键盘中按键数量较多时,为了减少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位,也就是把列线P1.0-P1.3 分别接4 个上拉电阻到电源,把列线P1.0-P1.3 设置为输入线,行线P1.4-P1.7 设置为输出线,4 根行线和4 根列线形成16 个相交点,如上图所示。
单片机按键实验报告
单片机按键实验报告篇一:单片机按键扫描实验报告键盘扫描一.实验目的(1)掌握矩阵键盘接口电路和键盘扫描编程方法。
(2)掌握按键值处理与显示电路设计。
二.实验任务(1)设计4*4键盘,编写各个键的特征码和对应的键值(0~F);(2)编程扫描按键,将按键对应的数字值使用数码管显示出来。
三.实验电路及连线方法1.采用动态显示连线方法:电路由2 片74LS573,1 个六字一体的共阴数码管组成。
由U15 输出段选码,U16 做位选码,与单片机的采用I/O 口连接方式,短路片J22 连接P2.0,J23 连接P2.3,做输出信号锁存。
(实际电路连接是d7-d6-d5-d4-d3-d2-d1-d0?h-c-d-e-g-b-a-f)。
PW12 是电源端。
2.键盘电路连线方法:电路由16 个按键组成,用P1 口扩展4×4 行列式键盘。
J20 是键盘连接端,连接到P1 口。
J21 是行列键盘、独立键盘选择端,当J21 的短路片连接2-3脚时,构成4×4 行列式键盘;当J21 的短路片连接2-1 脚时,可形成3×4 行列式键盘,4 个独立式按键S4、S8、S12、S16,这4 个独立按键分别连接P1.4~P1.7;其他12 个键3×4 行列式键盘。
PW15 是电源端。
四.编程思路1.采用反转法识别按键的闭合。
2.采用动态显示将键值显示出来。
五.算法流程图六.资源分配1.用P1口进行查找按键2.用R3做键值指针3.用R1做动态显示为选码指针。
4.R5为延时指针。
七.程序设计KPIN:ORG MOV MOV ANL MOV 0000H P1,#0F0H A,P1 A,#0F0H B,AMOVP1,#0FHMOVA,P1ANLA,#0FHORLA,BCJNE A,#0FFH,KPIN1AJMP EXITKPIN1: MOVB,AMOVDPTR,#TABKPMOVR3,#0KPIN2: MOVA,R3MOVC A,@A+DPTRCJNE A,B,KPIN3MOVA,R3LOOP: MOVR1,#0FEH;键盘动态显示 LOOP1: MOVA,R3ANLA,#0FHMOV DPTR,#TABMOVC A,@A+DPTRCLRP2.0CLRP2.1MOVP0,ASETB P2.0NOPCLRP2.0LOOP2: MOVA,R1;位选码MOVP0,ASETB P2.1MOVR5,#250LOOP3: DJNZ R5,LOOP3CLRP2.1SJMP LOOPKPIN3: INCR3CJNE A,#0FFH,KPIN2EXIT: RETTABKP: DB0EEH,0DEH,0BEH,7EH,0EDH,0DDH,0BDH,7DH,0EBHDB 0DBH,0BBH,7BH,0E7H,0D7H,0B7H,77H,67H,0FFHTAB: DB77H,44H,3EH,6EH,4DH,6BH,7BH,46H,7FH,6FH,5FHDB 79H,33H,7CH,3BH,1BHEND八.调试出现的问题及解决问题1:程序正常运行,但按键显示出现乱码解决:动态显示笔形码错误,并改正。
单片机实验五 -键盘实验
电子信息工程系实验报告课程名称:单片机与接口技术实验项目名称:键盘实验 实验时间:2013-5-23班级:通信10 姓名:Microlab_4 学号:实 验 目 的:熟悉keil 仿真软件、proteus 仿真软件的使用和实验板中行列式键盘的使用。
了解并熟悉行列式键盘的电路结构、与单片机的连接方法及其工作原理,理解掌握C51中单片机控制行列式键盘中判断按键是否按下、按键的识别、按键的消抖分别是如何实现的。
实 验 原 理:键盘是单片机系统中通用的输入设备,用于向系统输入数据或控制信息。
键盘中一般矩阵式(行列式)键盘用得较多,适用于按键数量较多的场合。
矩阵式键盘由行线和列线组成,按键位于行线、列线的交叉点上。
当键被按下,则其交点的行线和列线接通。
行和列可分别用两个I/O 口来控制。
判断是否有键按下时,行线通过上拉电阻接+5V 上,而先使所有列线为低电平(I /O 输出0),再读行线状态(输入口),当无键按下时,所有行线为高电平,即读到“全1”数据;当有某键按下时,总会有一根行线为低电平,即读到的数据不全为“1”。
按键的识别(识别键的行列位置)有两种方法:扫描法和反转法。
反转法将行线接一并口,做输出方式;列线接一并口,做输入方式。
使所有行线为低电平(送全“0”),读入列线值,为“0”的那列,即按键所在列;反过来,使行线做输入方式,列线做输出方式。
将刚读到的列线值输出,然后读行线值,为“0”的那行,即按键所在行。
编程时使用P1=0x0f;m=P1;P1=0xf0;n=P1;mn=m|n;即可得到按键的键值,每一个按键都有自己唯一的键值。
按键或键盘都是一个机械开关,键的按下和放开是利用机械触点的闭合和断开来实现的。
由于机械触点的弹性作用,一个按键开关在闭合及断开瞬间均有一连串的抖动,抖动的时间长短由按键的机械特性决定,一般为5~10ms。
为了确保按键动作只确认一次,必须消除抖动的影响。
一般采用延时的方法。
单片机 矩阵键盘实验 实验报告
实验五矩阵键盘实验一、实验内容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个键的反转码建一个表,通过查表就可知道是哪个键被按下了。
单片机原理及应用实验六--按键识别数码管显示实验
电子信息学院实验报告书课程名:《单片机原理及应用实验》题目:实验六按键识别数码管显示实验软件+硬件实验实验类别:【设计】班级:电子1313学号:26姓名:吴限评语:(1)电路连接调试:□正确□基本正确□不正确(2)实验程序编写:□正确□基本正确□不正确(3)数据测量分析:□准确□基本准确□不准确成绩:□A □B □C □D ,指导教师:王英赫1、实验内容或题目1)题目:按键识别数码管显示实验2)实验内容:数码管显示矩阵按键号。
2、实验目的与要求1)实验目的:掌握按键识别及数码管显示的实现方法。
2)实验要求:通过XL2000 的16 位矩阵按键,在数码管上分别显示0~9,A,B,C,D,E,F。
用Keil编译、Proteus仿真,代码下载到单片机实验箱上验证。
3、实验仪器(1)PC微机1台(2)实验箱 1台4、实验程序流程图5、实验程序 (实验程序清单作为附件放在最后)6、实验步骤1)keil 中C 语言程序实现。
2)在proteus 中完成电路图设计,并实现仿真。
开结初延显示有有判断N NY Y3)硬件实验部分:用一条8PIN 数据排线,把矩阵按键部份的JP50,接到CPU 部份的P1 口JP44;接8 位数码管的数据线。
将数码管部份的数据口JP5 接到CPU 部份的P0 口JP51;接8 位数码管的显示位线。
将数码管部份的显示位口JP8 接到CPU 部份的P2 口JP52.7、实验数据及结果8、思考题采用P3口控制矩阵按键输入,程序应该如何修改?答:本实验的程序中可以不用蜂鸣器驱动线,把以下程序的sbit BEEP = P3 ^ 7;及函数void beep()等删掉后;需要把扫描键值的函数改一下:unsigned char keyscan() {unsigned char scan1, scan2, keycode,j;P13= 0xf0;scan1 = P3;if (scan1 != 0xf0) //判键是否按下{delayms(10);scan1 = P3;if (scan1 != 0xf0) //二次判键是否按下{P1 = 0x0f;scan2 = P3;keycode = scan1 | scan2; //组合成键扫描编码for (j = 0; j < 16; j++){if (keycode == key_code[j]) //查表得键值{key = j;return (key); //返回有效键值}}}}elseP3 = 0xff;return (key = 16); //返回无效码} 即P1口换成P3口,而键编码数组是固定的,可以不变;此外主函数中的P1口也要改为P3口:void main(void) {P0 = 0xf7; //数码管初始显示"-"P2 = 0xfd;//数码管显示在第二位P3 = 0xff;while (1){keyscan();if (key < 16) //有效键值{P0 = disp_code[key]; //显示键值}}}<附件> 实验程序清单#include <reg52.h>#include <intrins.h>sbit BEEP = P3 ^ 7; //蜂鸣器驱动线unsigned char key;unsigned char code disp_code[] ={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xc0,0x86,0x8e,0xc0};unsigned char code key_code[] ={0xee, 0xed, 0xeb, 0xe7, 0xde, 0xdd, 0xdb, 0xd7, 0xbe, 0xbd, 0xbb,0xb7, 0x7e, 0x7d, 0x7b, 0x77 //键编码数组};char code SST516[3] _at_ 0x003b; //保留仿真器/********************延时子函数***************/void delayms(unsigned int ms){unsigned char t;while (ms--){for (t = 0; t < 114; t++);}}/*************x*0.14MS 延时子函数****************/void delayus(unsigned char x){unsigned char i;while (x--){for (i = 0; i < 14; i++){;}}}/******************蜂鸣器驱动子函数*****************/ void beep(){unsigned char i;for (i = 0; i < 250; i++){delayus(6);BEEP = !BEEP; //BEEP取反}BEEP = 1; //关闭蜂鸣器delayms(150); //延时}/******************键盘扫描子函数*********************/ unsigned char keyscan(){unsigned char scan1, scan2, keycode, j;P1 = 0xf0;scan1 = P1;if (scan1 != 0xf0) //判键是否按下{delayms(10); //延时10msscan1 = P1;if (scan1 != 0xf0) //二次判键是否按下{P1 = 0x0f;scan2 = P1;keycode = scan1 | scan2; //组合成键扫描编码for ( j = 0; j < 16; j++){if (keycode == key_code[ j]) //查表得键值{key = j;return (key); //返回有效键值}}}}elseP1 = 0xff;return (key = 16); //返回无效码}/*************************主函数***********************/void main(void){P0 = 0xf7; //数码管初始显示"-"P2 = 0xfd;//数码管显示在第二位P1 = 0xff;while (1){keyscan();if (key < 16) //有效键值{P0 = disp_code[key]; //显示键值beep(); //蜂鸣器响一声}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4×4矩阵键盘51单片机识别实验与程序1.实验任务
图4.14.1
2.硬件电路原理图
图4.14.2
3.系统板上硬件连线
(1.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4X4行列式键盘”区域中的C1-C4 R1-R4端口上;
(2.把“单片机系统”区域中的P0.0/AD0-P0.7/AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:P0.0/AD0对应着a,P0.1/AD1对应着b,……,P0.7/AD7对应着h。
4.程序设计内容
(1.4×4矩阵键盘识别处理
(2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和
“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要
消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接
地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,
通过软件查表,查出该键的功能。
5.程序框图
图4.14.3
C语言源程序
#include<AT89X51.H>
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x39,0x5e,0x79,0x71}; unsignedchartemp; unsignedcharkey; unsignedchari,j;
voidmain(void)
{
while(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--); temp=P3;
temp=temp&0x0f;
if(temp!=0x0f)
{
temp=P3;
temp=temp&0x0f; switch(temp)
key=7;
break;
case0x0d:
key=8;
break;
case0x0b:
key=9;
break;
case0x07:
key=10;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp&0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp&0x0f; }
}
}
temp=P3;
temp=temp&0x0f; if(temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp&0x0f; if(temp!=0x0f) {
temp=P3;
temp=temp&0x0f; switch(temp) {
case0x0e:
key=4;
break;
case0x0d:
key=5;
break;
case0x0b:
key=6;
break;
case0x07:
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp&0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp&0x0f; }
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp&0x0f; if(temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp&0x0f; if(temp!=0x0f)
temp=P3;
temp=temp&0x0f; switch(temp) {
case0x0e:
key=1;
break;
case0x0d:
key=2;
break;
case0x0b:
key=3;
break;
case0x07:
key=12;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp&0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp&0x0f;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp&0x0f; if(temp!=0x0f) {
for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;
temp=temp&0x0f; if(temp!=0x0f) {
temp=P3;
temp=temp&0x0f; switch(temp) {
case0x0e:
key=0;
break;
case0x0d:
key=13;
break;
key=14;
break;
case0x07:
key=15;
break;
}
temp=P3;
P1_0=~P1_0;
P0=table[key]; temp=temp&0x0f; while(temp!=0x0f) {
temp=P3;
temp=temp&0x0f; }
}
}
}
}。