婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av

電子開發網

電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

單片機系統中PS/2鍵盤驅動程序的設計

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2008-10-31

    在單片機系統中,經常使用的鍵盤都是專用鍵盤.此類鍵盤為單獨設計制作的,成本高、使用硬件連接線多,且可靠性不高,這一狀況在那些要求鍵盤按鍵較多的應用系統中更為突出.與此相比,在PC系統中廣泛使用PS/2鍵盤具有價格低、通用可靠,且使用連接線少(僅使用2根信號線)的特點,并可滿足多種系統的要求.因此在單片機系統中應用PS/2鍵盤是一種很好的選擇.
    文中在介紹PS/2協議和PS/2鍵盤工作原理與特點的基礎上,給出了一個在單片機上實現對PS/2鍵盤支持的硬件連接與驅動程序設計實現.該
設計實現了在單片機系統中對PS/2標準104鍵盤按鍵輸入的支持.使用Keil C51開發的驅動程序接口和庫函數可以方便地移植到其他單片機或嵌入式系統中.所有程序在Keil uVision2上編譯通過,在單片機AT89C51上測試通過.

1 PS/2協議
目前,PC機廣泛采用的PS/2接口為mini-DIN 6pin的連接器,如圖1所示.
PS/2接口圖 
    PS/2設備有主從之分,主設備采用Female插座,從設備采用Male插頭.現在廣泛使用的PS/2鍵盤鼠標均在從設備方式下工作.PS/2接口的時鐘
與數據線都是集電極開路結構,必須外接上拉電阻(一般上拉電阻設置在主設備中).主從設備之間數據通信采用雙向同步串行方式傳輸,時鐘信號由從設備產生.

1.1 從設備到主設備的通信
    當從設備向主設備發送數據時,首先檢查時鐘線,以確認時鐘線是否為高電平.如果是高電平,從設備就可以開始傳輸數據;反之,從設備要等待獲得總線的控制權,才能開始傳輸數據.傳輸的每一幀由11位組成,發送時序及每一位的含義如圖2所示.
從設備到主設備的通信 
    每一幀數據中開始位總是為0,數據校驗采用奇校驗方式,停止位始終為1.從設備到主設備通信時,從設備總是在時鐘線為高時改變數據線狀態,主設備在時鐘下降沿讀人數據線狀態.

1.2 主設備到從設備的通信
    主設備與從設備進行通信時,主設備首先將時鐘線和數據線設置為“請求發送”狀態,具體方式為:首先下拉時鐘線至少100us抑制通信,然后下拉數據線“請求發送”,最后釋放時鐘線.在此過程中,從設備在不超過10us的間隔內必須檢查這個狀態,當設備檢測到這個狀態時,它將開始產生時鐘信號.此時數據傳輸的每一幀由12位構成,其時序和每一位含義如圖3所示.
主設備到從設備的通信 
    與從設備到主設備通信相比,其每幀數據多了一個ACK位.這是從設備應答接收到字節的應答位,由從設備通過拉低數據線產生,應答位ACK總
是為0.主設備到從設備通信過程中,主設備總是在時鐘線為低電平時改變數據線的狀態,從設備在時鐘上升沿讀人數據線狀態.

2 PS/2鍵盤的編碼與命令集
2.1 PS/2鍵盤的編碼
    目前,PC機使用的PS/2鍵盤都默認采用第2套掃描碼集.掃描碼有兩種不同的類型:“通碼(make code)”和“斷碼(break code)”.當一個鍵被按下或持續按住時,鍵盤會將該鍵的通碼發送給主機;而當一個鍵被釋放時,鍵盤會將該鍵的斷碼發送給主機.根據鍵盤按鍵掃描碼的不同,可將按鍵分為3類:
第1類按鍵 通碼為一個字節,斷碼為0xF0+通碼形式.如A鍵,其通碼為0x1C;斷碼為0xF0 0x1C.
第2類按鍵 通碼為兩字節0xE0+0xXX形式,斷碼為0xE0+0xF0+0xXX形式.如Right Ctrl鍵,其通碼為0xE0 0x14;斷碼為0xE0 0xF0 0x14.
第3類特殊按鍵 有兩個,Print Screen鍵,其通碼為0xE0 0x12 0xE0 0x7C;斷碼為0xE0 0xF0 0x7C 0xE0 0xF0 0x12.Pause鍵,其通碼為0xE1 0x14 0x77 0xE1 0xF0 0xl4 0xF0 0x77;斷碼為空.
    組合按鍵掃描碼的發送是按照按鍵發生的次序,如按下面順序按左Shift十A鍵:① 按下左Shift鍵;② 按下A鍵;③ 釋放A鍵;④ 釋放左Shift鍵,那么計算機上接收到的一串數據為0x12 0x1C 0xF0 0x1C 0xF0 0x12.
    在文中的驅動程序設計中,就是根據按鍵的分類對其分別進行處理.

2.2 PS/2鍵盤的命令集
    主機可通過向PS/2鍵盤發送命令對鍵盤進行設置或者獲得鍵盤的狀態等操作.每發送一個字節,主機都會從鍵盤獲得一個應答0xFA(“重發
resend”和“回應echo”命令例外).驅動程序在鍵盤初始化過程中所用的指令:0xED,主機在該命令后跟隨發送一個參數字節,用于指示鍵盤上Num Lock,Caps Lock,Scroll Lock Led的狀態;0xF3,主機在這條命令后跟隨發送一個字節參數定義鍵盤機打的速率和延時;0xF4,用于當主機發送0xF5禁止鍵盤后,重新使能鍵盤.

3 PS/2鍵盤與單片機的連接電路
    PS/2鍵盤與AT89C51單片機的連接方式如圖4所示.P1.0接PS/2數據線;P3.2(INT0)接PS/2時鐘線.因為單片機的P1,P3口內部是帶上拉電阻的,所以PS/2的時鐘線和數據線可以直接與單片機的P1,P3相連接.
 

4 驅動程序設計
    驅動程序的開發使用Keil C51語言以及KeiluVision2編程環境.PS/2 104鍵盤驅動程序主要任務是實現單片機與鍵盤間PS/2通信,同時將接收到的按鍵掃描碼轉換為該按鍵的鍵值KeyVal,提供給系統上層軟件使用.

4.1 單片機與鍵盤間PS/2通信的程序設計
    在PS/2通信過程中,主設備(文中是單片機)是在時鐘信號為低時發送和接收數據信號.因為單片機向鍵盤發送的是指令,需要鍵盤回應,所以這
部分程序采用查詢方式;而單片機接收鍵盤數據時,數據線上的信號在時鐘為低時已經穩定,所以這部分程序采用中斷方式,且不需要在程序中加入延時程序.
    單片機向PS/2鍵盤發送數據程序代碼為:
void ps2_sentchar(unsigned char sentchar){//ps2主設備向從設備發送數據
unsigned char sentbit_cnt= 0x00;
unsigned char sentchar_chk = 0x00;
EX0=0; //關外部中斷0
//發起一個傳送,發起始位
PS2_SGN_CLOCK = 0; //將時鐘線拉低并保持100 us
delay100us();
PS2_SGN_DATA= 0; //起始位
PS2_SGN_CLOCK = 1;
//發送DATA0-7
for(sentbit_cnt=0;sentbit_cnt< 8;sentbit_cnt++){
while(PS2_SGN_CLOCK) _nop_(); //等待時鐘線變為低
PS2_SGN_DATA = sentchar& 0x01;//發送數據
if(PS2_SGN_DATA) sentchar_chk++; //計算校驗
while(!PS2_SGN_CL0CK) _nop_(); //等待時鐘線變高
sentchar>>=1; //待發送數據右移一位
}
//發送校驗位
while(PS2_SGN_CLOCK) _nop_(); //等待時鐘線變低
switch(sentchar_chk){
case 0:
case 2:
case 4:
case 6:PS2_SGN_DATA =1;break;//奇校驗
case 1:
case 3:
case 5:
case 7:PS2_SGN_DATA = 0;break;//奇校驗
default;break;
)
while(!PS2_SGN_CLOCK) _nop_(); //等待時鐘線變高
while(PS2_SGN_CLOCK) _nop_(); //等待時鐘線變低
PS2_SGN_DATA =1;//發送停止位,停止位總為1
while(!PS2_SGN_CLOCK) _nop_(); //等待時鐘線變高
while(PS2_SGN_CLOCK) _nop_(); //等待時鐘線變低
//接收ACK
//if(PS2_SGN_DATA) error();
//ACK信號由鍵盤發出,總為低電平
while(!PS2_SGN_CLOCK) _nop_(); //等待時鐘線變高
EX0= 1; //開外部中斷0
}

單片機由PS/2鍵盤接收數據程序:外部中斷0設置為下降沿觸發
void int0() interrupt 0 using 0 {//
EX0=0; //關外部中斷0
switch(ps2_revchar_cnt){
case 1:
……
case 8:mcu_revchar<<=1;
if(PS2_SGN_DATA) mcu_revchar |= 0x01;
ps2_revchar_cnt++;
break;
case 0:ps2_revchar_cnt++;break; //開始位,
case 9:ps2_revchar_cnt++;break; //校驗位,可添加校驗程序
case 10: _nop_();//停止位
ps2_revchar_cnt= 0;
revchar_flag=1;//置接收到數據標識位
break;
default:break;
}
EX0=1;//開外部中斷0
}

4.2 鍵盤掃描碼轉換程序設計
    由于鍵盤掃描碼無規律可循,因此由鍵盤掃描碼獲得相應按鍵的鍵值(字符鍵為其ASCII值,控制鍵如F1,Ctrl等為自定義值),只能通過查表的方式獲得.由于按鍵的3種類型及部分按鍵對應著兩個鍵值(如A鍵的鍵值根據Caps和Shift鍵狀態有0x41(A)和0x61(a)兩種),因此綜合考慮查表轉換速度和資源消耗,設計中使用4個鍵盤表:鍵盤掃描碼轉換基本集和切換集(kb_plain_map[NR_KEYS]與kb_shift_map[NR_KEYS]);包含E0前綴的鍵盤掃描碼轉換基本集和切換集(kbeO_plain_map[NR_KEYS]與kbe0_shiftmap[NR_KEYS]).PS/2 104鍵盤按鍵掃描碼最大值為0x83,所以設置NR_KEYS為132.所有4個鍵盤表的定義均為如下形式:KB_MAP[MAKE CODE]=KEYVAL,如果掃描碼對應的按鍵為空(如KB_MAP[0x00]),則定義相應鍵值為NULL_KEY(0x00).以下是鍵盤掃描碼基本集的部分代碼實例:
kb_plain_map[NR_KEYS]={……
NULL_KEY;0x2C;0x6B;0x69;0x6F;0x30;0x39;
NULL_KEY; //掃描碼0x40~0x47
//對應按鍵空,逗號,K,I,O,0,9,空
//對應鍵值0x00,',','k','i','o','O','9',0x00…… };
    如此設計鍵盤轉換表的另一個好處在于,以后如需擴展支持有ACPI、Windows多媒體按鍵鍵盤時,只需要將鍵表中相應處修改即可,如ACPI
Power按鍵通碼為0xE0 0x37,修改kbe0_plain_map[0x37]=KB_ACPI_PWR即可.
    特殊按鍵Pause使用單獨程序處理,如果接收到0xE1就轉入這段程序.而Print Screen鍵則將其看作是兩個通碼分別為0xE0 0x12和0xE0 0x7C
的“虛鍵”的組合鍵處理.在驅動程序中設定如下全局變量:led_status記錄Scroll Lock Led,Num Lock Led和Caps Lock Led的狀態(關為0,開為1);agcs_status記錄左右Shift Ctrl Gui Alt狀態,相應鍵按下則對應位為1,釋放為0.E0_FLAG接到0xE0置1;E1_FLAG接收到0xE1置1;F0_FLAG接收到0xF0置1.按鍵鍵值通過KeyVal提供上層程序使用.PS/2鍵盤掃描碼鍵值轉換程序ps2_codetrans()流程框架如圖5所示.
掃描碼鍵值轉換程序流程框架 

第1類按鍵的掃描碼鍵值轉換程序代碼。
if(F0_FLAG){//接收掃描碼為斷碼
switch(mcu_revchar){//處理控制鍵
case 0x11:ages_status&=0xF7;break;//左alt釋放
case 0x12:ages_status&=0xFE;break;//左shift釋放
case 0x14:agcs_status&=0xFD;break;//左ctrl釋放
case 0x58;if(led_status&0x04) led_status &= 0x03; //caps lock
else led_status |=0x04;
ps2_ledchange();
break;
case 0x59: agcs_status &= 0xEF;break;//右shift釋放
case 0x77: if(led_status&0x02)led_status&=0x05;//num lock
else led_status |=0x02;
ps2_ledchange();
break;
case 0x7E:if(led_status&0x01) led_status&=0x06;//scroll lock
else led_status |=0x01;
ps2_ledchange();
break;
default;break;
}
F0_FLAG=0;
}
else{//接收掃描碼為通碼
if(led_status&0x04) caps_flag=1;else caps_flag = 0;
if(led_status&0x02) num_flag =1;else num_flag =0;
if(agcs_status&0x11) shift_flag = 1;else
shift_flag=0;
//掃描碼鍵值轉換
if((caps_flag == shift_flag) || (!num_flag)) KeyVal=kb_plain_map[mcu_revchar];
else KeyVal = kb_shift_map[mcu_revchar];
switch(mcu_revchar)(//處理控制鍵或狀態鍵
case 0x11:agcs_status|= 0x08;//左alt按下
Case 0x12:agcs_status|= 0x01;//左shift按下
case 0x14:agcs_status|= 0x02;//左ctrl按下
case 0x59:agcs_status|= 0x10;//右shift按下
default:break;
}
}
    第2類按鍵的掃描碼鍵值轉換程序與上面相似.注意:在退出該程序段時,對E0_FLAG和F0_FLAG標識清0.Pause鍵的處理程序,如果接收到0xE1,置E1_FLAG=1,然后順次將后續接收到的7個字節數據和Pause的通碼后7個字節比較,一致則返回KeyVal=KB_PAUSE;在比較完所有7個字節后清除E1_FLAG標識.鍵盤初始化程序kb_init()流程為:
① 上電后,接收鍵盤上電自檢通過信號0xAA,或者自檢出錯信號0xFC.單片機接收為0xAA則進入下一步,否則進行出錯處理.
② 關LED指示,單片機發送0xED,然后接收鍵盤回應0xFA,接著發送0x00接收0xFA.
③ 設置機打延時和速率:單片機發送0xF3,接收0xFA,發送0x00(250 ms,2.0 cps),接收0xFA.
④ 檢查LED,發送0xED,接收0xFA,發送0x07(開所有LED),接收0xFA.發送0xED,接收0xFA,發送0x00(關LED),接收0xFA.
⑤ 允許鍵盤,發送0xF4,接收0xFA.鍵盤LED改變ps2_ledchange()函數流程:發送0xED;接收0xFA;發送led_status;接收0xFA.

5 結語
  該驅動程序經Keil uVision2 編譯,在AT89C51單片機上運行通過,實現了對PS/2 104鍵盤的支持,實現了對字符按鍵大小寫切換,Num Lock切換、控制鍵及組合按鍵的支持.同時該程序對其他嵌入式或單片機系統中PS/2鍵盤的應用也有借鑒意義.

Tags:單片機,鍵盤設計,驅動程序設計  
責任編輯:admin
相關文章列表
沒有相關文章
請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
1分 2分 3分 4分 5分

還可以輸入 200 個字
[ 查看全部 ] 網友評論
關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
返回頂部
刷新頁面
下到頁底
晶體管查詢
婷婷亚洲天堂影院-国产精品豆花视频www-伊人影院在线观看-日本少妇浓毛bbwbbwbbw-av网站观看-亚州欧美在线-91精品国产乱码久-任我爽精品视频在线播放-日本视频不卡-亚洲国产精品va在线观看香蕉-国产毛片乡下农村妇女-国产成人免费ā片在线观看老同学-欧美日韩免费在线-成人无码视频免费播放-色综合美女-免费毛片av
<button id="4i884"></button>
  • <abbr id="4i884"><source id="4i884"></source></abbr>
  • <code id="4i884"><tr id="4i884"></tr></code>
  • <rt id="4i884"></rt>
    <li id="4i884"></li>
  • <rt id="4i884"><tr id="4i884"></tr></rt>
  • 久久精品国产露脸对白| 欧美aaa在线观看| bt天堂新版中文在线地址| 日本中文字幕精品—区二区| 不卡影院一区二区| 99色精品视频| 免费男同深夜夜行网站| 成人在线观看a| 在线看的黄色网址| 网站一区二区三区| 毛片毛片毛片毛| 手机在线国产视频| 国产911在线观看| 欧美激情亚洲天堂| 九色在线视频观看| 日韩av在线综合| 999精彩视频| 黄色小视频大全| 日韩在线观看a| 日本wwww视频| 亚洲三级在线观看视频| 天天操天天干天天玩| 欧美激情视频免费看| 国产熟女高潮视频| 亚洲男人天堂2021| 男人用嘴添女人下身免费视频| 欧美日韩在线不卡视频| 中文字幕第一页在线视频| 国产日产欧美一区二区| 日本免费黄视频| 最新国产黄色网址| 91.com在线| www.99在线| 久久人人爽人人爽人人av| 久久精品99国产| 亚洲av毛片在线观看| 久久精品视频16| 吴梦梦av在线| 91av俱乐部| 成人在线观看毛片| 日本xxxx黄色| 欧美 日韩 国产一区| 天天综合五月天| 在线观看岛国av| 激情五月开心婷婷| 日韩精品在线视频免费观看| 亚洲一区二区在线视频观看| www黄色av| 国产尤物av一区二区三区| 一个色综合久久| 能在线观看的av网站| 欧美极品欧美精品欧美| 菠萝蜜视频在线观看入口| 成人亚洲免费视频| 欧美日韩在线观看不卡| 男人亚洲天堂网| 逼特逼视频在线| 国产精品沙发午睡系列| 人人妻人人澡人人爽欧美一区双| 亚洲黄色片免费| 亚洲一二区在线观看| 视频在线观看免费高清| 色哟哟精品视频| 日本在线观看免费视频| 黄色一级免费大片| 男人搞女人网站| 日本熟妇人妻中出| 手机看片福利盒子久久| 凹凸国产熟女精品视频| 97xxxxx| 熟女人妇 成熟妇女系列视频| 国产主播在线看| 韩国中文字幕av| 91在线第一页| xxxxxx在线观看| 农民人伦一区二区三区| 日本国产在线播放| 少妇高清精品毛片在线视频| 亚洲一区二区三区四区五区xx| 久久久国产欧美| 四虎1515hh.com| 久久亚洲精品无码va白人极品| 精品国偷自产一区二区三区| 欧美深夜福利视频| 亚洲 中文字幕 日韩 无码| 日韩av片网站| 肉大捧一出免费观看网站在线播放| 永久免费网站视频在线观看| 丁香花在线影院观看在线播放 | 精品这里只有精品| 久久精品网站视频| 看全色黄大色大片| 日韩网址在线观看| 色天使在线观看| 欧美中文字幕在线观看视频| 色综合av综合无码综合网站| 免费成年人高清视频| 奇米777四色影视在线看| aa在线免费观看| 91香蕉视频网址| 能在线观看的av| 奇米777在线视频| 777久久久精品一区二区三区| 国产精品自拍视频在线| 日韩亚洲欧美视频| 成年人网站av| 免费日韩中文字幕| 97免费视频观看| 国产乱女淫av麻豆国产| 国产视频九色蝌蚪| 涩多多在线观看| 无遮挡又爽又刺激的视频| 久久久国产精华液999999 | 久久久免费视频网站| 免费久久久久久| 日韩一级免费片| 青娱乐自拍偷拍| 欧美日韩激情四射| 午夜影院免费版| 蜜臀一区二区三区精品免费视频 | 日本久久久久久久久久久久| 亚洲精品蜜桃久久久久久| 福利片一区二区三区| 男人操女人免费软件| 欧美午夜性视频| www.日本在线视频| 超薄肉色丝袜足j调教99| 亚洲一级免费在线观看| 日本一本二本在线观看| 国产精品秘入口18禁麻豆免会员 | 欧美 国产 日本| 国产二区视频在线播放| 浮妇高潮喷白浆视频| 国产91视频一区| 国产性生活免费视频| 天天想你在线观看完整版电影免费| 一起操在线视频| 激情文学亚洲色图| 国产三级中文字幕| 国产一级大片免费看| 黄色片免费在线观看视频| 三级在线免费观看| 久久这里只有精品23| www.99热这里只有精品| 能在线观看的av| 男女视频在线看| 三级黄色片免费看| 国内精品视频一区二区三区| 国产二级片在线观看| 无码日韩人妻精品久久蜜桃| 亚欧美在线观看| 视频一区二区视频| av之家在线观看| 欧美男女交配视频| 污视频在线观看免费网站| 少妇久久久久久被弄到高潮| 亚洲 高清 成人 动漫| 国产又大又黄又粗的视频| 一级片黄色免费| 亚洲人精品午夜射精日韩| 看欧美ab黄色大片视频免费| 成人性生交视频免费观看| 丰满少妇大力进入| 天堂在线一区二区三区| 免费在线黄网站| 亚洲国产成人va在线观看麻豆| 国产又粗又长又爽视频| www.激情小说.com| 一本大道东京热无码aⅴ| av免费在线播放网站| 日韩成人午夜影院| 亚洲 欧美 日韩系列| 国产夫妻自拍一区| 久久精品国产露脸对白| 日日摸天天爽天天爽视频| 一区中文字幕在线观看| 青青在线免费观看视频| 2018中文字幕第一页| 激情图片中文字幕| 美女喷白浆视频| 久久国产亚洲精品无码| 黄色影视在线观看| 亚洲图色中文字幕| 99热亚洲精品| 成人av在线播放观看| 成人av毛片在线观看| 丝袜制服一区二区三区| 激情六月丁香婷婷| 国产人妻777人伦精品hd| 在线观看av的网址| 国产日本欧美在线| 婷婷中文字幕在线观看| 欧美第一页浮力影院| 亚洲天堂网一区| 青青草精品视频在线观看| 能在线观看的av| 波多野结衣作品集| 成人小视频在线看| 99视频在线免费| 天堂社区在线视频|