第 10章 MCS-51与键盘、显示器、拨盘、打印机的接口设计输入外设,键盘,BCD码拨盘等;
输出外设,LED显示器,LCD显示器、打印机等。
10.1 LED显示器接口原理
LED(Light Emitting Diode):发光二极管的缩写。
显示器前面冠以,LED”。
10.1.1 LED显示器的结构常用的 LED显示器为 8段 (或 7段,8段比 7段多了一个小数点,dp”段)。
有 共阳极 和 共阴极 两种。如图 10-1所示。
为使 LED显示不同的符号或数字,要为 LED提供 段码
(或称 字型码 )。
提供给 LED显示器的段码 ( 字型码 ) 正好是一个字节( 8段) 。各段与字节中各位对应关系如下:
按上述格式,8段 LED的段码如表 10-1所示。
显示字符 共阴极段码共阳极段码显示字符 共阴极段码共阳极段码
0 3FH C0H c 39H C6H
1 06H F9H d 5EH A1H
2 5BH A4H E 79H 86H
3 4FH B0H F 71H 8EH
4 66H 99H P 73H 8CH
5 6DH 92H U 3EH C1H
6 7DH 82H T 31H CEH
7 07H F8H y 6EH 91H
8 7FH 80H H 76H 89H
9 6FH 90H L 38H C7H
A 77FH 88H,灭,00H FFH
b 7CH 83H … … …
表 10-1 LED段码( 8段)
表 10-1只列出了部分段码,可根据实际情况选用 。
另外,段码是相对的,它由各字段在字节中所处的位决定。例如表 10-1中 8段 LED段码是按格式,
而形成的,,0” 的段码为 3FH( 共阴)。 反之,如将格式改为下列格式:
则,0” 的段码为 7EH( 共阴) 。
字型及段码由设计者自行设定,习惯上还是以,a”
段对应段码的最低位。
N个 LED显示块有 N位位选线 和 8× N根段码线 。
10.1.2 LED显示器工作原理图 10-2是 4位 LED显示器的结构原理图。
段码线 控制 显示的字型,
位选线 控制 该显示位的亮或暗。
静态显示 和 动态显示 两种显示方式。
1,静态显示方式各位的公共端连接在一起(接地或 +5V)。
每位的段码线( a~ dp) 分别 与一个 8位的锁存器输出相连。
显示字符一确定,相应锁存器的段码输出将维持不变,直到送入另一个段码为止。 显示的亮度高 。
图 10-3,4位静态 LED显示器电路。该电路各位可独立显示。
2,动态显示方式所有位的段码线 相应段并在一起,由一个 8位 I/O
口控制,形成 段码线的多路复用,各位的 公共端 分别由相应的 I/O线控制,形成各位的 分时选通。
图 10-4,4位 8段 LED动态显示电路。其中段码线占用一个 8位 I/O口,而位选线占用一个 4位 I/O口。
图 10-5为 8位 LED动态显示 2003.10.10的过程 。
图( a)是显示过程,某一时刻,只有一位 LED被选通显示,其余位则是熄灭的;
图( b)是实际显示结果,人眼看到的是 8位稳定的同时显示的字符。
10.2 键盘接口原理
1,键盘输入的特点键盘:一组按键开关的集合 。
行线电压信号通过键盘开关机械触点的断开、闭合,
输出波形如图 10-6。
2,按键的确认检测行线电平,便可确认按键按下与否。
高电平,断开; 低电平,闭合,
常用 软件来消除按键抖动。
基本思想,检测到有键按下,键对应的行线为低,软件延时 10ms后,行线如仍为低,则确认该行有键按下。
3.如何消除按键的抖动当键松开时,行线变高,软件延时 10ms后,行线仍为高,说明按键已松开。
采取以上措施,躲开了两个抖动期 t1和 t3的影响 。
10.2.2 键盘接口的工作原理独立式 按键接口和 行列式 键盘接口。
1.独立式键盘接口各键相互独立,每个按键各接一根输入线,通过检测输入线的电平状态可很容易判断那个键被按下。
此种接口 适于键数较少或操作速度较高 的场合。
图 10-7( a) 为 中断方式的独立式 键盘工作电路图 10-7( b) 为 查询方式的独立式 键盘工作电路 。
图 10-8为 8255A扩展 I/O口 的 独立式 按键接口电路。
图 10-9用 三态缓冲器 扩展的 I/O口的按键接口电路 。
对图 10-9独立式键盘编程,软件消抖,查询方式检测键的状态。仅有一键按下时才有效才处理。
KEYIN:MOV DPTR,#0BFFFH; 键盘端口地址 BFFFH
MOVX A,@DPTR ; 读键盘状态
ANL A,#1FH ; 屏蔽高三位
MOV R3,A ; 保存键盘状态值
LCALL DELAY10 ; 延时 10ms去键盘抖动
MOVX A,@DPTR ; 再读键盘状态
ANL A,#1FH ; 屏蔽高三位
CJNE A,R3,RETURN ; 两次不同,抖动引起转 RETURN
CJNE A,#1EH,KEY2 ; 相等,有键按下,不等转 KEY2
LJMP KEY1 ;是 K1键按下,转 K1键处理; 子程序 PKEY1
KEY2,CJNE A,#1DH,KEY3 ;S2键未按下,转 KEY3
LJMP KEY2 ;S2键按下,转 PKEY2处理
KEY3,CJNE A,#1BH,KEY4 ;S3未按下,转 KEY4
LJMP KEY3 ;S3按下,转 PKEY3处理
KEY4,CJNE A,#17H,KEY5 ;S4键未按下,转 KEY5
LJMP KEY4 ;S4按下,转 PKEY4处理
KEY5,CJNE A,#0FH,PASS ;S5未按下,转 RETURN
LJMP KEY5 ;S5按下,转 PKEY5处理
RETURN:RET ;重键或无键按下,从子程序返回识别和编程简单,用在按键数较少的场合。
2,行列式 (矩阵式 )键盘接口用于按键数目较多的场合,由 行线和列线组成,
按键位于行、列的交叉点上。如图 10-10所示。
按键数目较多的场合,行列式键盘与独立式键盘相比,要节省很多的 I/O口线。
( 1)行列式键盘工作原理无键按下,该行线为高电平,当有键按下时,
行线电平有列线的电平来决定 。
由于行、列线为多键共用,各按键彼此将相互发生影响,必须 将行、列线信号配合起来并作适当的处理,才能确定闭合键的位置 。
( 2) 按键的识别方法
a,扫描法图 10-10( b) 中 3号键被按下为例,来说明此键时如何被识别出来的。
识别键盘有无键被按下的方法,分两步进行:
第 1步,识别键盘有无键按下;
第 2步,如有键被按下,识别出具体的按键。
把所有列线置 0,检查各行线电平是否有变化,如有变化,说明有键按下,如无变化,则无键按下。
上述方法称为 扫描法,即 先把某一列置低电平,
其余各列为高电平,检查各行线电平的变化,如果某行线电平为低,可确定 此行列交叉点 处的按键被按下。
b,线反转法只需两步便能获得此按键所在的行列值,线反转法的原理如图 10-11。
第 1步,列线输出为全低电平,则行线中电平由高变低的所在行为按键所在行。
第 2步,行线输出为全低电平,则列线中电平由高变低所在列为按键所在列。
结合上述两步,可确定按键所在行和列。
( 3)键盘的编码根据实际需要灵活编码。
10.2.3 键盘的工作方式单片机在忙于各项工作任务时,如何兼顾键盘的输入,取决于键盘的工作方式。
原则,即要保证能及时响应按键操作,又不要过多占用 CPU的工作时间。
通常,键盘工作方式有 3种,即编程扫描、定时扫描和中断扫描。
1,编程扫描方式只有当单片机空闲时,才调用键盘扫描子程序,
扫描键盘。
工作过程:
( 1)在键盘扫描子程序中,先判断有无键按下。
方法,PA口 8位输出全 0,读 PC口低 4位状态,若 PC0~
PC3为全 1,则说明键盘无键按下;若不全为 1,则说明键盘可能有键按下。
( 2)用软件来消除按键抖动的影响。如有键按下,则进行下一步。
( 3)求按下键的键号。
( 4)等待按键释放后,再进行按键功能的处理操作。
2,定时扫描工作方式利用单片机内的定时器,产生 10ms的定时中断,对键盘进行扫描。
3.中断工作方式只有在键盘有键按下时,才执行键盘扫描程序,如无键按下,单片机将不理睬键盘。
键盘所做的工作分为三个层次,如图 10-13。
第 1层,单片机如何来监视键盘的输入。三种工作方式:①编程扫描②定时扫描③中断扫描。
第 2层,确定具体按键的键号。体现在按键的识别方法上就是:①扫描法;②线反转法。
第 3层,执行键处理程序。
10.3 键盘 /显示器接口设计实例一般把键盘和显示器放在一起考虑。
10.3.1 利用并行 I/O芯片实现键盘 /显示器接口图 10-14,8031用扩展 I/O接口芯片 8155H实现的
6位 LED显示和 32键的键盘 /显示器接口电路。图中的
8155H也可用 8255A来替代。
8031外扩一片 8155H。 RAM地址为 7E00H~ 7EFFH。
I/O口地址为 7F00H~ 7F05H。
PA口 为输出口,控制键盘列线的扫描,同时又是 6
位共阴极显示器的位扫描口。
PB口 作为显示器段码输出口,PC口作为键盘的行线状态的输入口。
75452,反相驱动器,7407,同相驱动器。
1.动态显示程序设计
8031内部 RAM设置 6个显示缓冲单元 79H~ 7EH,存放要显示的 6位数据。
8155H的 PB口输出相应位的段码,依次的改变 PA口输出为高的位 使某一位显示某一字符,其它位为暗。
动态地显示出由缓冲区中显示数据所确定的字符。
程序流程如图 10-15 。
参考程序如下,
DIR,MOV R0,# 79H ; 置缓冲器指针初值
MOV R3,# 01H ; 位选码的初值送 R3
MOV A,R3
LD0,MOV DPTR,# 7F01H; 位选码 → PA口( PA.0位); 最左边 LED亮
MOV @DPTR,A
INC DPTR ; 数据指针指向 PB口
MOV A,@R0 ; 显示数据 → A
ADD A,# 0DH ; 加偏移量(下条指令到表首间;所有指令占的单元数)
MOVC A,@A+ PC ; 根据显示数据来查表取段码
DIR1,MOVX @DPTR,A ; 段码 →8155 HPB口
ACALL DL1ms ; 该位显示 1ms
INC R0 ; 指针指向下一个数据单元
MOV A,R3 ; 位选码送入 A中
JB Acc.5,LD1 ; 判断是否扫描到最右边的; LED,如到最右边则返回
RL A ; 位选码向左移一位,准备让; 右边的下一位 LED亮位选码
MOV R3,A ; 送 R3中保存
AJMP LD0 ;
LD1,RET ;
DSEG,DB 3FH,06H,5BH,4FH,66H,6DH ; 共阴极段码表
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,73H,3EH
DB 31H,6EH,1CH,23H,40H,03H
DB 18H,00H
DL1ms,MOV R7,# 02H ; 延时 1ms子程序
DL,MOV R6,# 0FFH
DL6,DJNZ R6,DL6
DJNZ R7,DL
RET
2.键盘程序设计
( 1)判别键盘上有无键闭合
( 2)去除键的机械抖动
( 3)判别闭合键的键号
( 4)使 CPU对键的一次闭合仅作一次处理键盘程序的流程如图 10-16。
键盘子程序如下:
KEYI,ACALL KS1 ; 调用判有无键闭合子程序
JNZ LK1 ; 有键闭合,跳 LK1
NI,ACALL DIR ; 无键闭合,调用显示子程序,延;迟 6ms后,跳 KEYI
AJMP KEYI
LK1,ACALL DIR ; 可能有键闭合,延迟 12ms,软件去抖
ACALL DIR
ACALL KS1 ; 调用判有无键闭合子程序
JNZ LK2 ; 经去抖,判键确实闭合,跳 LK2处理
ACALL DIR ; 调用显示子程序延迟 6ms
AJMP KEYI ; 抖动引起,跳 KEYI
LK2,MOV R2,# 0FEH ; 列选码 → R2
MOV R4,# 00H ; R4为列号计数器
LK4,MOV DPTR,# 7F01H ; 列选码 →8155 H的 PA口
MOV A,R2 ;
MOVX @DPTR,A ;
INC DPTR ; 数据指针增 2,指向 PC口
INC DPTR ;
MOVX A,@DPTR ; 读 8155H PC口
JB Acc.0,LONE ; 0行线为高,无键闭合,跳
LONE,转判 1行
MOV A,# 00H ; 0行有键闭合,首键号 0→ A
AJMP LKP ; 跳 LKP,计算键号
LONE,JB Acc.1,LTW0 ; 1行线为高,无键闭合,跳 LTW0,;转判 2行
MOV A,# 08H ; 1行有键闭合,首键号 8→ A
AJMP LKP
LTW0,JB A.2,LTHR ; 2行线为高,无键闭合,跳 LTHR,;转判 3行
MOV A,# 10H ; 2行有键闭合,首键号 10H→A
AJMP LKP ; 跳 LKP,计算键号
LTHR,JB Acc.3,NEXT ; 3行线为高,无键;闭合,跳 NEXT,准备下一列扫描
MOV A,# 18H ; 3行有键闭合,首键号 18H→A
LKP,ADD A,R4 ; 计算键号:首键号+列号 =键号
PUSH A ; 键号进栈保护
LK3,ACALL DIR ; 调用显示子程序,延时 6ms
ACALL KS1 ; 调用判有无键闭合子程序,延时; 6ms
JNZ LK3 ; 判键释放否,未释放,则循环
POP A ; 键已释放,键号出栈 → A
RET
NEXT,INC R4 ; 列计数器加 1,为下一列扫描作准备
MOV A,R2 ; 判是否已扫到最后一列(最右一列)
JNB Acc.7,KND ; 键扫描已扫到最后一列,跳 KND,;重新进行整个键盘扫描
RL A ; 键扫描未扫到最后一列,,位选码左移;一位
MOV R2,A ; 位选码 → R2
AJMP LK4 ;
KND,AJMP KEYI ;
KS1,MOV DPTR,#7F01H; 判有无键闭合子程序,全
,0” →;扫描口( PA口)MOV A,# 00H ; 即列线全为低电平
MOVX @DPTR,A ;
INC DPTR ; DPTR增 2,指向 PC口
INC DPTR ; 指针增 1,指向 PC口
MOVX A,@DPTR ; 从 PC口读行线的状态
CPL A ; 行线取反,如无键按下,则 A为 0;
ANL A,# 0FH ; 屏蔽无用的高 4位
RET
10.3.2 利用 8031的串行口实现键盘 /显示器接口串行口未作它用,可用来外扩键盘 /显示器。
串行口为方式 0输出,串行口外接移位寄存器 74LS164。
接口电路如图 10-17。
74LS164(0)~ 74LS164(7):作为 8位 LED的段码输出,
8031的 P3.4,P3.5,两行键的行状态输入
P3.3( TXD),同步移位脉冲输出控制线,
优点,亮度大,容易做到 显示不闪烁,且 CPU不必频繁的为显示服务,从而使单片机有更多的时间处理其它事务。
显示子程序:
DIR,SETB P3.3 ; P3.3=1允许 TXD脚同步移位;脉冲输出
MOV R7,# 08H ; 送出的段码个数,R7为段;码个数计数器
MOV R0,# 7FH ; 7FH~ 78H为显示数据缓冲区
DL0,MOV A,@R0 ; 取出要显示的数送 A
ADD A,# 0DH ; 加上偏移量
MOVC A,@A+ PC ; 查段码表 SEGTAG,取出段码
MOV SBUF,A ; 将段码送 SBUF
DL1,JNB TI,DL1 ; 输出段码,查询 TI状态,1个字节;的段码输出完否?
CLR TI ; 1个字节的段码输出完,清 TI标志
DEC R0 ; 指向下一个显示数据单元
DJNZ R7,DL0 ; 段码个数计数器 R7是否为 0,如不; 为 0,继续送段码
CLR P3.3 ; 8个段码输出完毕,关显示器输出
RET ; 返回
SEGTAB,DB 0C0H,0F9H,0A4H,0B0H,99H ; 共阳极段码表,; 0,1,2,3,4
DB 92H,82H,0F8H,90H ; 5,6,7,8,9
DB 88H,83H,0C6H,0A1H,86H ; A,B,C,D,E
DB 8FH,0BFH,8CH,0FFH,0FFH ; F,-,P,暗键盘扫描子程序:
KEYI,MOV A,# 00H ; 判有无键按下,使所有列线为 0;的编码送 A
MOV SBUF,A ; 扫描键盘的( 8)号 74LS164输;出为 00H,使所有列线为 0
KL0,JNB TI,KL0 ; 串行输出完否?
CLR TI ; 串行输出完毕,清 TI
KL1,JNB P3.4,PK1 ; 第 1行有闭合键吗?如有,跳; PK1进行处理
JB P3.5,KL1 ; 在第 2行键中有闭合键吗?无闭;合键跳 KL1
PK1,ACALL DL10 ; 调用延时 10ms子程序 DL10,软;件消除抖动
JNB P3.4,PK2 ; 判是否抖动引起的?
JB P3.5,KL1
PK2,MOV R7,# 08H ; 不是抖动引起的
MOV R6,# 0FEH ; 判别是哪一个键按下,FEH为最;左一列为低
MOV R3,# 00H ; R3为列号寄存器
MOV A,R6 ;
KL5,MOV SBUF,A ; 列扫描码从串行口输出
KL2,JNB TI,KL2 ; 等待串行口发送完
CLR TI ; 串行口发送完毕,清 TI标志
JNB P3.4,PKONE ; 读第 1行线状态,第 1行有键闭;合,跳 PKONE处理
JB P3.5,NEXT ; 读第 2行状态,是第 2行某键否?
MOV R4,# 08H ; 第 2行键中有键被按下,行首键;号 08H送 R4
AJMP PK3 ;
PKONE,MOV R4,# 00H ; 第 1行有键按下,行首键号 00H送 R4
PK3,MOV SBUF,# 00H ; 等待键释放,发送 00H使所有列;线为低
KL3,JNB TI,KL3 ;
CLR TI ; 发送完毕,清标志
KL4,JNB P3.4,KL4 ; 判行线状态
JNB P3.5,KL4 ;
MOV A,R4 ; 两行线均为高,说明键已释放
ADD A,R3 ; 计算得键码 → A
RET
NEXT,MOV A,R6 ; 列扫描码左移一位,判下列键
RL A ;
MOV R6,A ; 记住列扫描码于 R6中
INC R3 ; 列号增 1
DJNZ R7,KL5 ; 列计数器 R7减 1,8列键都检查;完?
AJMP KEYI ; 8列键扫描完毕,开始下一个键;盘扫描周期
DL10,MOV R7,# 0AH ; 延时 10ms子程序
DL,MOV R6,# 0FFH
DL6,DJNZ R6,DL6
DJNZ R7,DL
RET
10.3.3 利用通用键盘 /显示器接口芯片 8279实现键盘 /
显示器接口
Intel 8279芯片,通用可编程键盘 /显示器接口芯片。
对键盘部分提供扫描工作方式,能对 64个键键盘阵列不断扫描,自动消抖,自动识别出闭合的键 并 得到键号,能对 双键或 N键同时按下 进行处理。
扫描方式作的显示接口,可显示多达 16位 的字符。
1.8279的引脚及内部结构
2,引脚功能介绍
(1)与 CPU的接口引脚
DB0~ DB7,数据总线、双向、三态,与单片机数据总线相连,在 CPU和 8279之间传送命令或数据。
CLK,系统时钟,用于 8279内部定时,以产生其工作所需的时序。
RESET,高电平时,8279被复位,复位后的状态如下:
* 16个字符左边输入显示方式
* 编码扫描键盘、双键锁定方式
CS*,片选
A0,=1,写入的是命令字节 ; 读出的是状态字节。
=0,写入或读出的字节均为数据。
RD*,WR*,读、写控制引脚
IRQ,中断请求线。在键盘方式中,当键盘 RAM( 先进先出)中存有按下键的数据时,IRQ为高电平,向
CPU提出中断申请。
( 2) 扫描信号输出引脚
CPU每次从键盘 RAM中读出一个字节数据时,IRQ就变为低电平。如果键盘 RAM中还有未读完的数据,IRQ将再次变为高电平,再次提出中断请求。
SL0~ SL3
扫描输出。用来扫描键盘和显示器。可编程设定为编码输出,即 SL0~ SL3需外接 4-16译码器,输出 16
取 1的扫描信号,也可编程设定为译码输出,即由 SL0
~ SL3直接输出 4取 1的扫描信号。
( 3)与键盘连接的引脚
RL0~ RL7
键盘矩阵的行信号输入线。
SHIFT
输入线,通常用作键盘上、下档功能的控制键。
CNTL/STB
输入线,高电平有效。在键盘方式时,通常用来作为键盘控制功能键使用。
( 4)与显示器连接的引脚
OUTA0~ OUTA3( A组显示数据),OUTB0~ OUTB3( B
组显示数据),向 LED显示器输出的段码,与扫描信号线 SL0~ SL3同步。两组可独立使用,也可合并使用。
BD*:消隐显示控制 。
3,8279的基本功能部件
( 1)扫描计数器编码方式,扫描线 SL0~ SL3输出,经外部 4-16译码器译码后,为键盘和显示器提供 16取 1的扫描线。
译码方式,计数器的最低二位在 8279内部译码后,从
SL0~ SL3输出,为键盘和显示器提供 4取 1扫描线。
D7 D6 D5 D4 D3 D2 D1 D0
CNTL SHIFT 扫 描 回 复
( 2)键盘去抖动及回复缓冲器
RL0~ RL7被接到键盘的行线。
在逐列扫描时,当某一键闭合,消抖电路延时等待 10ms之后,再检验该键是否仍闭合。若闭合,则该键的行、列地址和附加的移位、控制状态一起形成键盘数据,送入 8279内部的键盘 RAM存储器。格式为:
控制( CNTL) 和移位( SHIFT) 的状态由两个独立的附加开关决定,而扫描( D5,D4,D3) 是被按键的行编码,而回复( D2,D1,D0) 则是被按键的列位置数据。
( 3)键盘 RAM及其状态寄存器键盘 RAM,8字节先进先出( FIFO) 存储器。内部的 FIFO
状态寄存器 存放 FIFO的工作状态,如 FIFO是空还是满,
其中存有多少字符,是否操作出错等等。
当 FIFO存储器空间不足时,状态逻辑将产生 IRQ=1
信号,向 CPU发出中断申请。
( 4)显示 RAM和显示地址寄存器显示 RAM,存显示数据。共 16个字节,最多可存放 16位显示信息。显示 RAM的输出与显示扫描配合,同时轮流驱动被选中的显示位,使显示器呈现稳定的显示(动态扫描)。
4,8279的命令字和状态字命令字,D7,D6,D5为命令特征位,来区分 8条不同的命令字。
状态字,主要用于键盘工作方式,以指示键盘 RAM中的字符数和有无错误发生。
5,8279与键盘 /显示器的接口图 10-20为 8279与 8位显示器,4× 8键盘的接口电路。
行线接 8279的 RL0~ RL3,8279选用外部译码方式,SL0
~ SL2经 74LS138( 1) 译码输出,接列线,实现键盘逐列扫描。
SL0~ SL2又由 74LS138(2)译码输出到显示器各位的公共阴极,进行逐位扫描显示。 OUTB0~ 3,OUTA 0~ 3输出 8位段码。
当位切换时,BD*输出为低电平,使 74LS138(2)输出全为高电平,显示消隐。
当键盘上出现有效的闭合键时,键输入数据自动进入中断读取键盘 RAM中的键输入数据。若要更新显示器输出,仅需改变 8279中显示 RAM中的内容。
图 10-20:8279的 命令 /状态口地址为 7FFFH,数据口地址为 7FFEH。 8279初始化程序:
INITI,SETB EX1 ; 允许外部中断 1中断
MOV DPTR,#7FFFH ; 命令 /状态口地址写入 DPTR
MOV A,#0D1H ; 控制字 D1H送 A
MOVX @DPTR,A ; 向命令 /状态口写入控制字
LP,MOVX A,@DPTR ; 读 8279的状态
JB Acc.7,LP
MOV A,#00H
MOVX @DPTR,A
8279的键盘 RAM存储器,并向 8031请求中断,8031响应
MOV A,# 2AH
MOVX @DPTR,A
SETB EA
……
键输入中断服务程序:
PINT1,PUSH PSW
PUSH DPH
PUSH DPL
PUSH Acc
MOV DPTR,# 7FFFH ; 向命令口写入读键盘 RAM命令
MOV A,# 40H
MOVX @DPTR,A
MOV DPTR,# 7FFEH ; 读键输入值
MOVX A,@DPTR
CJNE A,# 37H,PRI1 ; 判输入停机命令否
SETB 20H
PRI1,POP Acc
POP DPL
POP DPH
POP PSW
RETI
显示子程序:
DIR,MOV DPTR,# 7FFFH ; 输出写显示 RAM命令
MOV A,# 90H
MOVX @DPTR,A
MOV R0,# 70H
MOV R7,# 08H ; 送显示 RAM数据的个数
MOV DPTR,# 7FFEH
DL0,MOV A,@R0
ADD A,# 05H ; 05H为查表偏移量
MOVC A,@A+PC ; 查表得到段码
MOVX @DPTR,A ; 写入显示 RAM
INC R0 ; 显示数据单元地址增 1
DJNZ R7,DL0 ; 8个显示数据是否输出完毕
RET
ADSEG,DB 3FH,06H,5BH,4FH,66H,6DH ; 段码表(共阴极)
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,73H,3EH
DB 31H,6EH,1CH,23H,40H,03H
DB 18H,38H,00H
10.4 MCS-51与液晶显示器( LCD) 的接口
LCD( Liquid Crystal Display),液晶显示器的缩写,一种 被动式 的显示器,即液晶本身并不发光,
而是经液晶经过处理后能 改变光线通过方向 的特性,
而达到 白底黑字 或 黑底白字 显示的目的。
液晶显示器具有 功耗低,抗干扰能力强 等优点,
广泛地应用在仪器仪表和控制系统中。
10.4.1 LCD显示器的分类按排列形状分,字段型,点阵字符型 和 点阵图形 。
( 1)字段型广泛用于电子表、数字仪表、计算器中。
( 2)点阵字符型显示字母、数字、符号。它是由 5× 7或 5× 10点阵组成,广泛应用在单片机应用系统中。
( 3)点阵图形型笔记本电脑和彩色电视等设备中。
10.4.2 点阵字符型液晶显示模块介绍点阵字符型 LCD显示器,需相应的 LCD控制器、驱动器,来对 LCD显示器进行扫描、驱动,以及一定空间的 RAM和 ROM来存储写入的命令和显示字符的点阵。
现在已 将 LCD控制器、驱动器,RAM,ROM和 LCD显示器用 PCB连接到一起,称为 液晶显示模块 LCM(LCd
Module)。
用户只向 LCM送入相应的命令和数据就可实现所需要的显示内容,与单片机接口简单,使用灵活方便。产品分为字符和图形两种。
1.基本结构
( 1)液晶板在液晶板上排列着若干 5× 7或 5× 10点阵的字符显示位,从 规格上分为每行 8,16,20,24,32,40位,
有一行、两行及四行三类,用户可根据需要,来选择购买。
( 2)模块电路框图由 控制器 HD44780,驱动器 HD44100及几个电阻电容组成。 HD44100是扩展显示字符位用的(例如,16字符× 1行模块就可不用 HD44100,16字符× 2行模块就要用一片 HD44100)。
引线号 符号 名称 功能
1 VSS 地 0V
2 VDD 电源 5V± 5%
3 VEE 液晶驱动电压
4 RS 寄存器选择 1:数据寄存器; 0,命令 寄存器
5 R/W* 读 /写 1:读; 0:写
6 E 使能 下降沿触发
7~14 DB0~DB7 8位数据线 数据传输表 10-2 液晶显示模块的引脚模块 14个引脚,其中有 8条 数据线,3条 控制线,3
条 电源线,见表 10-2。通过单片机写入模块的数据和指令,就可对显示方式和显示内容作出选择。
RS R/W* 操 作
0 0 命令寄存器写入
0 1 忙标志和地址计数器读出
1 0 数据寄存器写入
1 1 数据寄存器读出表 10-3 寄存器的选择
2,命令格式及命令功能说明
(1) 命令格式
LCD控制器 HD44780内有多个寄存器,如表 10-3所示。
RS位和 R/W*引脚 上的电平来选择寄存器,而 DB7~
DB0则决定命令功能。
命令共 11种,清除,返回,输入方式设置,显示开关控制,移位控制,功能设置,CGRAM( 字符生成
RAM) 地址设置,DDRAM( 显示数据 RAM) 地址设置,
读忙标志和地址,写数据到 CGRAM或 DDRAM,从 CGRAM
或 DDRAM读数据。
这些命令功能强:可组合成各种输入、显示、移位方式以满足不同的要求。
( 2)标准字符库图 10-23,字符库的内容、字符码和字型的对应关系。例如,A”的字符码为 41H,“B”的字符码为 42H。
10.4.3 8031与 LCD的接口及软件编程
1.8031与 LCD模块的接口接口电路见图 10-24。将 LCM挂接在 8031的总线上,通过对数据总线的读写实现对 LCM的控制。
1.软件编程
(1)初始化用户所编的显示程序,开始必须进行初始化,否则模块无法正常显示。
(2)显示程序编写 (自己阅读 )
10.5 MCS-51与微型打印机的接口内部有一个控制用单片机,固化有控打程序,智能化程度高。
常用的微型打印机,TPμP -40A/16A,GP16以及
XLF嵌入仪器面板上的汉字微型打印机。
10.5.1 MCS-51与 TPμP -40A/16A微型打印机的接口
1,TPμP -40A/16A微型打印机单片机控制的微型智能打印机。 TPμP -40A与
TPμP -16A的接口信号与时序完全相同,操作方式相近,硬件电路及插脚完全兼容,只是指令代码不完全相同。 TPμP -40A每行打印 40个字符,TPμP -16A则每行打印 16个字符。
2,主要性能、接口要求及时序
(1)TPμP -40A主要技术性能
单片机控制,2KB控打程序及标准的 Centronics并行接口。
可打印全部 ASCII代码字符及 128个非标准字符和图符。 1 6个代码字符( 6× 7点阵)由用户定义。
可打印出 8× 240点阵的图样(汉字或图案点阵)。
字符、图符和点阵图可在 宽和高的方向放大为× 2、
× 3、× 4倍。
每行字符的点行数(包括字符的行间距)可用命令更换。即字符行间距空点行在 0~ 256间任选。
2.接口信号采用 国际上流行的 Centronics打印机并行接口,
与单片机间是通过一条 20芯扁平电缆及接插件相连。
打印机有一个 20线扁平插座,信号引脚排列如图 10-
26所示。
引脚介绍,
DB0~ DB7,数据线,单向传输,由单片机输入给打印机。
STB*,数据选通信号。在该信号的上升沿时,数据线上的 8位并行数据被打印机读入机内锁存。
BUSY,打印机,忙,状态信号。当该信号有效(高电平)时,表示打印机正忙。此时,单片机不得向打印机送入新的数据。
ACK*,打印机的应答信号。低电平有效,表明打印机已取走数据线上的数据。
ERR*:,出错,信号。当送入打印机的命令格式出错时,打印机立即打印一行出错信息,提示出错。在打印出错信息之前,该信号线出现一个负脉冲,脉冲宽度为 30μs 。
3.接口信号时序接口信号时序如图 10-27所示。
选通信号 STB*宽度需大于 0.5μs 。 应答信号 ACK*可与 STB*信号作为一对应答联络信号,也可与 BUSY作为一对应答联络信号。
2,字符代码及打印命令写入的全部代码共 256个,其中 00H无效。
代码,01H~ 0FH为打印命令;
代码,10H~ 1FH为用户自定义代码;
代码,20H~ 7FH为标准 ASCII代码;
代码,80H~ FFH为非 ASCII代码,如图 10-28所示。其中包括少量汉字、希腊字母、块图图符和一些特殊字符。
3,TPμP -40A/16A与 MCS-51单片机接口设计
TPμP -40A/16A内部控制电路由单片机构成,在输入电路中有锁存器,在输出电路中有三态门控制。因此可直接与单片机相接。
TPμP -40A/16A只有握手线 STB*,BUSY( 或 ACK*),
接口电路如图 10-29所示。
图 10-30,并行 I/O口连接的打印机接口电路。图中的扩展 I/O口为 8255A的 PA口,采用了查询法,即通过 读
8255A 的 PC0脚的状态来判断送给打印机的一个字节的数据是否处理完毕 。也可用中断法( BUSY直接与单片机的 P3.3脚相连)。
例 把 MCS-51单片机内部 RAM 3FH~4FH单元中的 ASCII码数据送到打印机。 8255A设置为方式 0,即端口 A与端口
C的上半部为输出方式。端口 C的下半部为输入方式。
打印程序如下:
PRINT,MOV R0,#7FH ; 控制口地址 → R0
MOV A,#81H ; 8255A控制字 → A
MOVX @R0,A ; 控制字 → 控制口
MOV R1,#3FH ; 数据区首地址 → R1
MOV R2,#0FH ;打印数据个数的计数
LOOP,MOV A,@R1 ; 打印数据单元内容 → A
INC R1 ; 指向下一个数据单元
MOV R0,#7CH ; 8255A的端口 A地址 → R0
MOVX @R0,A ; 打印数据送 8255A的口 A并锁存
MOV R0,#7FH ; 8255A的控制口地址 → R0
MOV A,#0EH ; PC7的复位控制字 → A
MOVX @R0,A ; PC7=0
MOV A,#0FH ; PC7的置位控制字 → A
MOVX @R0,A ; PC7由 0变 1
LOOP1,MOV R0,#7EF ; 口 C地址 → R0
MOVX A,@R0 ; 读入 C口的值
ANL A,#01H ; 屏蔽 C口的高 7位,只留 PC0位
JNZ LOOP1 ; 查询 BUSY的状态,如为 1跳 LOOP1
DJNZ R2,LOOP ; 未打完,循环
10.5.2 MCS-51与 GP16微型打印机的接口
1,GP16微型打印机的接口信号控制器为 8031单片机。接口信号如下,
各信号的功能如下,
IO0~ IO7,双向三态数据总线,是 CPU与 GP16打印机之间命令、状态和数据信息传输线。
CS*,设备选择线。
RD*,WR*,读、写信号线。
BUSY,打印机状态输出,高电平表示 GP16处于忙状态,
可供 CPU查询或作中断请求线。
GP16控制器具有数据锁存器,与单片机接口十分方便 。
1.打印命令及打印方式
GP16的 打印命令占两个字节,其格式如下,
第一个字节 D7-----D4 D3-----D0
操作码 点行数 n
第二个字节 D7------------------ D0
打印行数 NN
GP16为微型针打,字符本身占据 7个点行 。命令字中的 点行数 n是选择字符行之间的行距的参数,若 n=10,
则行距为 3个点行数,应大于或等于 8。 打印行数 是执行本条命令时打印(或空走纸)的字符行数。
GP16的命令编码如下表。
D7 D6 D5 D4 命令功能
1 0 0 0 空走纸
1 0 0 1 打印字符串
1 0 1 0 十六进制数据打印
1 0 1 1 图形打印
3,MCS-51单片机和 GP16的接口
GP16内部有三态锁存器,能锁存数据总线上的数据,,故 GP16可以直接与 MCS-51数据总线相连而不须外加锁存器。图 10-32为 GP16与 8031数据总线口相连的接口电路。
图中 BUSY接 (P3.3),直接可用于中断方式。如要以查询方式工作时,BUSY可以不连接,通过查询状态字来获取 BUSY的状态。
如果使用其它 I/O或扩展 I/O口,只须将 P0口线换成其他 I/O或扩展 I/O口即可。
按照图 10-32的连接,GP16的 打印机地址为 7FFFH,
读取 GP16状态字 时,8031执行下列程序段:
MOV DPTR,# 7FFFH
MOVX A,@DPTR
将命令或数据写入 GP16时,8031执行下列程序段:
MOV DPTR,# 7FFFH
MOV A,# DATA/COMMAND
MOVX @DPTR,A
10.6 MCS-51单片机与 BCD码拨盘的接口设计
10.6.1 BCD码拨盘有时需输入一些控制参数,参数一经设定将维持不变。使用的最方便的拨盘是十进制输入,BCD码输出的 BCD码拨盘。这种拨盘如图 10-33,为四片 BCD码拨盘拼接的 4位十进制输入拨盘组。每片拨盘具有 0~ 9十个位置,每个位置都有相应的数字显示。
BCD码拨盘后面有 5个接点,A为输入控制线,另外 4
是 BCD码输出线。
拨盘拨到不同位置时,输入控制线 A分别与 4根 BCD
码输出线中的某根或某几根接通,其接通的 BCD码输出线状态正好与拨盘指示的十进制数相一致。
表 10-10为 BCD码拨盘的输入输出状态表。
拨盘输入 控制端 A
输出状态
8 4 2 1
0 1 0 0 0 0
1 1 0 0 0 1
2 1 0 0 1 0
3 1 0 0 1 1
4 1 0 1 0 0
5 1 0 1 0 1
6 1 0 1 1 0
7 1 0 1 1 1
8 1 1 0 0 0
9 1 1 0 0 1
表 10-10 BCD码拨盘的输入输出状态
10.6.2 BCD码拨盘与单片机的接口
1.与单片 BCD码拨盘的接口图 10-34是 8031通过 P1.0~ P1.3与单片 BCD码拨盘的接口电路。
A端接+ 5V,当拨盘拨至某十进制数时,相应的 8,4,
2,1有效端输出高电平(如拨至,6” 时,4,2,端为
,1” )无效端为低电平。输出的 BCD码为正逻辑。
如 A端接地,8,4,2,1输出端通过电阻上拉至高电平时,拨盘输出的 BCD码为负逻辑(反码) 。
2,多片 BCD码拨盘与单片机的接口如按图 10-34,N位拨盘需占用 4× N根 I/O口线,为减少 I/O口线,可将拨盘的输出线分别通过 4个与非门与单片机的 I/O口相连,每片拨盘的控制端 A不再接+ 5V
或地,而是分别与 I/O口线相连,用来控制选择多片拨盘中的任意一片。
这时,N位十进制拨盘,用 N片 BCD码拨盘拼成时 只需占用 4+N根 I/O口线 。图 10-35通过 P1与 4片 BCD码拨盘相连的 4位 BCD码输入电路。
4片拨盘的 BCD码输出相同端接入同一个 4个与非门。
四个与非门输出 8,4,2,1端分别接入 P1.3,P1.2,P1.1,
P1.0。 其余的 P1.6,P1.5,P1.4分别与千、百、十、个位 BCD码拨盘的控制端相连。当选中某位时,该位的控制端置 0,其它三个控制端置 1。
例如选中千位时,P1.7置 0,P1.4~ P1.6置 1,此时四个与非门所有其它位连接的输入端均为 1状态,因此四个与非门输出的状态完全取决于千位数 BCD拨盘输出状态。由于该位的控制端置 0,因此,拨盘所置之数输出为 BCD反码,通过与非门输出为该千位数的 BCD码下面以图 10-35为例,介绍 BCD码拨盘输入子程序。
例如输入为 9345,这时,每位 BCD码输出端上有相应的数字与 A接通。
本程序 将读入的 4位 BCD码按千、百、十、个依次存放在片内 RAM的 30H~ 33H单元,每个单元的高 4位为 0,低 4
位为 BCD码。
程序如下:
RDS,MOV R0,# 30H ; 初始化,存放单元首址
MOV R2,# 7FH ; P1口高 4位置控制字及低 4位置输入;方式
MOV R3,# 04H ; 读入 4个 BCD码
LOOP,MOV A,R2
MOV P1,A ; P1口送控制字及低 4位置输入方式
MOV A,P1 ; 读入 BCD码
ANL A,# 0FH ; 屏蔽高 4位
MOV @R0,A ; 送入存储单元
INC R0 ; 指向下个存储单元
MOV A,R2 ; 准备下一片拨盘的控制端置 0
RR A ;
MOV R2,A ;
DJNZ R3,LOOP ; 未读完返回
RET ; 读完结束