isp1016实现机载导航系统的键盘控制
//右移3位,提取按键列值
Row=Key&0x07;//提取按键行值
}
至此,就可根据Row和Col的值将它翻译为某一标准键,并存入NT键盘缓冲区。
3KBC内部逻辑设计
内部控制逻辑设计的关键是掌握按键识别原理。图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.3CPU的读操作
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若有低电平的回复线thenS1elseS0;
《isp1016实现机载导航系统的键盘控制(第2页)》