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 ;第1行3列被按下,显示2 CALLLCD3 ;调用显示2的子程序LP3: CJNE A,#0B8H,LP4 ;第2行1列被按下,显示3 CALLLCD4 ;调用显示3的子程序LP4: CJNE A,#0B4H,LP5 ;第2行2列被按下,显示4 CALLLCD5 ;调用显示4的子程序LP5: CJNE A,#0ACH,LP6 ;第2行3列被按下,显示5 CALLLCD6 ;调用显示5的子程序LP6: CJNE A,#78H,LP7 ;第3行1列被按下,显示6 CALLLCD7
;调用显示6的子程序LP7: CJNE A,#74H,LP8 ;第3行2列被按下,显示7 CALLLCD8 ;调用显示7的子程序LP8: CJNE A,#6CH,LP9 ;第3行3列被按下,显示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
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
;把0的ASCII码值传到P3口显示;调用写数据使能控制子程序
LCD9: MOV A,#38H CALL EN_2 RET
;把0的ASCII码值传到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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务