《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 業(yè)界動(dòng)態(tài) > 微機(jī)鍵盤(pán)接口的研究及其在儀器儀表中的應(yīng)用

微機(jī)鍵盤(pán)接口的研究及其在儀器儀表中的應(yīng)用

2008-12-08
作者:仲崇權(quán) 徐世昌 楊素英

  摘? 要: 介紹了標(biāo)準(zhǔn)微機(jī)鍵盤(pán)與計(jì)算機(jī)接口的規(guī)范,分析了鍵盤(pán)的串行通信協(xié)議和接口工作時(shí)序,并給出了鍵盤(pán)與單片機(jī)接口硬件電路和應(yīng)用程序?qū)嵗?/P>

  關(guān)鍵詞: 鍵盤(pán)? 接口? 時(shí)序? 串行通信? 掃描碼

?

  微機(jī)鍵盤(pán)以其穩(wěn)定性好、使用方便、價(jià)格便宜等優(yōu)點(diǎn),可有效地應(yīng)用在輸入量大、要求復(fù)雜的儀器儀表中。現(xiàn)存的計(jì)算機(jī)鍵盤(pán)種類(lèi)很多,但基本原理和接口規(guī)范是一樣的。IBM-PC鍵盤(pán)的核心器件是Intel公司的單片機(jī)8049。單片機(jī)采用行列掃描方法來(lái)監(jiān)測(cè)是否有鍵按下。若有鍵按下,則轉(zhuǎn)換為相應(yīng)的掃描碼,通過(guò)串行通訊線(xiàn)將其傳給計(jì)算機(jī),由主機(jī)接收并處理成擴(kuò)展鍵盤(pán)碼。

1 標(biāo)準(zhǔn)鍵盤(pán)工作原理

1.1 通信接口

  鍵盤(pán)與計(jì)算機(jī)通過(guò)一個(gè)五芯接口插座(PS/2接口為六芯)相接,各引腳定義分別是電源(VCC)、地(GND)、串行時(shí)鐘線(xiàn)" title="時(shí)鐘線(xiàn)">時(shí)鐘線(xiàn)SCK和串行數(shù)據(jù)線(xiàn)SIO,還有一根線(xiàn)未用。兩種鍵盤(pán)接口" title="鍵盤(pán)接口">鍵盤(pán)接口的插座外形圖及各線(xiàn)定義如圖1所示。

?

?

1.2 通信協(xié)議

  標(biāo)準(zhǔn)鍵盤(pán)與計(jì)算機(jī)采用雙向通信方式,鍵盤(pán)可以發(fā)送數(shù)據(jù)給計(jì)算機(jī),計(jì)算機(jī)也可以發(fā)送命令給鍵盤(pán)。計(jì)算機(jī)有最高優(yōu)先權(quán),可以在任何時(shí)候發(fā)命令給鍵盤(pán)。通信協(xié)議是標(biāo)準(zhǔn)的串行異步通信格式,1位起始位,8位數(shù)據(jù)位(LSB在先),1位奇校驗(yàn)位P,最后是1位停止位。數(shù)據(jù)格式如圖2所示。

?

?

  當(dāng)SIO和SCK同時(shí)為高電平" title="高電平">高電平時(shí),鍵盤(pán)可以發(fā)數(shù)據(jù)給計(jì)算機(jī)。SCK可以用作清除發(fā)送線(xiàn)。如果計(jì)算機(jī)將SCK拉為低電平,鍵盤(pán)將不發(fā)送數(shù)據(jù),而是將要發(fā)送的數(shù)據(jù)放到發(fā)送緩沖區(qū)中,直到SCK變?yōu)楦唠娖讲砰_(kāi)始發(fā)送數(shù)據(jù)。如果計(jì)算機(jī)將SIO拉低,則鍵盤(pán)在檢測(cè)到這一變化時(shí),將接收來(lái)自計(jì)算機(jī)的命令。

  圖3(a)給出了鍵盤(pán)發(fā)送一個(gè)字節(jié)的時(shí)序。鍵盤(pán)先將SIO拉低,通知計(jì)算機(jī)準(zhǔn)備接收數(shù)據(jù)。鍵盤(pán)在SCK的上升沿后改變數(shù)據(jù),在下降沿時(shí)數(shù)據(jù)有效,可以被計(jì)算機(jī)讀取。發(fā)送數(shù)據(jù)的時(shí)鐘信號(hào)" title="時(shí)鐘信號(hào)">時(shí)鐘信號(hào)由鍵盤(pán)產(chǎn)生。有的文獻(xiàn)介紹鍵盤(pán)時(shí)鐘頻率的典型值為20~30kHz,但實(shí)際上鍵盤(pán)的傳送速率不全在這個(gè)范圍內(nèi)。筆者曾做過(guò)測(cè)試,其中一只鍵盤(pán)的時(shí)鐘頻率是12.4kHz。

  圖3(b)給出了鍵盤(pán)接收一個(gè)字節(jié)的時(shí)序。為了避免在同一時(shí)刻發(fā)送數(shù)據(jù),建議計(jì)算機(jī)先將SCK拉低大約60μs以上,以此通知鍵盤(pán)不要發(fā)數(shù)據(jù)。然后計(jì)算機(jī)將SIO拉低,表明發(fā)送數(shù)據(jù)開(kāi)始,并釋放SCK,由鍵盤(pán)接管SCK并產(chǎn)生時(shí)鐘信號(hào)。計(jì)算機(jī)在此時(shí)鐘信號(hào)的同步下發(fā)送數(shù)據(jù)。鍵盤(pán)接收數(shù)據(jù)是從檢測(cè)到SIO變低開(kāi)始的,然后在SCK下降沿讀起始位,并在SCK的每個(gè)下降沿讀取后續(xù)數(shù)據(jù)。鍵盤(pán)在接收完校驗(yàn)位后,如果在下一個(gè)時(shí)鐘周期檢測(cè)到SIO處于空閑態(tài)(高電平),便會(huì)接受新數(shù)據(jù)并進(jìn)行處理。在此期間,鍵盤(pán)將把SIO置成低電平,直到接受數(shù)據(jù)完成。如果收到校驗(yàn)位后,鍵盤(pán)檢測(cè)到SIO沒(méi)有處于空閑態(tài),它將繼續(xù)發(fā)送時(shí)鐘信號(hào)直到SIO空閑。

?

?

1.3 鍵盤(pán)掃描碼

  一個(gè)基本按鍵的掃描碼由3個(gè)字節(jié)組成,1個(gè)字節(jié)的接通掃描碼和2個(gè)字節(jié)的斷開(kāi)掃描碼。其中第一與第三個(gè)字節(jié)相同,中間字節(jié)是斷開(kāi)標(biāo)志F0H。例如B鍵的接通掃描碼是32H,斷開(kāi)掃描碼是F0H 32H。B鍵被按下時(shí),32H被發(fā)送出去,如果一直按住不放,則鍵盤(pán)將以按鍵重復(fù)率不停地發(fā)送32H,直到該鍵釋放,才發(fā)出斷開(kāi)掃描碼F0H 32H。掃描碼與按鍵的位置有關(guān),與該鍵的ASCII碼并無(wú)對(duì)應(yīng)關(guān)系。鍵盤(pán)上還有部分?jǐn)U展鍵(功能鍵和控制鍵等),這些鍵的掃描碼由5個(gè)字節(jié)組成。與基本鍵的掃描碼相比,接通掃描碼與斷開(kāi)掃描碼前各多了一個(gè)固定值字節(jié)E0H。例如Home鍵的接通掃描碼是E0H 70H,斷開(kāi)掃描碼是E0H F0H 70H。還有兩個(gè)特殊鍵,PrintScreen鍵的接通掃描碼是E0H 12H E0H 7CH;斷開(kāi)掃描碼是E0H F0H 7CH E0H F0H 12H,PauseBreak鍵的接通掃描碼是E1H 14H 77H E1H F0H 14H F0H 77H,無(wú)斷開(kāi)掃描碼。

1.4 通信命令字

  除了鍵盤(pán)可以向計(jì)算機(jī)發(fā)送按鍵的掃描碼外,計(jì)算機(jī)還可以向鍵盤(pán)發(fā)送預(yù)定的命令字來(lái)對(duì)鍵盤(pán)功能進(jìn)行設(shè)定。

1.4.1 計(jì)算機(jī)發(fā)往鍵盤(pán)的命令

  EDH:設(shè)置狀態(tài)指示燈。該命令用來(lái)控制鍵盤(pán)上3個(gè)指示燈NumLock、ScrollLock、CapLock的亮滅。EDH發(fā)出后,鍵盤(pán)將回應(yīng)計(jì)算機(jī)一個(gè)收到應(yīng)答信號(hào)FAH,然后等待計(jì)算機(jī)發(fā)送下一個(gè)字節(jié),該字節(jié)決定各指示燈的狀態(tài)。

  Bit0控制ScrollLock;

  Bit1控制NumLock;

  Bit2控制CapLock;

  Bit3~Bit7必須為0,否則鍵盤(pán)認(rèn)為該字節(jié)是無(wú)效命令,將返回FEH,要求重發(fā)。

  EEH:回送響應(yīng)。該命令用于輔助診斷,要求鍵盤(pán)收到EEH后也回送EEH予以響應(yīng)。

  F0H:設(shè)置掃描碼。鍵盤(pán)收到該命令后,將回送收到信號(hào)FAH,并等待下一命令字節(jié),該字節(jié)的值01~03將決定鍵盤(pán)使用三種掃描碼中的哪一種。上電復(fù)位時(shí),鍵盤(pán)默認(rèn)掃描碼類(lèi)型是02,本文所舉的例子皆為此類(lèi)型掃描碼。不同類(lèi)型的掃描碼與不同類(lèi)型的微機(jī)相匹配。01類(lèi)型掃描碼由兩字節(jié)組成,分別為接通掃描碼和斷開(kāi)掃描碼;03類(lèi)型掃描碼只有一個(gè)字節(jié),為接通掃描碼。

  F3H:設(shè)置鍵盤(pán)重復(fù)速率。計(jì)算機(jī)發(fā)送該命令后,鍵盤(pán)將回送收到信號(hào)FAH,然后等待計(jì)算機(jī)的第二個(gè)字節(jié),該字節(jié)決定按鍵的重復(fù)速率。

  F4H:鍵盤(pán)使能。計(jì)算機(jī)發(fā)該命令給鍵盤(pán)后,將清除鍵盤(pán)發(fā)送緩沖區(qū),重新使鍵盤(pán)工作,并返回收到信號(hào)FAH。

  F5H:禁止鍵盤(pán)。計(jì)算機(jī)發(fā)該命令給鍵盤(pán)后,將使鍵盤(pán)復(fù)位,并禁止鍵盤(pán)掃描。鍵盤(pán)將返回收到信號(hào)FAH。

  FEH:重發(fā)命令。鍵盤(pán)收到此命令后,將會(huì)把上次發(fā)送的最后一個(gè)字節(jié)重新發(fā)送。

  FFH:復(fù)位鍵盤(pán)。此命令將鍵盤(pán)復(fù)位。若復(fù)位成功,鍵盤(pán)回送收到信號(hào)FAH和復(fù)位完成信號(hào)AAH。

1.4.2 鍵盤(pán)發(fā)往計(jì)算機(jī)的命令

??? 00H:出錯(cuò)或緩沖區(qū)已滿(mǎn)。

  AAH:電源自檢通過(guò)。BAT(基本保證測(cè)試)完成。

  EEH:回送響應(yīng)。

  FAH: 響應(yīng)信號(hào)。鍵盤(pán)每當(dāng)收到計(jì)算機(jī)的命令后,都會(huì)發(fā)此響應(yīng)信號(hào)。

  FEH:重發(fā)命令。計(jì)算機(jī)收到此命令后,將會(huì)把上次發(fā)送的最后一個(gè)命令字節(jié)重新發(fā)送。

  FFH:出錯(cuò)或緩沖區(qū)已滿(mǎn)。

2 鍵盤(pán)與單片機(jī)的接口電路及程序

  采用Atmel89C51單片機(jī)與標(biāo)準(zhǔn)鍵盤(pán)接口電路如圖4所示。口線(xiàn)P1.0和P1.1分別連接SCK和SIO,單片機(jī)的口線(xiàn)是上拉輸出形式,可以和鍵盤(pán)的通信線(xiàn)直接相連,由軟件控制口線(xiàn)產(chǎn)生收發(fā)時(shí)序。

?

?

  應(yīng)用程序使用Franklin C51編寫(xiě)。在程序中,單片機(jī)采用查詢(xún)方式檢測(cè)數(shù)據(jù)線(xiàn)狀態(tài)。如果數(shù)據(jù)線(xiàn)變?yōu)榈碗娖?說(shuō)明鍵盤(pán)即將有數(shù)據(jù)發(fā)出,則調(diào)用讀鍵盤(pán)子程序" title="子程序">子程序receive_data讀取一個(gè)字節(jié)數(shù)據(jù);若要發(fā)命令字給鍵盤(pán),單片機(jī)則調(diào)用子程序send_data來(lái)完成。

  單片機(jī)讀取來(lái)自鍵盤(pán)數(shù)據(jù)的子程序如下,該程序接收一個(gè)字節(jié)數(shù)據(jù)存放在變量from_kb中,并將該值返回到主程序,校驗(yàn)位放在全局位變量p_bit中。

#include

sbit?? ??? sio=P1^1; ????  ???????????? /*數(shù)據(jù)線(xiàn)*/

sbit?????? sck=P1^0;?????????  ???????? /*時(shí)鐘線(xiàn)*/

sbit?????? ACC_7=ACC^7;

sbit?????? ACC_0=ACC^0;

bit???????? p_bit;???????????????  ???? /*檢驗(yàn)位*/

char receive_data(void)

  {???char??????? i;

    char??from_kb;???? ??????????   /*放接收到的數(shù)據(jù)*/

????  while(sck);

????  while(!sck);?????????? ??     /*放棄起始位*/

????  for(i=0;i<8;i++) ????????????   /*讀取數(shù)據(jù)字節(jié)*/

????  { while(sck);?????????????????????/*下降沿讀取數(shù)據(jù)*/

????  from_kb>>=1;

????  ACC=from_kb;

????  ACC_7=sio;

????  from_kb=ACC;??????????

???   while(!sck);

}

  while(sck);

  p_bit=sio;???? ? ????????????????? /*讀取校驗(yàn)位*/

  while(!sck);???????????

  while(sck);????????????? ???????? /*略去讀停止位*/

  while(!(sck&sio));??????????????? /*等待時(shí)鐘線(xiàn)與數(shù)據(jù)線(xiàn)都釋放*/

????return(from_kb);

}

  下列程序是89C51單片機(jī)發(fā)送一個(gè)命令字節(jié)給鍵盤(pán)的子程序。要發(fā)送的命令字由主程序傳送,并存于變量to_kb中,該程序按照接口時(shí)序通過(guò)口線(xiàn)將命令字節(jié)傳送給鍵盤(pán)。

void send_to_kb(char??? to_kb)???? using 1

{???? char??????? i;

?????? ACC=to_kb;

?????? p_bit=!P;???????     ??? /*對(duì)發(fā)送字節(jié)進(jìn)行奇校驗(yàn),

????????????????????????????????????????? ?校驗(yàn)結(jié)果放在p_bit中*/

?????? sck=0;??????????????????????? /*將時(shí)鐘線(xiàn)拉低*/

?????? for(i=0;i<60;i++);?     /*時(shí)鐘線(xiàn)低電平保持60μs

??????????????????????????? ????    以上,以禁止鍵盤(pán)往外發(fā)數(shù)據(jù)*/

?????? sio=0;????????? ???????????   /*通知鍵盤(pán)接受命令字節(jié),

?????????????????????????????????????? 同時(shí)也作為起始位*/

?????? sck=1;???????? ???????????   /*釋放時(shí)鐘線(xiàn),以在鍵盤(pán)發(fā)

???????????????????? ???        出的時(shí)鐘信號(hào)同步下,發(fā)送命令字*/

?????? for(i=0;i<8;i++)???????????  /*發(fā)送命令字節(jié)*/

????????????? {???? while(sck);

???????????????????? while(!sck);???? /*上升沿發(fā)數(shù)據(jù)*/

???????????????????? ACC=to_kb;

????????????? sio=ACC_0;

????????????? to_kb>>=1;

}

  while(sck);

  while(!sck);

  sio=p_bit;???????????????????????? /*發(fā)送奇校驗(yàn)位*/

  while(sck);

  while(!sck);???????????

  sio=1;???????????????????????????? /*釋放數(shù)據(jù)線(xiàn)*/

}

  單片機(jī)的嵌入式應(yīng)用中有些需要進(jìn)行大量的文字輸入、參數(shù)修改和數(shù)值設(shè)定等操作。通常的方法是在電路中設(shè)計(jì)鍵盤(pán)電路、鍵盤(pán)接口和按鍵程序,這不僅占用許多硬件資源,而且由于鍵掃描處理程序一般都很龐大,軟件開(kāi)銷(xiāo)也很大。如果在儀器上預(yù)留一個(gè)標(biāo)準(zhǔn)鍵盤(pán)接口,改用微機(jī)鍵盤(pán)對(duì)儀器儀表進(jìn)行操作,則不僅占用系統(tǒng)資源少,成本低廉,而且微機(jī)鍵盤(pán)的鍵資源特別豐富,也給操作帶來(lái)極大方便。本方法在學(xué)校打鈴微電腦定時(shí)控制器中被采用,使得時(shí)間調(diào)整和上百組打鈴設(shè)置操作變得非常容易。

?

參考文獻(xiàn)

1 熊 寧,王景波.微機(jī)鍵盤(pán)通信方式及其編程.寧夏大學(xué)學(xué)報(bào)(自然科學(xué)版 ),1997;(12)

2 榮 振,梁 華,王春生.單片機(jī)擴(kuò)展標(biāo)準(zhǔn)微機(jī)鍵盤(pán)技術(shù).微型機(jī)與應(yīng)用,2000;19(7)

3 于印泉,佴曉東,王兆娟.單片機(jī)與PC鍵盤(pán)接口,內(nèi)燃機(jī)車(chē),2000;(5)

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無(wú)法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問(wèn)題,請(qǐng)及時(shí)通過(guò)電子郵件或電話(huà)通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話(huà):010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 天天综合天天综合 | 九九亚洲精品 | 日韩手机视频 | 男人影院在线 | 在线免费观看www视频 | 五月婷婷中文 | av毛片免费看 | 五月综合色婷婷影院在线观看 | 亚洲视频在线观看视频 | 日韩精品三级 | 免费国产不卡午夜福在线 | 青青青青久久精品国产h | 午夜插插| 国产精品午夜剧场 | 37pao成人国产永久免费视频 | 天堂欧美 | 一区二区视频在线观看 | 亚洲国产精品视频 | 伦理片中文字幕完整视频 | a级片播放| 日韩精品成人在线 | 欧美视频免费播放 | 欧洲做视频在线观看 | 日韩影线| 97福利视频精品第一导航 | 成免费视频 | 国产综合在线观看视频 | 狠狠色丁香婷婷久久综合不卡 | 鲁丝片一区二区三区免费 | 丁香激情六月 | 国产精品亚洲二区在线 | 久久亚洲一级毛片 | 极品美女啪啪无套 | 成人综合在线观看 | 日本三级全黄三级a | 日韩欧美无线在码 | pornh日本xxxxhd | 一级毛片免费观看 | 免费a级毛片在线观看 | 欧美日韩在线视频观看 | 精品一区二区三区视频在线观看 |