欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1417|回復: 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());

}

}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表