Gränsyta för PS2 controller med AVR-bitars Bang (5 / 5 steg)
Steg 5: Explaning koden
Om du har förstått flödesschemat blir detta ganska lätt
Koden har endast 2 funktion
1) int gameByte (kort int kommando)
2) utan laga kraft int_PS2inanalougemode()
int gameByte (kort int kommando) för (jag = 0; jag < 8; i ++) / / som 8 byte överförs jag < 8 CBI (PORTB, PSclock); KLOCKAN LÅG om ((PINB & _BV(PSdata))) SBI (PORTB, PSclock); KLOCKAN HÖG SBI (PORTB, PScommand);
{
kort int i; variabel som används som counter
_delay_us(1);
Short int data = 0x00; Rensa data variabel om du vill spara inställningen låg bitar senare.
{
om (command & _BV(i)) //each bit av kommandot är ANDED med 1 en efter en, värdet av den cmnd är således om i skick
{
SBI (PORTB, PScommand); Om kommandot är ett kommando pin är inställd
}
annat
{
CBI (PORTB, PScommand); annars görs kommandot pin noll
}
_delay_us(1); vänta för utgång för att stabilisera
{
SBI(data, i); Läs PSdata pin och butik
}
annat
{
CBI(data, i);
}
}
_delay_us(20); vänta på ACK att passera.
Return(data);
}
void int_PS2inanalougemode()-
denna funktion sätter registeransvarige i analogt läge tills det returnerar värdet 0x73 i 2 byte som anger PS2 styrenheten är i analogt läge om det inte returnerar dess steg räknaren och fortsätter att sätta PS2 controller är i analogt läge
int main(void)
i huvudloop poll vi helt enkelt mata in av PS2 controller.
video
fullständiga koden är här