540 likes | 691 Views
第 10 章 MCS-51 与键盘、显示器、拨盘的接口设计. 一、 键盘接口原理. 二、 键盘 / 显示器接口设计实例. 利用并行 I/O 芯片实现键盘 / 显示器接口. 利用 8031 的串行口实现键盘 / 显示器接口. 利用通用键盘 / 显示器接口芯片 8279 实现键盘 / 显示器接口. 10.2 键盘接口原理. 键盘输入的特点. 1) .按键的分类
E N D
第10章 MCS-51与键盘、显示器、拨盘的接口设计 一、键盘接口原理 二、键盘/显示器接口设计实例 利用并行I/O芯片实现键盘/显示器接口 利用8031的串行口实现键盘/显示器接口 利用通用键盘/显示器接口芯片8279实现键盘/显示器接口
10.2 键盘接口原理 键盘输入的特点 1).按键的分类 按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点式开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。 按键按接口原理可分为键盘分编码键盘和非编码键盘。 这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。 键盘上闭合键的识别由专用的硬件译码器实现,并产生键编号或键值的称为编码键盘,如BCD码键盘、ASCII码键盘等;靠软件识别的称为非编码键盘。
2).键输入原理 微机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。 对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入,并检查是哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。
3).按键结构与特点 行线电压信号通过键盘开关机械触点的断开、闭合, 输出波形如图10-6。 为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施。这一点可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。
+5v +5v I/O 接 口 I/O 接 口 单片机 单片机 & & +5v +5v 开关 开关 消除抖动电路 消除抖动电路 & & 硬件去抖 在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路。右图是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。 图 10-6 硬件去抖电路 图 硬件去抖电路
N 有按键信号? Y 延时等待10ms N 仍有按键信号? Y 键盘处理 N 按键释放? Y 软件去抖 如果按键较多,常用软件方法去抖动,即检测出键闭合后执行一个延时程序,产生5~10 ms的延时;让前沿抖动消失后,再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5~10 ms的延时,待后沿抖动消失后,才能转入该键的处理程序。 图10-7 软件去抖
10.2.1 非编码键盘接口的工作原理 独立式按键接口和行列式键盘接口。 1.独立式键盘接口 各键相互独立,每个按键各接一根输入线,通过检 测输入线的电平状态可很容易判断那个键被按下。 此种接口适于键数较少或操作速度较高的场合。 图10-7(a)为中断方式的独立式键盘工作电路 图10-7(b)为查询方式的独立式键盘工作电路。
图10-9用三态缓冲器扩展的I/O口的按键接口电路。图10-9用三态缓冲器扩展的I/O口的按键接口电路。 MOV DPTR,#0BFFFH MOVX A,@DPTR
对图10-9独立式键盘编程,软件消抖,查询方式检测键的状态。仅有一键按下时才有效才处理。对图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 ;重键或无键按下,从子程序返回 PKEY1: LJMP RETURN PKEY*的程序框架怎样
2. 行列式(矩阵式)键盘接口 按键数目较多的场合,行列式键盘与独立式键盘相比,要节省很多的I/O口线。 由行线和列线组成,按键位于行、列的交叉点上。 为了编程的需要,更准确的叫法:扫描线和回读线。为了读到确定的值,回读线被定义在有上拉电阻的线上。
首先判别键盘中有无键按下: 由单片机I/O口向键盘送(输出)全扫描字,然后读入(输入)列线状态来判断。方法是: 向扫描线(图中水平线)输出全扫描字00H,把全部行线置为低电平,然后将回读线的电平状态读入累加器A中。如果有按键按下,总会有一根列线电平被拉至低电平,从而使列输入不全为1。 判断键盘中哪一个键被按下: 通过将扫描线逐行置低电平后,检查回读线输入状态。方法是: 依次给扫描线送低电平,然后查所有回读线状态,称行扫描。如果全为1,则所按下的键不在此行;如果不全为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。
具体描述 行扫描法识别键号(值)的原理 • 将第0行变为低电平,其余行为高电平时,输出编码为1110。然后读取列的电平,判别第0行是否有键按下。在第0行上若有某一按键按下,则相应的列被拉到低电平,则表示第0行和此列相交的位置上有按键按下。若没有任一条列线为低电平,则说明0行上无键按下。 • 将第1行变为低电平,其余行为高电平时,输出编码为1101。然后通过输入口读取各列的电平。检测其中是否有变为低电平的列线。若有键按下,则进而判别哪一列有键按下,确定按键位置。 • 将第2行变为低电平,其余行为高电平时,输出编码为1011。判别是否有哪一列键按下的方法同上。 • 将第3行变为低电平,其余行为高电平时,输出编码为0111。判别是否有哪一列键按下的方法同上。
如何将你知道的第i行、第j列按键被按下的信息存放在A中?以什么形式存放?读图10-10如何将你知道的第i行、第j列按键被按下的信息存放在A中?以什么形式存放?读图10-10 在扫描过程中,当发现某行有键按下,也就是输入的列线中有一位为0时,便可判别闭合按键所在列的位置,根据行线位置和列线位置就能判断按键在矩阵中的位置,知道是哪一个键按下。 行首键号 读图并归纳,得出: 按键的值=行号×每行的按键个数+列号。计数译码法 第0行的键值为:0行×4+列号(0~3)为0、1、2、3; 第1行的键值为: 1行×4+列号(0~3)为4、5、6、7; 第2行的键值为: 2行×4+列号(0~3)为8、9、A、B; 第3行的键值为: 3行×4+列号(0~3)为C、D、E、F。 4×4键盘行首键号为0、4、8、C,列号为0,1,2,3。 此公式是针对例图,若行、列与扫描线、回读线的对应关系改变了,公式要改变。
键的位置码及键值的译码过程 按键扫描的工作过程如下: ① 判断键盘中是否有键按下; ② 进行行扫描,判断是哪一个键按下,若有键按下,则调用延时子程序去抖动; ③ 读取按键的位置码; ④ 将按键的位置码转换为键值(键的顺序号)0、1、2…、F。 这样编键号有何好处? 规划:行扫描过程结束后(发现有键按下)得到的行号存放在R0中,列号存放在R2中。
出口: EKEY键值(键号)在A中或? KEY: MOV P1,#0F0H ;令所有行为低电平 MOV A,P1 ;读列值 ORL A,#0FH ;取列值,A中有0则有键闭合 CPL A ;A中有1则有键按下则有键闭合 JZ EKEY;无键按下时退出 LCALL DEL20 ms ;延时20 ms去抖动 SKEY: MOV A,#00 ;下面进行行扫描,1行1行扫 MOV R0,A ;R0作为行计数器,开始为0 MOV R1,A ;R1作为列计数器,开始为0 MOV R3 #0FEH ;R3为行扫描字暂存,低4位为行扫描字 SKEY2:MOV A,R3 MOV P1,A ;输出行扫描字,高4位全1 MOV A,P1 ;读列值 MOV R1,A ;暂存列值 ORL A,#0F0H ;取列值 CPL A ;高电平则有键闭合 S123: JNZ SKEY3 ;有键按下转SKEY3,无键按下时进行一行扫描
INC R0 ;行计数器加1 MOV A,R3 RL A MOV R3,A ;形成下一行扫描字→R3 MOV A,R0 CJNE A,#04H,SKEY2;最后一行扫(4次)完了吗? EKEY: RET 去SKEY2扫描下一行 EKEY是谁的出口? 若有键闭合,则去SKEY3
列号译码 SKEY3: MOV A,R1 JNB ACC.4,SKEY5 JNB ACC.5,SKEY6 JNB ACC.6,SKEY7 JNB ACC.7,SKEY8 AJMP EKEY SKEY5:MOV A,#00H MOV R2,A;存0列号 AJMP DKEY SKEY6:MOV A,#01H MOV R2,A;存1列号 AJMP DKEY SKEY7:MOV A,#02H MOV R2,A;存2列号 AJMP DKEY SKEY8:MOV A,#03H MOV R2,A;存3列号 AJMP DKEY 去DKEY做什么?
;键位置译码 DKEY: MOV A,R0 ;取行号 MOV A,R0 ;取行号送A MOV B,#04H ;每一行按键个数 MUL AB ;行号×按键数 ADD A,R2 ;行号×按键数+列号=键值,在A中 AJMP EKEY 解读子程序的框架。 问:何时调用?
练习:设计一个2×2行列式键盘,并编写键盘扫描子程序。练习:设计一个2×2行列式键盘,并编写键盘扫描子程序。 解: 原理如图9-8所示。 ① 判断是否有键按下: 将列线P1.0、P1.1送全0,查P0.0、P0.1是否为0。 ② 判断哪一个键按下: 逐列送0电平信号,再逐行扫描是否为0。 ③ 键号=行首键号+列号 键盘扫描原理图
10.2.3 键盘的工作方式 单片机在忙于各项工作任务时,如何兼顾键盘的输 入,取决于键盘的工作方式。 原则:即要保证能及时响应按键操作,又不要过多占用CPU的工作时间。 通常,键盘工作方式有3种,即编程扫描、定时扫描和中断扫描。
1. 编程扫描方式 只有当单片机空闲时,才调用键盘扫描子程序,扫描键盘。 工作过程: 事先写好键盘扫描子程序,在主程序中的适当位置安排调用子程序。如上所述,一旦有键按下,子程序会把键值算好,放如A中,主程序中应有相应的程序去对键值作出反应。 2. 定时扫描工作方式 利用单片机内的定时器,产生10ms的定时中断,在中断服务程序中对键盘进行扫描。
3.中断工作方式 只有在键盘有键按下时,才执行键盘扫描程序,如无键按下,单片机将不理睬键盘。 键盘所做的工作分为三个层次,如图10-13。 第1层:单片机如何来监视键盘的输入。三种工作方式:①编程扫描②定时扫描③中断扫描。 第2层:确定具体按键的键号。体现在按键的识别方法上就是:①扫描法;②线反转法。 第3层:执行键处理程序。
10.3 键盘/显示器接口设计实例 10.3.1 利用并行I/O芯片实现键盘/显示器接口 一般把键盘和显示器放在一起考虑。 图10-14:8031用扩展I/O接口芯片8155H实现的6位LED显示和32键的键盘/显示器接口电路。 8031外扩一片8155H。RAM地址:7E00H~7EFFH。 I/O口地址:7F00H~7F05H。 PA口为输出口,控制键盘列线的扫描,同时又是6位共阴极显示器的位选线。 PB口作为显示器段码输出口,PC口作为输入口,是键盘的回读线。 75452:反相驱动器,7407:同相驱动器。
1. 动态显示程序设计 内部RAM 6个显示缓冲单元: 79H~7EH存放要显示的6位数据。 8155H的PB口输出相应位的段码; 8155H的PA口输出位选码,如01H。 子程序流程如图10-15 。 8155H的初始化程序: MOV DPTR, #7F00H MOV A, #03H;P215 MOVX @DPTR, A
参考程序: 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,#0EH ;加偏移量(下条指令到表首间 ;所有指令占的单元数) MOVC A,@A+PC ;根据显示数据来查表取段码 MOVX @DPTR,A ;段码→8155H PB口 ACALL DL1ms ;该位显示1ms
INC R0 ;指针指向下一个数据单元 MOV A, R3 ;位选码送入A中 JB Acc.5, LD1 ;判断是否扫描到最右边的 LED RL A ;位选码向左移一位 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 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。
判有无键闭合子程序,全“0”→ KS1: MOV DPTR ,#7F01H ;扫描口(PA口) MOV A,#00H ;即列线全为低电平 MOVX @DPTR,A ; MOV DPTR ,#7F03H ;DPTR增2,指向PC口 MOVX A,@DPTR ;从PC口读行线的状态 CPL A ;行线取反,如无键按下,则A为0 ANL A,#0FH ;屏蔽无用的高4位 RET 出口参数:A非零则有键闭合。
键盘子程序如下: 寄存器分配: R4列选码 R2列号计数器 KEYI: ACALL KS1 ;调用判有无键闭合子程序 JNZ LK1 ;有键闭合,跳LK1 • NI: ACALL DIR ;无键闭合,调用显示子程序 • 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 ACC.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 ACC ;键号进栈保护 LK3: ACALL DIR ;调用显示子程序,延时6ms ACALL KS1 ;调用判有无键闭合子程序 JNZ LK3 ;判键释放否,未释放,则循环 POP ACC ;键已释放,键号出栈→A RET
NEXT:INC R4 ;列计数器加1,为下一列扫描作准备 MOV A, R2 ;判是否已扫到最后一列(最右一列) RL A ;键扫描未扫到最后一列,,位选码左移一位 JNB ACC.7, KND ;键扫描已扫到最后一列,跳KND, ;重新进行整个键盘扫描 MOV R2, A ;位选码→R2 AJMP LK4 KND: AJMP KEYI ; 出现了意外,返回读键。 思考题:若希望LED上显示键入的内容,应如何构建主程序? 若希望显示呈右滚屏,数据区应如何处理?
熟悉OC门的负载电阻与开关上拉电阻的典型值。熟悉OC门的负载电阻与开关上拉电阻的典型值。 读图练习
读图练习 10.3.2 利用8031的串行口实现键盘/显示器接口
10.3.3 利用通用键盘/显示器接口芯片8279实现键盘/ 显示器接口
读图猜8279的功能 1.键盘的形式以及对信号线的要求 SL0~SL3:输出信号 RL0~RL3:输入信号 2.键盘的形式以及对信号线的要求 SL0~SL3:输出信号 OUTA0~OUTA3:输出信号,输出段码 OUTB0~OUTB3:输出信号,输出段码 3.与8031之间的口线—并口 有读写控制线 有数据线 地址线A0及时钟线(锁存控制线)CLK 有中断请求线IRQ
1.8279的引脚及内部结构 8279的结构
8279的引脚及功能描述 • 8279是Intel公司为8位微处理器设计的通用键盘/显示器接口芯片,其功能是:接收来自键盘的输入数据并作预处理;完成数据显示的管理和数据显示器的控制。单片机应用系统采用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)扫描信号输出引脚 • 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*:消隐显示控制。 众多的功能要靠命令字来告知8279
3. 8279的基本功能部件 (1)扫描计数器 SL0~SL3 编码方式:扫描线SL0~SL3输出,经外部4-16译码器 译码后,为键盘和显示器提供16取1的扫描线。 译码方式:计数器的最低二位在8279内部译码后,从 SL0~SL3输出,为键盘和显示器提供4取1扫描线。 (2)键盘去抖动及回复缓冲器 RL0~RL7被接到键盘的行线。 在逐列扫描时,当某一键闭合,消抖电路延时等待10ms之后,再检验该键是否仍闭合。若闭合,则该键的行、列地址和附加的移位、控制状态一起形成键盘数据,送入8279内部的键盘RAM存储器。格式为: