|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請(qǐng)教:請(qǐng)各位大哥幫我看看這個(gè) PS/2 程序!謝謝! |
| 作者:我好好學(xué)習(xí) 欄目:單片機(jī) |
/********************************************************************** 這是我自己做的一個(gè)鍵盤(相當(dāng)于標(biāo)準(zhǔn)的 PC 鍵盤,插在 PC 的 PS/2 口) 現(xiàn)在我的這個(gè)鍵盤還只有一個(gè)按鈕,我希望按下這個(gè)按鈕就相當(dāng)于在標(biāo)準(zhǔn)的 PC 鍵盤上按下 "w" ,這個(gè)按鈕接在 P3.3 上,當(dāng)按下這個(gè)按鈕,就 把 P3.3 拉低,外部中斷1 的下降沿觸發(fā)。 下面是 PS/2 協(xié)議: 我推薦下面的過程發(fā)送一個(gè)單一字節(jié)從仿真鍵盤/鼠標(biāo)到主機(jī) 1) 等待Clock = high 2) 延時(shí) 50 微秒 3) Clock s 仍舊為 high? No—到第1 步 4) Data = high? No—放棄 (并且從主機(jī)讀取字節(jié)) 5) 延遲 20 毫秒 (=40 微秒 to the time Clock is pulled low in sending the start bit.) 6) 輸出起始位 (0) \ 在發(fā)送所有這些位的每一位后 7) 輸出 8 個(gè)數(shù)據(jù)位 > 測(cè)試時(shí)鐘確認(rèn)主機(jī)是否把它拉低了 8) 輸出校驗(yàn)位 / 這說明主機(jī)要放棄這次傳送 9) 輸出停止位 (1) 10) 延遲30 毫秒 (=50 微秒 from the time Clock is released in sending the stop bit) ************************************************************************/ #include "reg52.h" #include "intrins.h" sbit P2_0 = P2^2; //數(shù)據(jù)線 sbit P2_5 = P2^5; //時(shí)鐘線 sbit P3_3 = P3^3; //外部中斷 static unsigned CHAR IntNum = 0; //中斷次數(shù)計(jì)數(shù) static unsigned CHAR KeyV; //鍵值 int Check_status( ); //檢查狀態(tài) void SendMessage( ); //向 PC 機(jī)的 PS/2 口發(fā)送數(shù)據(jù) void Send_Start_Bit( ); //發(fā)送起始位 void Send_Data_Bit( ); //發(fā)送數(shù)據(jù)位 void Send_Check_Bit( );//發(fā)送效驗(yàn)位 void Send_End_Bit( );//發(fā)送停止位 void Delay50us( ); //延時(shí) 50 微秒 void Delay20ms( ); //延時(shí) 20 毫秒 void Delay30ms( ); //延時(shí) 30 毫秒 void main() { P2_5 = 1; //把時(shí)鐘線置為高電平 P2_0 = 1; //把數(shù)據(jù)線置為高電平 IT1 = 1; //設(shè)外部中斷1為下降沿觸發(fā) EA = 1; //開中斷 EX1 = 1; //開中斷 while(1) { } } void Delay50us( ) //延時(shí) 50 微妙 { int i; for (i=0;i<50;i++) { _nop_(); } } void Delay20ms( ) //延時(shí) 20 毫秒 { int i,j; for (i=0;i<200;i++) { for (j=0;j<100;j++) { _nop_(); } } } void Delay30ms( ) //延時(shí) 30 毫秒 { int i,j; for (i=0;i<300;i++) { for (j=0;j<100;j++) { _nop_(); } } } void Send_Start_Bit( ) //發(fā)送起始位 { P2_0 = 0 ; //起始位的值 P2_5 = 0; //發(fā)送起始位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 1; //上拉 } void Send_Data_Bit( ) //發(fā)送數(shù)據(jù)位 { int i ;//循環(huán) 8 次 unsigned CHAR Strings = 0x44 ; //要發(fā)送的數(shù)據(jù) unsigned CHAR TEMP ;// 這個(gè)變量得到的是要發(fā)送的位 for (i=0;i<8;i++) { TEMP = Strings & 0x01; P2_0 = TEMP ; //發(fā)送位的值 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 0; //發(fā)送數(shù)據(jù)位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 1; //上拉 Strings = Strings >> 1; //右移一位 } } void Send_Check_Bit( )//發(fā)送效驗(yàn)位 { P2_0 = 1 ; //效驗(yàn)位的值 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 0; //發(fā)送效驗(yàn)位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 1; //上拉 } void Send_End_Bit( ) //發(fā)送停止位 { P2_0 = 1 ; //停止位的值 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 0; //發(fā)送停止位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); P2_5 = 1; //上拉 } void Keyboard_out(void) interrupt 2 //按下接在 P3.3 的按鈕 { int IsOrNoFlag = 1 ;//時(shí)鐘線此時(shí)是否為高的標(biāo)志 ,如果為高則把其置為 0 while(IsOrNoFlag) { if ( P2_5 == 1) //如果此時(shí)時(shí)鐘線為高 { IsOrNoFlag = 0; //時(shí)鐘線為高,則置標(biāo)志為 0 Delay50us( ); //延時(shí) 50 微妙 if ( P2_0 == 1 ) //如果此時(shí)數(shù)據(jù)線為高 & |
| 2樓: | >>參與討論 |
| 作者: 我好好學(xué)習(xí) 于 2006/3/11 10:40:00 發(fā)布:
re: 各位大大來幫幫我。 謝謝! |
|
| 3樓: | >>參與討論 |
| 作者: mxinfa 于 2006/3/11 11:07:00 發(fā)布:
在電腦上比較麻煩 PS/2鍵盤在電腦上使用的時(shí)候要發(fā)送復(fù)位測(cè)試等命令且正常響應(yīng)之后才能使用,你還是先用個(gè)單片機(jī)系統(tǒng)測(cè)試一下吧,真懷疑你的windows怎么能正常啟動(dòng)的,另外你上面的程序主程序應(yīng)該是死循環(huán)結(jié)構(gòu) main() { while(1); } |
|
| 4樓: | >>參與討論 |
| 作者: 我好好學(xué)習(xí) 于 2006/3/11 11:33:00 發(fā)布:
謝謝 mxinfa 大哥: mxinfa 大哥: 您說:“ps/2鍵盤在電腦上使用的時(shí)候要發(fā)送復(fù)位測(cè)試等命令且正常響應(yīng)之后才能使用” 這句話,我不是很理解: mxinfa 大哥,再詳細(xì)說說好嗎? 或者舉個(gè)例子,好嗎? 謝謝! |
|
| 5樓: | >>參與討論 |
| 作者: 我好好學(xué)習(xí) 于 2006/3/13 8:05:00 發(fā)布:
各位大哥再幫幫我! 我試了,還是不行 各位大哥再幫幫我啊! 謝謝! |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |