STM32系列第28篇--游戏手柄
扫描二维码
随时随地手机看文章
FC手柄,大致可分为两种:一种手柄插口是11针的,一种是9针的,可以直接和DR9的串口头对插。
FC手柄有10个按键(实际上只有8个):
上、下、左、右、Start、Select、A、B、A连发、B连发。
A和A连发是一个键值,而B和B连发也是一个键值,只是连发按键当你一直按下的时候,会不停的发送(方便快速按键,比如发炮弹之类的功能)。
FC手柄的控制电路,由1个8位并入串出的移位寄存器(CD4021),外加一个时基集成电路(NE555,用于连发)构成。读取手柄按键值的信息十分简单:先Latch(锁存键值),然后就得到了第一个按键值(A,下降沿采集),之后在7个Clock的作用下,依次读取其他按键的键值,总共8个按键键值。
读写时序图:
电路连接图:
CODE:
#include"joypad.h"//初始化手柄接口.voidJOYPAD_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE);//使能PB,PD端口时钟GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOB,GPIO_Pin_11);//上拉GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOD,&GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOD,GPIO_Pin_3);//上拉GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOGPIO_SetBits(GPIOB,GPIO_Pin_10);//上拉}//手柄延迟函数//t:要延迟的时间voidJOYPAD_Delay(u16t){while(t--);}//读取手柄按键值.//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]:Au8JOYPAD_Read(void){vu8temp=0;u8t;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);}returntemp;}