4×4矩阵键盘51单片机识别实验与程序
单片机课程设计---4×4矩阵式键盘识别显示电路的设计

《单片机原理及应用》课程设计题目:4×4矩阵式键盘与单片机连接与编程专业:测控技术与仪器班级:机电082-1 姓名:学号:指导老师:组员:( 2011.7 .13)目录第1节引言 (2)1.1 4*4矩阵式键盘系统概述 (2)1.2 本设计任务和主要内容 (3)第2节系统主要硬件电路设计 (4)2.1 单片机控制系统原理 (4)2.2 单片机主机系统电路 (5)2.2.1 时钟电路 (8)2.2.2 复位电路 (8)2.2.3 矩阵式键盘电路 (8)2.3 译码显示电路 (9)第3节系统软件设计 (13)3.1 软件流程图 (13)3.2 系统程序设计 (14)第4节结束语 (17)参考文献 (18)第一节引言矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。
单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
1.1 4*4矩阵式键盘识别显示系统概述矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
基于msc51单片机实现的四位4乘4矩阵键盘计算器的C语言程序及其PROTUES电路和仿真_课程设计

单片机原理及接口技术课程设计报告设计题目:计算器设计信息与电气工程学院二零一三年七月计算器设计单片机体积小,功耗小,价钱低,用途灵活,无处不在,属专用运算机。
是一种特殊器件,需通过专门学习方能把握应用,应用中要设计专用的硬件和软件。
最近几年来,单片机以其体积小、价钱廉、面向操纵等独特优势,在各类工业操纵、仪器仪表、设备、产品的自动化、智能化方面取得了普遍的应用。
与此同时,单片机应用系统的靠得住性成为人们愈来愈关注的重要课题。
阻碍靠得住性的因素是多方面的,如组成系统的元器件本身的靠得住性、系统本身各部份之间的彼此耦合因素等。
其中系统的抗干扰性能是系统靠得住性的重要指标。
数学是科技进步的重要工具,数据的运算也随着科技的进步越发变得繁琐复杂,计算器的显现能够大大解放人在设计计算进程中的工作量,使计算的精度、速度取得改善,通过msc51单片机,矩阵键盘和LED数码管能够实现简单的四位数的四那么运算和显示,并当运算结果超出范围时予以报错。
注:这一部份要紧描述题目的背景和意义,对设计所采取的要紧方式做一下简要描述。
字数不要太多,300-500字。
另注:本文要当做模板利用,不要随意更改字体、字号、行间距等,学会利用格式刷。
文中给出的各项内容都要在大伙儿的报告中表现,可采纳填空的方式利用本模板。
1. 设计任务结合实际情形,基于AT89C51单片机设计一个计算器。
该系统应知足的功能要求为:(1) 实现简单的四位十进制数字的四那么运算;(2) 按键输入数字,运算法那么;(3) LED数码管移位显示每次输入的数据和运算结果;(4) 当运算结果超出范围时实现报错。
要紧硬件设备:AT89C51单片机、LED数码管、矩阵键盘。
注:这一部份需要写明系统功能需求,用到的要紧硬件(参考实验箱的说明书)。
2. 整体方案设计计算器以AT89C51单片机作为整个系统的操纵核心,应用其壮大的I/O功能和计算速度,组成整个计算器。
通过矩阵键盘输入运算数据和符号,送入单片机进行数据处置。
4×4矩阵式键盘按键

一、实验目的1.掌握4×4矩阵式键盘程序识别原理2.掌握4×4矩阵式键盘按键的设计方法二、设计原理(1)如图14.2所示,用单片机的并行口P3连接4×4矩阵键盘,并以单片机的P3.0-P3.3各管脚作输入线,以单片机的P3.4-P3.7各管脚作输出线,在数码管上显示每个按键“0-F”的序号(2)键盘中对应按键的序号排列如图14.1所示三、参考电路740)this.width=740" border=undefined>图14.2 4×4矩阵式键盘识别电路原理图740)this.width=740" border=undefined>图14.1 4×4键盘0-F显示740)this.width=740" border=undefined>图14.3 4×4矩阵式键盘识别程序流程图四、电路硬件说明(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五、程序设计内容(1)4×4矩阵键盘识别处理(2)每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码矩阵的行线和列线分别通过两并行接口和CPU通信键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能六、程序流程图(如图14.3所示)七、汇编源程序;;;;;;;;;;定义单元;;;;;;;;;;COUNT EQU 30H;;;;;;;;;;入口地址;;;;;;;;;;ORG 0000HLJMP STARTORG 0003HRETIORG 000BHRETIORG 0013HRETIORG 001BHRETIORG 0023HRETIORG 002BHRETI;;;;;;;;;;主程序入口;;;;;;;;;;ORG 0100HSTART: LCALL CHUSHIHUA LCALL PANDUANLCALL XIANSHILJMP START ;;;;;;;;;;初始化程序;;;;;;;;;; CHUSHIHUA: MOV COUNT#00H RET;;;;;;;;;;判断哪个按键按下程序;;;;;;;;;; PANDUAN: MOV P3#0FFHCLR P3.4MOV A P3ANL A#0FHXRL A#0FHJZ SW1LCALL DELAY10MSJZ SW1MOV A P3ANL A#0FHCJNE A#0EH K1MOV COUNT#0LJMP DKK1: CJNE A#0DH K2MOV COUNT#4LJMP 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#0FHXRL 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#0FHXRL 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#0FHXRL 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#11LJMP DKKF: CJNE A#07H KG MOV COUNT#15KG: NOPLJMP DKSW4: LJMP PANDUAN DK: RET ;;;;;;;;;;显示程序;;;;;;;;;; XIANSHI: MOV A COUNT MOV DPTR#TABLE MOVC A@A+DPTRMOV P0 ALCALL DELAYSK: MOV A P3ANL A#0FHXRL A#0FHJNZ SKRET ;;;;;;;;;;10ms延时程序;;;;;;;;;;DELAY10MS: MOV R6#20D1: MOV R7#248DJNZ R7$DJNZ R6D1RET;;;;;;;;;;200ms延时程序;;;;;;;;;;DELAY: MOV R5#20LOOP: LCALL DELAY10MSDJNZ R5LOOPRET;;;;;;;;;;共阴码表;;;;;;;;;;TABLE: DB 3FH06H5BH4FH66H6DH7DH07H DB 7FH6FH77H7CH39H5EH79H71H ;;;;;;;;;;结束标志;;;;;;;;;;END八、C语言源程序#include<AT89X51.H>unsigned char code table[]={0x3f0x660x7f0x390x060x6d0x6f0x5e0x5b0x7d0x770x790x4f0x070x7c0x71};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;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;key=14;break;case 0x07:key=15;break;}P0=table[key];}}}}九、注意事项在硬件电路中,要把8联拨动拨码开关JP2拨下,把8联拨动拨码开关JP3拨上去。
14.4×4矩阵式键盘识别技术

第四章实验及实践课题(14) 4×4矩阵式键盘识别技术实验任务如图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芯排线连接到“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”,开关的一端(列线)通过电阻接V,而接地是通过程序输出数字“0”实现的。
键盘处理CC程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
5.程序框图图4.14.36.汇编源程序KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#8 ;一开始数码管全亮即是8WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FH ;立即数与到累加器XRL A,#0FH ;立即数异或到累加器,和下面一句构成判断第1行有没按键按下的功能。
JZ NOKEY1 ;累加器为零转移到NOKEY1,LCALL DELY10MSMOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#07H,NK0 :累加器A与立即数不等转移到NK1MOV KEYBUF,#0 ;这里及下面改的比较多,主要是类似这颜色部分改了。
基于51单片机的4-4矩阵键盘字符输入

void display(unsigned char num)
{
P0=table[num];
}
void init_led()
{
P0 = 0x00;
}
void main()
{
while(1)
{
P1 = 0xef;
temp = P1;
temp = temp0xf0;
if (temp != 0xf0)
{
temp = P1;
switch(temp)
{
case 0xee:
key=0;
break;
case 0xed:
key=1;
break;
case 0xeb:
key=2;
break;
case 0xe7:
key=3;
break;
default:
break;
}
display(key);
P1=0xfe;
}
P1 = 0xdf;
key=10;
break;
case 0xb7:
key=11;
break;
default:
break;
}
display(key);
}
P1=0x7f;
temp=P1;
temp=temp0x0f;
if(temp!=0x0f)
{
temp=P1;
switch(temp)
{
case 0x7e:
key=12;
break;
temp = P1;
temp = temp0x0f;
if(temp != 0x0f)
{
temp = P1;
switch(temp)
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; }}}}}。
基于51单片机4乘4矩阵键盘的设计

case 0x7d:KEY=7;break;
case 0xeb:KEY=8;break;
case 0xdb:KEY=9;break;
case 0xbb:KEY=10;break;
case 0x7b:KEY=11;break;
case 0xe7:KEY=12;break;
控制任务:
编程实现4乘4的矩阵键盘控制连接在P0口和P1口上的16个LED,当按下某键并释放后只有对应的LED灯亮,例如按S0后D0亮,按S1后D1亮。
程序及仿真:
#include<reg51.h>
unsigned char code led[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
b=P2;
a=a|b;
switch(a)
{
case 0xee:KEY=0;break;
case 0xde:KEY=1;break;
case 0xbe:KEY=2;break;
case 0x7e:KEY=3;break;
case 0xed:KEY=4;break;
case 0xdd:KEY=5;break;
{
P0=0xff;
P1=led[n-8];
}}
int main(void)
{
whilsplay(KEY);
}
return 0;
}
更多资源,请关注微博“风竹弈星”,私聊。
unsigned char KEY=0xff;
void keyscan(void)
{
unsigned char a,b;
P2=0xf0;//高四位作为输入(高电平),低四位输出低电平
51单片机矩阵按键程序4 4

//以下程序都是在VC++6.0 上调试运行过的程序,没有错误,没有警告。
//单片机是STC89C52RC,但是在所有的51 52单片机上都是通用的。
51只是一个学习的基础平台,你懂得。
//程序在关键的位置添加了注释。
//用//11111111111111111代表第一个程序。
//2222222222222222222222222代表第二个程序,以此类推//1111111111111111111111111111111111111111111111111111111111111111111//1111111111111111111111111111111111111111111111111111111111111111111/****************************************************************************** ** 实验名: 矩阵键盘实验* 使用的IO : 数码管使用P0,键盘使用P3.0、P3.1、P3.2、P3.3* 实验效果: 按矩阵键盘分别显示在数码管上面显示十六进制的0到F。
* 注意:******************************************************************************* /#include<reg51.h>#define GPIO_DIG P0#define GPIO_KEY P1sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char KeyValue;//用来存放读取到的键值void Delay10ms(); //延时10msvoid KeyDown(); //检测按键函数/****************************************************************************** ** 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无******************************************************************************* /void main(void){LSA=0; //给一个数码管提供位选LSB=0;LSC=0;while(1){KeyDown();GPIO_DIG=DIG_CODE[KeyValue];}}/****************************************************************************** ** 函数名: KeyDown* 函数功能: 检测有按键按下并读取键值* 输入: 无* 输出: 无******************************************************************************* /void KeyDown(void){char a=0;GPIO_KEY=0x0f;if(GPIO_KEY!=0x0f)//读取按键是否按下{Delay10ms();//延时10ms进行消抖if(GPIO_KEY!=0x0f)//再次检测键盘是否按下{//测试列GPIO_KEY=0X0F;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;switch(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)) //检测按键松手检测{Delay10ms();a++;}}}}/****************************************************************************** ** 函数名: Delay10ms* 函数功能: 延时函数,延时10ms* 输入: 无* 输出: 无******************************************************************************* /void Delay10ms(void) //误差0us{unsigned char a,b,c;for(c=1;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}。
矩阵键盘扫描汇编程序

4*4矩阵键盘扫描汇编程序(基于51单片机)// 程序名称:4-4keyscan.asm;// 程序用途:4*4矩阵键盘扫描检测;// 功能描述:扫描键盘,确定按键值。
程序不支持双键同时按下,;// 如果发生双键同时按下时,程序将只识别其中先扫描的按键;// 程序入口:void;// 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态;//================================================================== ====PROC KEYCHKKEYNAME DATA 40H ;按键名称存储单元;(b7-b5纪录按键状态,b4位为有效位,;b3-b0纪录按键)KEYRTIME DATA 43H ;重复按键时间间隔SIGNAL DATA 50H ;提示信号时间存储单元KEY EQU P3 ;键盘接口(必须完整I/O口) KEYPL EQU P0.6 ;指示灯接口RTIME EQU 30 ;重复按键输入等待时间KEYCHK:;//=============按键检测程序========================================= ====MOV KEY,#0FH ;送扫描信号MOV A,KEY ;读按键状态CJNE A,#0FH,NEXT1 ;ACC<=0FH; CLR C ;Acc等于0FH,则CY为0,无须置0NEXT1:; SETB C ;Acc不等于0FH,则ACC必小于0 FH,;CY为1,无须置1MOV A,KEYNAMEANL KEYNAME,#1FH ;按键名称屏蔽高三位RRC A ;ACC带CY右移一位,纪录当前按键状态ANL A,#0E0H ;屏蔽低五位ORL KEYNAME,A ;保留按键状态;//=============判别按键状态,决定是否执行按键扫描=================== =====CJNE A,#0C0H,NEXT2 ;110按键稳定闭合,调用按键检测子程序SJMP KEYSCANNEXT2:CJNE A,#0E0H,NEXT3 ;111按键长闭合,重复输入允许判断SJMP WAITNEXT3:CJNE A,#0A0H,EXIT ;101干扰,当111长闭合处理ORL KEYNAME,#0E0HWAIT:MOV A,KEYRTIMEJNZ EXIT ;时间没到,退出;//=============键盘扫描程序========================================= =====KEYSCAN:MOV R1,#0 ;初始化列地址MOV R3,#11110111B ;初始化扫描码LOOP:MOV A,R3RL AMOV R3,A ;保留扫描码MOV KEY,A ;送扫描码MOV A,KEY ;读键盘ORL A,#0F0H ;屏蔽高四位CJNE A,#0FFH,NEXT31 ;A不等于FFH,说明该列有按键动作INC R1 ;列地址加1,准备扫描下一列CJNE R1,#4,LOOP ;列地址不等于4,扫描下一列SJMP EXIT ;没有按键,退出;//=============按键判断对应位等于零,说明该行有按键按下============= =====NEXT31:JB ACC.0,NEXT32MOV R2,#0 ;第0行有按键SJMP NEXT5NEXT32:JB ACC.1,NEXT33MOV R2,#1 ;第1行有按键SJMP NEXT5NEXT33:JB ACC.2,NEXT34MOV R2,#2 ;第2行有按键SJMP NEXT5NEXT34:MOV R2,#3 ;第3行有按键NEXT5: ;计算按键地址MOV A,R1RL ARL A ;列地址乘4(每列对应4行)ADD A,R2 ;加行地址MOV DPTR,#KEYTABMOVC A,@A+DPTRANL KEYNAME,#0E0HORL KEYNAME,A ;送按键(送值的时候已经置按键有效)MOV KEYRTIME,#RTIME ;送重复按键等待时间CLR KEYPL ;打开指示灯MOV SIGNAL,#10 ;送信号提示时间(每次按键闪10 0ms)EXIT:MOV KEY,#0FFH ;置键盘接口高电平RET ;退出;//=============按键名称表=========================================== =====KEYTAB:DB 1AH ;扫描码0,对应A ************************************ ******DB 1BH ;扫描码1,对应B ** **DB 1CH ;扫描码2,对应C ** I/O口 PX.4 PX.5 PX.6 PX.7 **DB 1DH ;扫描码3,对应D ** **DB 11H ;扫描码4,对应1 ** PX.0 A(0) 1(4) 2(8) 3 (C) **DB 14H ;扫描码5,对应4 ** **DB 17H ;扫描码6,对应7 ** PX.1 B(1) 4(5) 5(9) 6 (D) **DB 1EH ;扫描码7,对应E ** **DB 12H ;扫描码8,对应2 ** PX.2 C(2) 7(6) 8(A) 9 (E) **DB 15H ;扫描码9,对应5 ** **DB 18H ;扫描码A,对应8 ** PX.3 D(3) E(7) 0(B) F(F) **DB 10H ;扫描码B,对应0 ** **DB 13H ;扫描码C,对应3 ************************************ ******DB 16H ;扫描码D,对应6DB 19H ;扫描码E,对应9DB 1FH ;扫描码F,对应FEND第二种解法ORG 0000HSTART: MOV R0,#00H ;初始化程序,开始的延时是为了使硬件能够准备好DJNZ R0,$LOOP: MOV SP,#60HCALL KEYDISPLAY:MOV A,R4MOV DPTR,#TABLE ;定义字形表的起始地址MOVC A,@A+DPTR ;TABLE为表的起始地址MOV P2,ASJMP LOOP;子程序内容,P1口的低四位为行线,高四位为列线KEY: PUSH PSWPUSH ACCMOV P1,#0F0H ;令所有的行为低电平,全扫描字-P1.0-P1.3,列为输入方式;这一段只是验证有键按下,并不能判断是哪一行MOV R7,#0FFH ;设置计数常数,作为延时KEY1: DJNZ R7, KEY1MOV A,P1 ;读取P1口的列值ANL A,#0F0H ;判别有键值按下吗(当有键按下时,P1口的高四位就不全为1了,底四位还是都为0的);这个地方进行相或的原因,是因为要把底四位的0000变成1111,以便下一步进行求反ORL A,#0FH //这个地方原版上没有,这是又加了,如果不加的的话,是不对的********CPL A ;求反后,有高电平就有键按下JZ EKEY;累加器为0则转移(意为求反后本来全为0的,如果有键按下时,求反后高四位就有1了),退出LCALL DEL20ms ;有键按下,进行处理;下面进行行行扫描,1行1行扫SKEY: MOV A,#00HMOV R0,A ;R0作为行计数器,开始初值为0MOV R1,A ;R1作为列计数器,开始初值为0MOV R2,#0FEH ;R2作为扫描暂存字,开始初值为1111 1110,(第四位作为行扫描字)SKEY2: MOV A,R2MOV P1,A ;输出行扫描字,1111 1110NOPNOPNOP ;3个NOP操作使P1口输出稳定MOV A,P1 ;读列值(和开始一样)MOV R1,A ;暂存列值(第一次为**** 1110,既高四位有一位"可能"会为0)ANL A,#0F0H ;取高四位,ORL A,#0FH ;使第四位全部置1CPL ABIAOZHI:JNZ SKEY3 ;累加器为非0则转移指令(意思是判断到按键在这一行),转去处理INC R0 ;如果按键没在这一行,行计数器加1SETB C ;进位标志位加1,为了在左移的时候开始的低位0不在出现在低(循环一圈后)MOV A,R2RLC A ;带进位左移1位(形成下一行扫描字,再次扫描)MOV R2,AMOV A,R0;把加1后的行计数器R0和总共扫描次数(4次比较)CJNE A,#04H,SKEY2 ;(扫描完了么)书本上这个地方也有错误,书本上写的是:SKEY1AJMP EKEY ;如果没有的话,退出;有键按下后行扫描过后,此为确列行SKEY3: MOV A,R1 ;JNB ACC.4,SKEY5 ;直接寻址位为0咋转移指令JNB ACC.5,SKEY6JNB ACC.6,SKEY7JNB ACC.7,SKEY8AJMP EKEY //我自己感觉到这命令没有用处SKEY5: MOV A,#00H ;存0列号MOV R3,AAJMP DKEYSKEY6: MOV A,#01H ;存1列号MOV R3,AAJMP DKEYSKEY7: MOV A,#02H ;存2列号MOV R3,AAJMP DKEYSKEY8: MOV A,#03H ;存3列号MOV R3,AAJMP DKEY;取出具体的行号,再加上列号,最终确认按键的号码DKEY: //MOV R4,#00HMOV A,R0MOV B,#04HMUL AB ;让行号*4,第四位放在A中(总共就4行,相乘后一定<16,也就是只有第四位有值)ADD A,R3 ;让行号和列号相加,最终确认任按键的具体号MOV R4,AEKEY: POP ACCPOP PSWRET ;按键扫描处理函数DEL20ms:MOV R7,#2DL2: MOV R6,#18DL1: MOV R5,#255DJNZ R5,$DJNZ R6,DL1DJNZ R7,DL2RET;此为共阴极数码管的数字表TABLE: DB 3FH ;0DB 06H ;1DB 5BH ;2DB 4FH ;3DB 66H ;4DB 6DH ;5DB 7DH ;6DB 27H ;7DB 7FH ;8DB 6FH ;9DB 77HDB 7CHDB 39HDB 5EHDB 79HDB 71HEND第三种PIC单片机键盘扫描汇编程序;本程序用于PIC外接键盘的识别,通过汇编程序,使按下K1键时第一个数码管显示1,按下K2键时第一;个数码管上显示2,按下K3键时第一个数码管上显示3,按下K4键时第一个数码管上显示4,;汇编程序对键盘的扫描采用查询方式LIST P=18F458INCLUDE "P18F458.INC";所用的寄存器JIANR EQU 0X20FLAG EQU JIANR+1 ;标志寄存器DEYH EQU JIANR+2DEYL EQU JIANR+3F0 EQU 0 ;FLAG的第0位定义为F0ORG 0X00GOTO MAINORG 0X30;*************以下为键盘码值转换表****************** CONVERT ADDWF PCL,1RETLW 0XC0 ;0,显示段码与具体的硬件连接有关RETLW 0XF9 ;1RETLW 0XA4 ;2RETLW 0XB0 ;3RETLW 0X99 ;4RETLW 0X92 ;5RETLW 0X82 ;6RETLW 0XD8 ;7RETLW 0X80 ;8RETLW 0X90 ;9RETLW 0X88 ;ARETLW 0X83 ;BRETLW 0XC6 ;CRETLW 0XA1 ;DRETLW 0X86 ;ERETLW 0X8E ;FRETLW 0X7F ;"."RETLW 0XBF ;"-"RETLW 0X89 ;HRETLW 0XFF ;DARKRETURN;***************PIC键盘扫描汇编程序初始化子程序***************** INITIALBCF TRISA,5 ;置RA5为输出方式,以输出锁存信号BCF TRISB,1BCF TRISA,3BCF TRISE,0BCF TRISE,1BSF TRISB,4 ;设置与键盘有关的各口的输入输出方式BCF TRISC,5BCF TRISC,3 ;设置SCK与SDO为输出方式BCF INTCON,GIE ;关闭所有中断LW 0XC0WF SSPSTAT ;设置SSPSTAT寄存器LW 0X30WF SSPCON1 ;设置SPI的控制方式,允许SSP方式,并且时钟下降;沿发送数据,与"74HC595当其SCLK从低到高电平;跳变时,串行输入数据(DI)移入寄存器"的特点相对应LW 0X01WF JIANR ;显示值寄存器(复用为键值寄存器)赋初值CLRF FLAG ;清除标志寄存器RETURN ;返回;**************显示子程序*****************DISPLAYCLRF PORTAWF SSPBUFAGAINBTFSS PIR1,SSPIFGOTO AGAINNOPBCF PIR1,SSPIFBSF PORTA,5 ;详细的程序语句请参考 pic教程语句部分,可在首页搜索。
51单片机4×4矩阵按键扫描方法

key=0xf0;//低四位为0
if(key==0xf0)//若无变化,证明按键松开
return 0;//返回0
else//否则,按键未松开
return 1;//返回1
}
//*********主函数*********//
int main()
{
key=0xff;//按键初始化
led=0xff;//关闭LED灯
//送至led显示
/*
eg:如果是第三行第二列按键按下
则第3个、第6(2列+4)个LED灯亮
如下图所示(Proteus仿真电路图)
*/
}
}
led_arry[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//数组定义,便于显示
//******检测是否有按键按下*****//
uchar Check_Button()
{
key=0x0f;//高四位为0
if(key==0x0f)//若无变化,证明无按键按下
return 0;//返回0
else//否则
return 1;//返回1
}
//********行检测********//
uchar Line[]={0x0e,0x0d,0x0b,0x07}; //那个按键按下,检测出的状态则对应数组中的第几个数
void Check_Line()
{
uchar i;
key=0x0f;//高四位为0
/*****4×4按键扫描******/
/***编程要点
1.首先检测是否有按键按下
2.若有按键按下,即进行行检测,列检测
3.行检测:高4位设为0,低4位为1,进行检测0x0f
矩阵键盘的键值计算及编程

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矩阵键盘识别技术一实验目的1.熟悉和掌握AT89S51单片机相关的功能2.了解矩阵式键盘的内部结构,掌握至少一种常用的按键识别的方法3.利用AT89S51单片机和设计一个4×4矩阵键盘控制。
4.掌握子程序结构和子程序实际的基本知识。
二实验原理1. 4×4矩阵键盘的序列排列如图1-1,图1-12.如图1-2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0―P1.3作输入线,以p1.4-P1.7作输出线,在数码管上显示每个按键的“0-F”序号.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
3.程序框图三实验原理图四实验代码#include<AT89X51.H> unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,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){case0x0e: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;}}}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){case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07: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;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;case0x0b: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;}}}}}五实验小结1.通过本次试验熟练的掌握了AT89S51单片机相关的功能。
4乘4键盘实验报告1(1)

4乘4键盘实验报告一、摘要本系统以89C51集成块为核心器件,制作一种4横4列的键盘。
采用16个按钮式键盘,以及一个硬件复位器。
在按下其中一个按钮时,在键盘扫描程序的作用下,通过键盘扫描识别后,在数码管上显示出来;按下硬件复位器,数码管只显示小数点,实现复位。
本次设计代码采用C语言编制,方便简单,易于调试。
关键词:89C51,键盘,按纽,数码管二、硬件设计2.1、89C51简介89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。
单片机的可擦除只读存储器可以反复擦除100次。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU 和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。
89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要特性:·与MCS-51 兼容·4K字节可编程闪烁存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路2.2、元件分析与工作原理VCC:供电电压。
GND:接地。
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
4X4矩阵键盘+1602——51单片机的Proteus实验

4X4矩阵键盘+1602——51单片机的Proteus实验本文转载自小波电子工作室。
C语言源代码//======================================================依次可以从键盘输入0-f,在1602LCD上显示出来(此程序在所买开发板上验证通过)//======================================================//******** 小波电子工作室All rights reserved******//******** 个人主页:/niejinbo **//******** 文件名:lcd_key.1.c ************//******** 功能概要:4*4矩阵键盘扫描***********//******** MCU: STC89C52 晶振:11.0592Mhz **********//******** 设计者:聂金波************//******** 完成日期:2008-07-14 ************//******** 当前版本:0714.1 ************//******** 改进说明:暂无************//******** 补充说明: 从键盘输入0-F,在LCD上显示出来//*********头文件区*******************#include<reg52.h>#include<math.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int//*********定义变量区*******************sbit dula=P2^6; //关闭数码管显示之用sbit wela=P2^7;sbit lcden=P3^4; //LCD使能信号sbit lcdrs=P3^5; //LCD数据/命令选择信号uchar tab_key[50];uchar code tab[]="0123456789abcdef";uchar n=0,temp,key;//*********函数声明区********************void lcd_disp(); //LCD显示函数void lcd_init(); //LCD初始化函数void write_com(uchar); //写命令函数void write_data(uchar); //写数据函数void delay(uint); //延迟函数void key_scan(); //键盘扫描函数void key_manage1(); //键盘功能分配函数void key_manage2();void key_manage3();void key_manage4();void key_manage5();void key_manage6();void key_manage7();void key_manage8();void key_manage9();void key_manage10();void key_manage11();void key_manage12();void key_manage13();void key_manage14();void key_manage15();void key_manage16();//**********主函数开始**********void main(){lcd_init();write_com(1);while(1){key_scan();lcd_disp();}}//**********LCD显示函数开始***********void lcd_disp(){uchar a,i=0;write_com(0x80);for(i=0;i<n;i++){a=tab_key[i];write_data(tab[a]);}}//**********LCD初始化函数开始*********void lcd_init(){dula=0;wela=0; // 关闭数码管显示lcden=0;write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口write_com(0x0c); //开显示,显示光标,光标闪烁write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动write_com(0x80); //设置光标指针}//**********写命令函数开始************void write_com(uchar com){lcdrs=0; //低电平写命令P0=com; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********写数据函数开始************void write_data(uchar dat){lcdrs=1; //低电平写数据P0=dat; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//**********键盘扫描函数开始**** void key_scan(){//**********扫描第一行*********P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xee:key_manage1();break;case 0xde:key_manage2();break;case 0xbe:key_manage3();break;case 0x7e:key_manage4();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第二行*********P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xed:key_manage5();break;case 0xdd:key_manage6();break;case 0xbd:key_manage7();break;case 0x7d:key_manage8();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第三行********* P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key_manage9();break;case 0xdb:key_manage10();break;case 0xbb:key_manage11();break;case 0x7b:key_manage12();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}//**********扫描第四行********* P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(100);if(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key_manage13();break;case 0xd7:key_manage14();break;case 0xb7:key_manage15();break;case 0x77:key_manage16();break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}//*********延时函数开始************** void delay(uint k){uint i,j;for(i=k;i>0;i--)for(j=50;j>0;j--);}//******键盘功能分配函数群开始********// 键盘功能示意图// 设计者:聂金波//** 1 ** 2 ** 3 ** 4 **//** 5 ** 6 ** 7 ** 8 **//** 9 ** 0 ** s ** c **//** M1** M2** M3** M4**void key_manage1(){tab_key[n]=0;n++;}void key_manage2(){tab_key[n]=1;n++;}void key_manage3(){tab_key[n]=2;n++;}void key_manage4() {tab_key[n]=3;n++;}void key_manage5() {tab_key[n]=4;n++;}void key_manage6() {tab_key[n]=5;n++;}void key_manage7(){tab_key[n]=6;n++;}void key_manage8(){tab_key[n]=7;n++;}void key_manage9() {tab_key[n]=8;n++;}void key_manage10(){tab_key[n]=9;n++;}void key_manage11() {tab_key[n]=10;n++;}void key_manage12(){tab_key[n]=11;n++;}void key_manage13(){tab_key[n]=12;n++;}void key_manage14(){tab_key[n]=13;n++;}void key_manage15(){tab_key[n]=14;n++;}void key_manage16(){tab_key[n]=15;n++;}Proteus仿真图依次从键盘输入:abcd 277817639 (本人QQ号)4X4矩阵键盘-Proteus截图。
4乘4矩阵键盘检测

#define uchar unsigned char
#define uint unsigned int
sbit p2_7 = P2^7 ;
unsigned char const table[]={
0x06,0x5b,0x3f,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
{
uchar cord_h,cord_l;//行列值
P1=0x0f; //行线输出全为0
cord_h=P1&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P1&0x0f; //读入列线值
temp=table[13];
break;//d
case 0xeb:
temp=table[14];
break;//e
case 0xe7:
temp=table[15];
break;//f
}
if (p2_7==0)//确认键
{
P0 = temp;
}
}
}
uchar keyscan(void)//键盘扫描函数
0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
uchar temp;
uchar keyscan(void);
void delay(uint i);
void main()
{
uchar key;
P0=0x049;//1数码管亮按相应的按键,会显示按键上的字符
51单片机--矩阵键盘仿真

51单片机--矩阵键盘仿真矩阵键盘实验该实验采用proteus 7.4 sp3进行的仿真,仿真原理图如下图所示,该实验是4×4矩阵键盘实验,每按一个键最后一个数码管显示,原先显示的数左移一位,六位都显示后从新从第一个开始显示。
键盘输入值如下图键盘上标注。
输入0、1、2时的显示结果:有输入5、6、7后的显示结果:/********************************************************************** * 程序名; 矩阵键盘实验* 功能:数码管通过动态扫描显示键盘输入的数字,输入一个数,数码管上* 显示的数左移一位,达到六位后从第一个开始显示.* 编程者:ZPZ* 编程时间:2009/8/11**********************************************************************/ #include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charbit flag=0;uchar temp,i,m,s=0,s1,s2,s3,s4,s5;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};void display(uchar a);void delay(uint z);void keyscan();void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d);/****************** 主函数*******************/ void main(){while(1){keyscan();if(flag==0){P1=0xff;P0=0xff;}if(flag==1){display(m);}}}/****************** 显示函数*******************/ void display(uchar a){if(s==1){P1=0x20;P0=table[a];s1=table[a];delay(1);}if(s==2){P1=0x10;P0=s1;delay(1);P1=0x20;P0=table[a];s2=table[a];delay(1);} if(s==3){P1=0x08;P0=s1;delay(1);P1=0x10;P0=s2;delay(1);P1=0x20;P0=table[a];s3=table[a];delay(1);} if(s==4){P1=0x04;P0=s1;delay(1);P1=0x08;P0=s2;delay(1);P1=0x10;P0=s3;delay(1);P1=0x20;P0=table[a];s4=table[a];delay(1);} if(s==5){P1=0x02;P0=s1;delay(1);P1=0x04;P0=s2;delay(1);P1=0x08;P0=s3;delay(1);P1=0x10;P0=s4;delay(1);P1=0x20;P0=table[a];s5=table[a];delay(1);} if(s==6){P1=0x01;P0=s1;delay(1);P1=0x02;P0=s2;delay(1);P1=0x04;P0=s3;delay(1);P1=0x08;P0=s4;delay(1);P1=0x10;P0=s5;delay(1);P1=0x20;P0=table[a];delay(1);}if(s>6){s=1;}}/****************** 延时子函数*******************/ void delay(uint z){uint j,k;for(j=z;j>0;j--)for(k=120;k>0;k--);}/****************** 键扫描函数*******************/ void keyscan(){P3=0xff;keyin(0xfe,0,1,2,3);keyin(0xfd,4,5,6,7);keyin(0xfb,8,9,10,11);keyin(0xf7,12,13,14,15);}/****************** 键输入函数*******************/void keyin(uchar zhi,uchar a,uchar b,uchar c,uchar d){P3=zhi;temp=P3;temp=P3&0xf0;if(temp!=0xf0){delay(10);temp=P3;temp=P3&0xf0;if(temp!=0xf0){temp=P3;temp=P3&0xf0;switch(temp){case(0xe0):m=a;break;case(0xd0):m=b;break;case(0xb0):m=c;break;case(0x70):m=d;break;default:break;}flag=1;delay(200);s++;if(s>6)s=1;}delay(10);}}。
4×4矩阵式键盘识别技术

14.4×4矩阵式键盘识别技术1.实验任务如图4.14.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
对应的按键的序号排列如图4.14.1所示错误!48C159D26AE37BF图4.14.12.硬件电路原理图图4.14.23.系统板上硬件连线(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.程序框图错误!P3=FFH,P3.0=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键P3=FFH,P3.1=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键P3=FFH,P3.2=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键P3=FFH,P3.3=0有键按下吗?延时10ms真得有键按下吗?根据当前状态识别按键图4.14.3 6.汇编源程序KEYBUF EQU 30HORG 00HSTART: MOV KEYBUF,#2WAIT:MOV P3,#0FFHCLR P3.4MOV A,P3ANL A,#0FHXRL A,#0FHLCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY1MOV A,P3ANL A,#0FHCJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1NK4: NOPDK1:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK1A: MOV A,P3ANL A,#0FHJNZ DK1A NOKEY1:MOV P3,#0FFHCLR P3.5MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY2MOV A,P3ANL A,#0FHCJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2NK8: NOPDK2:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK2A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK2ANOKEY2:MOV P3,#0FFHCLR P3.6MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY3MOV A,P3ANL A,#0FHCJNE A,#0EH,NK9 MOV KEYBUF,#8LJMP DK3NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9LJMP DK3NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3NK12: NOPDK3:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK3A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK3ANOKEY3:MOV P3,#0FFHCLR P3.7MOV A,P3ANL A,#0FHXRL A,#0FHJZ NOKEY4LCALL DELY10MS MOV A,P3ANL A,#0FHXRL A,#0FHMOV A,P3ANL A,#0FHCJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4NK16: NOPDK4:MOV A,KEYBUFMOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,ADK4A: MOV A,P3ANL A,#0FHXRL A,#0FHJNZ DK4ANOKEY4:LJMP WAITDELY10MS:D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB 7FH,6FH,77H,7CH,39H,5EH,79H,71HEND7.C语言源程序#include <AT89X51.H>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=P3;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;break;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;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){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=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;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; }}}}}。
单片机课程设计---4×4矩阵式键盘识别显示电路的设计

《单片机原理及应用》课程设计题目:4×4矩阵式键盘与单片机连接与编程专业:测控技术与仪器班级:机电082-1 姓名:学号:指导老师:组员:( 2011.7 .13)目录第1节引言 (2)1.1 4*4矩阵式键盘系统概述 (2)1.2 本设计任务和主要内容 (3)第2节系统主要硬件电路设计 (4)2.1 单片机控制系统原理 (4)2.2 单片机主机系统电路 (5)2.2.1 时钟电路 (8)2.2.2 复位电路 (8)2.2.3 矩阵式键盘电路 (8)2.3 译码显示电路 (9)第3节系统软件设计 (13)3.1 软件流程图 (13)3.2 系统程序设计 (14)第4节结束语 (17)参考文献 (18)第一节引言矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N个按键,即时在LED数码管上。
单片机控制的据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。
1.1 4*4矩阵式键盘识别显示系统概述矩阵式键盘模式以N个端口连接控制N*N个按键,实时在LED数码管上显示按键信息。
显示按键信息,既降低了成本,又提高了精确度,省下了很多的I/O端口为他用,相反,独立式按键虽编程简单,但占用I/O口资源较多,不适合在按键较多的场合应用。
并且在实际应用中经常要用到输入数字、字母、符号等操作功能,如电子密码锁、电话机键盘、计算器按键等,至少都需要12到16个按键,在这种情况下如果用独立式按键的话,显然太浪费I/O端口资源,为了解决这一问题,我们使用矩阵式键盘。
矩阵式键盘简介:矩阵式键盘又称行列键盘,它是用N条I/O线作为行线,N条I/O线作为列线组成的键盘。
在行线和列线的每个交叉点上设置一个按键。
这样键盘上按键的个数就为N*N个。
这种行列式键盘结构能有效地提高单片机系统中I/O口的利用率。
013、4×4矩阵式键盘识别技术

13.4×4矩阵式键盘识别技术1.实验任务如图4.13.2所示,用AT89S51的并行口P1接4×4矩阵键盘,以P1.0-P1.3作输入线,以P1.4-P1.7作输出线;在数码管上显示每个按键的“0-F”序号。
对应的按键的序号排列如图4.13.1所示图4.13.12.硬件电路原理图图4.13.23.系统板上硬件连线(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.13.36.汇编源程序KEYBUFEQU30HORG00HSTART:MOVKEYBUF,#2 WAIT:MOVP3,#0FFHCLRP3.4MOVA,P3ANLA,#0FHXRLA,#0FH JZNOKEY1 LCALLDELY10MS MOVA,P3ANLA,#0FHXRLA,#0FH JZNOKEY1MOVA,P3ANLA,#0FH CJNEA,#0EH,NK1 MOVKEYBUF,#0 LJMPDK1NK1:CJNEA,#0DH,NK2 MOVKEYBUF,#1 LJMPDK1NK2:CJNEA,#0BH,NK3 MOVKEYBUF,#2 LJMPDK1NK3:CJNEA,#07H,NK4 MOVKEYBUF,#3 LJMPDK1NK4:NOPDK1:MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTR MOVP0,ADK1A:MOVA,P3 ANLA,#0FHXRLA,#0FHJNZDK1ANOKEY1:MOVP3,#0FFHCLRP3.5MOVA,P3ANLA,#0FHXRLA,#0FH JZNOKEY2 LCALLDELY10MS MOVA,P3ANLA,#0FHXRLA,#0FH JZNOKEY2MOVA,P3ANLA,#0FH CJNEA,#0EH,NK5 MOVKEYBUF,#4LJMPDK2NK5:CJNEA,#0DH,NK6 MOVKEYBUF,#5 LJMPDK2NK6:CJNEA,#0BH,NK7 MOVKEYBUF,#6 LJMPDK2NK7:CJNEA,#07H,NK8 MOVKEYBUF,#7 LJMPDK2NK8:NOPDK2:MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTRMOVP0,ADK2A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK2ANOKEY2:MOVP3,#0FFHCLRP3.6MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY3 LCALLDELY10MS MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY3MOVA,P3ANLA,#0FHCJNEA,#0EH,NK9 MOVKEYBUF,#8 LJMPDK3NK9:CJNEA,#0DH,NK10 MOVKEYBUF,#9 LJMPDK3NK10:CJNEA,#0BH,NK11 MOVKEYBUF,#10 LJMPDK3NK11:CJNEA,#07H,NK12 MOVKEYBUF,#11 LJMPDK3NK12:NOPDK3:MOVA,KEYBUF MOVDPTR,#TABLE MOVCA,@A+DPTRMOVP0,ADK3A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK3ANOKEY3:MOVP3,#0FFHCLRP3.7MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY4 LCALLDELY10MS MOVA,P3ANLA,#0FHXRLA,#0FHJZNOKEY4MOVA,P3ANLA,#0FHCJNEA,#0EH,NK13 MOVKEYBUF,#12 LJMPDK4NK13:CJNEA,#0DH,NK13 MOVKEYBUF,#13 LJMPDK4NK13:CJNEA,#0BH,NK15 MOVKEYBUF,#13 LJMPDK4NK15:CJNEA,#07H,NK16 MOVKEYBUF,#15 LJMPDK4NK16:NOPDK4:MOVA,KEYBUF MOVDPTR,#TABLEMOVCA,@A+DPTRMOVP0,ADK4A:MOVA,P3ANLA,#0FHXRLA,#0FHJNZDK4ANOKEY4:LJMPWAITDELY10MS:MOVR6,#10D1:MOVR7,#248DJNZR7,$DJNZR6,D1RETTABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07HDB7FH,6FH,77H,7CH,39H,5EH,79H,71HEND7.C语言源程序#include<AT89X51.H>unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,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){case0x0e: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;}}}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){case0x0e:key=4;break;case0x0d:key=5;break;case0x0b:key=6;break;case0x07: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;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;case0x0b:key=13;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; }}}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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.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>
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=P3;
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;
break;
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;
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)
{
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; }
}
}
}
}。