Вы находитесь на странице: 1из 2

//https://www.scribd.

com/doc/86204752/Decoding-PS2-Wired-and-Wireless-Controller-
for-Interfacing-With-PIC-Micro-Controller

/*-----------------------------------------------------------------------------
TITLE : Basic PS2 interfaceAUTHOR : C.K. KOKDATE : 22/5/2011DESCRIPTION : PS2 basic
interfacing routinesthe time delay for each sub-routines interval is matchingPS2
wireless
controller-------------------------------------------------------------------------
-----
*//*-----------------------------------------------------------------------------
BASIC
HEADER-----------------------------------------------------------------------------
-*/#include <16F877a.h>#use delay(clock=20000000)#fuses hs, noprotect, nowdt,
nolvp#byte PORTA=5#byte PORTB=6#byte PORTC=7#byte PORTD=8#byte
PORTE=9/*--------------------------------------------------------------------------
---PS2 CONTROLLER
INTERFACING------------------------------------------------------------------------
------*//*------------------------------
DECLARATIONS----------------------------------*/#bit PSX_DATA =PORTD.3 //DATA
connected to D3#bit PSX_CMND =PORTD.2 //CMND connected to D2#bit PSX_ATT
=PORTD.1 //ATT connected to D1#bit PSX_CLOCK =PORTD.0 //CLK connected to D0int
i,PSX_WRITE,PSX_READ,DATA4,DATA5,DATA6,DATA7,DATA8,DATA9;/*------------------------
-READ WRITE FOR EACH BIT----------------------------*/void ReadWrite()
{ for(i=0;i<8;i++){ PSX_CLOCK=0;if(bit_test(PSX_WRITE,i)){PSX_CMND=1;}else
PSX_CMND=0; delay_us(2);PSX_CLOCK=1;if(PSX_DATA==1) {bit_set(PSX_READ,i);}else
bit_clear(PSX_READ,i); delay_us(2);}delay_us(16);}/*-------------------------------
SHORT POLL-----------------------------------*/void ShortPoll()
{ PSX_ATT=0;delay_us(16);PSX_WRITE=0x01;ReadWrite();PSX_WRITE=0X42;ReadWrite();PSX_
WRITE=0X00;ReadWrite();PSX_WRITE=0X00;ReadWrite();PSX_WRITE=0X00;ReadWrite();PSX_AT
T=1;delay_us(16);}/*--------------------------CONFIG TO ANALOG
MODE-----------------------------*/void EnterConfig()
{ PSX_ATT=0;delay_us(16);PSX_WRITE=0X01;ReadWrite();PSX_WRITE=0X43;ReadWrite();PSX_
WRITE=0X00;ReadWrite();

PSX_WRITE=0X01;ReadWrite();PSX_WRITE=0X00;ReadWrite();PSX_ATT=1;delay_us(16);}void
TurnOnAnalogMode()
{ PSX_ATT=0;delay_us(16);PSX_WRITE=0X01;ReadWrite();PSX_WRITE=0X44;ReadWrite();PSX_
WRITE=0X00;ReadWrite();PSX_WRITE=0X01;ReadWrite();PSX_WRITE=0X03;ReadWrite();PSX_WR
ITE=0X00;ReadWrite();PSX_WRITE=0X00;ReadWrite();PSX_WRITE=0X00;ReadWrite();PSX_WRIT
E=0X00;ReadWrite();PSX_ATT=1;delay_us(16);}void Exitconfig()
{ PSX_ATT=0;delay_us(16);PSX_WRITE=0X01;ReadWrite();PSX_WRITE=0X43;ReadWrite();PSX_
WRITE=0X00;ReadWrite();PSX_WRITE=0X00;ReadWrite();PSX_WRITE=0X5A;ReadWrite();PSX_WR
ITE=0X5A;ReadWrite();PSX_WRITE=0X5A;ReadWrite();PSX_WRITE=0X5A;ReadWrite();PSX_WRIT
E=0X5A;ReadWrite();PSX_ATT=1;delay_us(16);}/*-----------------------------------
POLL-------------------------------------*/void Poll()
{ PSX_ATT=0;delay_us(16);PSX_WRITE=0X01; ReadWrite();PSX_WRITE=0x42;
ReadWrite();PSX_WRITE=0X00; ReadWrite();PSX_WRITE=0X00; ReadWrite();
DATA4=PSX_READ;PSX_WRITE=0X00; ReadWrite(); DATA5=PSX_READ;PSX_WRITE=0X00;
ReadWrite(); DATA6=PSX_READ;PSX_WRITE=0X00; ReadWrite();
DATA7=PSX_READ;PSX_WRITE=0X00; ReadWrite(); DATA8=PSX_READ;PSX_WRITE=0X00;
ReadWrite();
DATA9=PSX_READ;PSX_ATT=1;delay_ms(16);}/*--------------------------------
INITIALIZE----------------------------------*/void PS2_init(){ShortPoll();
ShortPoll(); ShortPoll();EnterConfig();TurnOnAnalogMode();Exitconfig();}

/*------------------------------------------------------------------------------
MAIN
FUNCTION---------------------------------------------------------------------------
---*/void main(){ set_tris_b(0); // set PortB all outputset_tris_d(0b00001000); //
set PortD all output except D3 PS2 data pin as input)PS2_init(); // establish
connection and configure PS2 controllerWHILE(1)
{ poll();/*----------------------------DATA4
KEYPAD1-----------------------------------*/if(!bit_test(DATA4,0)) {} else{}
//SELECTif(!bit_test(DATA4,1)) {} else{} //L3if(!bit_test(DATA4,2)) {} else{}
//R3if(!bit_test(DATA4,3)) {} else{} //STARTif(!bit_test(DATA4,4)) {} else{}
//UPif(!bit_test(DATA4,5)) {} else{} //RIGHTif(!bit_test(DATA4,6)) {} else{}
//DOWNif(!bit_test(DATA4,7)) {} else{} //LEFT/*----------------------------DATA5
KEYPAD2-----------------------------------*/if(!bit_test(DATA5,0)) {} else{}
//L2if(!bit_test(DATA5,1)) {} else{} //R2if(!bit_test(DATA5,2)) {} else{} //L1if(!
bit_test(DATA5,3)) {} else{} //R1if(!bit_test(DATA5,4)) {} else{} //TRIANGLEif(!
bit_test(DATA5,5)) {} else{} //Oif(!bit_test(DATA5,6)) {} else{} //Xif(!
bit_test(DATA5,7)) {} else{} //SQUARE/*--------DATA6 ANALOG RIGHT X AXIS
(RIGHT:0:LEFT = 0:128:255)-------------*//*--------DATA7 ANALOG RIGHT Y AXIS
(UP:0:DOWN = 0:128:255)----------------*//*--------DATA8 ANALOG LEFT X AXIS
(RIGHT:0:LEFT = 0:128:255)--------------*//*--------DATA9 ANALOG LEFT Y AXIS
(UP:0:DOWN = 0:128:255)---------------
*/}}/*-----------------------------------------------------------------------------
*/

Вам также может понравиться