锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-11-09 11:07:02 31k6电阻

描述

1、设计原理

(1)如图14.2.使用单片机并行口P3连接4×4矩阵键盘,单片机P3.0-P3.3各管脚输入线,单片机P3.4-P3.7每根管脚的输出线显示在数字管上 “0-F”的序号。

(2)键盘中对应键的序号排列如图14所示.1所示。

98f9222902fca0a353e901feecb37475.png

2、参考电路

图14.2 4×4矩阵式键盘识别电路原理图

三、电路硬件说明

(1)在单片机系统区域,单片机P3.0-P3.77端口通过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 0000H

LJMP START

ORG 0003H

RETI

ORG 000BH

RETI

ORG 0013H

RETI

ORG 001BH

RETI

ORG 0023H

RETI

ORG 002BH

RETI

;;;;;;;;;;主程序入口;;;;;;;;;;

ORG 0100H

START: LCALL CHUSHIHUA

LCALL PANDUAN

LCALL XIANSHI

LJMP START

;;;;;;;;;;初始化程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CHUSHIHUA: MOV COUNT,#00H

RET

;;;;;;;;;;按下程序判断哪个按钮;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

PANDUAN: MOV P3,#0FFH

CLR P3.4

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW1

LCALL DELAY10MS

JZ SW1

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K1

MOV COUNT,#0

LJMP DK

K1: CJNE A,#0DH,K2

MOV COUNT,#4

LJMP DK

K2: CJNE A,#0BH,K3

MOV COUNT,#8

LJMP DK

K3: CJNE A,#07H,K4

MOV COUNT,#12

K4: NOP

LJMP DK

SW1: MOV P3,#0FFH

CLR P3.5

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW2

LCALL DELAY10MS

JZ SW2

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K5

MOV COUNT,#1

LJMP DK

K5: CJNE A,#0DH,K6

MOV COUNT,#5

LJMP DK

K6: CJNE A,#0BH,K7

MOV COUNT,#9

LJMP DK

K7: CJNE A,#07H,K8

MOV COUNT,#13

K8: NOP

LJMP DK

SW2: MOV P3,#0FFH

CLR P3.6

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW3

LCALL DELAY10MS

JZ SW3

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,K9

MOV COUNT,#2

LJMP DK

K9: CJNE A,#0DH,KA

MOV COUNT,#6

LJMP DK

KA: CJNE A,#0BH,KB

MOV COUNT,#10

LJMP DK

KB: CJNE A,#07H,KC

MOV COUNT,#14

KC: NOP

LJMP DK

SW3: MOV P3,#0FFH

CLR P3.7

MOV A,P3

ANL A,#0FH

XRL A,#0FH

JZ SW4

LCALL DELAY10MS

JZ SW4

MOV A,P3

ANL A,#0FH

CJNE A,#0EH,KD

MOV COUNT,#3

LJMP DK

KD: CJNE A,#0DH,KE

MOV COUNT,#7

LJMP DK

KE: CJNE A,#0BH,KF

MOV COUNT,#11

LJMP DK

KF: CJNE A,#07H,KG

MOV COUNT,#15

KG: NOP

LJMP DK

SW4: LJMP PANDUAN

DK: RET

;;;;;;;;;;显示程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

XIANSHI: MOV A,COUNT

MOV DPTR,#TABLE

MOVC A,@A DPTR

MOV P0,A

LCALL DELAY

SK: MOV A,P3

ANL A,#0FH

XRL A,#0FH

JNZ SK

RET

;;;;;;;;;;10ms延迟程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELAY10MS: MOV R6,#20

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

;;;;;;;;;;200ms延迟程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELAY: MOV R5,#20

LOOP: LCALL DELAY10MS

DJNZ R5,LOOP

RET

;;;;;;;;;;共阴码表;;;;;

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H

DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H

;;;;;;;;;;结束标志;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

END

7、C语言源程序

#include

unsigned 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)

{ P30xff; //给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拨上去。

打开APP阅读更多精彩内容

点击阅读全文

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章