单片机课后习题答案

(或COM)。可以显示数字和简单的字符,每个数字和字符与其字形码(段码)对应。

点阵式LCD显示器的段电极与背电极呈正交带状分布,液晶位于正交的带状电极间。点阵式LCD的控制一般采用行扫描方式,通过两个移位寄存器控制所扫描的点。

80C51与液晶显示模块LCM的基本接口电路如图6.11所示。

图6.11 80C51与液晶显示模块LCM的基本接口电路

液晶显示模块初始化子程序(将系统设置成显示2行字符,5×7点阵,开显示,显示光标,字符闪烁,清屏,光标为移动方式,自动地址为增量方式。):

电源打开后,在电源上升到4.5V并维持15ms后,写入功能设置控制字,选择数据接口位数等;等待5ms后,检查忙标志,在不忙的情况下,再进行其他的功能设置;检查忙标志,在不忙的情况下,关显示;检查忙标志,在不忙的情况下,清屏;检查忙标志,在不忙的情况下,设定输入方式,初始化结束。程序如下:

LCD: MOV A, #38H ; 8位数据,2行显示,5×7点阵 MOV DPTR, #8000H ; LCD 的口地址 MOVX @DPTR, A LCALL BUSY MOV A, #01H ; 清屏 MOV DPTR, #8000H MOVX @DPTR, A

LCALL BUSY

MOV A, #07H ; AC自动加1,整体显示移动 MOV DPTR, #8000H MOVX @DPTR, A LCALL BUSY MOV A, #0FH ; 开显示,开光标,字符闪烁 MOV DPTR, #8000H MOVX @DPTR, A RET

BUSY:

LOOP:

PUSH DPH

PUSH DPL PUSH PSW PUSH ACC

MOV DPTR, #8001H MOVX A, @DPTR

JB ACC.7, LOOP POP ACC POP PSW POP DPL POP DPH RET

; 保护现场

; 读BH及AC ; 忙,继续等待

; 不忙,恢复现场返回

41

12.矩阵式键盘的编程要点是什么? 解:

(1)判断键盘上有无键按下:列输出全0,读行输入状态,若状态为全1,则说明键盘无键按下;若不全为1,则说明键盘有按下。

(2)消除按键抖动的影响:在判断有键按下后,用软件延时的方法,再判断键盘状态,如果仍为有键按下状态,则认为有一个确定的键按下,否则当作按键抖动处理。

(3)求按键位置,计算键号:用扫描的方法识别闭合键N所在的行号X和列号Y,并根据:以下公式计算闭合键的键号N =X行首键号+列号Y。

(4)键闭合一次仅进行一次按键处理:方法是等待按键释放之后,再进行按键功能的处理操作。

13.设计一个8051外扩键盘和显示器电路,要求扩展8个键,4位LED显示器。 解:

硬件电路连接图如图6.13所示。

图6.13 6.13题LED显示器/键盘电路图

14.使用8255的PC口设计一个4行4列键盘矩阵的接口电路,并编写出与之对应的键盘识别程序。 解:

硬件连接电路图如图6.14所示。

图6.14 6.14题扩展键盘电路图 程序如下:

ORG 1000H

START:MOV DPTR, #7FFFH ; 8255初始化

MOV A, #81H

42

MOVX @DPTR, A KEY: ACALL KEY1 JNZ LKEY1 ACALL DELAY1 AJMP KEY LKEY1: ACALL DELAY1 ACALL DELAY1 ACALL KEY1 JNZ LKEY2 ACALL DELAY1 AJMP KEY LKEY2: MOV R2, #0EFH MOV R4, #00H LKEY4: MOV DPTR, #7FFEH MOV A, R2 MOVX @DPTR, A MOV A, @DPTR JB ACC.0, LONE MOV A, #00H AJMP LKEYP LONE: JB ACC.1, LTWO MOV A, #04H AJMP LKEYP LTWO: JB ACC.2, LTHR MOV A, #08H AJMP LKEYP

LTHR: JB ACC.3, NEXT MOV A, #0CH LKEYP: ADD A, R4 PUSH ACC LKEY3: ACALL DELAY1 ACALL KEY1 JNZ LKEY3 POP ACC RET

NEXT: INC R4 MOV A, R2

JNB ACC.7, KND RL A MOV R2, A

AJMP LKEY4 KND: AJMP KEY KEY1: MOV DPTR, #7FFEH 描线

MOV A, #00H MOVX @DPTR, A MOVX A, @DPTR CPL A ANL A, #0F0H RET DELAY1: MOV R7,#4

; 检查有键闭合否 ; A非0说明有键按下 ; 执行一次延时子程序(延时6 ms) ; 有键闭合延时2×6ms=12ms以去抖动 ; 延时以后再检查是否有键闭合 ; 有键闭合,转LKEY2 ; 无键闭合,说明是干扰信号,不作处理 ; 延时6ms后转KEY继续等待键入 ; 扫描初值送R2,设定PC4为当前扫描线 ; 回送初值送R4 ; 指向PC口

; 扫描初值送PC口

; 取回送线状态 ; ACC.0=1,第0行无键闭合,转LONE

; 装第0行行值 ; 转计算键码 ; ACC.1=1,第1行无键闭合,转LTWO ; 装第1行行值 ; 转计算键码

; ACC.2=1,第2行无键闭合,转LTHR ; 装第2行行值 ; ACC.3=1,第3行无键闭合,转NEXT

; 装第3行行值 ; 计算键码 ; 保存键码 ; 延时6ms ; 判断键是否继续闭合,若闭合再延时 ; 若键释放,则键码送A ; 列号加1 ; 第7位为0,以扫描到最高列,转KND ; 循环左移一位 ; 进行下一列扫描 ; 扫描完毕,开始新的一轮 ; 将PC口地址送DPTR,PC口高四位作为扫; 所有扫描线均为低电平 ; PC口向列线输出00H ; 取回送线状态 ; 行线状态取反 ; 屏蔽A的高四位 ; 返回

; 延时6mS延时子程序

43

D1:MOV R6,#220 D2: DJNZ R6,D2

DJNZ R6,D2 DJNZ R7,D1 RET END

15.利用单片机串行口,一片74LS164扩展3×8键盘矩阵,P1.0~P1.2作为键盘输入口,试画出该部分接口逻辑电路图,并编写与之对应的按键识别程序。 解:

硬件连接电路图如图6.15所示。

图6.15 6.15题扩展键盘电路图 程序如下:

ORG 1000H

SERKEY: MOV SCON, #00H ; 设置串行口 MOV A, #00H ; 键盘初始化,送00H到列线上 LCALL VARTO ; 发送数据

CHK: JNB P1.0, CHK0 ; 检查是否有键按下 JNB P1.1, CHK0 ; 检查是否有键按下 JNB P1.2, CHK0 ; 检查是否有键按下

AJMP CHK ; 无键按下,继续查找 CHK0: LCALL DLY1 ; 调用10ms延时子程序,去抖

JNB P1.0, CHEN ; 确实有键按下,转CHEN JNB P1.1, CHEN JNB P12, CHEN AJMP CHK ; 无键按下,继续查找 CHEN: MOV R2, #0FEH ; 首列扫描字送R2,查键号,最低位为0

MOV R4, #00H ; 首列偏移值送R4 CHKN: MOV A, R2 ; 发送列扫描字

LCALL VARTO JB P1.0, CH1 ; 检查P1.0有无键按下;若无,转CH1 MOV A, #0 ; 第一行首列值送A,00H+(R4) AJMP CKEY ; 转求键号 CH1: JB P1.1, CH2 ; 检查P1.1有无键按下;若无,转NEXT

MOV A, #8 ; 第二行首列值送A CH2: JB P1.1, NEXT ; 检查P1.1有无键按下;若无,转NEXT

MOV A, #16 ; 第三行首列值送A AJMP CKEY ; 转求键号 CKEY: ADD A, R4 ; 求键号,并入栈保护 RET

NEXT: INC R4 ; 指向下一列

MOV A, R2 ; 取出原扫描字 JNB ACC.7,KEND ; 是否已检查完8列? RL A ; 8列未完,指向下一列

44

联系客服:779662525#qq.com(#替换为@)