📄 ——isp1016实现机载导航系统的键盘控制.htm
字号:
<TD align=middle width="33%">X X X</TD>
<TD align=middle width="33%">0 0 0 0</TD>
<TD align=middle width="34%"> </TD></TR></TBODY></TABLE>
<P
style="TEXT-INDENT: 30px">显然,KBC的编程可以有2种模式,一种是软件查询,另一种是中断驱动。由于本系统采用WindowNT为运行环境,KBC对应用程序透明,所以,将INT请求直接和CPU的某一空闲中断(IRQ9)相连接,以便使驱动程序能将KBC作为一个设备打开。在初始化加载时,应将对应中断触发设置为电平敏感。其VC核心代码如下:</P>
<P style="TEXT-INDENT: 30px">#define SReg 0x401 //键盘状态寄存器地址</P>
<P style="TEXT-INDENT: 30px">#define DReg 0x400 //键盘数据寄存器地址</P>
<P style="TEXT-INDENT: 30px">…</P>
<P style="TEXT-INDENT: 30px">BYTE SR,Key,Row,Col;<IMG height=298
hspace=1 src="——isp1016实现机载导航系统的键盘控制.files/8c.gif" width=307
align=right vspace=1 border=0></P>
<P style="TEXT-INDENT: 30px">…</P>
<P style="TEXT-INDENT: 30px">SR=inp(SReg)&0x1f;</P>
<P style="TEXT-INDENT: 30px">//读数据寄存器,低6位有效</P>
<P style="TEXT-INDENT: 30px">Col=Key>>3;</P>
<P style="TEXT-INDENT: 30px">//右移3位,提取按键列值</P>
<P style="TEXT-INDENT: 30px">Row=Key & 0x07;//提取按键行值</P>
<P style="TEXT-INDENT: 30px">}</P>
<P
style="TEXT-INDENT: 30px">至此,就可根据Row和Col的值将它翻译为某一标准键,并存入NT键盘缓冲区。</P>
<P style="TEXT-INDENT: 0px"><B>3 KBC内部逻辑设计</B></P>
<P
style="TEXT-INDENT: 30px">内部控制逻辑设计的关键是掌握按键识别原理。图3所示是其键盘识别原理图。设计时,可将按键设置在行线、列线的交点上。行线通过上拉电阻接到VCC(+5V),无按键时处于高电平。有按键时行线电平状态由列线决定。所有列线均为高则行线高,任一列线为低则行线低。KBC处理的核心就在于确认某一行线为低时,能定位出对应的列线。</P>
<P style="TEXT-INDENT: 30px">3.1 输出扫描线(SL3..SL0)</P>
<P
style="TEXT-INDENT: 30px">在设计输出扫描线时,可以使用一个2-Bit状态机Q5[L1..0]来依次轮流使扫描线输出为低电平。驱动时钟的周期为640ms,亦即每即扫描线持续640ms的低电平。将状态机的状态编码值和当前周期为低电平的扫描线序号对应起来,即可简化后续处理。图4是扫描线输出波形。注意,无论何种按键组合,在任一状态,有且仅有一个扫描线为低电平,否则后续处理将无法正确识别。<BR><IMG
height=285 hspace=20 src="——isp1016实现机载导航系统的键盘控制.files/8d.gif"
width=521 vspace=10 border=0><BR></SPAN> <SPAN
class=main1>3.2 键盘编码</P>
<P
style="TEXT-INDENT: 30px">处理回复线(RL4..RL0)时,应该对其中为低电平的行线进行编码。5个行线需要3-Bit寄存器,记为[RQ5..RQ0],其真值表如下:</P>
<P style="TEXT-INDENT: 30px">[RL4..RL0] ->[RQ2..0]</P>
<P style="TEXT-INDENT: 30px">----------------</P>
<P style="TEXT-INDENT: 30px">[H,H,H,H,L] ->[0,0,0];0</P>
<P style="TEXT-INDENT: 30px">[H,H,H,L,H] ->[0,0,1];1</P>
<P style="TEXT-INDENT: 30px">[H,H,L,H,H] ->[0,1,0];2</P>
<P style="TEXT-INDENT: 30px">[H,L,H,H,H] ->[0,1,1];3</P>
<P style="TEXT-INDENT: 30px">[L,H,H,H,H] ->[1,0,0];4</P>
<P
style="TEXT-INDENT: 30px">当KBC确认是有效按键后,应把行列编码值放入缓冲,以供CPU读取,其逻辑表达如下:</P>
<P
style="TEXT-INDENT: 30px">式中,[KSL1,KSL0]是记录有效按键的扫描线编码,即当时的[QSL1..0]状态。</P>
<P style="TEXT-INDENT: 30px">3.3 CPU的读操作</P>
<P
style="TEXT-INDENT: 30px">CPU读状态寄存器时,系统把中断请求寄存器INT的值送出,而读数据寄存器时,它将把FIFO缓冲的按键值送出,处理CPU读操作的表达式如下:</P>
<P style="TEXT-INDENT: 30px">[D4..D0].oe=!CS & !RD;
//寄存器由三态控制</P>
<P style="TEXT-INDENT: 30px">[D4..D0]=(!A0 & [FIFO4..FIFO0])#
//A0=0:送按键数据</P>
<P style="TEXT-INDENT: 30px">(A0 & [L,L,L,L,INT]);
//A0=1;送状态</P>
<P style="TEXT-INDENT: 30px">INT.ar=!Reset #(!CS&!RD &
!A0);//读数据寄存器时应撤销中断</P>
<P style="TEXT-INDENT: 30px">3.4 键盘处理状态机</P>
<P
style="TEXT-INDENT: 30px">该状态处理机是KBC处理的核心。图5是其状态转移图,其驱动时钟应该比扫描周期快而且应该是它的整数倍。此处采用的80ms时钟周期是扫描周期的8倍。下面讨论其状态转移条件。<BR><IMG
height=272 hspace=40 src="——isp1016实现机载导航系统的键盘控制.files/8e.gif"
width=466 vspace=10 border=0><BR></SPAN> <SPAN
class=main1>S0:复位状态</P>
<P style="TEXT-INDENT: 30px">1.记录当前扫描周期</P>
<P style="TEXT-INDENT: 30px">2.if若有低电平的回复线then S1 else S0;</P>
<P style="TEXT-INDENT: 30px">S1:</P>
<P style="TEXT-INDENT: 30px">1. 启动延时(去抖)计数器,延时10.24ms</P>
<P style="TEXT-INDENT: 30px">2. 无条件进入下一状态S2</P>
<P style="TEXT-INDENT: 30px">S2:去抖状态</P>
<P style="TEXT-INDENT: 30px">if去抖正确then S3</P>
<P style="TEXT-INDENT: 30px">else S0</P>
<P style="TEXT-INDENT: 30px">S3:确认状态</P>
<P style="TEXT-INDENT: 30px">1. 将有效键值打入FIFO缓冲</P>
<P style="TEXT-INDENT: 30px">2. 设置</P>
<P style="TEXT-INDENT: 0px"><B>4 改进建议</B></P>
<P
style="TEXT-INDENT: 30px">上述KBC完全可以满足一般系统对键盘的要求,但仍然可以改进以使之更加智能化。例如使CPU能够对KBC的读操作和写入控制字进行适当控制、使KBC可处理组合按键和按键连击、增加KBC多字节的缓冲等。上述功能完全可以根据设计者系统和应用程序的要求进行改进。本设计源代码使用的是ABLE硬件描述语言,对此感兴趣的同志可以和作者进行联系。
</SPAN></P>
<P></P></DIV></TD></TR>
<TR>
<TD align=middle height=15>
<TABLE cellSpacing=0 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>
<DIV></DIV></TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right height=2>
<TABLE cellSpacing=0 cellPadding=0 width="80%" border=0>
<TBODY>
<TR>
<TD width=75>【<A href="javascript:doPrint();">打印本稿</A>】</TD>
<TD width=8></TD>
<TD width=75>
<P>【<A
href="http://www.21ic.com/new_info/news/review.asp?title=isp1016实现机载导航系统的键盘控制target="
_blank?>发表评论</A>】</P></TD>
<TD width=10></TD>
<TD width=79>【<A
href="http://www.21ic.com/new_info/news/sendmail.asp?num=isp1016实现机载导航系统的键盘控制">推荐</A>】</TD></TR></TBODY></TABLE></TD></TR>
<TR>
<TD align=right height=2></TD></TR>
<TR>
<TD align=right height=2><A href="javascript:window.close();"><IMG
height=20 src="——isp1016实现机载导航系统的键盘控制.files/close_c.gif" width=77
border=0 name=Image161></A><FONT
color=#ffffff>----</FONT></TD></TR></TBODY></TABLE><BR><BR>
<TABLE cellSpacing=0 cellPadding=0 width=520 align=center border=0>
<TBODY>
<TR>
<TD vAlign=bottom align=middle width=114 bgColor=#999a76
height=1><IMG height=1 src="——isp1016实现机载导航系统的键盘控制.files/blank.gif"
width=1></TD>
<TD width=466 height=1></TD></TR>
<TR>
<TD align=middle width=114 bgColor=#ece8db height=19>相关新闻</TD>
<TD width=466 height=19></TD></TR>
<TR bgColor=#999a76>
<TD colSpan=2 height=1><IMG height=1
src="——isp1016实现机载导航系统的键盘控制.files/blank.gif" width=1></TD></TR>
<TR>
<TD colSpan=2 height=1></TD></TR></TBODY></TABLE>
<TABLE borderColor=#000000 cellSpacing=0 cellPadding=0 width=520
align=center border=0>
<TBODY>
<TR>
<TD vAlign=top>
<TABLE class=RelatedTable width="100%" border=0>
<TBODY>
<TR class=RelatedTr>
<TD class=RelatedTd>
<SCRIPT language=javascript
src="——isp1016实现机载导航系统的键盘控制.files/about.htm"></SCRIPT>
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><BR></TD>
<TD vAlign=top align=middle width=150 bgColor=#ece8db height=2>
<TABLE cellSpacing=0 cellPadding=1 width="100%" border=0>
<TBODY>
<TR>
<TD bgColor=#000000>
<TABLE cellSpacing=0 cellPadding=2 width=150 bgColor=#ece8db
border=0>
<TBODY>
<TR>
<TD>
<META content="Microsoft FrontPage 5.0" name=GENERATOR>
<META content=FrontPage.Editor.Document name=ProgId>
<P><A href="http://www.21ic.com/custom/tek/tek.htm"><IMG
src="——isp1016实现机载导航系统的键盘控制.files/tek.gif"
border=0></A></P><BR><BR><A href="http://www.hhcn.com/"
target=_blank><IMG
src="——isp1016实现机载导航系统的键盘控制.files/hh_logo.gif"></A> </TD></TR>
<TR>
<TD
height=5></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=766 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top colSpan=6></TD></TR>
<TR>
<TD vAlign=top colSpan=6 height=10></TD></TR>
<TR>
<TD vAlign=top bgColor=#999999 colSpan=6 height=2></TD></TR>
<TR>
<TD class=stxt vAlign=center align=middle colSpan=6
height=6></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=766 align=center border=0>
<TBODY>
<TR>
<TD class=s width=973 height=12></TD></TR>
<TR>
<TD class=s width=973 height=20>
<DIV align=center><FONT face="Arial, Helvetica, sans-serif"><!--start copyright-->
<DIV align=center><FONT color=black>
<TABLE cellSpacing=0 cellPadding=0 width=600 align=center border=0>
<TBODY>
<TR>
<TD align=middle width="100%" colSpan=2><BR>Better View:800*600 Best
View:1024x768 为了本系统能够更好的为您服务,请使用IE4.0或以上版本浏览器
<BR><BR>版权所有(C)21IC中国电子网 电话:010-82357510, 82357511 传真: 010-82357512
</TD></TR></TBODY></TABLE><!--start copyright--></FONT></DIV></FONT></DIV></TD></TR></TBODY></TABLE><BR></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -