isp1016实现机载导航系统的键盘控制_传感与控制论文
关键词:键盘控制器 在线可编程 扫描线 isp1016
1 键盘控制器的外部接口信号
无论在任何计算机系统中,键盘都是最重要的输入设备,但是普通键盘不能满足机载要求。笔者在新一代电子航空图导航系统中,用lattice公司的isplsi1016设计了一个4×5键盘控制器(以下简称kbc),经实际应用,该键盘控制器通用性较强。图1是其键盘和显示器外观示意图。
一航情况下,kbc应该是cpu的一个外部i/o设备,它一方面监测各按钮状态,另一方面接受cpu的查询并主动向cpu请求中断。因此,外部接口信号分cpu接口信号和键盘按钮矩阵状态信号。图2为通用kbc外部接口信号示意图,其定义如下:
*reset:复位,低有效。该信号有效时将异步复位内部所有寄存器,以对kbc进行初始化;
*clk:工作时钟,频率为100khz;
*cs:片选,低有效;
*rd:读信号,低有效;
*a0:片内地址,用于区分片内寄存器;
*int:中断请求,高有效。当键盘控制器检测到有效按键时,该脚为高,当cpu读走按键编码时,kbc自动撤销中断请求;
*d4~d0:三态数据线;
*sl3~sl0:扫描输出,按键盘矩阵的列线;
*rl4~rl0:回复线,接键盘矩阵的行线。
实际上,大部分矩阵键盘的行列是可对换的。
2 kbc接口寄存器定义及驱动程序
kbc针对cpu接口设计有2个只读寄存器,即数据寄存器(dreg)和状态寄存器(sreg)。数据寄存器用于保持有效按键的编码值,该编码值就是按键所在的行列;而状态寄存器则用于保持按键的状态,以供cpu查询。当cpu访问kbc时(即cs和rd同时有效),adk a0=0,则访问数据寄存器,否则访问状态寄存器。表1、表2分别是数据寄存器和状态寄存器的定义。
表1 数据寄存器定义
d7 d6 d5 | d4 d3 | d2 d1 d0 |
x x x | col(列值) | row(行值) |
表2 状态寄存器定义
d7 d6 d5 | d4 d3 d2 d1 | d0 |
x x x | 0 0 0 0 |
显然,kbc的编程可以有2种模式,一种是软件查询,另一种是中断驱动。由于本系统采用windownt为运行环境,kbc对应用程序透明,所以,将int请求直接和cpu的某一空闲中断(irq9)相连接,以便使驱动程序能将kbc作为一个设备打开。在初始化加载时,应将对应中断触发设置为电平敏感。其vc核心代码如下:
#define sreg 0x401 //键盘状态寄存器地址
#define dreg 0x400 //键盘数据寄存器地址
…
byte sr,key,row,col;
…
sr=inp(sreg)&0x1f;
//读数据寄存器,低6位有效
col=key>>3;
//右移3位,提取按键列值
row=key & 0x07;//提取按键行值
}
至此,就可根据row和col的值将它翻译为某一标准键,并存入nt键盘缓冲区。
3 kbc内部逻辑设计
内部控制逻辑设计的关键是掌握按键识别原理。图3所示是其键盘识别原理图。设计时,可将按键设置在行线、列线的交点上。行线通过上拉电阻接到vcc(+5v),无按键时处于高电平。有按键时行线电平状态由列线决定。所有列线均为高则行线高,任一列线为低则行线低。kbc处理的核心就在于确认某一行线为低时,能定位出对应的列线。
3.1 输出扫描线(sl3..sl0)
在设计输出扫描线时,可以使用一个2-bit状态机q5[l1..0]来依次轮流使扫描线输出为低电平。驱动时钟的周期为640ms,亦即每即扫描线持续640ms的低电平。将状态机的状态编码值和当前周期为低电平的扫描线序号对应起来,即可简化后续处理。图4是扫描线输出波形。注意,无论何种按键组合,在任一状态,有且仅有一个扫描线为低电平,否则后续处理将无法正确识别。
3.2 键盘编码
处理回复线(rl4..rl0)时,应该对其中为低电平的行线进行编码。5个行线需要3-bit寄存器,记为[rq5..rq0],其真值表如下:
[rl4..rl0] ->[rq2..0]
----------------
[h,h,h,h,l] ->[0,0,0];0
[h,h,h,l,h] ->[0,0,1];1
[h,h,l,h,h] ->[0,1,0];2
[h,l,h,h,h] ->[0,1,1];3
[l,h,h,h,h] ->[1,0,0];4
当kbc确认是有效按键后,应把行列编码值放入缓冲,以供cpu读取,其逻辑表达如下:
式中,[ksl1,ksl0]是记录有效按键的扫描线编码,即当时的[qsl1..0]状态。
3.3 cpu的读操作
cpu读状态寄存器时,系统把中断请求寄存器int的值送出,而读数据寄存器时,它将把fifo缓冲的按键值送出,处理cpu读操作的表达式如下:
[d4..d0].oe=!cs & !rd; //寄存器由三态控制
[d4..d0]=(!a0 & [fifo4..fifo0])# //a0=0:送按键数据
(a0 & [l,l,l,l,int]); //a0=1;送状态
int.ar=!reset #(!cs&!rd & !a0);//读数据寄存器时应撤销中断
3.4 键盘处理状态机
该状态处理机是kbc处理的核心。图5是其状态转移图,其驱动时钟应该比扫描周期快而且应该是它的整数倍。此处采用的80ms时钟周期是扫描周期的8倍。下面讨论其状态转移条件。
s0:复位状态
1.记录当前扫描周期
2.if若有低电平的回复线then s1 else s0;
s1:
1. 启动延时(去抖)计数器,延时10.24ms
2. 无条件进入下一状态s2
s2:去抖状态
if去抖正确then s3
else s0
s3:确认状态
1. 将有效键值打入fifo缓冲
2. 设置
4 改进建议
上述kbc完全可以满足一般系统对键盘的要求,但仍然可以改进以使之更加智能化。例如使cpu能够对kbc的读操作和写入控制字进行适当控制、使kbc可处理组合按键和按键连击、增加kbc多字节的缓冲等。上述功能完全可以根据设计者系统和应用程序的要求进行改进。本设计源代码使用的是able硬件描述语言,对此感兴趣的同志可以和作者进行联系。