PS2鍵盤解碼的基本原理是通過外部中斷讀取鍵盤輸出的串行信號(hào),在根據(jù)掃描碼進(jìn)行查表解碼。鍵盤發(fā)送往主機(jī)的信號(hào)總是在時(shí)鐘的下降沿因此此中斷是在下降沿觸發(fā),且時(shí)鐘信號(hào)是由鍵盤給出,因此使用P1口中斷(已經(jīng)在初始化端口時(shí)設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總為0,緊接是8個(gè)數(shù)據(jù)位,然后是奇校驗(yàn)位,最后是停止位總為1.
本程序只能對(duì)基本按鍵(即鍵被按下時(shí)產(chǎn)生三個(gè)字節(jié)的掃描碼的按鍵)做出解碼,包括所有的可顯示字符鍵和Table,Back Space和Ente三個(gè)特殊功能鍵。基本按鍵的掃描碼由三個(gè)字節(jié)組成,第1個(gè)字節(jié)為接通碼,第2、3字節(jié)為斷開碼;其中第1字節(jié)和第3字節(jié)相同,中間字節(jié)為斷開標(biāo)志0xf0。例如:通碼和斷碼是以什么樣的序列發(fā)送到你的計(jì)算機(jī)使得字符G 出現(xiàn)在你的字處理軟件里呢?因?yàn)檫@是一個(gè)大寫字母需要發(fā)生這樣的事件次序按下Shift 鍵按下G 鍵釋放G 鍵釋放Shift 鍵,與這些時(shí)間相關(guān)的掃描碼如下:Shift 鍵的通碼12h G鍵的通碼34h G 鍵的斷碼F0h 34h Shift 鍵的斷碼F0h 12h 因此發(fā)送到你的計(jì)算機(jī)的數(shù)據(jù)應(yīng)該是12h 34h F0h 34h F0h 12h如果按鍵按著不放會(huì)連續(xù)發(fā)送通碼命令,可以連續(xù)顯示字符(沒有驗(yàn)證,實(shí)驗(yàn)驗(yàn)證是可以的)。
具體的說明都已經(jīng)在程序中做了注釋,主程序,中斷服務(wù)函數(shù)中讀取鍵盤發(fā)送的值:
/*****************************************************
程序功能:接收并解碼來自標(biāo)準(zhǔn)鍵盤的基本按鍵的掃描碼
然后在1602液晶上顯示。按Back Space鍵可以前向刪除顯
示字符,按Space鍵可以后向刪除顯示字符。
-----------------------------------------------------
將撥碼開關(guān)的SN74LVC2454和LCD位撥至ON
讀取鍵盤的信號(hào)需要電平轉(zhuǎn)換,注意設(shè)置SN74LVC2454的轉(zhuǎn)換方向
跳線設(shè)置:將跳線座J13的B8腳和P1.7腳短接
-----------------------------------------------------
測(cè)試說明:敲定標(biāo)準(zhǔn)鍵盤上的按鍵,觀察液晶顯示
*****************************************************/
#include #include "cry1602.h" #include "cry1602.C" #include "PS2Keyboard.h" #include "PS2Keyboard.C" #define SIDval P5IN & BIT6 #define BufferSize 32 //顯示緩存大小 unsigned char bitcount=11; //位計(jì)數(shù)變量 unsigned char kb_buffer[BufferSize]; //顯示緩存 unsigned char input=0; //數(shù)據(jù)壓入緩存位置指針 unsigned char output=0; //數(shù)據(jù)彈出緩存位置指針 unsigned char pebit=0xff; //奇偶校驗(yàn)標(biāo)志位 unsigned char recdata=0; //接收到的數(shù)據(jù) unsigned char tishi[]={"this is a demo!"}; /****************主函數(shù)****************/ void main(void) { uchar disptmp,i; uchar x = 0,y = 0; uchar first = 1; WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門狗 P6DIR |= BIT2;P6OUT &= ~BIT2; //打開電平轉(zhuǎn)換 P2DIR |= BIT3;P2OUT |= BIT3; //方向5V-->3.3V /*------選擇系統(tǒng)主時(shí)鐘為8MHz-------*/ BCSCTL1 &= ~XT2OFF; // 打開XT2高頻晶體振蕩器 do { IFG1 &= ~OFIFG; //清除晶振失敗標(biāo)志 for (i = 0xFF; i > 0; i--); //等待8MHz晶體起振 } while ((IFG1 & OFIFG)); // 晶振失效標(biāo)志仍然存在? BCSCTL2 |= SELM_2; //主時(shí)鐘選擇高頻晶振 LcdReset(); //復(fù)位液晶 DispNchar(0,0,15,tishi); //液晶顯示提示信息 Init_KB(); //初始化鍵盤端口 _EINT(); //打開全局中斷 while(1) { LPM3; //進(jìn)入低功耗模式 if(first) { first = 0; LcdWriteCommand(0x01, 1); //顯示清屏 LcdWriteCommand(0x0f, 1); //打開游標(biāo) } disptmp = GetChar(); //讀取鍵值對(duì)應(yīng)的ASCII碼 if(disptmp != 0xff) //取出了一個(gè)有效字符 { if(disptmp == 8) //如果是退格鍵 { if((x == 0) && (y == 0))//如果游標(biāo)在第1行第1位 { x = 15; y = 1; Disp1Char(x,y,0x20); //0x20是空格的ASCII碼 LocateXY(x,y); } else if((x == 0) && (y == 1))//如果游標(biāo)在第2行第1位 { x = 15; y = 0; Disp1Char(x,y,0x20); LocateXY(x,y); } else { Disp1Char(--x,y,0x20); LocateXY(x,y); } } else if((disptmp == 9) || (disptmp == 13)) //如果是Table鍵或Enter鍵 { _NOP(); } else //其余字符顯示 { Disp1Char(x++,y,disptmp); if(x == 16) //如果一行顯示完畢 { x = 0; y ^= 1; LocateXY(x,y); //重新定位游標(biāo)位置 } } } } } /******************************************* 函數(shù)名稱:PORT1_ISR 功 能:P1端口的中斷服務(wù)函數(shù),在這里接收來 自鍵盤的字符 說明:鍵盤發(fā)送往主機(jī)的信號(hào)總是在時(shí)鐘的下降沿 因此此中斷是在下降沿觸發(fā),且時(shí)鐘信號(hào)是由鍵盤 給出,因此使用P1口中斷(已經(jīng)在初始化端口時(shí) 設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總 為0,緊接是8個(gè)數(shù)據(jù)位,然后是奇校驗(yàn)位,最后是 停止位總為1. 參 數(shù):無 返回值 :無 ********************************************/ #pragma vector=PORT1_VECTOR __interrupt void PORT1_ISR(void) { if(P1IFG & BIT7) //如果是clock的中斷 { P1IFG &=~ BIT7; //清除中斷標(biāo)志 if(bitcount == 11) //接收第1位 { if(SIDval) //起始位總為0如果是1就不是起始位 return; //返回 else bitcount--; //是起始位就接著接收下一位,進(jìn)行計(jì)數(shù) } else if(bitcount == 2) //接收奇偶校驗(yàn)位 { if(SIDval) //如果校驗(yàn)位等于1 pebit = 1; //這個(gè)程序中只是對(duì)校驗(yàn)位進(jìn)行讀取,正確與否并為做判斷 else pebit = 0; bitcount--; } else if(bitcount == 1) //接收停止位 { if(SIDval) //若停止位正確 { bitcount = 11; //復(fù)位位計(jì)數(shù)變量 if( Decode(recdata) ) //解碼獲得此鍵值的ASCII值并保存 LPM3_EXIT; //退出低功耗模式 recdata = 0; //清除接收數(shù)據(jù) } else //如果出錯(cuò) { bitcount = 11; recdata = 0; } } else //接收8個(gè)數(shù)據(jù)位 { recdata >>= 1; if(SIDval) recdata |= 0x80; bitcount--; } } } 解碼程序PS2Keyboard.C: #include #include "PS2Keyboardcode.h" #define BufferSize 32 extern uchar kb_buffer[BufferSize]; extern uchar input; extern uchar output; extern uchar flag; /******************************************* 函數(shù)名稱:PushBuff 功 能:將一個(gè)字符壓入顯示緩存,如果緩存以 滿則覆蓋前面的數(shù)據(jù) 參 數(shù):c--要顯示的字符 返回值 :無 ********************************************/
上一篇:MSP430學(xué)習(xí)筆記6-動(dòng)態(tài)數(shù)碼管的顯示
下一篇:MSP430學(xué)習(xí)筆記3-PWM的產(chǎn)生
推薦閱讀最新更新時(shí)間:2025-04-25 08:59




設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 基于GPS自動(dòng)授時(shí)的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺(tái)控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時(shí)處理器M7000
- 基于HW2181B的航模無線遙控通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 應(yīng)對(duì)機(jī)器人“四高”,極海推出全球首款雙核Cortex-M52 MCU G32R501
- 非道路移動(dòng)機(jī)械透射式煙度計(jì)研究與實(shí)現(xiàn)
- 基于STM32F103的角磨機(jī)開關(guān)磁阻電機(jī)控制器的設(shè)計(jì)
- LT1934IS6 5V 降壓轉(zhuǎn)換器的典型應(yīng)用電路
- MTRCKTSBN5643L: 采用恩智浦MPC5643L微控制器的3相無傳感器BLDC開發(fā)套件
- 用于高電流分流穩(wěn)壓器的 TL431 可編程精密基準(zhǔn)的典型應(yīng)用
- NCV7718GEVB,具有保護(hù)功能的 NCV7718 六角半橋驅(qū)動(dòng)器評(píng)估板
- LT1170CQ、5V/5A 反激式轉(zhuǎn)換器的典型應(yīng)用
- CY8CKIT-059,PSoC 5LP 原型設(shè)計(jì)套件旨在用作具有 PSoC 5LP 系列的 CY8C5888LTI-LP097 器件的開發(fā)平臺(tái)
- 具有內(nèi)置診斷功能的 TDA7801 數(shù)字輸入四路功率放大器的 I2C 總線模式應(yīng)用圖 (TDA7801/H/SM) 中的典型應(yīng)用圖
- LTC3400ES6 單節(jié)電池至 3.3V 同步升壓轉(zhuǎn)換器的典型應(yīng)用電路
- 使用 Diodes Incorporated 的 AZ317L 的參考設(shè)計(jì)
- LTC2980IY 16 通道 PMBU 電源系統(tǒng)管理器的典型應(yīng)用電路
- 大眾汽車宣布明年起其所有電動(dòng)車型全面轉(zhuǎn)向磷酸鐵鋰電池,升級(jí)至MEB Plus平臺(tái)
- 總產(chǎn)值破2000億,深圳要做“機(jī)器人第一城”?
- 鴻道Intewell操作系統(tǒng) 人形機(jī)器人底層操作系統(tǒng)
- 如何定位國(guó)產(chǎn)智駕芯片的終局價(jià)值?
- 新一代車規(guī)級(jí)數(shù)字功放電感VSAD-T系列 為汽車音響注入高保真基因
- 蜂巢能源快充電池突破:15分鐘充至滿電,提升30%效率
- 整車操作系統(tǒng)何以躋身智能汽車三大件?
- 人形機(jī)器人如何做到“手眼”協(xié)同+“大小腦”協(xié)同?
- 中國(guó)電池公司獲英國(guó)政府10億英鎊支持!
- 從游戲到智能駕駛,英偉達(dá)有哪些技術(shù)升級(jí)?
- 福祿克明星款熱像儀全新來襲,搶先免費(fèi)體驗(yàn)贏好禮
- 直播已結(jié)束【解鎖 TI Sitara AM2x MCU 在電機(jī)驅(qū)動(dòng)中的新可能】
- 有獎(jiǎng)報(bào)名|TI MSPM0 在【電力輸送和工廠自動(dòng)化與控制系統(tǒng)】、【家用電器和電機(jī)控制】中的典型應(yīng)用
- 有獎(jiǎng)直播 | 同質(zhì)化嚴(yán)重,缺乏創(chuàng)新,ST60毫米波非接觸連接器,賦予你獨(dú)特的產(chǎn)品設(shè)計(jì),重拾市場(chǎng)話語權(quán)
- 是德科技有獎(jiǎng)問答活動(dòng)之一,A4WP無線充電測(cè)試的示波器方案,答題闖關(guān)贏好禮!
- 報(bào)名參會(huì)三重禮 | 西門子車用半導(dǎo)體全棧解決方案直播
- 跟著電源達(dá)人一起動(dòng)手做“高效率雙向DC-DC變換器”
- Digi-key干貨視頻教程來襲,意見領(lǐng)袖講解疑難設(shè)計(jì)問題,帶你突破成長(zhǎng)瓶頸~
- VISHAY醫(yī)療主題月 幸運(yùn)闖關(guān)贏大獎(jiǎng)!
- Cepton和Dataspeed合作,為自動(dòng)駕駛汽車提供高性能激光雷達(dá)!
- 新型陰極涂層可“一箭雙雕”:提升鋰電池安全和能量密度
- 8分鐘完成8公里首航 無人機(jī)配送邁開商業(yè)化大步
- 辰芯科技購買Arteris? IP的FlexNoC?互連技術(shù)
- 人工智能重構(gòu)教育 技術(shù)革新將帶來新挑戰(zhàn)
- 期待工業(yè)機(jī)器人在智能時(shí)代下的表現(xiàn)
- 小米11標(biāo)準(zhǔn)版取消充電器與數(shù)據(jù)線
- 小米11發(fā)布:依舊3999元起售
- 雷軍公布小米實(shí)驗(yàn)室:遍及全球 小米科技園有123間
- 三星Galaxy Smart Tag追蹤器解密:再也不怕“丟三落四”