⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 磁动力电子--本站原创--小巧的键盘练习器 (下篇).htm

📁 PS2键盘驱动程序
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0051)http://www.cdle.net/web/alldata/CDLE/cdle050028.htm -->
<HTML><HEAD><TITLE>磁动力电子--本站原创--小巧的键盘练习器 (下篇)</TITLE><!-- #BeginTemplate "/Templates/wz-cdle.dwt" --><!-- #BeginEditable "doctitle" -->
<STYLE type=text/css>.style5 {
	COLOR: #cc3300
}
</STYLE>
<!-- #EndEditable -->
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>@import url( /web/Css/all.css );
</STYLE>

<META content="MSHTML 6.00.2900.3132" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff leftMargin=0 topMargin=0>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
  <TBODY>
  <TR bgColor=#99cc00>
    <TD></TD>
    <TD width=760>
      <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR>
          <TD width=15 rowSpan=3></TD>
          <TD width=151 rowSpan=3><IMG height=65 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/logo.gif" width=151></TD>
          <TD width=510 rowSpan=3>
            <DIV align=center><!-- #BeginEditable "TOP%20AD" --><!-- #BeginLibraryItem "/Library/ad.lbi" --><A 
            href="http://auction1.taobao.com/auction/0/item_detail-0db2-a9404b7f3dc75177237ce8cdc3a49b83.jhtml" 
            target=_blank><IMG alt=cdle.net欢迎您! 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/ad2.gif" align=middle 
            border=0></A><!-- #EndLibraryItem --><!-- #EndEditable --></DIV></TD>
          <TD height=22>
            <DIV align=right><A name=TOP></A><IMG height=6 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/go5.gif" width=5> <A 
            class=T12_W1 href="http://www.cdle.net/about.htm" 
            target=_blank>关于站点</A>&nbsp;&nbsp;</DIV></TD></TR>
        <TR>
          <TD height=22>
            <DIV align=center><IMG height=6 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/go5.gif" width=5 border=0> <A 
            onclick="window.external.AddFavorite('http://www.cdle.net', '磁动力工作室')" 
            href="http://www.cdle.net/web/alldata/CDLE/cdle050028.htm#"><SPAN 
            class=T12_W1>收藏本站</SPAN></A></DIV></TD></TR>
        <TR>
          <TD height=22>
            <DIV align=center><IMG height=6 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/go5.gif" width=5 border=0> <A 
            href="mailto:pnzwzw@cdle.net"><SPAN 
            class=T12_W1>联系站长</SPAN></A></DIV></TD></TR></TBODY></TABLE></TD>
    <TD></TD></TR>
  <TR>
    <TD bgColor=#99cc00 height=10><IMG height=1 
      src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/zo.gif" width=1></TD>
    <TD width=760 bgColor=#cccc99 height=20 rowSpan=2><!-- #BeginLibraryItem "/Library/dhl.lbi" -->
      <TABLE cellSpacing=1 cellPadding=0 width="100%" border=0>
        <TBODY>
        <TR>
          <TD background="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/bg1.gif" 
            height=20> <A class=T12_R1 
            href="http://www.cdle.net/index.htm">首页</A> | <A class=T12_B2 
            href="http://www.cdle.net/web/alldata/DZ/index.htm">电子制作</A> | <A 
            class=T12_B2 
            href="http://www.cdle.net/web/alldata/CNC/index.htm">雕刻机DIY</A> | <A 
            class=T12_B2 
            href="http://www.cdle.net/web/alldata/Robot/index.htm">机器人梦工场</A> | <A 
            class=T12_B2 
            href="http://www.cdle.net/web/alldata/MCU/index.htm">电子&amp;单片机</A> | <A 
            class=T12_B2 
            href="http://www.cdle.net/web/alldata/Data/index.htm">资料下载</A> | <A 
            class=T12_R1 
            href="http://www.cdle.net/web/alldata/CDLE/index.htm">本站原创</A> | <A 
            class=T12_R1 
            href="http://www.cdle.net/web/netshop/index.htm">DIY套件</A> | <A 
            class=T12_B2 href="http://www.cdle.net/bbs/index.asp" 
            target=_blank>论坛</A></TD></TR></TBODY></TABLE><!-- #EndLibraryItem --></TD>
    <TD bgColor=#99cc00 height=10><IMG height=1 
      src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/zo.gif" width=1></TD></TR>
  <TR>
    <TD height=10><IMG height=1 src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/zo.gif" 
      width=1></TD>
    <TD height=10><IMG height=1 src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/zo.gif" 
      width=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD>&nbsp;</TD>
    <TD width=760>
      <TABLE height=20 cellSpacing=0 cellPadding=0 width="100%" align=center 
      border=0>
        <TBODY>
        <TR>
          <TD width=560> <A class=T12_G5 
            href="http://www.cdle.net/index.htm">磁动力电子</A>--<A class=T12_G5 
            href="http://www.cdle.net/web/alldata/CDLE/index.htm">本站原创</A>--<!-- #BeginEditable "t1" --><SPAN 
            class=T12_R1>小巧的键盘练习器 (下篇)</SPAN><!-- #EndEditable --></TD>
          <TD width=120> <SPAN class=T12_P2><IMG height=16 alt=点击数量 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/click.gif" 
            width=18></SPAN><SPAN class=T12_BL3>阅读数:</SPAN> <!-- #BeginEditable "t2" -->
            <SCRIPT language=JavaScript 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/wclick.htm"></SCRIPT>
             <!-- #EndEditable --></TD>
          <TD width=80> <IMG height=6 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/go5.gif" width=5> <A 
            class=T12_B1 href="javascript:window.close()">关 闭</A> <IMG height=6 
            src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/go4.gif" 
      width=5></TD></TR></TBODY></TABLE></TD>
    <TD>&nbsp;</TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD>&nbsp;</TD>
    <TD class=TB1 vAlign=top width=760 bgColor=#cccc99>
      <TABLE cellSpacing=1 cellPadding=1 width="100%" border=0>
        <TBODY>
        <TR>
          <TD vAlign=top bgColor=#ffffff>
            <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
              <TBODY>
              <TR>
                <TD width=10>&nbsp;</TD>
                <TD vAlign=top width=529><!-- #BeginEditable "main" -->
                  <TABLE class=wz1 cellSpacing=0 cellPadding=0 width="100%" 
                  border=0>
                    <TBODY>
                    <TR>
                      <TD class=wz1 vAlign=top>
                        <TABLE cellSpacing=0 cellPadding=0 width="100%" 
border=0>
                          <TBODY>
                          <TR>
                            <TD>
                              <P align=center><SPAN 
                              class=wz1_t>小巧的键盘练习器(下篇)</SPAN></P>
                              <P class=wz1_t2 align=center><A 
                              href="mailto:pnzwzw@cdle.net" target=_blank><IMG 
                              height=21 
                              src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/p2.gif" 
                              width=23 
                          border=0></A>作者:温正伟 原载:无线电杂志</P></TD></TR></TBODY></TABLE>
                        <P>  <B>键盘─主机</B>:<BR>  图七就是设备向键盘发送数据,PS2接口的时序图。在无击键发生时,DATA和CLK一直处于高电平状态,当有键被按下时,键盘先是检查CLK线,看它是否是处在高电平,如果是处在低电平说明主机无空闲接收数据,这时键盘将会缓冲数据(不同的PS/2设备有不同的缓冲字节,键盘一般为16字节,鼠标只有一个字节)直到主机空闲CLK重新被拉高,键盘获得总线权,这时键盘产生时钟信号在CLK线上输出,同时每一个时钟周期在DATA线上输出一位数据。第1位为起始位为0,第2-9位为一个八位二进制数据由低位到高位依次输出,第10位为奇校验位,用来错误检测,如果数据位中包含偶数个1校验位就会置1,如果数据位中包含奇数个1校验位就会置0,数据位中1的个数加上校验位总是奇数(这就是奇校验),第11为停止位表明一帧数据已发送完成,这时CLK也停止了时钟信号的输出电平拉回到高位。键盘向主机发送数据时每帧数据有11位,产生11个时钟,在编程时主机可以在时钟信号变为低电平时(或在下降沿)开始读取DATA线上的数据。时钟的频率最高为33KHz,一般大多数都会使用10-20KHz,在编写程序时这个是值得注意的,如果设备的发出的时钟频率为15KHz时,那么在每个时钟周期的低电平时间约为40微秒,这就要求你的程序在读取一位数据的时间不得超出40微秒。还有一点要注意的就是键盘每送出一帧数据后都不需要主机发送"接收完成"的回应信号,也就是说无论主机是否接收到当前的数据,键盘都会发送下一个要发送的数据。<BR><BR></P>
                        <TABLE cellSpacing=1 cellPadding=0 align=center 
                        bgColor=#ff9900 border=0>
                          <TBODY>
                          <TR>
                            <TD><IMG height=122 
                              src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/cdle050027_07.gif" 
                              width=500></TD></TR>
                          <TR>
                            <TD><FONT 
                          color=#000000>图7:键盘-主机</FONT></TD></TR></TBODY></TABLE>
                        <P><B>  主机-键盘:</B><BR>  图八是主机向键盘发送数据,PS/2接口上的时序图。首先要说的是无论是主机是收还是发数据,时钟信号总是由设备所产生。主机要发送数据到键盘时,要先把DATA和CLK线设置成"请求发送"状态,做法是至少将CLK线拉低100微秒,接着拉低DATA线,释放CLK线,主机等待键盘产生时钟信号,在第1个时钟周期的低电平起主机发送数据,由低位到高位依次发送,并发送奇校验位,在第11个时钟周期DATA线被释放,在第12个周期里,键盘会发出一个时钟周期的ACK信号(DATA被拉低)以通知主机已成功接收到数据,主机可以根据这个判断键盘是否收到数据。主机发送数据到PS/2设备的数据帧就包括了12位,设备应该在不超过10毫秒的间隔内就要检查CLK线是否被拉低,当被拉低时设备将开始产生时钟信号,并且时钟脉冲的上升沿输入八个数据位和一个停止位并锁存,而主机是在时钟线为低发送数据,这和键盘发送数据到主机是相反的。在主机把停止位发送后设备要应答已接收到数据就把数据线拉低并产生最后一个时钟脉冲,如果主机在第11个时钟脉冲后不释放数据线,设备将继续产生时钟脉冲直到数据线被释放,然后设备将产生一个错误。另外主机可以在第11时钟前中止当前数据的传送,做法是下拉时钟线至少100微秒。<BR></P>
                        <TABLE cellSpacing=1 cellPadding=0 align=center 
                        bgColor=#ff9900 border=0>
                          <TBODY>
                          <TR>
                            <TD><IMG height=99 
                              src="磁动力电子--本站原创--小巧的键盘练习器 (下篇)_files/cdle050027_08.gif" 
                              width=500></TD></TR>
                          <TR>
                            <TD><FONT 
                          color=#000000>图8:主机-键盘</FONT></TD></TR></TBODY></TABLE>
                        <P>  上面的所提及的PS/2键盘通讯协议也适用于PS/2的鼠标。</P>
                        <P>  <B>键盘的编码和软件实现</B><BR>  如果你拆装过键盘,就会发现键盘内安装了一个大型的按键矩阵,它们是由安装在电路板上的键盘编码器来监视其状态的,编码器会监视在一个时刻内有那么键被按下、放开或主机发来了信号等等。最初的键盘是IBM用INTEL的8048制作键盘编码器的,而主机内的控制器则使用8042芯片,现在已有很多兼容的编码器芯片如8049,HT82K628A,,EM83050H,键盘控制器更多的会整合到主机板的芯片组中去。编码器的作用就是把键盘的事件作监视并把它转化为扫描码,并以数据帧方式传送到主机。<BR>  扫描码根据不同的事件可以分为通码和断码。通码就是指键被按下时所要发送的扫描码,断码则是键被放开时所要发送扫描码。从XT到现代的键盘,一共发展了三套扫描码,第一套扫描码集是原始的XT扫描码集绝大部分现在的键盘已不在支持,第二套扫描码集是所有现代键盘默认的扫描码集,第三套扫描码集为可选的PS/2扫描码集但很少被使用。无论那套扫描码集对应所要表示的ASCII码都是没有规律可寻的,也就是你不能用一个简单的计算公式根据按键的扫描码得出所按的是什么键,一定要通过查表,表2表3表4就是现在最常用第二套扫描码集,现在出售的键盘都会支持它。<BR>  那么如何知道按下一个或多个键时所产生的扫描码值呢?例如按下了左SHIFT+A键时,这时键盘会发送什么样扫描码呢?先来说说整个击键的过程,先按下左SHIFT键,再按下A键,释放A键,释放左SHIFT键,这些时间段内分别产生了左SHIFT的通码(12H),A的通码(1CH),A的断码(F0H,1CH),SHIFT断码(F0H,12H),查表后可以得出产生了12H,1CH,F0H,1CH,F0H,12H这一连串的扫描码,这些数据都是以上面所说的PS2通讯协议从键盘发向主机。用单片机解码时,在程序中可以根据每个断码前一字节为FOH去判断当前的键是否释放,同样SHIFT、CTRL等功能键都可以在程序中用标志位去进行处理,具体的做法可以参考本文所附带的单片机C51源码。<BR>  如果你还没有读完下面一段就迫不及待的照上面的电路做了一个,你就会发现当按NumLocK或CapsLock键时,并不像把键盘接入电脑主机那样会点亮相应的状态指示灯。这是因为在实例所提供的程序中并没有向键盘发送过任何的命令字。之前我们说过了主机向键盘发送数据的通讯过程,那么键盘的命令集又有什么呢?在表五中罗列了部分常用的命令字,要想得到更多的相关信息可以参看http://panda.cs.ndsu.nodak.edu/~achapwes/PICmicro/keyboard/atkeyboard.html(英文)。要注意的是每次从主机发送命令字节到键盘,键盘都会返回一个0xFA字节回应主机已收到命令,但Resend和Echo命令的回应除外。主机在发送下一个字节给键盘之前要先等待键盘应答字节,如在一段时内没有收到可以判断为通讯超时。键盘回应任何命令后会清除自己的输出缓冲区。<BR>  在本文所附带的实例原码中,应用了单片机的外部中断去做键盘的接收,并把中断设为低电平有效,也就是说在键盘时钟的低电平时中断程序才读取DATA线上的数据,当中断进行11次后说明一帧数据接收完毕,转向扫描码的判断和ASCII码的转换程序,转换的方式先去掉断码,保留通码,用通码去查表,因此笔者在SCANCODES.h中定义了常用键的通码以及与之相对应的ASCII码,当查到有相对应的值时,就转去LCM的显示函数进行显示处理。更多相关资料和更新版本的源码请访问笔者的主页<A 
                        href="http://www.cdle.net/" 
                        target=_blank>http://www.cdle.net/</A>或参与<A 
                        href="http://www.cdle.net/bbs" 
                        target=_blank>http://www.cdle.net/bbs</A>的论坛讨论。</P>
                        <P></P>
                        <TABLE cellSpacing=1 align=center bgColor=#99cc33 
                        border=0>
                          <TBODY>
                          <TR>
                            <TD height=25>
                              <DIV align=center>键 名</DIV></TD>
                            <TD height=25>
                              <DIV align=center>通 码</DIV></TD>
                            <TD height=25>
                              <DIV align=center>断 码</DIV></TD>
                            <TD bgColor=#99cc33 height=25>
                              <DIV align=center>-</DIV></TD>
                            <TD height=25>
                              <DIV align=center>键 名</DIV></TD>
                            <TD height=25>
                              <DIV align=center>通 码</DIV></TD>
                            <TD height=25>
                              <DIV align=center>断 码</DIV></TD>
                            <TD height=25>
                              <DIV align=center>-</DIV></TD>
                            <TD height=25>
                              <DIV align=center>键 名</DIV></TD>
                            <TD height=25>
                              <DIV align=center>通 码</DIV></TD>
                            <TD height=25>
                              <DIV align=center>断 码</DIV></TD></TR>
                          <TR bgColor=#ffffff>
                            <TD height=20>
                              <DIV align=center>A</DIV></TD>
                            <TD height=20>1C</TD>
                            <TD height=20>F0,1C</TD>
                            <TD bgColor=#99cc33 height=20>&nbsp;</TD>
                            <TD height=20>
                              <DIV align=center>9</DIV></TD>
                            <TD height=20>46</TD>
                            <TD height=20>F0,46</TD>
                            <TD bgColor=#99cc33 height=20>&nbsp;</TD>
                            <TD height=20>
                              <DIV align=center>[</DIV></TD>
                            <TD height=20>54</TD>
                            <TD height=20>FO,54</TD></TR>
                          <TR bgColor=#ffffff>
                            <TD height=20>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -