📄 单片机坐标8255扫描键盘、显示实验.htm
字号:
face=黑体>实验程序框图</FONT></A><FONT face=宋体><BR><IMG
src="单片机坐标8255扫描键盘、显示实验.files/200412868324999.jpg"><IMG
src="单片机坐标8255扫描键盘、显示实验.files/200412868332999.jpg"></FONT></P>
<P>源代码:</P>
<P>D8255 EQU
8506H
;8255状态/数据口地址<BR>D8255A EQU
8500H
;8255 PA口地址<BR>D8255B EQU
8502H
;8255 PB口地址<BR>Z8279 EQU
8701H
;8279状态口地址<BR>D8279 EQU
8700H
;8279数据口地址<BR>DISPTR EQU
08H
;当前显示位置<BR>KEYVAL EQU
09H
;读到的键码<BR>
ORG
0000H<BR>
LJMP
START<BR>
ORG
0040H<BR>START:<BR>
MOV
SP,#60H<BR>
LCALL
DELAY
;延时<BR>
MOV
DISPTR,#30H
;显示缓冲区头指针<BR>
MOV
DPTR,#D8255<BR>
MOV
A,#90H
;置8255状态<BR>
;方式0,PB,PC口输出,PA口输入<BR>
MOVX
@DPTR,A<BR>
MOV
DPTR,#Z8279
;置8279命令字<BR>
MOV
A,#0D3H<BR> MOVX
@DPTR,A
;清LED显示<BR>
MOV
A,#00H<BR>
MOVX
@DPTR,A<BR>
MOV
A,#38H<BR>
MOVX
@DPTR,A<BR>
MOV
A,#0D1H<BR>KB_DIS:<BR>
LCALL
RD_KB
;读键盘<BR>
MOV
A,#0FFH<BR>
CJNE A,KEYVAL,DISBUF
;判读到键<BR>
SJMP
KB_DIS
;没有则继续读键<BR>DISBUF:<BR>
LCALL
DISP
;把键移入显存<BR>
LCALL
DELAY
;延时消抖<BR>
LCALL
DELAY<BR>
SJMP
KB_DIS<BR>DISP:
;显存依次前移<BR>
MOV
R1,#31H
;在最后加入新键值<BR>MOVE:<BR>
MOV
A,@R1<BR>
DEC
R1<BR>
MOV
@R1,A<BR>
INC
R1<BR>
INC
R1<BR>
CJNE
R1,#38H,MOVE<BR>
MOV
37H,KEYVAL<BR>
MOV
KEYVAL,#0FFH<BR>
MOV
DPTR,#Z8279<BR>
MOV
A,#90H<BR>
MOVX
@DPTR,A<BR>
MOV
R0,#08H<BR>
MOV
R1,#30H<BR>
MOV
DPTR,#D8279<BR>LP:
MOV
A,@R1<BR>
MOVX
@DPTR,A<BR>
INC
R1<BR>
DJNZ
R0,LP<BR>
RET<BR>RD_KB:
;键盘扫描<BR>
MOV
A,#02H
;扫描第一行<BR>
MOV
DPTR,#D8255B<BR>
MOVX
@DPTR,A<BR>
MOV
DPTR,#D8255A<BR>
MOVX
A,@DPTR<BR>
MOV
R1,#00H<BR>
CJNE A,#0FFH,KEYCAL
;判键是否按下<BR>
MOV
A,#01H
;扫描第二行<BR>
MOV
DPTR,#D8255B<BR>
MOVX
@DPTR,A<BR>
MOV
DPTR,#D8255A<BR>
MOVX
A,@DPTR<BR>
MOV
R1,#08H<BR>
CJNE
A,#0FFH,KEYCAL<BR>
SJMP
NOKEY
;无键按下<BR>KEYCAL:
;计算键码<BR>
MOV
R0,#08H<BR>SHIFT:<BR>
RRC
A<BR>
JNC
CALC<BR>
INC
R1<BR>
DJNZ
R0,SHIFT<BR>CALC:
;换算显示码<BR>
MOV
DPTR,#DL_DAT<BR>
MOV
A,R1<BR>
MOVC
A,@A+DPTR<BR>
MOV
KEYVAL,A<BR>
RET<BR>NOKEY: MOV
KEYVAL,#0FFH
;返回无键标志<BR>
RET<BR>DELAY: MOV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -