找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 977|回复: 0
收起左侧

求助avr单片机模拟PS手柄接电脑并口可用实机ps2没反应

[复制链接]
ID:518034 发表于 2020-6-21 19:12 | 显示全部楼层 |阅读模式
#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());

}

}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表