新手上路
- 积分
- 22
- 金钱
- 22
- 注册时间
- 2018-7-26
- 在线时间
- 2 小时
|
个人认为F1例程中 实验29 游戏手柄实验 逻辑有问题,请原子哥看看是不是真的有问题
原代码如下:(STM32F1开发指南-库函数版本_V3.1 PDF文档里说是"按下是0,松开是1",看了主函数的处理程序应该是照着"按下是1,松开是0"处理的)
//读取手柄按键值.
//FC手柄数据输出格式:
//每给一个脉冲,输出一位数据,输出顺序:
//A->B->SELECT->START->UP->DOWN->LEFT->RIGHT.
//总共8位,对于有C按钮的手柄,按下C其实就等于A+B同时按下.
//按下是1,松开是0.
//返回值:
//[7]:右
//[6]:左
//[5]:下
//[4]:上
//[3]:Start
//[2]:Select
//[1]:B
//[0]:A
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;
}
仔细分析这段函数你会发现传过来的数据和这个函数的返回值temp是反的,例如数据如果是0000 0001,temp却为1111 1110,这个temp到了主函数处理就全乱套了,LCD屏会闪现除了A(其实是不显示B值,存放字符串的数组顺序也错了,这里我就假设该数组是正确的好说明情况)的键值,这表示系统认为自己收到了右、左、下、上、Start、Select、B,这显然和我们只是输入了键值A相悖,我将上述
if(JOYPAD_DAT==0)temp|=0x80;
改为if(JOYPAD_DAT==1)temp|=0x80;重新进行试验发现除了A键和B键值反了其他六个键值均显示正常,仿真运行之后发现接收和解析是没问题的,最后看到字符串数组:
const u8*JOYPAD_SYMBOL_TBL[8]=
{"Right","Left","Down","Up","Start","Select","A","B"};//手柄按键符号定义
显然A、B键值顺序错误了,将数组改成
const u8*JOYPAD_SYMBOL_TBL[8]=
{"Right","Left","Down","Up","Start","Select","B","A"};
再次重新试验,8个键值均显示正常。
所以个人认为 实验29 游戏手柄实验 存在着两个地方的小错误,如果有理解不周到的地方请大家指正。
|
-
|