OpenEdv-开源电子网

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

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第三十三章 游戏手柄实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-21 22:13:29 | 显示全部楼层 |阅读模式

第三十三章  游戏手柄实验

相信80后小时候都有玩过FC游戏机(又称:红白机/小霸王游戏机),那是一代经典,给我们的童年带了了无限乐趣。本章,我们将向大家介绍如何通过STM32来驱动FC游戏机手柄,将FC游戏机的手柄作为战舰STM32开发板的输入设备(综合实验可以直接通过这个手柄来玩FC游戏)。

在本章中,我们将使用STM32驱动FC手柄,将手柄的按键键值等信息通过TFTLCD模块显示出来。本章分为如下几个部分:

33.1 游戏手柄简介

33.2 硬件设计

33.3 软件设计

33.4 下载验证
33.1游戏手柄简介

FC游戏机曾今是一统天下(现在也还是很多人玩),红极一时,那时任天堂单是FC机的主机的发售收入就超过全美国的电视台的收入的总和。本章,我们将使用STM32来驱动FC手柄,实现手柄控制信号的读取,我们先来了解一下FC手柄。

       FC手柄,大致可分为两种:一种手柄插口是11针的,一种是9针的。但11针的现在市面上很少了(因为11针手柄是早期FC组装兼容机最主要的周边),现在几乎都是9FC组装手柄的天下,所以我们本章使用的是9FC手柄,该手柄还有一个特点,就是可以直接和DR9的串口头对插!这样同开发板的连接就简单了。FC手柄的外观如图33.1.1所示:


33.1.1 FC手柄外观图

       这种手柄一般有10个按键(实际是8个键值):上、下、左、右、StartSelectABA连发、B连发。这里的AA连发是一个键值,而BB连发也是一个键值,只是连发按键当你一直按下的时候,会不停的发送(方便快速按键,比如发炮弹之类的功能)。

FC手柄的控制电路,由18位并入串出的移位寄存器(CD4021),外加一个时基集成电路(NE555,用于连发)构成。不过现在的手柄,为了节约成本,直接就在PCB上做绑定了,所以你拆开手柄,一般是看不到里面有四四方方的IC,而只有一个黑色的小点,所有电路都集成到这个里面了,但是他们的控制和读取方法还是一样的。

9针手柄的读取时序和接线图如33.1.2所示:


33.1.2 FC手柄读取时序和接线图

       从上图可看出,读取手柄按键值的信息十分简单:先Latch(锁存键值),然后就得到了第一个按键值(A),之后在Clock的作用下,依次读取其他按键的键值,总共8个按键键值。

       有了以上了解,我们就可以通过STM32IO来驱动FC手柄了。

33.2 硬件设计

本实验采用STM323个普通IO连接FC手柄的ClockDataLatch信号,本章实验功能简介:在主函数不停的查询手柄输入,一旦检测到输入信号,则在LCD模块上面显示键值和对应的按键符号。同样我们也是用LED0来指示程序正在运行。

所要用到的硬件资源如下:

1)  指示灯DS0

2) TFTLCD模块

3)  FC手柄

前两个,在之前的实例已经介绍过了,FC手柄属于外部器件。战舰STM32开发板板载了一个FC手柄接口(就是一个DR9接头,在开发板上标号为JOY_PAD),该接口与MCU的连接原理图如33.2.1所示:

 33.2.1 FC手柄接头与STM32的连接电路图

图中,JOY_PAD就是用来连接FC手柄的,该接头采用标准的DR9座,战舰STM32开发板上有2DR9座,一个用来接FC手柄(有JOY_PAD字样,LCD左上),另外一个用来接RS232串口(有COM字样,LCD右上),这两个头千万不要接错!否则可能烧坏手柄或者烧坏STM32

从上图我们知道,手柄的CLKClock)、LATLatch)和DATData)分别连接在STM32PC12PC8PC9上面,这里与SDIO部分信号线共用了,所以当使用SDIO的时候,就不能使用FC手柄了。因为信号线都是直连的,所以我们在开发板上不需要做配置,只需要将FC手柄插入JOY_PAD插口即可。

开发板配套的手柄,见图33.1.1


33.3 软件设计

打开上一章的工程,首先在HARDWARE文件夹下新建一个REMOTE的文件夹。然后新建一个joypad.cjoypad.h的文件保存在JOYPAD文件夹下,并将这个文件夹加入头文件包含路径。

打开joypad.c文件,输入如下代码:

#include "joypad.h"

//初始化手柄接口.

void JOYPAD_Init(void)

{

      RCC->APB2ENR|=1<<4;//先使能外设PORTC时钟     

       GPIOC->CRH&=0XFFF0FF00;

       GPIOC->CRH|=0X00030083;    

       GPIOC->ODR|=3<<8;

       GPIOC->ODR|=1<<12;

}

//读取手柄按键值.

//FC手柄数据输出格式:

//每给一个脉冲,输出一位数据,输出顺序:

//A->B->SELECT->START->UP->DOWN->LEFT->RIGHT.

//总共8,对于有C按钮的手柄,按下C其实就等于A+B同时按下.

//按下是0,松开是1.

//返回值:

//[0]:

//[1]:

//[2]:

//[3]:

//[4]:Start

//[5]:Select

//[6]:B

//[7]:A

u8 JOYPAD_Read(void)

{

       u8 temp=0;

       u8 t;

       JOYPAD_LAT=1;                              //锁存当前状态

      JOYPAD_LAT=0;

       for(t=0;t<8;t++)

       {

              temp<<=1;    

              if(JOYPAD_DAT)temp|=0x01;     //LOAD之后,就得到第一个数据

              JOYPAD_CLK=1;                     //每给一次脉冲,收到一个数据

             JOYPAD_CLK=0; 

       }

       return temp;

}

该部分代码仅2个函数,都比较简单,JOYPAD_Init函数用于初始化IO,即把PC8PC9PC12设置为正确的状态,以便同FC手柄通信。另外一个函数JOYPAD_Read就是按照图33.1.2所示的时序读取FC手柄,该函数的返回值就是手柄的状态。

保存joypad.c,然后把该文件加入HARDWARE组下。接下来打开joypad.h在该文件里面加入如下代码:

#ifndef __JOYPAD_H

#define __JOYPAD_H  

#include "sys.h"

//手柄连接引脚

#define JOYPAD_CLK PCout(12)      //时钟            PC9

#define JOYPAD_LAT PCout(8)        //锁存        PC8

#define JOYPAD_DAT PCin(9)         //数据        PC12   

void JOYPAD_Init(void);                   //初始化 

u8 JOYPAD_Read(void);                    //读取键值                                   

#endif

这部分代码就不介绍了,我们保存joypad.h,然后在test.c里面修改主函数如下:

const u8*JOYPAD_SYMBOL_TBL[8]=

{"Right","Left","Down","Up","Start","Select","A","B"};//手柄按键符号定义

int main(void)

{           

       u8 key;

       u8 t=0,i=0;           

      Stm32_Clock_Init(9);    //系统时钟设置

       uart_init(72,9600);      //串口初始化为9600

       delay_init(72);                  //延时初始化

       LED_Init();                //初始化与LED连接的硬件接口

       LCD_Init();                  //初始化LCD

       usmart_dev.init(72);      //初始化USMART       

       JOYPAD_Init();            //手柄初始化

      POINT_COLOR=RED;//设置字体为红色

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"JOYPAD TEST");     

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/12");

     LCD_ShowString(60,130,200,16,16,"KEYVAL:");          

   LCD_ShowString(60,150,200,16,16,"SYMBOL:");         

      POINT_COLOR=BLUE;//设置字体为红色

       while(1)

       {

              key=JOYPAD_Read();

              if(key!=0XFF)

              {

                     LCD_ShowNum(116,130,key,3,16);//显示键值

                     for(i=0;i<8;i++)

                     {

                            if((key&(1<<i))==0)

                            {

                                   LCD_Fill(60+56,150,60+56+48,150+16,WHITE);//清除之前的显示

                                   LCD_ShowString(60+56,150,200,16,16,(u8*)

JOYPAD_SYMBOL_TBL); //显示符号

                            }           

                     }               

              }

             delay_ms(10);

              t++;

              if(t==20)

              {

                     t=0;

                     LED0=!LED0;

              }

       }

}

此部分代码也比较简单,初始化JOYPAD之后,就一直扫描FC手柄(通过JOYPAD_Read函数实现),然后只要接收到手柄的有效信号,就在LCD模块上面显示出来。

至此,我们的软件设计部分就结束了。

33.4下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图33.4.1所示的内容:

33.4.1程序运行效果图

此时我们按下FC手柄的按键,则可以看到LCD上显示了对应按键的键值以及对应的符号。如图33.4.2所示:

33.4.2解码游戏手柄数据成功

 

实验28 游戏手柄实验.rar

142.88 KB, 下载次数: 1052

《STM32开发指南》第三十三章 FC游戏手柄实验.rar

580.23 KB, 下载次数: 1050

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2012-10-27
在线时间
65 小时
发表于 2013-3-21 22:18:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-3-21 22:31:10 | 显示全部楼层
回复【2楼】arm51avr:
---------------------------------
谢谢支持。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2013-3-22 16:51:05 | 显示全部楼层
好東西,頂
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-7-9 14:49:28 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
求淘宝链接- -
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-7-9 16:51:04 | 显示全部楼层
回复【5楼】charlieholy:
---------------------------------
什么链接?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

50

主题

201

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
423
金钱
423
注册时间
2013-4-9
在线时间
1 小时
发表于 2013-7-9 17:12:44 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
这个手柄哪里有卖
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2013-7-9 18:26:55 | 显示全部楼层
淘宝一堆啊
搜索:FC 游戏手柄
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-10-11
在线时间
0 小时
发表于 2014-10-27 15:18:05 | 显示全部楼层
刚在看这个,请问原子哥,这个怎么识别时哪个按键被按下呢?在主程序中通过判定0xff中哪个为0来选择说是哪一个键,但是这游戏手柄是怎么对应起来,游戏手柄每次发上来只是一个低电平的信号啊,主程序里也不过是正好在循环中间哪一个位为0就输出相应的信息,怎么对应呢?

假设是可以对应的情况下:
一开始的理解是按键扫描循环8次,只够一个键按下的时间,如果每次循环的时间足够长的话,会出现同时按下多个键的情况,这样键值就会不一样,比如说按下AB两键,键值就变成0x00111111,但是显示的就会是键A
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-10-27 17:12:08 | 显示全部楼层
回复【9楼】xylucky:
---------------------------------
教程写的这么明白还搞不出???
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2014-10-11
在线时间
0 小时
发表于 2014-10-28 10:37:46 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
你键盘按一个键给端口一个低平信号是吧,随便按一个键都会有低平的信号吧,程序里面是没有做判定的,我就想知道,是怎么判定的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-10-30 01:27:37 | 显示全部楼层
回复【11楼】xylucky:
---------------------------------
输出是有时序的。不是简单的按下输出0什么的。
具体的波形,我教程也写了,请看教程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-6-19
在线时间
0 小时
发表于 2015-7-27 18:53:35 | 显示全部楼层
回复【12楼】正点原子:
---------------------------------
       GPIOC->ODR|=3<<8;

       GPIOC->ODR|=1<<12;

为什么这里初始化为1?
单FC手柄时序图一开始这两个却是0?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-7-27 22:50:26 | 显示全部楼层
回复【13楼】Timothy:
---------------------------------
上拉的意思。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2015-6-19
在线时间
0 小时
发表于 2015-7-28 11:31:48 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
我的意思是为什么要上拉。而不是下拉。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-7-29 00:17:17 | 显示全部楼层
回复【15楼】Timothy:
---------------------------------
你可以设置为下拉。能用就行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2015-5-30
在线时间
9 小时
发表于 2015-9-15 18:33:45 | 显示全部楼层
我用的是名为嘉兴的手柄,我用了最小系统板自己做了一个串接口,为啥只能识别一个按键?是手柄问题吗,
要学的东西很多,不要慌,一步一个脚印,扎扎实实的学
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2015-10-27
在线时间
4 小时
发表于 2015-10-27 10:58:50 | 显示全部楼层
原子哥。我刚买的战舰V3开发板。库函数版的代码:这个键值得"B"和"A"是不是反了,我按B按键液晶显示的是KEYVAL:2   SYMBOL:A
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2015-10-27
在线时间
0 小时
发表于 2015-10-28 09:12:08 | 显示全部楼层
好东西,先收藏再说
小菜鸟要学飞
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 06:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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