在我的上一个博客小霸王游戏机手柄(一)——硬件解读中我们已经知道了手柄所用芯片及其时序功能,还知道了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 A12GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100MGPIO_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;//管脚设置B10GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//速度为100MGPIO_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,则表示相应位的按键被按下。