您好,欢迎来到投聚财经。
搜索
您的当前位置:首页3X3矩阵键盘

3X3矩阵键盘

来源:投聚财经




1.设计题目

设计一个3*3矩阵键盘(反转法),LCD液晶显示的程序,当每按下一个键之后,在液晶块上显示出相应的键值。

2.设计要求

当每按下一个键之后,在液晶块上显示出相应的键值。

3.硬件电路

如图1所示。整体电路由矩阵键盘、单片机、LCD显示三块电路构成。

LCD1
LM016L
U1

0

1

2

19

XTAL1

P0.0/AD0

39

D7

D6

5

D4

D3

D2

D1

D0


W

RS

VEE

VDD

VSS

38

18

XTAL2

P0.1/AD1

37

P0.2/AD2

36

P0.3/AD3

35

P0.4/AD4

34

9

RST

P0.5/AD5

14

13

12

11

10

9

8

7

6

5

4

3

2

1

33

P0.6/AD6

32

P0.7/AD7

29

PSEN

P2.0/A8

21

22

P2.1/A9

23

P2.2/A10

24

P2.3/A11

30

25

ALE

P2.4/A12

31

26

EA

P2.5/A13

27

P2.6/A14

28

P2.7/A15

1

P1.0

P3.0/RXD

10

2

11

P1.1

P3.1/TXD

3

12

P1.2

P3.2/INT0

4

13

P1.3

P3.3/INT1

5

14

P1.4

P3.4/T0

6

15

P1.5

P3.5/T1

7

16

P1.6

P3.6/WR

8

17

P1.7

P3.7/RD

ATC51

3

4

5

6

7

8

3.1键盘电路
如图1所示。键盘的列线接在P1.2-P1.4上,行线接在P1.5-P1.7上。程序中采用反转法对键盘进行扫描。

3.2单片机电路
如图1所示。单片机采用ATC51

3.3显示电路
如图1所示。LCD1602的数据口分别对应接在P3口上,控制和使能端分别接在P2.0-P2.2上。

4.程序流程图

总体程序的流程如图2所示。



开始

LCD初始化

给列线低电平,行线高电平

判断是否有键 N

按下
Y
延时12MS,去抖动

N 判断是否真的
有键按下
Y
给列线低电平,行线高电平

把键值处理结果存放在累加器A中

A=D8H?

Y

显示0子程序

N

Y

显示1子程序

A=D4H?

Y

显示2子程序

N

A=CCH?

N

Y

显示3子程序

A=B8H?

N

Y

显示4子程序

A=B4H?

N

Y

显示5子程序

A=ACH?

N

Y

显示6子程序

A=78H?

N

Y

显示7子程序

A=74H?

N

Y

显示8子程序

A=6CH?

N

2



5.具体程序

具体程序如下:
;*******************************************************************;* *;**********************矩阵键盘键值显示****************************

;*

*

*

*

;*

LCD1602 显示

*

;*

;* 邮箱: tmjiangjiajia@163.com

*

;* 作者:蒋佳佳

;* 时间: 2008/06/11

*

;*

*

;*******************************************************************

;矩阵键盘定义:
;P1.2-P1.4为列线,P1.5-P1.7为行线

;--------------------------------------------------------------
RS EQU P2.0 ;
RW EQU P2.1 ;
EN EQU P2.2 ;
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
;--------------------------------------------
; LCD初始化
;--------------------------------------------
MOV SP,#50H ;设置堆栈

MOV P3,#01H
CALL EN_1
MOV P3,#30H
CALL EN_1
MOV P3,#0EH
CALL EN_1
MOV P3,#06H
CALL EN_1

;LCD初始化命令字,清屏并置AC为零;调用写命令使能程序
;功能设置,8位接口,2行显示,5*7点阵 ;调用写命令使能程序
; 开显示及光标,字符不显示
;调用写命令使能程序
;显示不移位,AC为增量
;调用写命令使能程序

MOV P3,#81H; ;LCD 写入地址

CALL EN_1 ;调用写命令使能程序

;---------------------------------------------------------------------

; 键盘扫描程序

;------------------------------------------------



;--------------------------------------------------

; 用于按键消抖动

;-------------------------------------------------

Key_1: MOV P1,#0E0H ;给列线低电平,行线高电平

MOV A,P1 ;P1口读信号给A

CJNEA,#0E0H,AA1 ;判断是否有键按下

JMP Key_1 ;若没有键按下,则跳回去继续检测

AA1: CALL Delay_2 ;有键按下,则延时12MS,去抖动

;AA2:

MOV A,P1 ;再次从P1口读信号给A

CJNEA,#0E0H,AA2 ;确认是否真的有键按下,

JMP Key_1 ;若是抖动,则跳回去继续检测

MOV R3,A

; MOV 40H,A

; AA7: CALL Delay_2

; AA5:

MOV A,P1

;///??????????

;

CJNE A,40H,AA6

;

JMP AA7

; AA6: MOV A,R3

;------------------------------------------

;--------------------------------------------

; 扫描各个按键盘

;--------------------------------------------

; MOV P1,#0E0H ;#0E0H 给列线低电平,行线高电平

; MOV A,P1

AA2:

ANL A,#0E0H

;若真的有键按下,则对键值进行处理 ,相与



MOV B,A
MOV P1,#1CH

;相与的结果给B保存起来
;给列线高电平,行线低电平

MOV A,P1 ;P1 口读信号给A

ANL A,#1CH
ORL A,B

;对键值进行处理,相与
;把结果和B中数据相或处理

;-----------------------------------------

;;;;

CJNE A,#0FCH,LP0

;有键按下时判断哪位被按下

;;;;

JMP Key_1

;---------------------------------------------
LP0: CJNE A,#0D8H,LP1 ;1 1 列被按下,显示0 CALL LCD1 ;调用显示0 的子程序 LP1: CJNE A,#0D4H,LP2 ;1 2 列被按下,显示1



CALLLCD2 ;调用显示1的子程序LP2: CJNE A,#0CCH,LP3 ;13列被按下,显示2 CALLLCD3 ;调用显示2的子程序LP3: CJNE A,#0B8H,LP4 ;21列被按下,显示3 CALLLCD4 ;调用显示3的子程序LP4: CJNE A,#0B4H,LP5 ;22列被按下,显示4 CALLLCD5 ;调用显示4的子程序LP5: CJNE A,#0ACH,LP6 ;23列被按下,显示5 CALLLCD6 ;调用显示5的子程序LP6: CJNE A,#78H,LP7 ;31列被按下,显示6 CALLLCD7
;调用显示6的子程序LP7: CJNE A,#74H,LP8 ;32列被按下,显示7 CALLLCD8 ;调用显示7的子程序LP8: CJNE A,#6CH,LP9 ;33列被按下,显示8 CALLLCD9 ;调用显示8的子程序LP9: JMP Key_1

;----------------------------------------------------
; 显示子程序
;----------------------------------------------------

LCD1: MOV A,#30H CALL EN_2 RET
LCD2: MOV A,#31H CALL EN_2 RET
LCD3: MOV A,#32H CALL EN_2 RET
LCD4: MOV A,#33H CALL EN_2 RET
LCD5: MOV A,#34H CALL EN_2 RET
LCD6: MOV A,#35H CALL EN_2 RET
LCD7: MOV A,#36H CALL EN_2 RET
LCD8: MOV A,#37H CALL EN_2 RET

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;0ASCII码值传到P3口显示;调用写数据使能控制子程序



LCD9: MOV A,#38H CALL EN_2 RET

;0ASCII码值传到P3口显示;调用写数据使能控制子程序

;------------------------------------------------

EN_2: MOV P3,A SETB RS
CLR RW
CLR EN

;写数据使能控制子程序

CALL Delay_1
SETB EN

MOV P3,#81H
CALL EN_1
RET
EN_1: CLR RS ;使能端控制
CLR RW
CLR EN
CALL Delay_1
SETB EN
RET
;-----------------------------------------------------

Delay_1: ;延时5MS 子程序 MOV R6,#25
D2 : MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
RET
;-----------------------------
; 延时12MS 子程序Delay_2:
MOV R5,#0CH
D8: MOV R4,#0FFH
DJNZ R4,$
DJNZ R5,D8
RET

END

6.结束语

整个硬件和软件设计能很好的满足题目设计要求。

Copyright © 2019- tjwe.cn 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务