在我的上一個部落格小霸王遊戲機搖桿(一)——硬體解讀中我們已經知道了搖桿所用晶片及其時序功能,還知道了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,則表示相應位的按鍵被按下。