内容发布更新时间 : 2024/12/23 3:51:52星期一 下面是文章的全部内容请认真阅读。
(或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