OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5941|回复: 4

个人认为F1例程中实验29 游戏手柄实验逻辑有问题,请原子哥看看是不是真的有问题

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-7-26
在线时间
2 小时
发表于 2018-7-26 10:07:10 | 显示全部楼层 |阅读模式
个人认为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 游戏手柄实验 存在着两个地方的小错误,如果有理解不周到的地方请大家指正。

1.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-7-26
在线时间
2 小时
 楼主| 发表于 2018-7-26 14:06:49 | 显示全部楼层
我手头是没有游戏手柄的,我只是创建一个数组来模拟游戏手柄的输入,我是认为按下为1,松开为0;例如如果我按下了A键,传送的数据就应该是0000 0001,如果按下B键,则为0000 0010
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2018-12-6
在线时间
18 小时
发表于 2019-3-6 10:04:47 | 显示全部楼层
时序图 Latch 第一个脉冲对应的才是A吧
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-4-7
在线时间
6 小时
发表于 2019-11-30 19:50:02 | 显示全部楼层
"按下是0,松开是1"的意思是:按下时JOYPAD_DAT这个IO口检测到的电平是低电平,松开时则检测到高电平。
而在程序中,键值temp是按照哪个按键被按下,temp的哪个位就置一的原则,没有问题。有反应的置一,无反应的清零,这是程序的设计规范。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2022-8-14
在线时间
1 小时
发表于 2022-8-14 10:37:24 来自手机 | 显示全部楼层
源码中写的注释有点问题,pdf是正确的,应该是按下是0,松开是1
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 07:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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