中级会员
- 积分
- 269
- 金钱
- 269
- 注册时间
- 2022-11-1
- 在线时间
- 53 小时
|
楼主 |
发表于 2023-2-17 16:30:43
|
显示全部楼层
这是.c文件里的完整驱动代码
- #include"joypad.h"
- //手柄初始化
- void JOYPAD_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
-
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD,ENABLE); //使能PB PD端口时钟
-
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出,一般用于0-3.3v
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_11;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOB,&GPIO_InitStruct);
- GPIO_SetBits(GPIOB,GPIO_Pin_11);//上拉引脚设为高电平
-
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;//可有可无
- GPIO_Init(GPIOB,&GPIO_InitStruct);
- GPIO_SetBits(GPIOB,GPIO_Pin_11);//上拉
-
- GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
- GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init(GPIOD,&GPIO_InitStruct);
- GPIO_SetBits(GPIOD,GPIO_Pin_3);
-
-
- }
- //延时
- void JOYPAD_Delay(u16 t)
- {
- while(t--); //
-
-
- }
- //读取键值,当有数据传输过来时,电平被拉低,意味着有按键按下
- //每给一个脉冲,输出一位数据,输出顺序:
- //A->B->SELECT->START->UP->DOWN->LEFT->RIGHT.
- //按下为0,松开为1
- u8 JOYPAD_Read(void)
- {
- vu8 temp=0; //中间变量,用来记录接受到的数据
- u8 t;
- JOYPAD_LAT=1;//锁存当前状态,先高
- JOYPAD_Delay(80); //延时一段时间
- JOYPAD_LAT=0; //后低
- for(t=0;t<8;t++) //实际只循环了7次,第一次直接读值
- {
- temp>>=1; //右移1位赋值
- if (JOYPAD_DAT==0)temp|= 0x80; //得到第一个数据,最高位置1
- JOYPAD_CLK=1; //每给一个脉冲,得到一个数据
- JOYPAD_Delay(80);
- JOYPAD_CLK=0;
- JOYPAD_Delay(80);
-
-
- }
- return temp;
- }
- //下面这是我写的,
- /*
- u8 JOYPAD_Read(void)
- {
- JOYPAD_LAT=1; //上升沿
- JOYPAD_Delay(80); //延时
- JOYPAD_DAT=0; //数据
- JOYPAD_CLK=0; //时钟
- JOYPAD_LAT=0; //下降沿读A
- JOYPAD_Delay(80);
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读B
- JOYPAD_Delay(80);
-
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读Start
-
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读Select
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读Up
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读Down
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读Left
- JOYPAD_LAT=0;
- JOYPAD_DAT=0;
- JOYPAD_CLK=1;
- JOYPAD_Delay(80);
- JOYPAD_CLK=0; //读Right
- }*/
复制代码 |
|