关于游戏手柄的一些理解。。

2019-07-20 05:17发布

游戏手柄的读取时序应该是 :A->B->SELECT->START->UP->DOWN->LEFT->RIGHT
而不是像时序图的那样。。

$Q[D5CC@INCEYNF9%%1.png
这里 select 和START 顺序调换一下。。

u8 JOYPAD_Read(void)
{
        vu8 temp=0;
        u8 t;
        JOYPAD_LAT=1;        //锁存当前状态
        JOYPAD_Delay(80);
        JOYPAD_LAT=0;
        for(t=0;t<8;t++)
        {
                temp>>=1;         
                if(JOYPAD_DAT==0)temp|=0x80;//LOAD之后,就得到第一个数据
                JOYPAD_CLK=1;                                   //每给一次脉冲,收到一个数据
                JOYPAD_Delay(80);
                JOYPAD_CLK=0;       
                JOYPAD_Delay(80);
        }
        return temp;
}


讲解下这个程序:
      当你按下 A键时,进入for循环JOYPAD_LAT 已经产生了一个下降沿,在t=0时,JOYPAD_DAT==0表示按键按下,此时检测到A按键按下。temp = 1000 0000
      跳出循环时, temp的值为  0000 0001 ,所以A按键的值为 1,也符合 首先读取A按键的时序图。
     当你按下 SELECT 按键时,经过三次循环,JOYPAD_DAT才检测到 这个按键按下   temp = 1000 0000
    在继续循环5次,跳出循环,此时  temp = 0000 0100 所以SELECT 的值为 4。  其他的值依次类推。。
   
  我们在主程序中定义一个 指针数组  
const u8*JOYPAD_SYMBOL_TBL[8]=
{"A","B","Select","Start","Up","Down","Left","Right"};//手柄按键符号定义



然后在改动下 main 程序的for循环
                        for(i=0;i<8;i++)
                        {
                                if(key&(0X01<<i))   //  在这个地方改动了。。
                                {
                                        LCD_Fill(30+56,150,30+56+48,150+16,WHITE);//清除之前的显示
                                        LCD_ShowString(30+56,150,200,16,16,(u8*)JOYPAD_SYMBOL_TBL);//显示符号
                                }               
                        }               


经战舰版上测试 没有问题。以上个人理解,有错误还往大佬指出。。
0条回答

一周热门 更多>