第10章 MCS-51与键盘、显示器、拨盘、打印机的接 口设计 输出外设:LED显示器、LCD显示器、打印机等。 输入外设:键盘、BCD码拨盘等; 输出外设:LED显示器、LCD显示器、打印机等。 10.1 LED显示器接口原理 LED(Light Emitting Diode):发光二极管的缩写。 显示器前面冠以“LED”。 10.1.1 LED显示器的结构 常用的LED显示器为8段(或7段,8段比7段多了一 个小数点“dp”段)。 有共阳极和共阴极两种。如图10-1所示。
提供给LED显示器的段码(字型码)正好是一个字 节(8段)。各段与字节中各位对应关系如下: 为使LED显示不同的符号或数字,要为LED提供段码 (或称字型码)。 提供给LED显示器的段码(字型码)正好是一个字 节(8段)。各段与字节中各位对应关系如下: 按上述格式,8段LED的段码如表10-1所示。
表10-1 LED段码(8段) 显示字符 共阴极段码 共阳极段码 3FH C0H c 39H C6H 1 06H F9H d 5EH A1H 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只列出了部分段码,可根据实际情况选用。 另外,段码是相对的,它由各字段在字节中所处的 位决定。例如表10-1中8段LED段码是按格式: 而形成的, “0”的段码为3FH(共阴)。反之,如 将格式改为下列格式: 则 “0”的段码为7EH(共阴)。 字型及段码由设计者自行设定,习惯上还是以“a” 段对应段码的最低位。
10.1.2 LED显示器工作原理 图10-2是4位 LED显示器的结构原理图。 N个LED显示块有N位位选线和8×N根段码线。
段码线控制显示的字型, 位选线控制该显示位的亮或暗。 静态显示和动态显示两种显示方式。 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。
采取以上措施,躲开了两个抖动期t1和t3的影响。 2. 按键的确认 检测行线电平 高电平:断开;低电平:闭合, 3.如何消除按键的抖动 常用软件来消除按键抖动。 基本思想:检测到有键按下,键对应的行线为低,软 件延时10ms后,行线如仍为低,则确认该行有键按下。 当键松开时,行线变高,软件延时10ms后,行线仍为 高,说明按键已松开。 采取以上措施,躲开了两个抖动期t1和t3的影响。
此种接口适于键数较少或操作速度较高的场合。 图10-7(a)为中断方式的独立式键盘工作电路 图10-7(b)为查询方式的独立式键盘工作电路。 10.2.2 键盘接口的工作原理 独立式按键接口和行列式键盘接口。 1.独立式键盘接口 各键相互独立,每个按键各接一根输入线,通过检 测输入线的电平状态可很容易判断那个键被按下。 此种接口适于键数较少或操作速度较高的场合。 图10-7(a)为中断方式的独立式键盘工作电路 图10-7(b)为查询方式的独立式键盘工作电路。
图10-8为8255A扩展I/O口的独立式按键接口电路。
图10-9用三态缓冲器扩展的I/O口的按键接口电路。
CJNE A,R3,RETURN ;两次不同,抖动引起转RETURN 对图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 PKEY1 ;是K1键按下,转K1键处理 ;子程序PKEY1 KEY2: CJNE A,#1DH,KEY3 ;S2键未按下,转KEY3 LJMP PKEY2 ;S2键按下,转PKEY2处理 KEY3: CJNE A,#1BH,KEY4 ;S3未按下,转KEY4 LJMP PKEY3 ;S3按下,转PKEY3处理 KEY4: CJNE A,#17H,KEY5 ;S4键未按下,转KEY5 LJMP PKEY4 ;S4按下,转PKEY4处理 KEY5: CJNE A,#0FH,PASS ;S5未按下,转RETURN LJMP PKEY5 ;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 。
参考程序: ;最左边LED亮 DIR: MOV R0,#79H ;置缓冲器指针初值 MOV R3,#01H ;位选码的初值送R3 MOV A,R3 LD0: MOV DPTR,#7F01H;位选码→PA口(PA.0位) ;最左边LED亮 MOVX @DPTR,A INC DPTR ;数据指针指向PB口 MOV A,@R0 ;显示数据→A ADD A,#0DH ;加偏移量(下条指令到表首间 ;所有指令占的单元数) MOVC A,@A+PC ;根据显示数据来查表取段码
DIR1: MOVX @DPTR,A ;段码→8155HPB口 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
2.键盘程序设计 (1)判别键盘上有无键闭合 (2)去除键的机械抖动 (3)判别闭合键的键号 (4)使CPU对键的一次闭合仅作一次处理 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 ;列选码→8155H的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口
串口为方式0输出,串口外接移位寄存器74LS164。 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列键都检查 ;完?
Intel 8279芯片:通用可编程键盘/显示器接口芯片。 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*:片选
(2)扫描信号输出引脚 A0:=1,写入的是命令字节; 读出的是状态字节。 =0,写入或读出的字节均为数据。 RD*、WR*:读、写控制引脚 IRQ:中断请求线。在键盘方式中,当键盘RAM(先 进先出)中存有按下键的数据时,IRQ为高电平,向 CPU提出中断申请。 CPU每次从键盘RAM中读出一个字节数据时,IRQ就变为低电平。如果键盘RAM中还有未读完的数据,IRQ将再次变为高电平,再次提出中断请求。 (2)扫描信号输出引脚
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扫描线。
在逐列扫描时,当某一键闭合,消抖电路延时等 待10ms之后,再检验该键是否仍闭合。若闭合,则该 (2)键盘去抖动及回复缓冲器 RL0~RL7被接到键盘的行线。 在逐列扫描时,当某一键闭合,消抖电路延时等 待10ms之后,再检验该键是否仍闭合。若闭合,则该 键的行、列地址和附加的移位、控制状态一起形成键 盘数据,送入8279内部的键盘RAM存储器。格式为: D7 D6 D5 D4 D3 D2 D1 D0 CNTL SHIFT 扫 描 回 复 控制(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
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)。
条电源线,见表10-2。通过单片机写入模块的数据和 指令,就可对显示方式和显示内容作出选择。 模块14个引脚,其中有8条数据线,3条控制线,3 条电源线,见表10-2。通过单片机写入模块的数据和 指令,就可对显示方式和显示内容作出选择。 表10-2 液晶显示模块的引脚 引线号 符号 名称 功能 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位数据线 数据传输
命令格式及命令功能说明 (1) 命令格式 控制器HD44780内有多个寄存器,如表10-3所示。 表10-3 寄存器的选择 RS R/W* 操 作 命令寄存器写入 1 忙标志和地址计数器读出 数据寄存器写入 数据寄存器读出
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.软件编程 初始化 用户所编的显示程序,开始必须进行初始化,否 则模块无法正常显示。 显示程序编写(自己阅读) 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只有握手线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并 锁存
10.5.2 MCS-51与GP16微型打印机的接口 1. GP16微型打印机的接口信号 控制器为8031单片机。接口信号如下: 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,#7EH ;口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),直接可用于中断方式。如要以 如果使用其它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码拨盘的输入输出状态表。
表10-10 BCD码拨盘的输入输出状态 拨盘输入 控制端A 输出状态 8 4 2 1 3 5 6 7 9
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接通。 放在片内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 ;读完结束