音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(chǎng)網(wǎng)
技術(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ī)
請(qǐng)教:請(qǐng)各位大哥幫我看看這個(gè) PS/2 程序!謝謝!
/**********************************************************************
這是我自己做的一個(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í)
re:
各位大大來幫幫我。
謝謝!

3樓: >>參與討論
mxinfa
在電腦上比較麻煩
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í)
謝謝 mxinfa 大哥:
mxinfa 大哥:
您說:“ps/2鍵盤在電腦上使用的時(shí)候要發(fā)送復(fù)位測(cè)試等命令且正常響應(yīng)之后才能使用”

這句話,我不是很理解:

mxinfa 大哥,再詳細(xì)說說好嗎?
或者舉個(gè)例子,好嗎?

謝謝!



5樓: >>參與討論
我好好學(xué)習(xí)
各位大哥再幫幫我!
我試了,還是不行
各位大哥再幫幫我啊!

謝謝!


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
尋求ZLG-mcu 76x 系列的通用仿真器
我本是寫軟件的,請(qǐng)大家?guī)兔Π?/a>
哪位給解釋一下:仿真器和ISP下載線的區(qū)別
MSP430的工具,這里統(tǒng)統(tǒng)都有~~
求助93C46的編程
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)