单片机课后习题答案 下载本文

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