久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3360|回復: 5
打印 上一主題 下一主題
收起左側

相求大神幫寫個STC89C52解碼PS2手柄的程序,可以購買哦

[復制鏈接]
跳轉到指定樓層
樓主
ID:171308 發表于 2018-1-30 11:56 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如題,急需
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:190832 發表于 2018-1-30 13:56 | 只看該作者
PS2接口協議
  USB型PS2接口,5腳的稱為AT鍵盤,6腳mini_din連接器稱為PS2鍵盤;
都只有4個腳有意義,ACC,GND,CLK,DAT;CLK和DAT接上拉電阻,平時高;
  CLK 15Khz,傳輸12位數據(起始位,8位數據,奇偶校驗位,停止位,應答位),數據位1的個數為偶數個校驗位為0,否則為1;
  PS/2通訊協議是一種雙向同步串行通訊協議.通訊的兩端通過CLK同步,并通過DAT交換數據.任何一方如果想抑制另外一方通訊時,只需要把CLK拉到低電平.如果是PC機和PS/2鍵盤間的通訊,則PC機必須做主機,PC機可以抑制PS/2鍵盤發送數據,而PS/2鍵盤則不會抑制PC機發送數據.
  PS/2設備的CLK和DAT數據腳 都是集電極開路的,平時都是高電平.當PS/2設備等待發送數據時,它首先檢查CLK以確認其是否為高電平.如果是低電平,則認為是PC機抑制了通訊,此時它必須緩沖需要發送的數據直到重新獲得總線的控制權(一般PS/2鍵盤有16個字節的緩沖區,而PS/2鼠標只有一個緩沖區僅存儲最后一個要發送的數據).如果CLK為高電平,PS/2設備便開始將數據發送到PC機.一般都是由PS/2設備產生時鐘信號.發送時一般都是按照數據幀格式順序發送.其中數據位在CLK為高電平時準備好,在CLK的下降沿被PC機讀入.
  當時鐘頻率為15kHz時,從CLK的上升沿到數據位轉變時間至少要5μs.數據變化到CLK下降沿的時間至少也有5 us,但不能大于25 us,這是由PS/2通訊協議的時序規定的.如果時鐘頻率是其它值,參數的內容應稍作調整.
  上述討論中傳輸的數據是指對特定鍵盤的編碼或者對特定命令的編碼.一般采用第二套掃描碼集所規定的碼值來編碼.其中鍵盤碼分為通碼(Make)和斷碼(Break).通碼是按鍵接通時所發送的編碼,用兩位十六進制數來表示,斷碼通常是按鍵斷開時所發送的編碼,用四位十六進制數來表示.
  PS/2向PC機發送一個字節
  (1)檢測時鐘線電平,如果時鐘線為低,則延時50us;
  (2)檢測判斷時鐘信號是否為高,為高,則向下執行,為低,則轉到(1);
  (3)檢測數據線是否為高,如果為高則繼續執行,如果為低,則放棄發送(此時PC機在向PS/2設備發送數據,所以PS/2設備要轉移到接收程序處接收數據);
  (4)延時20us(如果此時正在發送起始位,則應延時40us);
  (5)輸出起始位0到數據線上.這里要注意的是:在送出每一位后都要檢測時鐘線,以確保PC機沒有抑制PS/2設備,如果有則中止發送;
  (6)輸出8個數據位到數據線上;
  (7)輸出校驗位;
  (8)輸出停止位(1);
  (9)延時30us(如果在發送停止位時釋放時鐘信號則應延時50us);
  發送單個位
  (1)準備數據位(將需要發送的數據位放到數據線上);
  (2)延時20us;
  (3)把時鐘線拉低;
  (4)延時40us;
  (5)釋放時鐘線;
  (6)延時20us.
  PS/2設備從PC機接收一個字節
  由于PS/2設備能提供串行同步時鐘,因此,如果PC機發送數據,則PC機要先把時鐘線和數據線置為請求發送的狀態.PC機通過下拉時鐘線大于100μs來抑制通訊,并且通過下拉數據線發出請求發送數據的信號,然后釋放時鐘.當PS/2設備檢測到需要接收的數據時,它會產生時鐘信號并記錄下面8個數據位和一個停止位.主機此時在時鐘線變為低時準備數據到數據線,并在時鐘上升沿鎖存數據.而PS/2設備則要配合PC機才能讀到準確的數據.具體連接  步驟如下:
  (1)等待時鐘線為高電平.
  (2)判斷數據線是否為低,為高則錯誤退出,否則繼續執行.
  (3)讀地址線上的數據內容,共8個bit,每讀完一個位,都應檢測時鐘線是否被PC機拉低,如果被拉低則要中止接收.
  (4)讀地址線上的校驗位內容,1個bit.
  (5)讀停止位.
  (6)如果數據線上為0(即還是低電平),PS/2設備繼續產生時鐘,直到接收到1且產生出錯信號為止(因為停止位是1,如果PS/2設備沒有讀到停止位,則表明此次傳輸出錯).
  (7)輸出應答位.
  (8)檢測奇偶校驗位,如果校驗失敗,則產生錯誤信號以表明此次傳輸出現錯誤.
  (9)延時45 μs,以便PC機進行下一次傳輸.
  讀數據線的步驟如下
  (1)延時20μs;
  (2)把時鐘線拉低
  (3)延時40μs
  (4)釋放時鐘線
  (5)延時20μs
  (6)讀數據線.
  發出應答位
  (1)延時15μs;
  (2)把數據線拉低;
  (3)延時5μs;
  (4)把時鐘線拉低;
  (5)延時40μs;
  (6)釋放時鐘線;
  (7)延時5μs;
  (8)釋放數據線.
實例:接收解碼數碼管顯示
#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit CLK=P3^2;sbit SDA=P1^6;
sbit DA=P2^2;sbit DB=P2^3;sbit DC=P2^4;
uint dat;
bit flag;
uchar code table[]={
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
void delay(uchar ms)
{
        uchar i,j;
        for(i=ms;i>0;i--)
          for(j=110;j>0;j--);
}
void rupt0() interrupt 0
{
        uchar i;
        while(!CLK)
        {
                _nop_();
        }
        if(CLK==0)
        {
                dat=((dat>>1)&((uint)SDA<<8));
                i++;
    }
        if(i==9)
        {
                i=0;
                EX0=0;
                flag=1;
    }               
}
void jiema()
{
        uchar a,j;
        switch(dat)
        {
                case 0x13f:a=0x3f;break;
                case 0x106:a=0x06;break;
                case 0x15b:a=0x5b;break;
                case 0x14f:a=0x4f;break;
                case 0x166:a=0x66;break;
                case 0x16d:a=0x6d;break;
    }
        P0=table[a];
        j=50;while(j--);
        P0=0x00;
}
void main()
{
        EA=1;EX0=1;IT0=1;
        while(1)
        {
                uchar i;
                if(flag==1)
                {
                        if(i<=100)
                        {
                jiema();
                                delay(1);
                            i++;
                        }
                        else
                        {               
                                i=0;
                                EX0=1;
                                flag=0;
            }
                }
    }
}
回復

使用道具 舉報

板凳
ID:88606 發表于 2018-1-30 14:57 | 只看該作者
幫助在二樓!
回復

使用道具 舉報

地板
ID:258566 發表于 2018-1-30 15:17 | 只看該作者


  1. 是一個avr的解碼程序,修改頭文件和硬件連接。
復制代碼
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int


  //DO數據
uchar scan[9]={0x01,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  //存放DI數據
uchar re_code[9];                                             
uint m;

//共陰數碼管段碼
uchar ddd[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
//位碼
uchar www[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};                                                                                

void port_init(void)
{
  DDRE=0xff;
  PORTE=0x00;  //段選

  DDRB=0xff;
  PORTB=0xff;  //位選        
        
  //PD0->DAT輸入;PD1->CMD輸出;PD2->CS輸出;PD3->CLK輸出
  DDRD  =(0<<PD0)|(1<<PD1)|(1<<PD2)|(1<<PD3) ;
  PORTD =0;
}

void delay(uint n)
{
        uint i;
        for(i=0;i<n;i++);
}

uchar scanout(uchar command)   //向手柄發送命令并接受反饋的子程序
{
    uchar i,j=1;
    uchar res=0;
    for(i=0;i<8;i++)     //逐位接收     
    {
          if(command&0x01)      cmd_set;
          else                            cmd_clr;
          command=command>>1;
          delay(1);
          clk_clr;
          delay(1);                              //這里延時很關鍵,太多了手柄就反應遲鈍了
          if(PIND&0x01) res=res+j;      //這里就開始同步接收DI值了
          j=j<<1;
          clk_set;
          delay(2);                 
    }
    return res;        
}
void Read_PS2(void)        //向手柄發送DO并將反饋DI存入re_code[ ]中
{
         uchar i;
         cs_clr;
         for(i=0;i<9;i++)        re_code=scanout(scan);
         cs_set;        
}                                             
void main(void)
{
        port_init();
        delay(50);
  while(1)
         {
         Read_PS2();
         delay(200);
         
         m=re_code[3]*256+re_code[4];
                 
         PORTE=ddd[m/256/16];
         PORTB=www[3];
         delay(50);
         PORTE=ddd[m/256%16];
         PORTB=www[2];
         delay(50);
         PORTE=ddd[m%256/16];
         PORTB=www[1];
         delay(50);
         PORTE=ddd[m%256%16];
         PORTB=www[0];
         delay(50);
                 
         PORTE=ddd[out[7]/16];
         PORTB=www[7];
         delay(50);
         PORTE=ddd[out[7]%16];
         PORTB=www[6];
         delay(50);
         PORTE=ddd[out[8]/16];
         PORTB=www[5];
         delay(50);
         PORTE=ddd[out[8]%16];
         PORTB=www[4];
         delay(50);        
        }
}
回復

使用道具 舉報

5#
ID:171308 發表于 2018-1-31 11:41 | 只看該作者
hange_v 發表于 2018-1-30 13:56
PS2接口協議
  USB型PS2接口,5腳的稱為AT鍵盤,6腳mini_din連接器稱為PS2鍵盤;
都只有4個腳有意義,ACC,GND ...

感謝感謝
回復

使用道具 舉報

6#
ID:171308 發表于 2018-1-31 11:41 | 只看該作者
cccc888 發表于 2018-1-30 15:17
#include  
#include
#define uchar unsigned char

謝謝你的幫助
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乡下妇女做爰 | 精品久久久久久久人人人人传媒 | 精品国产91亚洲一区二区三区www | 久久久久久成人 | 美女131mm久久爽爽免费 | a国产视频 | 操久久| 91看国产 | 亚洲成人在线视频播放 | www.亚洲视频.com| 中文字幕乱码一区二区三区 | 影音先锋中文字幕在线观看 | 91精品国产综合久久福利软件 | 亚洲不卡在线观看 | 福利久久| 成人在线中文字幕 | 亚洲精品一区二区三区四区高清 | 三级av在线| 欧美aⅴ | 久久国产精品首页 | 成人久久久 | www.youjizz.com日韩 | 久久精品国产一区二区三区 | 亚洲v日韩v综合v精品v | 高清人人天天夜夜曰狠狠狠狠 | 一区二区欧美在线 | 91精品久久久久久久 | 国产一区二区三区亚洲 | 在线免费观看成人 | 欧美一级视频免费看 | 欧美亚洲视频 | 亚洲国产视频一区二区 | 韩日在线视频 | 在线视频 亚洲 | 国产福利一区二区 | 亚洲成人毛片 | 亚洲97| 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 久久成人国产精品 | 美女视频一区二区三区 | av片在线观看 |