?? 磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇).htm
字號:
<!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>磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)</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="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_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="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_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="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/go5.gif" width=5> <A
class=T12_W1 href="http://www.cdle.net/about.htm"
target=_blank>關(guān)于站點</A> </DIV></TD></TR>
<TR>
<TD height=22>
<DIV align=center><IMG height=6
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_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="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/go5.gif" width=5 border=0> <A
href="mailto:pnzwzw@cdle.net"><SPAN
class=T12_W1>聯(lián)系站長</SPAN></A></DIV></TD></TR></TBODY></TABLE></TD>
<TD></TD></TR>
<TR>
<TD bgColor=#99cc00 height=10><IMG height=1
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_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="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_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">電子&單片機</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">本站原創(chuàng)</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="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/zo.gif" width=1></TD></TR>
<TR>
<TD height=10><IMG height=1 src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/zo.gif"
width=1></TD>
<TD height=10><IMG height=1 src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/zo.gif"
width=1></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD> </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">本站原創(chuàng)</A>--<!-- #BeginEditable "t1" --><SPAN
class=T12_R1>小巧的鍵盤練習(xí)器 (下篇)</SPAN><!-- #EndEditable --></TD>
<TD width=120> <SPAN class=T12_P2><IMG height=16 alt=點擊數(shù)量
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/click.gif"
width=18></SPAN><SPAN class=T12_BL3>閱讀數(shù):</SPAN> <!-- #BeginEditable "t2" -->
<SCRIPT language=JavaScript
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/wclick.htm"></SCRIPT>
<!-- #EndEditable --></TD>
<TD width=80> <IMG height=6
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/go5.gif" width=5> <A
class=T12_B1 href="javascript:window.close()">關(guān) 閉</A> <IMG height=6
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/go4.gif"
width=5></TD></TR></TBODY></TABLE></TD>
<TD> </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD> </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> </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>小巧的鍵盤練習(xí)器(下篇)</SPAN></P>
<P class=wz1_t2 align=center><A
href="mailto:pnzwzw@cdle.net" target=_blank><IMG
height=21
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/p2.gif"
width=23
border=0></A>作者:溫正偉 原載:無線電雜志</P></TD></TR></TBODY></TABLE>
<P> <B>鍵盤─主機</B>:<BR> 圖七就是設(shè)備向鍵盤發(fā)送數(shù)據(jù),PS2接口的時序圖。在無擊鍵發(fā)生時,DATA和CLK一直處于高電平狀態(tài),當(dāng)有鍵被按下時,鍵盤先是檢查CLK線,看它是否是處在高電平,如果是處在低電平說明主機無空閑接收數(shù)據(jù),這時鍵盤將會緩沖數(shù)據(jù)(不同的PS/2設(shè)備有不同的緩沖字節(jié),鍵盤一般為16字節(jié),鼠標(biāo)只有一個字節(jié))直到主機空閑CLK重新被拉高,鍵盤獲得總線權(quán),這時鍵盤產(chǎn)生時鐘信號在CLK線上輸出,同時每一個時鐘周期在DATA線上輸出一位數(shù)據(jù)。第1位為起始位為0,第2-9位為一個八位二進制數(shù)據(jù)由低位到高位依次輸出,第10位為奇校驗位,用來錯誤檢測,如果數(shù)據(jù)位中包含偶數(shù)個1校驗位就會置1,如果數(shù)據(jù)位中包含奇數(shù)個1校驗位就會置0,數(shù)據(jù)位中1的個數(shù)加上校驗位總是奇數(shù)(這就是奇校驗),第11為停止位表明一幀數(shù)據(jù)已發(fā)送完成,這時CLK也停止了時鐘信號的輸出電平拉回到高位。鍵盤向主機發(fā)送數(shù)據(jù)時每幀數(shù)據(jù)有11位,產(chǎn)生11個時鐘,在編程時主機可以在時鐘信號變?yōu)榈碗娖綍r(或在下降沿)開始讀取DATA線上的數(shù)據(jù)。時鐘的頻率最高為33KHz,一般大多數(shù)都會使用10-20KHz,在編寫程序時這個是值得注意的,如果設(shè)備的發(fā)出的時鐘頻率為15KHz時,那么在每個時鐘周期的低電平時間約為40微秒,這就要求你的程序在讀取一位數(shù)據(jù)的時間不得超出40微秒。還有一點要注意的就是鍵盤每送出一幀數(shù)據(jù)后都不需要主機發(fā)送"接收完成"的回應(yīng)信號,也就是說無論主機是否接收到當(dāng)前的數(shù)據(jù),鍵盤都會發(fā)送下一個要發(fā)送的數(shù)據(jù)。<BR><BR></P>
<TABLE cellSpacing=1 cellPadding=0 align=center
bgColor=#ff9900 border=0>
<TBODY>
<TR>
<TD><IMG height=122
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/cdle050027_07.gif"
width=500></TD></TR>
<TR>
<TD><FONT
color=#000000>圖7:鍵盤-主機</FONT></TD></TR></TBODY></TABLE>
<P><B> 主機-鍵盤:</B><BR> 圖八是主機向鍵盤發(fā)送數(shù)據(jù),PS/2接口上的時序圖。首先要說的是無論是主機是收還是發(fā)數(shù)據(jù),時鐘信號總是由設(shè)備所產(chǎn)生。主機要發(fā)送數(shù)據(jù)到鍵盤時,要先把DATA和CLK線設(shè)置成"請求發(fā)送"狀態(tài),做法是至少將CLK線拉低100微秒,接著拉低DATA線,釋放CLK線,主機等待鍵盤產(chǎn)生時鐘信號,在第1個時鐘周期的低電平起主機發(fā)送數(shù)據(jù),由低位到高位依次發(fā)送,并發(fā)送奇校驗位,在第11個時鐘周期DATA線被釋放,在第12個周期里,鍵盤會發(fā)出一個時鐘周期的ACK信號(DATA被拉低)以通知主機已成功接收到數(shù)據(jù),主機可以根據(jù)這個判斷鍵盤是否收到數(shù)據(jù)。主機發(fā)送數(shù)據(jù)到PS/2設(shè)備的數(shù)據(jù)幀就包括了12位,設(shè)備應(yīng)該在不超過10毫秒的間隔內(nèi)就要檢查CLK線是否被拉低,當(dāng)被拉低時設(shè)備將開始產(chǎn)生時鐘信號,并且時鐘脈沖的上升沿輸入八個數(shù)據(jù)位和一個停止位并鎖存,而主機是在時鐘線為低發(fā)送數(shù)據(jù),這和鍵盤發(fā)送數(shù)據(jù)到主機是相反的。在主機把停止位發(fā)送后設(shè)備要應(yīng)答已接收到數(shù)據(jù)就把數(shù)據(jù)線拉低并產(chǎn)生最后一個時鐘脈沖,如果主機在第11個時鐘脈沖后不釋放數(shù)據(jù)線,設(shè)備將繼續(xù)產(chǎn)生時鐘脈沖直到數(shù)據(jù)線被釋放,然后設(shè)備將產(chǎn)生一個錯誤。另外主機可以在第11時鐘前中止當(dāng)前數(shù)據(jù)的傳送,做法是下拉時鐘線至少100微秒。<BR></P>
<TABLE cellSpacing=1 cellPadding=0 align=center
bgColor=#ff9900 border=0>
<TBODY>
<TR>
<TD><IMG height=99
src="磁動力電子--本站原創(chuàng)--小巧的鍵盤練習(xí)器 (下篇)_files/cdle050027_08.gif"
width=500></TD></TR>
<TR>
<TD><FONT
color=#000000>圖8:主機-鍵盤</FONT></TD></TR></TBODY></TABLE>
<P> 上面的所提及的PS/2鍵盤通訊協(xié)議也適用于PS/2的鼠標(biāo)。</P>
<P> <B>鍵盤的編碼和軟件實現(xiàn)</B><BR> 如果你拆裝過鍵盤,就會發(fā)現(xiàn)鍵盤內(nèi)安裝了一個大型的按鍵矩陣,它們是由安裝在電路板上的鍵盤編碼器來監(jiān)視其狀態(tài)的,編碼器會監(jiān)視在一個時刻內(nèi)有那么鍵被按下、放開或主機發(fā)來了信號等等。最初的鍵盤是IBM用INTEL的8048制作鍵盤編碼器的,而主機內(nèi)的控制器則使用8042芯片,現(xiàn)在已有很多兼容的編碼器芯片如8049,HT82K628A,,EM83050H,鍵盤控制器更多的會整合到主機板的芯片組中去。編碼器的作用就是把鍵盤的事件作監(jiān)視并把它轉(zhuǎn)化為掃描碼,并以數(shù)據(jù)幀方式傳送到主機。<BR> 掃描碼根據(jù)不同的事件可以分為通碼和斷碼。通碼就是指鍵被按下時所要發(fā)送的掃描碼,斷碼則是鍵被放開時所要發(fā)送掃描碼。從XT到現(xiàn)代的鍵盤,一共發(fā)展了三套掃描碼,第一套掃描碼集是原始的XT掃描碼集絕大部分現(xiàn)在的鍵盤已不在支持,第二套掃描碼集是所有現(xiàn)代鍵盤默認(rèn)的掃描碼集,第三套掃描碼集為可選的PS/2掃描碼集但很少被使用。無論那套掃描碼集對應(yīng)所要表示的ASCII碼都是沒有規(guī)律可尋的,也就是你不能用一個簡單的計算公式根據(jù)按鍵的掃描碼得出所按的是什么鍵,一定要通過查表,表2表3表4就是現(xiàn)在最常用第二套掃描碼集,現(xiàn)在出售的鍵盤都會支持它。<BR> 那么如何知道按下一個或多個鍵時所產(chǎn)生的掃描碼值呢?例如按下了左SHIFT+A鍵時,這時鍵盤會發(fā)送什么樣掃描碼呢?先來說說整個擊鍵的過程,先按下左SHIFT鍵,再按下A鍵,釋放A鍵,釋放左SHIFT鍵,這些時間段內(nèi)分別產(chǎn)生了左SHIFT的通碼(12H),A的通碼(1CH),A的斷碼(F0H,1CH),SHIFT斷碼(F0H,12H),查表后可以得出產(chǎn)生了12H,1CH,F0H,1CH,F0H,12H這一連串的掃描碼,這些數(shù)據(jù)都是以上面所說的PS2通訊協(xié)議從鍵盤發(fā)向主機。用單片機解碼時,在程序中可以根據(jù)每個斷碼前一字節(jié)為FOH去判斷當(dāng)前的鍵是否釋放,同樣SHIFT、CTRL等功能鍵都可以在程序中用標(biāo)志位去進行處理,具體的做法可以參考本文所附帶的單片機C51源碼。<BR> 如果你還沒有讀完下面一段就迫不及待的照上面的電路做了一個,你就會發(fā)現(xiàn)當(dāng)按NumLocK或CapsLock鍵時,并不像把鍵盤接入電腦主機那樣會點亮相應(yīng)的狀態(tài)指示燈。這是因為在實例所提供的程序中并沒有向鍵盤發(fā)送過任何的命令字。之前我們說過了主機向鍵盤發(fā)送數(shù)據(jù)的通訊過程,那么鍵盤的命令集又有什么呢?在表五中羅列了部分常用的命令字,要想得到更多的相關(guān)信息可以參看http://panda.cs.ndsu.nodak.edu/~achapwes/PICmicro/keyboard/atkeyboard.html(英文)。要注意的是每次從主機發(fā)送命令字節(jié)到鍵盤,鍵盤都會返回一個0xFA字節(jié)回應(yīng)主機已收到命令,但Resend和Echo命令的回應(yīng)除外。主機在發(fā)送下一個字節(jié)給鍵盤之前要先等待鍵盤應(yīng)答字節(jié),如在一段時內(nèi)沒有收到可以判斷為通訊超時。鍵盤回應(yīng)任何命令后會清除自己的輸出緩沖區(qū)。<BR> 在本文所附帶的實例原碼中,應(yīng)用了單片機的外部中斷去做鍵盤的接收,并把中斷設(shè)為低電平有效,也就是說在鍵盤時鐘的低電平時中斷程序才讀取DATA線上的數(shù)據(jù),當(dāng)中斷進行11次后說明一幀數(shù)據(jù)接收完畢,轉(zhuǎn)向掃描碼的判斷和ASCII碼的轉(zhuǎn)換程序,轉(zhuǎn)換的方式先去掉斷碼,保留通碼,用通碼去查表,因此筆者在SCANCODES.h中定義了常用鍵的通碼以及與之相對應(yīng)的ASCII碼,當(dāng)查到有相對應(yīng)的值時,就轉(zhuǎn)去LCM的顯示函數(shù)進行顯示處理。更多相關(guān)資料和更新版本的源碼請訪問筆者的主頁<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> </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> </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>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -