ESP8266与PS2通信

ESP8266与PS2通信

Talk is cheap,show you code!

/**
 * 功能:PS2遥控,串口打印按键信息
 * 平台:ESP8266
 * 接线:
 *    ESP8266:    PS2:
 *    GPIO12  ->  DAT
 *    GPIO13  ->  CMD
 *    GPIO14  ->  CS
 *    GPIO15  ->  CLK
 * 作者:锋 2022-1-22-00:18
 */
 
#define DI_pin 12//D6 DAT
#define DO_pin 13//D7 CMD
#define CS_pin 14//D5
#define CLK_pin 15//D8

#define DO_H digitalWrite(DO_pin,HIGH)
#define DO_L digitalWrite(DO_pin,LOW)
#define CLK_H digitalWrite(CLK_pin,HIGH)
#define CLK_L digitalWrite(CLK_pin,LOW)
#define CS_H digitalWrite(CS_pin,HIGH)
#define CS_L digitalWrite(CS_pin,LOW)

typedef unsigned short u16;
typedef unsigned char u8;

u8 Data[9];
u8 SELECT,L3,R3,START,UP,RIGHT,DOWN,LEFT,L2,R2,L1,R1,TRIANGLE,CIRCLE,FORK,SQUARE;
u8 PS2_LX,PS2_LY,PS2_RX,PS2_RY;


void PS2_Cmd(u8 CMD) 
{
  volatile u16 ref=0x01; 
  Data[1]=0; 
  for(ref=0x01;ref<0x0100;ref<<=1) 
  {
    if(ref&CMD) 
    {
     DO_H; 
    }
    else 
    DO_L; 
    CLK_H; 
    delayMicroseconds(10); 
    CLK_L; 
    delayMicroseconds(10); 
    CLK_H; 
    if(digitalRead(DI_pin)) 
    {
      Data[1]=ref|Data[1];
    }
  }
  delayMicroseconds(16);
}

void PS2_ReadData(void) 
{
    volatile u8 byt=0; 
    volatile u16 ref=0x01; 
    CS_L; 
    PS2_Cmd(0x01);
    PS2_Cmd(0x42);
    for(byt=2;byt<9;byt++)
    {
        for(ref=0x01;ref<0x100;ref<<=1) 
        { 
            CLK_H; 
            delayMicroseconds(10); 
            CLK_L; 
            delayMicroseconds(10); 
            CLK_H; 
            if(digitalRead(DI_pin)) 
            {
              Data[byt] = ref|Data[byt];
            }
        }
        delayMicroseconds(16);
    }
    CS_H;
}

void PS2_ClearData() 
{
    u8 a; 
    for(a=0;a<9;a++) 
    {
        Data[a]=0x00;
    }
}

void PS2_ShortPoll(void) 
{
    CS_L; 
    delayMicroseconds(16);
    PS2_Cmd(0x01); 
    PS2_Cmd(0x42); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0x00); 
    PS2_Cmd(0x00); 
    CS_H; 
    delayMicroseconds(16);
}

void PS2_EnterConfing(void) 
{
    CS_L;
    delayMicroseconds(16);
    PS2_Cmd(0x01); 
    PS2_Cmd(0x43); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0x01); 
    PS2_Cmd(0x00); 
    PS2_Cmd(0X00);
    PS2_Cmd(0X00); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0X00); 
    CS_H; 
    delayMicroseconds(16);
}

void PS2_TurnOnAnalogMode(void) 
{
    CS_L; 
    PS2_Cmd(0x01); 
    PS2_Cmd(0x44); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0x01);
    PS2_Cmd(0xEE);
    PS2_Cmd(0X00); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0X00); 
    CS_H; 
    delayMicroseconds(16);
}

void PS2_VibrationMode(void) 
{
    CS_L; 
    delayMicroseconds(16); 
    PS2_Cmd(0x01); 
    PS2_Cmd(0x4D); 
    PS2_Cmd(0X00); 
    PS2_Cmd(0x00); 
    PS2_Cmd(0X01); 
    CS_H; 
    delayMicroseconds(16); 
}

void PS2_ExitConfing(void)
{
    CS_L;
    delayMicroseconds(16); 
    PS2_Cmd(0x01);
    PS2_Cmd(0x43); 
    PS2_Cmd(0X00);
    PS2_Cmd(0x00); 
    PS2_Cmd(0x5A); 
    PS2_Cmd(0x5A); 
    PS2_Cmd(0x5A);
    PS2_Cmd(0x5A); 
    PS2_Cmd(0x5A); 
    CS_H; 
    delayMicroseconds(16); 
}

void PS2_SetInit(void) 
{
    PS2_ShortPoll();
    PS2_ShortPoll();
    PS2_ShortPoll(); 
    PS2_EnterConfing();
    PS2_TurnOnAnalogMode();
    PS2_VibrationMode();
    PS2_ExitConfing();
}

void PS2(void)
{
    PS2_ClearData();
    PS2_ReadData();
    
    SELECT=!(0x80&Data[3]);
    L3=!(0x40&Data[3]);
    R3=!(0x20&Data[3]);
    START=!(0x10&Data[3]);
    UP=!(0x08&Data[3]);
    RIGHT=!(0x04&Data[3]);
    DOWN=!(0x02&Data[3]);
    LEFT=!(0x01&Data[3]);
    
    L2=!(0x80&Data[4]);
    R2=!(0x40&Data[4]);
    L1=!(0x20&Data[4]);
    R1=!(0x10&Data[4]);
    TRIANGLE=!(0x08&Data[4]);
    CIRCLE=!(0x04&Data[4]);
    FORK=!(0x02&Data[4]);
    SQUARE=!(0x01&Data[4]);
    
    PS2_RX=Data[5];
    PS2_RY=Data[6];
    PS2_LX=Data[7];
    PS2_LY=Data[8];
    
    delay(100);
}

void SerialPrintKey(void)
{
  Serial.printf("PS2_LX=%d,PS2_LY=%d,PS2_RX=%d,PS2_RY=%d\n",PS2_LX,PS2_LY,PS2_RX,PS2_RY);
  Serial.printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",SELECT,L3,R3,START,UP,RIGHT,DOWN,LEFT,L2,R2,L1,R1,TRIANGLE,CIRCLE,FORK,SQUARE);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(DI_pin,INPUT);
  pinMode(DO_pin,OUTPUT);
  pinMode(CS_pin,OUTPUT);
  pinMode(CLK_pin,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  PS2();
  SerialPrintKey();
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值