PS2鍵盤解碼的基本原理是通過外部中斷讀取鍵盤輸出的串行信號,在根據(jù)掃描碼進(jìn)行查表解碼。鍵盤發(fā)送往主機(jī)的信號總是在時鐘的下降沿因此此中斷是在下降沿觸發(fā),且時鐘信號是由鍵盤給出,因此使用P1口中斷(已經(jīng)在初始化端口時設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總為0,緊接是8個數(shù)據(jù)位,然后是奇校驗(yàn)位,最后是停止位總為1.
本程序只能對基本按鍵(即鍵被按下時產(chǎn)生三個字節(jié)的掃描碼的按鍵)做出解碼,包括所有的可顯示字符鍵和Table,Back Space和Ente三個特殊功能鍵。基本按鍵的掃描碼由三個字節(jié)組成,第1個字節(jié)為接通碼,第2、3字節(jié)為斷開碼;其中第1字節(jié)和第3字節(jié)相同,中間字節(jié)為斷開標(biāo)志0xf0。例如:通碼和斷碼是以什么樣的序列發(fā)送到你的計(jì)算機(jī)使得字符G 出現(xiàn)在你的字處理軟件里呢?因?yàn)檫@是一個大寫字母需要發(fā)生這樣的事件次序按下Shift 鍵按下G 鍵釋放G 鍵釋放Shift 鍵,與這些時間相關(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如果按鍵按著不放會連續(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
讀取鍵盤的信號需要電平轉(zhuǎn)換,注意設(shè)置SN74LVC2454的轉(zhuǎn)換方向
跳線設(shè)置:將跳線座J13的B8腳和P1.7腳短接
-----------------------------------------------------
測試說明:敲定標(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)主時鐘為8MHz-------*/ BCSCTL1 &= ~XT2OFF; // 打開XT2高頻晶體振蕩器 do { IFG1 &= ~OFIFG; //清除晶振失敗標(biāo)志 for (i = 0xFF; i > 0; i--); //等待8MHz晶體起振 } while ((IFG1 & OFIFG)); // 晶振失效標(biāo)志仍然存在? BCSCTL2 |= SELM_2; //主時鐘選擇高頻晶振 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(); //讀取鍵值對應(yīng)的ASCII碼 if(disptmp != 0xff) //取出了一個有效字符 { 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ī)的信號總是在時鐘的下降沿 因此此中斷是在下降沿觸發(fā),且時鐘信號是由鍵盤 給出,因此使用P1口中斷(已經(jīng)在初始化端口時 設(shè)置)。發(fā)送的數(shù)據(jù)位11位,第一位是起始位,總 為0,緊接是8個數(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; //這個程序中只是對校驗(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 //如果出錯 { bitcount = 11; recdata = 0; } } else //接收8個數(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 功 能:將一個字符壓入顯示緩存,如果緩存以 滿則覆蓋前面的數(shù)據(jù) 參 數(shù):c--要顯示的字符 返回值 :無 ********************************************/
上一篇:MSP430學(xué)習(xí)筆記6-動態(tài)數(shù)碼管的顯示
下一篇:MSP430學(xué)習(xí)筆記3-PWM的產(chǎn)生
推薦閱讀
史海拾趣
隨著全球?qū)Νh(huán)境保護(hù)的日益重視,Herga公司積極響應(yīng)綠色制造的號召,將環(huán)保理念融入產(chǎn)品設(shè)計(jì)和生產(chǎn)過程中。公司研發(fā)出了一系列節(jié)能高效的電子產(chǎn)品組件,如低能耗的驅(qū)動器、可回收材料的電機(jī)外殼等。這些產(chǎn)品不僅滿足了市場對高性能、高品質(zhì)的需求,還降低了生產(chǎn)過程中的碳排放和資源消耗。Herga公司的這一舉措贏得了社會各界的廣泛贊譽(yù),也為其在電子行業(yè)中的可持續(xù)發(fā)展奠定了堅(jiān)實(shí)基礎(chǔ)。
自E-Z-HOOK公司成立以來,其產(chǎn)品線一直在不斷擴(kuò)大。到了1970年代,隨著電子行業(yè)的快速發(fā)展,對測試工具的需求也日益增加。公司的新主人繼承了阿爾伯特·史密斯的愿景,并決定進(jìn)一步擴(kuò)展產(chǎn)品線。他們引入了一系列新的測試鉤型號,以適應(yīng)不同尺寸和形狀的測試點(diǎn)。此外,公司還開始生產(chǎn)其他與測試相關(guān)的零部件和組件,以滿足客戶日益增長的需求。
隨著數(shù)字化轉(zhuǎn)型的深入,CET Technology緊跟時代步伐,成功研發(fā)出數(shù)字化安全生產(chǎn)管控平臺。該平臺通過整合配電、給水、電梯、消防、空調(diào)、安防等各系統(tǒng),建立統(tǒng)一的安全物聯(lián)感知平臺,實(shí)現(xiàn)對安全生產(chǎn)各要素的在線監(jiān)測。利用3D可視化技術(shù),關(guān)鍵信息得以直觀呈現(xiàn),為企業(yè)的安全生產(chǎn)管理提供了有力支持。此外,CET還引入了AI技術(shù),對安全風(fēng)險進(jìn)行精準(zhǔn)預(yù)測,助力企業(yè)防范和應(yīng)對各類安全事件。
為了進(jìn)一步擴(kuò)大市場份額,維峰電子積極開拓國內(nèi)外市場。公司通過與國內(nèi)外知名企業(yè)的合作,成功進(jìn)入了多個領(lǐng)域,包括工業(yè)控制、汽車和新能源等。特別是新能源領(lǐng)域,維峰電子憑借其在電子連接器方面的技術(shù)優(yōu)勢,成功開發(fā)出多款適用于新能源領(lǐng)域的產(chǎn)品,受到了市場的廣泛認(rèn)可。
Elektron公司的故事始于1942年,由威利·科伯以Elektron物理技術(shù)設(shè)備工廠Kerber的名稱成立。當(dāng)時,該公司主要生產(chǎn)基于汞蒸氣整流器的固定電池電源和船用電池充電器。這些產(chǎn)品在市場上取得了良好的反響,為公司的發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。在隨后的幾年里,Elektron不斷擴(kuò)大產(chǎn)品范圍,開始涉足汽車行業(yè)的電池充電器以及焊接和切割工藝的電源等領(lǐng)域。
進(jìn)入XXXX年代,Esico-Triton開始將目光投向國際市場。公司積極參加國際電子展會,與世界各地的潛在客戶和合作伙伴建立聯(lián)系。通過不斷的市場調(diào)研和產(chǎn)品調(diào)整,Esico-Triton成功打入歐洲和亞洲市場,產(chǎn)品的國際知名度逐漸提升。
ABB控制系統(tǒng)在大口徑無縫鋼管生產(chǎn)線中的應(yīng)用 介紹了ABB 公司的 AC450系列集散控制系統(tǒng)在大口徑無縫鋼管生產(chǎn)線中的應(yīng)用,著重描敘了系統(tǒng)配置和控制功能,以及 ABB 的 8"C&& 和 !E<&& 總線在系統(tǒng)中的應(yīng)用。… 查看全部問答∨ |
JPEG2000中嵌入式塊編碼的FPGA設(shè)計(jì) 摘要: 為了使JPEG2000能應(yīng)用到便攜產(chǎn)品中,采用了高效存儲結(jié)構(gòu)的硬件實(shí)現(xiàn)方案,并設(shè)計(jì)了相應(yīng)的寄存器組和控制邏輯。仿真結(jié)果表明所設(shè)計(jì)所設(shè)計(jì)的編碼器能夠在0.256s內(nèi)完成對一幀512×512的灰度圖像的編碼。 關(guān)鍵詞: 基于最優(yōu)截?cái)嗟那度胧骄幋a JP ...… 查看全部問答∨ |
最近遇到單位計(jì)算機(jī)接一個自動設(shè)備,用的就是串口來通信,向上級(服務(wù)器)發(fā)送自動設(shè)備的數(shù)據(jù)又要占用一個串口。 原配的計(jì)算機(jī) 2 個串口都是公的,而新買的計(jì)算機(jī)的 2 個串口是一公一母。 請問: 1.為何是這樣?   ...… 查看全部問答∨ |
MS “博客達(dá)人”征文大賽熱烈啟動,獎品豐厚,火速報名中!!! 沒有做不到,只有想不到!這句話應(yīng)用在開發(fā)技術(shù)領(lǐng)域再適合不過了。以微軟新一代操作系統(tǒng)Windows Vista;最新版本瀏覽器IE8;新一代互聯(lián)網(wǎng)多媒體及交互技術(shù)Silverlight以及用來開發(fā)下一代用戶界面基礎(chǔ)的WPF,還有大家熟悉的SQL Server, VSTS等技術(shù)為 ...… 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 基于GPS自動授時的無線智能控制器的設(shè)計(jì)
- 基于PTR2000的無線氣象信息采集系統(tǒng)設(shè)計(jì)
- Microchip推出MEC175xB系列器件,為嵌入式控制器引入硬件 抗量子攻擊能力
- 無人飛行器機(jī)載穩(wěn)定云臺控制系統(tǒng)的設(shè)計(jì)
- 匠芯創(chuàng)推出面向具身智能高性能實(shí)時處理器M7000
- 基于HW2181B的航模無線遙控通信系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
- 應(yīng)對機(jī)器人“四高”,極海推出全球首款雙核Cortex-M52 MCU G32R501
- 非道路移動機(jī)械透射式煙度計(jì)研究與實(shí)現(xiàn)
- 基于STM32F103的角磨機(jī)開關(guān)磁阻電機(jī)控制器的設(shè)計(jì)
- 鴻道Intewell操作系統(tǒng) 人形機(jī)器人底層操作系統(tǒng)
- 如何定位國產(chǎn)智駕芯片的終局價值?
- 新一代車規(guī)級數(shù)字功放電感VSAD-T系列 為汽車音響注入高保真基因
- 蜂巢能源快充電池突破:15分鐘充至滿電,提升30%效率
- 整車操作系統(tǒng)何以躋身智能汽車三大件?
- 人形機(jī)器人如何做到“手眼”協(xié)同+“大小腦”協(xié)同?
- 中國電池公司獲英國政府10億英鎊支持!
- 從游戲到智能駕駛,英偉達(dá)有哪些技術(shù)升級?
- 自動緊急制動系統(tǒng)將強(qiáng)制安裝!重磅新規(guī)征求意見!
- 具有語音播報功能的超聲波液位測量系統(tǒng)設(shè)計(jì)
- 侯峰:拒中興華為于門外,中國應(yīng)該學(xué)習(xí)美國怎樣的戰(zhàn)略安全意識
- HTC真無線耳機(jī)新品解密:黑色版“AirPods”
- Arm人工智能生態(tài)聯(lián)盟助力AI產(chǎn)業(yè)鏈發(fā)展
- realme真我X50 Pro 玩家版「光速銀」真機(jī)照曝光
- 成本影響市場 特斯拉超級電池未必是標(biāo)桿
- 研調(diào):紫光建DRAM廠, 制程開發(fā)為量產(chǎn)最大挑戰(zhàn)
- 貿(mào)易戰(zhàn)無影響!臺積電劉德音:南京廠產(chǎn)能相當(dāng)滿
- 仙知一站式移動機(jī)器人方案解決各種問題
- 太空機(jī)器人受到全球機(jī)器人業(yè)界的原因是什么
- 虎博科技發(fā)布金融信息機(jī)器人,有效提高信息獲取效率