PS2鍵盤與單片機通信_第1頁
PS2鍵盤與單片機通信_第2頁
PS2鍵盤與單片機通信_第3頁
PS2鍵盤與單片機通信_第4頁
PS2鍵盤與單片機通信_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、PS/2鍵盤與單片機通信1、 實驗目的:掌握PS/2鍵盤與單片機通信的原理,并能加以應用。2、 實驗儀器:單片機最小實驗系統(tǒng)AT89S52,PS/2鍵盤3、 實驗原理: PS2接口通信協(xié)議PS2接口鍵盤與主機采用雙向通信方式,鍵盤可以向主機發(fā)送數(shù)據(jù)主機也可以發(fā)送命令給鍵盤。主機具有最高優(yōu)先權。通信協(xié)議是標準的串行異步通信格式,1位起始位,8位數(shù)據(jù)位(LSB在先),1位奇校驗位P,1位停止位,若為主機發(fā)送狀態(tài),則還有一位應答位。數(shù)據(jù)格式如圖2所示。主機同鍵盤進行通信時,無論發(fā)送還是接收數(shù)據(jù),都要依賴于鍵盤發(fā)送的時鐘脈沖(每次數(shù)據(jù)傳輸發(fā)送l1個時鐘脈沖),時鐘頻率為10-167kHz,通過判斷時鐘

2、脈沖的上升沿和下降沿,逐位發(fā)送或讀取數(shù)據(jù)位。當數(shù)據(jù)線DATA和時鐘線CLK同時為高電平時,鍵盤可以發(fā)數(shù)據(jù)給主機。CLK可用作清除發(fā)送線。如果主機將CLK拉為低電平,則禁止鍵盤發(fā)送數(shù)據(jù),而是將發(fā)送數(shù)據(jù)放到發(fā)送緩存區(qū)中,直到CLK變?yōu)楦唠娖讲砰_始發(fā)送數(shù)據(jù)。如果主機將DATA拉低,則當鍵盤檢測到這一變化時,接收來自主機的命令。概括如表l所示。當鍵盤發(fā)送數(shù)據(jù)時,鍵盤先將DATA 拉低,通知主機準備接收數(shù)據(jù)。鍵盤在CLK為高電平時建立數(shù)據(jù),主機在CLK為低電平時讀取數(shù)據(jù)。發(fā)送數(shù)據(jù)的時鐘信號由鍵盤產生。時序如圖3所示。圖4給出了鍵盤接受一個字節(jié)的時序。為了避免在同一時刻發(fā)送數(shù)據(jù),應將CLK拉低大約100

3、uS以上, 以禁止鍵盤發(fā)送數(shù)據(jù)。然后主機將數(shù)據(jù)線DATA拉低,發(fā)送起始位,并釋放CLK(高電平),由鍵盤接管CLK,以產生時鐘信號。主機在此同步時鐘信號下發(fā)送數(shù)據(jù)。鍵盤接收數(shù)據(jù)是從檢測到DATA變低開始,然后在CLK為高電平時讀取數(shù)據(jù),這與鍵盤發(fā)送數(shù)據(jù)時的情形相反。當主機發(fā)送完校驗位后,釋放數(shù)據(jù)線DATA(停止位)。隨后,鍵盤將DATA置成低電平,作為收到數(shù)據(jù)的應答信號(ACK),并產生一個周期的時鐘脈沖。如果在第11個脈沖后,主機未釋放DATA,鍵盤將繼續(xù)發(fā)送時鐘信號到DATA空閑。4、 軟件編程與調試1、接口設計 PS/2鍵盤 單片機 Data T1(P35) CLk INT1(P33)

4、LCD液晶 單片機 Data Bus P0 RS P23 RW P25 E P272、 流程簡圖開 始 初 始 化開 中 斷BF = = 1 捕獲鍵值, 判斷后進 行相應操作 操作完畢,關中斷液晶顯示返 回3、 源程序#include#includelcd12864.c/包含128X64驅動程序#includesbit Key_Data =P35;/定義Keyboard數(shù)據(jù)端口引腳sbit Key_CLK=P33;/中斷端口,時鐘線static unsigned char KeyV=0X00; /鍵值static unsigned char BF = 0; /標識是否有字符被收到static

5、unsigned char IntNum = 0; /中斷次數(shù)計數(shù)bit dx=0; /大小寫標志 dx=1時大寫狀態(tài)/*/void Keyboard_out(void) interrupt 2/鍵盤中斷處理 鍵值存儲在 KeyV 中if (IntNum0) & (IntNum 1; /因鍵盤數(shù)據(jù)是低高,結合上一句所以右移一位if (Key_Data=1) /當鍵盤數(shù)據(jù)線為1時(執(zhí)行if語句里面的代碼),當鍵盤數(shù)據(jù)線為0時(不執(zhí)行if語句里面的代碼),直接執(zhí)行KeyV1KeyV = KeyV | 0x80; /當鍵盤數(shù)據(jù)線為1時,存儲一位高電平1IntNum+; /中斷次數(shù)加一(中斷一次接收一

6、位數(shù)據(jù))if (IntNum 10) /中斷11次后數(shù)據(jù)發(fā)送完畢 IntNum = 0; /當中斷11次后表示一幀數(shù)據(jù)收完,清變量準備下一次接收BF = 1; /標識有字符輸入完了EA = 0; /關中斷等顯示完后再開中void Decode() /鍵值處理 unsigned char TempCyc; signed char k; TempCyc=KeyV; if(BF=1)/接收完一個有效數(shù)據(jù)時 BF=0; /準備下一次接收 switch ( TempCyc ) /鍵值與顯示字符的對應關系 /鍵值/ /對應字符/case 0x8A: k=0; break; /0case 0x2C: k=1

7、; break; /1case 0x3C: k=2; break; /2case 0x4C: k=3; break; /3case 0x4A: k=4; break; /4case 0x5C: k=5; break; /5case 0x6C: k=6; break; /6case 0x7A: k=7; break; /7case 0x7C: k=8; break; /8case 0x8C: k=9; break; /9 case 0x38: k=17; break; /acase 0x64: k=18; break; /bcase 0x42: k=19; break; /ccase 0x46:

8、 k=20; break; /dcase 0x48: k=21; break; /ecase 0x56: k=22; break; /fcase 0x68: k=23; break; /gcase 0x66: k=24; break; /hcase 0x86: k=25; break; /icase 0x76: k=26; break; /jcase 0x84: k=27; break; /kcase 0x96: k=28; break; /lcase 0x74: k=29; break; /mcase 0x62: k=30; break; /ncase 0x88: k=31; break;

9、/ocase 0x9A: k=32; break; /p case 0x2A: k=33; break; /qcase 0x5A: k=34; break; /rcase 0x36: k=35; break; /scase 0x58: k=36; break; /tcase 0x78: k=37; break; /ucase 0x54: k=38; break; /vcase 0x3A: k=39; break; /wcase 0x44: k=40; break; /xcase 0x6A: k=41; break; /ycase 0x34: k=42; break; /zcase 0x98:

10、k=10; break; /;case 0xAA: k=-5; break; /+case 0xF2: k=43; break; /+ case 0x52: k=-16;break; /空格鍵case 0xB0: k=101;break; /大小寫控制鍵Caps lock if(k=101) dx=!dx;/按下大小寫控制鍵時 大小寫標志取反 if(k=-16) /空格鍵按下時 write_data(-16+0); if(dx=1) /大寫標志 if(k=0&k=3&k16 & k=0 & k=9) write_data(k+0); if(k=10)write_data(k+1)+0);if(

11、k=-5)write_data(k+18)+0); EA=1; / write_data(0x01);void delay(int x) /延時程序int i,j;for(i=0;i600;i+)for(j=0;jx;j+); void main() lcd_init(); /初始化液晶驅動硬件 /wlcome() ;/調用開機畫面和歡迎界面子程序 IT1 = 1; /設外部中斷1為下降沿觸發(fā)EA = 1; /開總中斷EX1=1; /開中斷 1while(1) Decode();delay(10);4、 程序調試與結果測試軟件:KeilC51 Uvision3結果:按下PS/2鍵盤0-9、A-

12、Z鍵都會在液晶上顯示相應的鍵,如 果按下CapsLock鍵再按0-9,A-Z, 則顯示相應按鍵的上標,或是大小寫切換。5、 問題與討論 1、PS/2協(xié)議是什么? 2、PS/2與單片機通信的原理如何? 附錄1:lcd12864.c #include#include LCD12864.h#include #ifndef UCHAR #define uchar unsigned char#ifndef UINT #define uint unsigned int/*初始化*/void lcd_init() writeCmd(0x30); delayMs(10); writeCmd(0x0c); de

13、layMs(10); writeCmd(0x01); delayMs(10);void delayUs() /延時約2us _nop_();_nop_();void delayMs(uint a) /延時 a * 1ms uint i, j; for(i = a; i 0; i-) for(j = 100; j 0; j-);bit checkBusy() /檢測LCD是否處于忙狀態(tài), 若忙返回1, 空閑返回0 bit busy; RS = 0; /請參考數(shù)據(jù)共享中的手冊 RW = 1; E = 1; delayUs(); busy = (bit)(LCD_DATA&0x80); E = 0;

14、 return busy;void wait() /等待LCD到空閑 while(checkBusy();void writeCmd(uchar cmd)/寫命令 wait(); RS = 0; RW = 0; E = 0; delayUs(); LCD_DATA = cmd; delayUs(); E = 1; delayUs(); E = 0;void writeData(uchar dat) /寫數(shù)據(jù) wait(); RS = 1; RW = 0; E = 0; delayUs(); LCD_DATA = dat; delayUs(); E = 1; delayUs(); E = 0;void write_data(unsigned char lcddata) writeCmd(0x80); writeData(lcddata);附錄2:lcd12864.h #ifndef _LCD12864_H_#define _LCD12864_H_#ifndef UCHAR #define uchar unsigned char#ifndef UINT #define uint unsigned int#define LCD_DATA P0s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論