MOV R2, A ; 列扫描字送R2 AJMP CHKN ; 8列未完,检查下一列 KEND: AJMP SERKEY ; 8列查完,未查到有键按下,等待 VARTO: MOV SBUF, A ; 发送A中数据
JNB TI, $ ; 发送等待 CLR TI ; 清除 RET DLY1: …… ; 延时10ms子程序(略) END ; 结束 16.设计一个含8位动态显示和2×8键阵的硬件电路,并编写程序,实现将按键内容显示在LED数码管上的功能。 解:
硬件连接电路图如图6.16所示。
图6.16 6.16题扩展键盘显示器电路图
程序如下:
ORG 1000H
KD1:
MOV A, #0000 0011B ; 8155初始化,PA,PB基本输出方式,PC输入方式 MOV DPTR, #7F00H MOVX @DPTR, A KEY1:
ACALL KS1 ; 调用判断是否有键闭合子程序 JNZ LK1 ; 有键闭合转LK1 ACALL DSP8155 ; 调用8155动态显示子程序,延时6ms AJMP KEY1 LK1:
ACALL DSP8155 ACALL DSP8155 ; 调用两次显示,延时12ms ACALL KS1 JNZ LK2
ACALL DSP8155 ; 调用8155动态显示子程序,延时6ms AJMP KEY1 LK2: MOV
R2, #0FEH
45
MOV R4, #00H LK3: MOV DPTR, #7F01H
MOV A, R2 MOVX @DPTR, A INC DPTR INC DPTR MOVX A, @DPTR JB ACC.0, LONE MOV A, #00H AJMP LKP LONE: JB ACC.1, LTWO
MOV A, #08H AJMP LKP LKP: ADD A, R4
PUSH ACC LK4: ACALL DSP8155
ACALL KS1 JNZ LK4 POP ACC NEXT: INC R4
MOV A, R2 JNB ACC.7, KND RL A MOV R2, A AJMP LK3 KND: AJMP KEY1 KS1: MOV DPTR, #7F01H
MOV A, #00H MOVX @DPTR, A INC DPTR INC DPTR MOVX A, @DPTR CPL A ANL A, #0FH RET
DSP8155: MOV DPTR, #7F00H MOV A, #00000011B
MOVX @DPTR, A DISP1: MOV R0, #7EH MOV A, #80H LOOP: MOV R2, A
MOV DPTR, #7F01H MOVX @DPTR, A MOV A, @R0 MOV DPTR, #PTRN MOVC A, @A+DPTR MOV DPTR, #7F02H MOVX @DPTR, A CALL D1MS DEC R0 MOV A, R2 CLR C RRC A JC PASS AJMP LOOP PASS: RET D1MS: MOV R7, #02H DMS: MOV R6, #0FFH
46
; 指向8155命令寄存器
; 设定PA口、PB口为基本输出方式; 输出命令字
; 指向缓冲区末地址
; 扫描字,PA7为1,从左至右扫描 ; 暂存扫描字 ; 指向8155的PA ; 输出位选码
; 读显示缓冲区一字符 ; 指向段数据表首地址 ; 查表,得段数据 ; 指向8155的PB ; 输出段数据 ; 延时1ms ; 调整指针 ; 读回扫描 ; 清进位标志 ; 扫描字右移 ; 结束
; 继续显示 ; 返回
; 延时1ms子程序
PTRN:
DJNZ DJNZ RET DB DB DB …… END
R6, $
R7, DMS
0C0H, 0F9H, 0A4H, 0B0H, 99H …… ……
; 段数据表
17.设计一个用8155控制32个按键的键盘接口电路。编写程序实现以下功能:用8155定时器定时,每隔2s读一次键盘,并将读出的键值存入8155片内RAM以20H开始的单元中。 解:
硬件连接电路如图6.17所示。8155控制口的口地址为:7F00H;PA口地址:7F01H;PB口地址:7F02H;PC口地址:7F03H。片内RAM地址:7E00H~7EFFH。定时器低位地址:7F04H;定时器高位地址:7F05H。
图6.17 6.17题扩展键盘电路图
程序如下:
ORG 0000H LJMP MAIN ORG 0013H LJMP IEX1 ORG 0030H
MAIN: MOV SP,#60H
MOV R5,#200
MOV DPTR,#7FF8H MOV A,#11000001 MOVX @DPTR,A MOV DPTR,#7FFCH MOV A,#52H MOVX @DPTR,A INC DPTR MOV A,#27H MOVX @DPTR,A MOV DPTR,#7E40H SETB EX1 SETB EA SJMP $ ORG 0200H
IEX1: DJNZ R5,RETI_0
LCALL KEY1
MOVX @DPTR,A INC DPTR
RETI_0: RETI
;中断次数计数值
;8155初始化
;写定时器初值
;8155片内RAM地址
;调用键盘扫描及求键值子程序 ;存键值 ;修改地址 ;中断返回
47
时
AJMP KEY1 ;无键按下返回
LK1: ACALL T12MS ;调延时12 ms子程序
ACALL KS1 ;查有无键按下,若有则为键确实按下 JNZ LK2 ;键按下,(A)≠0,转逐列扫描 AJMP KEY1 ;不是键按下返回
LK2: MOV R4,#00H ;首列号入R4
MOV R2,#0FEH ;首列扫描字送R2
LK3: MOV A,R2 ;第一次列扫描
MOV DPTR,#7FF9H ;列扫描字送至8155PA口 MOVX @DPTR,A ;使第0列线为0 INC DPTR ;指向8155PC口 INC DPTR MOVX A,@DPTR ;8155PC口读入行状态 JB ACC.0,LONE ;第0行无键按下,转查第1行 MOV A,#00H ;第0行有键按下,该行首键号#00→A AJMP LKP ;转求键号
LONE: JB ACC.1,LTWO ;第1行无键按下,转查第2行
MOV A,#08H ;第1行有键按下,该行首键号#08→A AJMP LKP
LTWO: JB ACC.2,LTHR ;第2行无键按下,转查第3行
MOV A,#10H ;第2行有键按下,该行首键号#10H→A LJMP LKP
LTHR: JB ACC.3,LOOP ;第3行无键按下,转查下一列
MOV A,#18H ;第3行有键按下,该行首键号#18H→A
LKP: ADD A,R4 ;键号=行首建号+列号
PUSH ACC ;键号进栈保护
LK4: ACALL KS1 ;等待键释放
JNZ LK4 ;未释放,等待 POP ACC ;键释放,键号→A RET ;键扫描结束,出口状态:(A)=键号
LOOP: INC R4 ;指向下一列,列号加1
MOV A,R2 ;判断8列扫描完没有 JNB ACC.7,KND ;8列扫描完,返回 RL A ;扫描字左移一位,转变为下一列扫描字 MOV R2,A ;扫描字入R2 AJMP LK3 ;转下一列扫描
KND: AJMP KEY1 KS1: MOV DPTR,#7FF9H ;指向PA口
MOV A,#00H ;全扫描字#00H=00000000B MOVX @DPTR,A ;全扫描字入PA口 INC DPTR ;指向PC口 INC DPTR MOVX A,@DPTR ;读入PC口行状态
CPL A
ANL A,#0FH RET ;出口状态:(A)≠0时有键按下 T12MS: MOV R7,#18H T12MS1: MOV R6,#0FFH
DJNZ R6,$ DJNZ R7,T12MS1
RET
END
ORG 0100H
KEY1: ACALL KS1
JNZ LK1
;调用判断有无键按下子程序 ;有键按下时,(A)≠0,转消抖动延
18.设计一个TPμP-40A的打印机接口,将打印缓冲区中从30H开始的10字节数据传输到打印机,编写程序。
48