游戏手柄的读取时序应该是 :A->B->SELECT->START->UP->DOWN->LEFT->RIGHT
而不是像时序图的那样。。
这里 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
);//显示符号
}
}
经战舰版上测试 没有问题。以上个人理解,有错误还往大佬指出。。
一周热门 更多>