STM32学习笔记----FC游戏手柄

1、游戏手柄
FC游戏手柄,几乎都是 9 针(还有一种11针的),该手柄还有一个特点,就是可以直接和 DR9 的串口头对插!这样同开发板的连接就简单了。FC 手柄的外观如图所示:
STM32学习笔记----FC游戏手柄_第1张图片
FC手柄有10个按键(实际上只有8个):
上、下、左、右、Start、Select、A、B、A连发、B连发。
A和A连发是一个键值,而B和B连发也是一个键值,只是连发按键当你一直按下的时候,会不停的发送(方便快速按键,比如发炮弹之类的功能)。

FC手柄的控制电路,由1个8位并入串出的移位寄存器(CD4021),外加一个时基集成电路(NE555,用于连发)构成。读取手柄按键值的信息十分简单:先Latch(锁存键值),然后就得到了第一个按键值(A,下降沿采集),之后在7个Clock的作用下,依次读取其他按键的键值,总共8个按键键值。不过现在的手柄,为了节约成本,直接就在 PCB 上做绑定 了,所以你拆开手柄,一般是看不到里面有四四方方的 IC,而只有一个黑色的小点,所有电路 都集成到这个里面了,但是他们的控制和读取方法还是一样的。 9 针手柄的读取时序和接线图如图所示:
STM32学习笔记----FC游戏手柄_第2张图片
2、电路连接
STM32学习笔记----FC游戏手柄_第3张图片
3、程序

//手柄连接引脚
#define JOYPAD_CLK PCout(12)  	//时钟		PC9
#define JOYPAD_LAT PCout(8)  	//锁存    	PC8
#define JOYPAD_DAT PCin(9)	 	//数据    	PC12   
const u8*JOYPAD_SYMBOL_TBL[8]=
{"Right","Left","Down","Up","Start","Select","A","B"};//手柄符号定义
//初始化手柄接口
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,i;
	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;	
	}
	if(temp!=0XFF)//表示接收到数据
	{
		LCD_ShowNum(116,130,temp,3,16);//显示键值
		for(i=0;i<8;i++)
		{
			if((temp&(1<<i))==0)//一次按位判断键值,若某一位为0,代表对应按键被按下
			{
				LCD_Fill(60+56,150,60+56+48,150+16,WHITE);//清除之前的显示
				LCD_ShowString(60+56,150,200,16,16,(u8*)JOYPAD_SYMBOL_TBL[i]);//显示符号
			}		
		}		    
	}
}

你可能感兴趣的:(STM32笔记)