#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#define CHIP_SELECT_ACTIVE() (0 == (PINB & (1<<2)))
#define BAUD 9600
#define PSX_ACK_PORT PORTC
#define PSX_ACK_DDR DDRC
#define PSX_ACK_PIN PINC
#define PSX_ACK_BIT (1<<0)
#define ST_IDLE 0
#define ST_READY 1
#define ST_SEND_5A 2
#define ST_SEND_BUF0 3
#define ST_SEND_BUF1 4
#define ST_DONE 5
static unsigned char state = ST_IDLE;
static volatile unsigned char psxbuf[2];
void Init_Usart(void)
{
//设置波特率
UBRRH = (F_CPU / BAUD / 16 - 1) / 256;
UBRRL = (F_CPU / BAUD / 16 - 1) % 256;
//接收中断使能,接收使能,发送使能
UCSRB |= (1 << RXCIE) | (1 << RXEN) | (1 << TXEN);
}
void Send_Char(char data)
{
//查询方式发送
while(!(UCSRA & (1 << UDRE)));
UDR = data;
}
static void ack()
{
_delay_us(1);
// pull acknowledge
PSX_ACK_PORT &= ~PSX_ACK_BIT;
PSX_ACK_DDR |= PSX_ACK_BIT;
_delay_us(3);
// release acknowledge
PSX_ACK_DDR &= ~PSX_ACK_BIT;
}
unsigned char getkey(unsigned char date)
{
unsigned char num=0;
unsigned char tmp=0;
//while(PIND&(1<<3));
for(num=0;num<8;num++)
{
if(date&0x01) PORTB|=(1<<4);else PORTB&=~(1<<4);
date>>=1;
tmp>>=1;
//while((PIND&(1<<3))==0){
while(PINB&(1<<5));
if(PINB&(1<<3)) tmp|=0x80;//while((PIND&(1<<3))==0);}
while((PINB&(1<<5))==0);
}
return tmp;
}
int main(void)
{
/* PORT C
* Name Type
* 0: PSX ACT Emulated OC
* 1: NC OUT 0
* 2: NC OUT 0
* 3: nc
*
* 4: nc
* 5: nc
* 6: reset
*/
DDRC = 0xF6;
PORTC = 0x08;
/* PORT B
*
* Name Type
* 0, 1, 2: Attention Input (The 3 pins are shorted together)
* 3 : CMD (MOSI) from PSX Input
* 4 : DATA (MISO) to PSX Output 0
* 5 : PSX CLK (SCK) from PSX Input
* 6 : XTAL
* 7 : XTAL
*/
PORTB = 0;
DDRB = 0x10;
unsigned char t0,t1,t2,t3,t4,t5,t6,t7,t8;
Init_Usart();
PORTD=0XFF;
DDRD=0X00;
sei();
while(1){
while(!CHIP_SELECT_ACTIVE());
t0=getkey(0xff^0XFF);ack();
t1=getkey(0x41^0XFF);ack();
t2=getkey(0x5a^0XFF);ack();
if(t1==0x42){
t3=getkey(PIND^0XFF);ack();
t4=getkey(0XFF^0XFF);ack();
//t5=getkey(0x00);ack();
//t6=getkey(0x00);ack();
//t7=getkey(0x00);ack();
//t8=getkey(0x00);ack();
}
else if(t1==0x43){
t3=getkey(PIND^0XFF);ack();
t4=getkey(0XFF^0XFF);ack();
//t5=getkey(0x00);ack();
//t6=getkey(0x00);ack();
//t7=getkey(0x00);ack();
//t8=getkey(0x00);ack();
}
else if(t1==0x45){
t3=getkey(0x03^0XFF);ack();
t4=getkey(0X02^0XFF);ack();
//t5=getkey(0x01);ack();
//t6=getkey(0X02);ack();
//t7=getkey(0x01);ack();
//t8=getkey(0X00);ack();
}
Send_Char(t1);
while(CHIP_SELECT_ACTIVE());
}
}
|