FC手柄,大致可分為兩種:一種手柄插口是11針的,一種是9針的,可以直接和DR9的串口頭對插。
FC手柄有10個按鍵(實際上只有8個):
上、下、左、右、Start、Select、A、B、A連發(fā)、B連發(fā)。
A和A連發(fā)是一個鍵值,而B和B連發(fā)也是一個鍵值,只是連發(fā)按鍵當你一直按下的時候,會不停的發(fā)送(方便快速按鍵,比如發(fā)炮彈之類的功能)。
FC手柄的控制電路,由1個8位并入串出的移位寄存器(CD4021),外加一個時基集成電路(NE555,用于連發(fā))構(gòu)成。讀取手柄按鍵值的信息十分簡單:先Latch(鎖存鍵值),然后就得到了第一個按鍵值(A,下降沿采集),之后在7個Clock的作用下,依次讀取其他按鍵的鍵值,總共8個按鍵鍵值。
讀寫時序圖:
電路連接圖:
CODE:
#include"joypad.h"http://初始化手柄接口.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);//上拉}//手柄延遲函數(shù)//t:要延遲的時間voidJOYPAD_Delay(u16t){while(t--);}//讀取手柄按鍵值.//FC手柄數(shù)據(jù)輸出格式://每給一個脈沖,輸出一位數(shù)據(jù),輸出順序://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;//鎖存當前狀態(tài)JOYPAD_Delay(80);JOYPAD_LAT=0;for(t=0;t<8;t++){temp>>=1;if(JOYPAD_DAT==0)temp|=0x80;//LOAD之后,就得到第一個數(shù)據(jù)JOYPAD_CLK=1;//每給一次脈沖,收到一個數(shù)據(jù)JOYPAD_Delay(80);JOYPAD_CLK=0;JOYPAD_Delay(80);}returntemp;}