单片机按键矩阵识别(含程序、原理图)

合集下载

4×4矩阵键盘51单片机识别实验及程序

4×4矩阵键盘51单片机识别实验及程序

4×4矩阵键盘51单片机识别实验与程序1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F〞序号。

对应的按键的序号排列如图4.14.1所示图4.14.12.硬件电路原理图图4.14.23.系统板上硬件连线〔1.把“单片机系统“区域中的P3.0-P3.7端口用8芯排线连接到“4*4行列式键盘〞区域中的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.3C语言源程序*include <AT89*51.H>unsigned char code table[]={0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71};unsigned char temp;unsigned char key;unsigned char i,j;void main(void) {while(1){P3=0*ff;P3_4=0;temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=7;break;case 0*0d:key=8;break;case 0*0b:key=9;break;case 0*07:key=10;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}P3=0*ff;P3_5=0;temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=4;break;case 0*0d:break;case 0*0b:key=6;break;case 0*07:key=11;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}P3=0*ff;temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=1;break;case 0*0d:key=2;break;case 0*0b:break;case 0*07:key=12;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}P3=0*ff;P3_7=0;temp=P3;temp=temp & 0*0f;if (temp!=0*0f) {for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3;temp=temp & 0*0f; if (temp!=0*0f) {temp=P3;temp=temp & 0*0f; switch(temp){case 0*0e:key=0;break;case 0*0d:key=13;break;case 0*0b:key=14;break;case 0*07:key=15;break;}temp=P3;P1_0=~P1_0;P0=table[key]; temp=temp & 0*0f; while(temp!=0*0f) {temp=P3;temp=temp & 0*0f; }}}}}。

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

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

单片机实验报告信息处理实验实验二矩阵键盘专业:电气工程及其自动化指导老师:***组员:明洪开张鸿伟张谦赵智奇学号: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单片机的并口能够动态地改变输入输出方式,因此,矩阵键盘采用行反转法识别最为简便。

单片机实现4X4矩阵键盘控制项目PPT课件

单片机实现4X4矩阵键盘控制项目PPT课件

-
5
• 在矩阵按键处理过程中,一旦检测到有按 键闭合与确认按键已经稳定闭合期间,通 过调用10-20ms延时子程序避开按键抖动问 题。由于按键是机械器件,按下或者松开 时有固定的机械抖动,抖动图如图所示。
-
6
• 按键去抖分为硬件去抖和软件去抖,硬件去抖最简单的是 按键两端并联电容,容量根据实验而定。软件去抖使用方 便不增加硬件成本,容易调试,所以现在处理按键抖动问 题大部分选择软件去抖。软件去抖操作步骤如下:
-
10
13.4 项目软件程序设计
• 矩阵键盘行线P20~P23为输出线,列线 P24~P27为输入线。单片机将行线(P20~P23) 全部输出低电平,此时读入列线数据,若列线 全为高电平则没有键按下,当列线有出现低电 平时调用延时程序以此来去除按键抖动。延时 完成后再判断是否有低电平,如果此时读入列 线数据还是有低电平,则说明确实有键按下, 再来进一步确定键值。
51单片机
VC C P0. 0 P0. 1 P0. 2 P0. 3 P0. 4 P0. 5 P0. 6 P0. 7 EA/VPP PROG/ ALE PSEN A15/P2. 7 A14/P2. 6 A13/P2. 5 A12/P2. 4 A11/P2. 3 A10/P2. 2 A9/P2. 1 A8/P2. 0

case 0xdd:P0=table[5];break; //显示按键码“5”

case 0xbd:P0=table[6];break; //显示按键码“6”

case 0x7d:P0=table[7];break; //显示按键码“7”

case 0xeb:P0=table[8];break; //显示按键码“8”

单片机4×4矩阵键盘设计方案

单片机4×4矩阵键盘设计方案

1、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号。

(2)键盘中对应按键的序号排列如图14.1所示。

2、参考电路图14.2 4×4矩阵式键盘识别电路原理图3、电路硬件说明(1)在“单片机系统”区域中,把单片机的P3.0-P3.7端口通过8联拨动拨码开关JP3连接到“4×4行列式键盘”区域中的M1-M4,N1-N4端口上。

(2)在“单片机系统”区域中,把单片机的P0.0-P0.7端口连接到“静态数码显示模块”区域中的任何一个a-h端口上;要求:P0.0对应着a,P0.1对应着b,……,P0.7对应着h。

4、程序设计内容(1)4×4矩阵键盘识别处理。

(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

5、程序流程图(如图14.3所示)6、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUALCALL PANDUANLCALL XIANSHILJMP START;;;;;;;;;;初始化程序;;;;;;;;;;CHUSHIHUA: MOV COUNT,#00HRET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;;PANDUAN: MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHJZ SW1LCALL DELAY10MS JZ SW1MOV A,P3ANL A,#0FHCJNE A,#0EH,K1 MOV COUNT,#0 LJMP DKK1: CJNE A,#0DH,K2 MOV COUNT,#4 LJMP DKK2: CJNE A,#0BH,K3 MOV COUNT,#8 LJMP DKK3: CJNE A,#07H,K4 MOV COUNT,#12K4: NOPLJMP DKSW1: MOV P3,#0FFH CLR P3.5MOV A,P3ANL A,#0FHJZ SW2LCALL DELAY10MS JZ SW2MOV A,P3ANL A,#0FHCJNE A,#0EH,K5 MOV COUNT,#1 LJMP DKK5: CJNE A,#0DH,K6 MOV COUNT,#5 LJMP DKK6: CJNE A,#0BH,K7 MOV COUNT,#9 LJMP DKK7: CJNE A,#07H,K8 MOV COUNT,#13K8: NOPLJMP DKSW2: MOV P3,#0FFH CLR P3.6MOV A,P3ANL A,#0FHJZ SW3LCALL DELAY10MS JZ SW3MOV A,P3ANL A,#0FHCJNE A,#0EH,K9 MOV COUNT,#2 LJMP DKK9: CJNE A,#0DH,KA MOV COUNT,#6 LJMP DKKA: CJNE A,#0BH,KB MOV COUNT,#10 LJMP DKKB: CJNE A,#07H,KC MOV COUNT,#14 KC: NOPLJMP DKSW3: MOV P3,#0FFH CLR P3.7MOV A,P3ANL A,#0FHJZ SW4LCALL DELAY10MSJZ SW4MOV A,P3ANL A,#0FHCJNE A,#0EH,KDMOV COUNT,#3LJMP DKKD: CJNE A,#0DH,KE MOV COUNT,#7LJMP DKKE: CJNE A,#0BH,KF MOV COUNT,#11 LJMP DKKF: CJNE A,#07H,KG MOV COUNT,#15KG: NOPLJMP DKSW4: LJMP PANDUAN DK: RET ;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A,COUNTMOV DPTR,#TABLEMOVC A,@A+DPTRMOV P0,ALCALL DELAYSK: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ SKRET;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6,#20D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5,#20LOOP: LCALL DELAY10MSDJNZ R5,LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H;;;;;;;;;;结束标志;;;;;;;;;;END7、C语言源程序#includeunsigned char code table[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71};void main(void){ unsigned char i,j,k,key;while(1){ P3=0xff; //给P3口置1//P3_4=0; //给P3.4这条线送入0//i=P3;i=i&0x0f; //屏蔽低四位//if(i!=0x0f) //看是否有按键按下//{ for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);if(i!=0x0f) //再次判断按键是否按下//{ switch(i) //看是和P3.4相连的四个按键中的哪个// { case 0x0e:key=0;break;case 0x0d:key=1;break;case 0x0b:key=2;break;case 0x07:key=3;break;}P0=table[key]; //送数到P0口显示//}}P3=0xff;P3_5=0; //读P3.5这条线//i=P3;i=i&0x0f; //屏蔽P3口的低四位//if(i!=0x0f) //读P3.5这条线上看是否有按键按下// { for(j=50;j>0;j--) //延时//for(k=200;k>0;k--);i=P3; //再看是否有按键真的按下//i=i&0x0f;if(i!=0x0f){ switch(i) //如果有,显示相应的按键//{ case 0x0e:key=4;break;case 0x0d:key=5;break;case 0x0b:key=6;break;case 0x07:key=7;break;}P0=table[key]; //送入P0口显示//}}P3=0xff;P3_6=0; //读P3.6这条线上是否有按键按下// i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--)for(k=200;k>0;k--);i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=8;break;case 0x0d:key=9;break;case 0x0b:key=10;break;case 0x07:key=11;break;}P0=table[key];}}P3=0xff;P3_7=0; //读P3.7这条线上是否有按键按下//i=P3;i=i&0x0f;if(i!=0x0f){ for(j=50;j>0;j--) for(k=200;k>0;k--); i=P3;i=i&0x0f;if(i!=0x0f){ switch(i){ case 0x0e:key=12;break;case 0x0d:key=13;break;case 0x0b:key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}8、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。

51单片机矩阵键盘原理

51单片机矩阵键盘原理

51单片机矩阵键盘原理介绍在嵌入式系统中,矩阵键盘是一种常见的输入装置。

51单片机是广泛使用的一种微控制器,结合矩阵键盘可以实现各种应用。

本文将详细介绍51单片机矩阵键盘的原理及其工作方式。

什么是矩阵键盘?矩阵键盘是将一组按钮布置成矩阵形式,以减少输入引脚的数量。

每个按钮在矩阵键盘中都会被分配一个坐标,通过扫描行和列,可以确定用户按下的是哪个按钮。

51单片机的输入输出结构51单片机具有强大的输入输出能力,可以连接各种外设。

在使用矩阵键盘时,通常使用IO口进行输入和输出操作。

矩阵键盘的接线方式将矩阵键盘与51单片机连接时,需要将键盘的行和列引脚分别连接到单片机的IO 口。

通过对行进行扫描,再根据列的输入状态判断按钮是否按下。

这种接线方式可以大大减少所需的IO口数量。

矩阵键盘的扫描原理矩阵键盘的扫描原理是通过不断扫描行并读取列的状态来判断按钮是否按下。

具体步骤如下: 1. 将所有行引脚设为输出,输出高电平。

2. 逐个扫描行,将当前行引脚设为低电平。

3. 读取所有列引脚的状态,如果有低电平表示有按钮按下。

4. 如果有按钮按下,则根据行和列的坐标确定按下的按钮。

51单片机矩阵键盘的实现以下是使用51单片机实现矩阵键盘的基本步骤: 1. 将行和列引脚连接到单片机的IO口。

2. 初始化IO口的状态。

3. 在主程序中进行循环扫描,根据扫描结果执行相应的操作。

优化矩阵键盘的扫描速度为了提高矩阵键盘的扫描速度,可以采用以下优化方法: 1. 使用硬件定时器来定时扫描行,减少CPU的负载。

2. 使用中断方式处理按键事件,从而减少程序中的轮询操作。

3. 将矩阵键盘的行和列布局进行优化,减少扫描的时间复杂度。

利用矩阵键盘实现密码输入矩阵键盘广泛应用于密码输入功能。

通过将矩阵键盘与51单片机结合,可以实现密码的输入、验证等功能。

以下是一个简单的密码输入的实现步骤: 1. 设置一个密码数组用于存储密码。

2. 使用矩阵键盘获取用户输入的密码,并依次存储到临时数组中。

自学单片机之矩阵按键

自学单片机之矩阵按键

矩阵按键1.1矩阵按键连接图:1.2矩阵按键扫描原理:1.3矩阵按键与独立按键转换:看电路图,只用将某一个IO 口写0 ,即可组成独立按键。

1.4 程序实例:矩阵4 x4共十六个按键按顺序按下,数码管分别显示0~F。

#include "reg52.h"typedef unsigned int u16;typedef unsigned char u8;#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;u8 KeyValue;u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//ÏÔʾ0~FµÄÖµvoid delay(u16 i){while(i--);}void KeyDown(void){char a=0;GPIO_KEY=0x0f; // 低四位写高高四位写0if(GPIO_KEY!=0x0f)//判断是否有按键按下{delay(1000);//延时10ms消抖if(GPIO_KEY!=0x0f)//确认是否真的有按键按下{GPIO_KEY=0X0F; // 再次高四位写0 低四位写1 去干扰开始列扫描此时按键任然是按下状态switch(GPIO_KEY){case(0X07): KeyValue=0;break;case(0X0b): KeyValue=1;break;case(0X0d): KeyValue=2;break;case(0X0e): KeyValue=3;break;}GPIO_KEY=0XF0; //第二步开启行扫描高四位写1 低四位写0switch(GPIO_KEY){case(0X70): KeyValue=KeyValue;break;case(0Xb0): KeyValue=KeyValue+4;break;case(0Xd0): KeyValue=KeyValue+8;break;case(0Xe0): KeyValue=KeyValue+12;break;}while((a<50)&&(GPIO_KEY!=0xf0)) //判断按键是否松开{delay(1000); //延时消抖a++; //设定一个强制退出条件}}}}void main(){LSA=0;LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=smgduan[KeyValue];}}。

【实用】单片机矩阵键盘接口PPT文档


按结构原理分类
(1)触点式按键——机械式、导电橡胶式 (2)无触点按键——电气式、磁感应按键
(前者造价低,后者寿命长)
按接口原理分类
(1)独立式键盘——每键各接一根输入线 (2)行列式(矩阵)键盘——按行列交叉连线 (3)屏幕式键盘——触摸屏
按译码方式分类
(1)编码键盘——通过硬件实现译码 (2)非编码键盘——通过扫描程序实现译码
键值=行号×4+列号
图7 矩阵式键盘连接电路
单片机控制技术
单片机矩阵键盘接口
三、矩阵键盘按键识别技术
(二)行列反转法
第一步:向所有的列线上输出低 电平,行线输出高电平,然后读入 行信号。如果有按键按下,则读入 的行信号不全为高;记录此时行值。
第二步:向所有的列线上输出高 电平,行线输出低电平(行列反 转),然后读入列信号。如果有键 按下,则读入的列信号不全为高; 记录此时列值。
键盘是与单片机进行人机交互的最基本的途径。
VCC
图6 矩阵式按键行号、列号与键值
由图5可知,一个4×4的 第二步:向所有的列线上输出高电平,行线输出低电平(行列反转),然后读入列信号。
其次,逐列扫描判断具体的按键:
行、列结构,可以构成一 如有任何一个键被按下,则读入的行电平则不全为高;
独立式按键电路配置灵活,在按键较多时I/O口线浪费较大。
(各键扫描码见图9)
图9 行列反转法中按键与扫描码对应关系
单片机控制技术
单片机矩阵键盘接口
单片机控制技术
单片机矩阵键盘接口
一、认识单片机键盘
(二)独立式键盘
独立式键盘电路设计 时,每个按键必须占用 一根I/O口线,另一端接 地。 独立式按键电路配置 灵活,在按键较多时I/O 口线浪费较大。

stm32矩阵键盘原理图及程序介绍

stm32矩阵键盘原理图及程序介绍STM32F0 系列产品基于超低功耗的ARM Cortex-M0 处理器内核,整合增强的技术和功能,瞄准超低成本预算的应用。

该系列微控制器缩短了采用8 位和16 位微控制器的设备与采用32 位微控制器的设备之间的性能差距,能够在经济型用户终端产品上实现先进且复杂的功能。

本文为大家介绍stm32矩阵键盘原理图及程序stm32矩阵键盘原理图主要实现:扫描矩阵键盘,将检测到的数据通过spi 通信发送到数码管显示。

主要步骤:1:初始化时钟void RCC_Configuration(void){//----------使用外部RC晶振-----------RCC_DeInit(); //初始化为缺省值RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟while(RCC_GetFlagStatus(RCC_FLAG_HSERDY)== RESET); //等待外部高速时钟使能就绪FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait stateRCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLKRCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLKRCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZRCC_PLLCmd(ENABLE); //Enable PLLCLKwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)== RESET); //Wait till PLLCLK is ready RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock。

单片机矩阵键盘


按键抖动时间一般小于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。

51单片机_矩阵按键检测

}
}
returnk;//返回扫描到的键值
}
void main()
{
int num=0, tmp;
while(1)
{
tmp = MatrixKeyscan();//扫描键盘判断是否有按键按下
if(tmp != -1) num = tmp;//当有按键按下时,将键值赋给num(无键按下时扫描键盘返回值-1)
《51系列单片机_矩阵按键检测》
此程序使用单片机89SC52
//1、此程序实现矩阵按键的检测功能,按下按键时,数码管显示按键的相应键值
#include<reg52.h>
voiddelay_ms(int n)//延时函数,延时n毫秒
{
inti, j;
for(i=0; i<n; i++)
for(j=0; j<110; j++);
}
voiddisplay(int num)//控制数码管按位输出显示数值num
{
charBitSet[8] =
{
0x7f, 0xbf, 0xdf, 0xef,
0xf7, 0xfb, 0xfd, 0xfe
};//用于设置(低电平位选)数码管的位选信号,从低到高对应8个数码管
charNumberCode[16] =
for(i=0; i<4; i++)
{
P1 = line[i];//将行扫描值逐个送至P1端口
tmp = P1;//再读取P1口的值
if(tmp != line[i])//若读取的数值不等于送入的行扫描值,表示有按键被按下
{
delay_ms(10);//延时,重新读取判断,确认有键按下
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

按键矩阵识别技术实验说明
如图2所示,把P1端口的8条I/O口分成4条列线4条行线交叉但不接触构成4×4键盘阵列,16个按键放置交叉位置,这样在单片机复杂系统需要较多按键时,这种接法可以节省单片机的硬件资源。

1.结合给出的电路原理图试分析4*4键盘矩阵识别原理,及LED动态扫描原理。

(6分)
2.根据分析的键盘矩阵识别原理设计程序实现一下功能:当按下某个按键时在2个七段数码管上显示该按键的编号(注意考虑同时按下多个按键时程序处理过程)、按下某个按键使其弹起时对于消抖情况程序的处理。

(9分)
2.0相关原理图如下:
3.0实验说明
本试验给了1-8键判断方法。

按1-8键中任意键,则数码管显示该键编号。

想想怎样实现1-16个键的判断显示?
参考程序见程序范例。

/************************************************************************ ******************
*描述: 按键距阵识别技术
*编写: 秦立春
*版本信息: V1.0 2008年4月20日
*说明: sp1,sp2,SP3跳线向右;
************************************************************************* *****************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define ON 0
#define OFF 1
uchar bdata OUT;
sbit JDQ=OUT^0;
sbit HF =OUT^1;
sbit BZ =OUT^2;
sbit AA =OUT^3;
sbit BB =OUT^4;
sbit CC =OUT^5;
sbit DD =OUT^6;
sbit X0=P2^0;
sbit X1=P2^1;
sbit X2=P2^2;
sbit X3=P2^3;
sbit Y0=P2^4;
sbit Y1=P2^5;
sbit Y2=P2^6;
sbit Y3=P2^7;
sbit RS=P1^7;
sbit RW=P3^4;
sbit E =P3^5;
sbit HC574_LE=P3^3;
//-----------------------------------------------------
void delay(unsigned int t) // 延时函数
{
for(;t!=0;t--) ;
}
//------------------------------------------------------ void HC574(void) // 74HC574控制输出;
{
P0=OUT;
HC574_LE=1;
delay(2);
HC574_LE=0;
}
//================================================== unsigned char Key_Scan(void)
{
uchar a, key;
P2=0xf0;
if(!(Y0&&Y1&&Y2&&Y3))
{
P2=0xf0;
delay(200);
if(!(Y0&&Y1&&Y2&&Y3))
{
P2=0xff;
X0=0;
if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0e);goto pp1;}
P2=0xff;
X1=0;
if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0d);goto pp1;} P2=0xff;
X2=0;
if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x0b);goto pp1;} P2=0xff;
X3=0;
if(!(Y0&&Y1&&Y2&&Y3)){a=P2;a=(a&0xf0+0x07);goto pp1;} }
else a=0xff;
}
else a=0xff;
pp1: key=a;
return key;
}
//-----------------------------------------------------------
uchar key(void)
{
uchar k, KEY;
KEY=0xff;
k=Key_Scan();
if(k!=0xff)
{
while(k==Key_Scan());
switch(k) // 键码
{
case 0x7e: KEY=0x04;break; // 4
case 0x7d: KEY=0x08;break; // 8
case 0x7b: KEY=0x0b;break; //
case 0x77: KEY=0x0f;break; //
case 0xbe: KEY=0x03;break; // 3
case 0xbd: KEY=0x07;break; // 7
case 0xbb: KEY=0x0a;break; //
case 0xb7: KEY=0x0e;break; //
case 0xde: KEY=0x02;break; // 2
case 0xdd: KEY=0x06;break; // 6
case 0xdb: KEY=0x00;break; // 0
case 0xd7: KEY=0x0d;break; //
case 0xee: KEY=0x01;break; // 1
case 0xed: KEY=0x05;break; // 5
case 0xeb: KEY=0x09;break; // 9
case 0xe7: KEY=0x0c;break; //
default: KEY=0xff;break; // 无键按下
}
}
return KEY;
}
main()
{
uchar code shu[12]={0xc0,0xf9,0xa4,0xb0,0x99,//0,1,2,3,4,
0x92,0x82,0xf8,0x80,0x90,//5,6,7,8,9,
0x00,0xff}; //灭共阳极数码管显示段码 uchar i,k;
uchar display[2]={0xff,0xff};
RS=0; RW=0; E=0;
OUT=0;HC574();
delay(60000);
while(1)
{
k=key();
if(k<=0x0f)
{
display[0]=k/10;
display[1]=k%10;
}
for(i=0;i<2;i++)
{
P1=(~(0X01<<i))&0X7F; P0=shu[display[i]]; delay(100);
}
}
}。

相关文档
最新文档