简洁实用的键盘接口及其译码结构(上)

🏠 首页 《无线电》杂志 1989年 🔗 第2期 🔗 第30页 分类:技术市场 🔗 周振安 🔗

键盘接口方式很多,本文介绍的3/8线译码键盘接口具有硬件电路简单,软件易于实现的特点。

本接口电路如图1所示。其中十六个键排成2×8矩阵;3/8线译码器将PIO B口三根线的输出译码为唯一低电平的8线输出(作为8条行线);PIO A口的二条线置为输入线,读取数据,用作列线。不断扫描各行(即将B口三条线输出的三位二进制码累加),A口二条列线不断读取列线数据。将A口和B口的五条线由高位到低位排列为PA\(_{4}\)PA3PB\(_{2}\)PBlPB\(_{O}\)(称为键的代码),可实现16键键盘扫描。将键代码减去01000就可得到键的真实值(称为键值)。键、键代码及键值对应关系见表。

图1
图1 🔍原图 (771×482)
图2
图2 🔍原图 (883×582)

图2是系统监控主程序(片断)框图。当系统接通电源后,主程序就被运行。各中断服务子程序都可通过键盘发布命令来启动,其框图见图3,这里中断次数计数器只设置了一个BF\(_{0}\),CTC通道0每发出一次中断请求,BFO计数器就加1。

图3
图3 🔍原图 (305×556)
图4
图4 🔍原图 (276×386)

在编制监控软件程序时,须注意如下要点:1、CPU每隔5ms扫描一次键盘。在初始化时,设置CTC通道0每5ms发出一次中断请求,中断请求的次数由中断次数计数器BF\(_{0}\)计数。当主程序运行到键盘子程序段时,首先判断CTC通道0是否发过中断请求,只有当(BFO)>0时,CPU才扫描键盘。2、各中断服务子程序要尽量少占用CPU时间。CPU扫描键盘,发现有键按下时,必须经过20ms以上的延时以消除键抖动。如果直接调用延时子程序,势必会过多占用CPU的时间。这里设置了一个键盘扫描次数计数器B,若在连续四次扫描键盘过程中,键值均保持不变,则认为该键稳定按下,从而防止误判。键释放的判断是靠判断B≥4及D=0来实现的。若仅是B≥4,而D≠0,则认为此时按下的键尚未释放。只有当B≥4。且D=0,才认为键已释放,此后程序转入键译码。3、设置功能转换键(以下简称功能键)。在键盘子程序中,有时要实现的命令子程序数目多于键的数目,则至少要设置一个功能键。4、编制命令转移表。

键盘子程序框图见图4所示,它分为三个组成部分:键盘扫描、键值确认和转移指针的获得。下面详细说明。

图5
图5 🔍原图 (888×1304)

程序一开始首先判断中断计数器BF\(_{0}\)是否为0,若为0则不扫描键盘,直接返回主程序;若BF0。不等于0,则开始扫描键盘,每扫描一遍键盘,中断计数器减一。扫描键盘时,P10B口的低三位依次取000→001→010→011→100→101→110→111,使3/8线译码器的八根输出线依次为低电平,从而依次选中键盘的各行。每选中一行,由A口读出列值进行判别,若列值不等于11则表明当前行有键按下,此时可将列值及行值按照顺序

图6
图6 🔍原图 (415×86)

并成一字节存入D寄存器,从而获得按键的信息。

为防止误判,B计数器经过4次扫描并获得完全相同的键代码方可确认该键准确按下,否则不予确认。

为使程序可靠执行,在按键未释放前不执行键功能模块,只有当按键释放,即同时满足B≥4,D=0,程序才能转入相应模块,否则返回主程序。

程序的以下部分就是如何根据键值跳转到相应的模块上去。这里将24个模块的首地址作为跳转目标,安排24条绝对跳转指令组成命令转移表,将转移表的首地址JPTAB送到HL寄存器,并将获得的键代码减去01000即得键值,然后使键值×3→BC,执行HL←HL+BC就得到转移指针。

由于功能模块数目大于键的数目,需设一功能键,使一键多用。例如安排第15号键作为功能键,用某个标志位的状态=1来记忆该键的按下。当某键按下时,先判功能键状态标志位,若标志位为0,则执行第一功能,即16个键各自对应KEY\(_{1}\),KEY2,…KEY\(_{16}\)模块;若标志位为1,则表明上次按过功能键,须修正一下键值,使程序跳转到第二功能上,即16个键各自对应KEY17,KEY\(_{18}\),…KEY32模块上。(待续)(周振安)