1k likes | 1.22k Views
第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所示。.
E N D
第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显示不同的符号或数字,要为LED提供段码 (或称字型码)。 提供给LED显示器的段码(字型码)正好是一个字 节(8段)。各段与字节中各位对应关系如下: 按上述格式,8段LED的段码如表10-1所示。
表10-1只列出了部分段码,可根据实际情况选用。表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-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. 按键的确认 检测行线电平 高电平:断开;低电平:闭合, 3.如何消除按键的抖动 常用软件来消除按键抖动。 基本思想:检测到有键按下,键对应的行线为低,软 件延时10ms后,行线如仍为低,则确认该行有键按下。 当键松开时,行线变高,软件延时10ms后,行线仍为 高,说明按键已松开。 采取以上措施,躲开了两个抖动期t1和t3的影响。
10.2.2 键盘接口的工作原理 独立式按键接口和行列式键盘接口。 1.独立式键盘接口 各键相互独立,每个按键各接一根输入线,通过检 测输入线的电平状态可很容易判断那个键被按下。 此种接口适于键数较少或操作速度较高的场合。 图10-7(a)为中断方式的独立式键盘工作电路 图10-7(b)为查询方式的独立式键盘工作电路。
图10-9用三态缓冲器扩展的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 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步:列线输出为全低电平,则行线中电平由高变低第1步:列线输出为全低电平,则行线中电平由高变低 的所在行为按键所在行。 第2步:行线输出为全低电平,则列线中电平由高变低 所在列为按键所在列。 结合上述两步,可确定按键所在行和列。 (3)键盘的编码 根据实际需要灵活编码。 10.2.3 键盘的工作方式 单片机在忙于各项工作任务时,如何兼顾键盘的输 入,取决于键盘的工作方式。
原则:即要保证能及时响应按键操作,又不要过多占原则:即要保证能及时响应按键操作,又不要过多占 用CPU的工作时间。 通常,键盘工作方式有3种,即编程扫描、定时扫 描和中断扫描。 1. 编程扫描方式 只有当单片机空闲时,才调用键盘扫描子程序, 扫描键盘。 工作过程: (1)在键盘扫描子程序中,先判断有无键按下。 方法:PA口8位输出全0,读PC口低4位状态,若PC0~ PC3为全1,则说明键盘无键按下;若不全为1,则说明 键盘可能有键按下。
(2)用软件来消除按键抖动的影响。如有键按下,则(2)用软件来消除按键抖动的影响。如有键按下,则 进行下一步。 (3)求按下键的键号。 (4)等待按键释放后,再进行按键功能的处理操作。 2. 定时扫描工作方式 利用单片机内的定时器,产生10ms的定时中断,对 键盘进行扫描。 3.中断工作方式 只有在键盘有键按下时,才执行键盘扫描程序,如 无键按下,单片机将不理睬键盘。 键盘所做的工作分为三个层次,如图10-13。
第1层:单片机如何来监视键盘的输入。三种工作方第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亮 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
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口
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位的字符。扫描方式的显示接口,可显示多达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提出中断申请。 CPU每次从键盘RAM中读出一个字节数据时,IRQ就变为低电平。如果键盘RAM中还有未读完的数据,IRQ将再次变为高电平,再次提出中断请求。 (2)扫描信号输出引脚