天天看點

小霸王遊戲機搖桿(二)——代碼讀取

  在我的上一個部落格小霸王遊戲機搖桿(一)——硬體解讀中我們已經知道了搖桿所用晶片及其時序功能,還知道了DB9接口所用到的5個管腳中每個管腳的硬體連接配接及其作用,接下來就可以編寫程式來讀取搖桿的資料了。

  在這裡我們使用STM32作為硬體平台來進行代碼編寫。代碼如下:

//管腳宏定義
#define LOAD PAout(11)
#define CLK  PAout(12)
#define DATA PBin(10)

//管腳初始化函數,LOAD、CLK設定為輸出,CLK設定為輸入
void XBW_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量
	
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB,ENABLE); //使能端口A B時鐘
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //輸出模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;//管腳設定A11 A12
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度為100M
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽輸出
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;//下拉
	GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化結構體
	
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; //輸出模式
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//管腳設定B10
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度為100M
	GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化結構體
}

//讀取對應鍵狀态函數
u8 XBW_Get_Data(void)
{
	int i;
	u8 Data=0;
	LOAD=1;     //将P1-P8的資料鎖存到移位寄存器(Q1-Q8)中
	delay_ms(1);
	LOAD=0;     //設定成串行輸出模式
	Data=DATA;  //儲存搖桿資料,先将Q8儲存
	CLK=0;
	delay_ms(5);
	for(i=0;i<8;i++)
	{
		Data<<=1;
		CLK=1;   //時鐘上升沿,資料移位
		Data+=DATA;
		CLK=0;   //等待下一次上升沿
		delay_ms(1);
	}
	return Data;
}
           

  函數讀取到的資料為一個8位二進制數,轉換為二進制後,如果某一位為0,則表示相應位的按鍵被按下。

繼續閱讀