#include "stm32f10x.h"
#include "motor.h"
#include "ps2_adapter.h"
#include "ax_delay.h"
#include "ax_led.h"
#define MAX_SPEED 70
#define MIN_SPEED 10
#define SPEED_STEP 5
#define JOYSTICK_DEADZONE 20
PS2_State_t PS2_State;
typedef enum {
CAR_STOP,
CAR_FORWARD,
CAR_BACKWARD,
CAR_LEFT,
CAR_RIGHT,
CAR_FOR_LEFT,
CAR_FOR_RIGHT,
CAR_BACK_LEFT,
CAR_BACK_RIGHT
} CarState_t;
CarState_t car_state = CAR_STOP;
uint8_t current_speed = 30;
static uint32_t Get_Tick(void)
{
return AX_GetTick();
}
int main(void)
{
SystemInit();
TIM4_SystemTick_Init();
AX_DELAY_Init();
AX_LED_Init();
Motor_Init();
PS2_Init();
AX_LED_Green_On();
AX_Delayms(500);
AX_LED_Green_Off();
while(!PS2_IsConnected())
{
AX_LED_Red_Toggle();
AX_Delayms(200);
}
AX_LED_Green_On();
AX_Delayms(200);
AX_LED_Green_Off();
AX_Delayms(200);
AX_LED_Green_On();
while(1)
{
PS2_ReadData(&PS2_State);
if(PS2_State.Button & PSB_SELECT)
{
car_state = CAR_STOP;
current_speed = MIN_SPEED;
Car_Stop();
AX_LED_Red_On();
AX_Delayms(500);
AX_LED_Red_Off();
continue;
}
static uint32_t last_speed_time = 0;
uint32_t current_time = Get_Tick();
if((current_time - last_speed_time) > 20)
{
if(PS2_State.Button & PSB_L1)
{
if(current_speed < MAX_SPEED)
{
current_speed += SPEED_STEP;
last_speed_time = current_time;
AX_LED_Green_Toggle();
}
}
else if(PS2_State.Button & PSB_R1)
{
if(current_speed > MIN_SPEED)
{
current_speed -= SPEED_STEP;
last_speed_time = current_time;
AX_LED_Green_Toggle();
}
}
}
CarState_t new_state = CAR_STOP;
if((PS2_State.Button & PSB_PAD_UP)&&(PS2_State.Button & PSB_PAD_LEFT))
{
new_state = CAR_FOR_LEFT;
}
else if((PS2_State.Button & PSB_PAD_UP)&&(PS2_State.Button & PSB_PAD_RIGHT))
{
new_state = CAR_FOR_RIGHT;
}
else if((PS2_State.Button & PSB_PAD_DOWN)&&(PS2_State.Button & PSB_PAD_LEFT))
{
new_state = CAR_BACK_LEFT;
}
else if((PS2_State.Button & PSB_PAD_DOWN)&&(PS2_State.Button & PSB_PAD_RIGHT))
{
new_state = CAR_BACK_RIGHT;
}
else if(PS2_State.Button & PSB_PAD_UP)
{
new_state = CAR_FORWARD;
}
else if(PS2_State.Button & PSB_PAD_DOWN)
{
new_state = CAR_BACKWARD;
}
else if(PS2_State.Button & PSB_PAD_LEFT)
{
new_state = CAR_LEFT;
}
else if(PS2_State.Button & PSB_PAD_RIGHT)
{
new_state = CAR_RIGHT;
}
if(new_state != car_state) {
car_state = new_state;
}
switch(car_state)
{
case CAR_FORWARD:
Car_Move_Forward(current_speed);
AX_LED_Green_On();
AX_LED_Red_Off();
break;
case CAR_BACKWARD:
Car_Move_Backward(current_speed);
AX_LED_Red_On();
AX_LED_Green_Off();
break;
case CAR_LEFT:
Car_Turn_Left(current_speed);
AX_LED_Green_Toggle();
AX_LED_Red_Toggle();
break;
case CAR_RIGHT:
Car_Turn_Right(current_speed);
AX_LED_Green_Toggle();
AX_LED_Red_Toggle();
break;
case CAR_FOR_LEFT:
Car_Turn_For_Left(current_speed);
AX_LED_Green_Toggle();
AX_LED_Red_Toggle();
break;
case CAR_FOR_RIGHT:
Car_Turn_For_Right(current_speed);
AX_LED_Green_Toggle();
AX_LED_Red_Toggle();
break;
case CAR_BACK_LEFT:
Car_Turn_Back_Left(current_speed);
AX_LED_Green_Toggle();
AX_LED_Red_Toggle();
break;
case CAR_BACK_RIGHT:
Car_Turn_Back_Right(current_speed);
AX_LED_Green_Toggle();
AX_LED_Red_Toggle();
break;
case CAR_STOP:
default:
Car_Stop();
AX_LED_Green_Off();
AX_LED_Red_Off();
break;
}
AX_Delayms(10);
}
} main.c
#include "motor.h"
#include "stm32f10x.h" // Device header
Motor_TypeDef motors[6];
static void Motor_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |
GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
static void Motor_TIM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM5, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 100 - 1;
TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC3Init(TIM5, &TIM_OCInitStructure);
TIM_OC4Init(TIM5, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);
TIM_Cmd(TIM2, ENABLE);
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM5, ENABLE);
}
void Motor_Init(void)
{
Motor_GPIO_Init();
Motor_TIM_Init();
motors[MOTOR1].timer = TIM2;
motors[MOTOR1].channel = TIM_Channel_1;
motors[MOTOR1].in1_port = GPIOB;
motors[MOTOR1].in1_pin = GPIO_Pin_0;
motors[MOTOR1].in2_port = GPIOB;
motors[MOTOR1].in2_pin = GPIO_Pin_1;
motors[MOTOR2].timer = TIM2;
motors[MOTOR2].channel = TIM_Channel_2;
motors[MOTOR2].in1_port = GPIOB;
motors[MOTOR2].in1_pin = GPIO_Pin_10;
motors[MOTOR2].in2_port = GPIOB;
motors[MOTOR2].in2_pin = GPIO_Pin_11;
motors[MOTOR3].timer = TIM3;
motors[MOTOR3].channel = TIM_Channel_1;
motors[MOTOR3].in1_port = GPIOB;
motors[MOTOR3].in1_pin = GPIO_Pin_12;
motors[MOTOR3].in2_port = GPIOB;
motors[MOTOR3].in2_pin = GPIO_Pin_13;
motors[MOTOR4].timer = TIM3;
motors[MOTOR4].channel = TIM_Channel_2;
motors[MOTOR4].in1_port = GPIOB;
motors[MOTOR4].in1_pin = GPIO_Pin_14;
motors[MOTOR4].in2_port = GPIOB;
motors[MOTOR4].in2_pin = GPIO_Pin_15;
motors[MOTOR5].timer = TIM5;
motors[MOTOR5].channel = TIM_Channel_3;
motors[MOTOR5].in1_port = GPIOB;
motors[MOTOR5].in1_pin = GPIO_Pin_3;
motors[MOTOR5].in2_port = GPIOB;
motors[MOTOR5].in2_pin = GPIO_Pin_4;
motors[MOTOR6].timer = TIM5;
motors[MOTOR6].channel = TIM_Channel_4;
motors[MOTOR6].in1_port = GPIOB;
motors[MOTOR6].in1_pin = GPIO_Pin_5;
motors[MOTOR6].in2_port = GPIOB;
motors[MOTOR6].in2_pin = GPIO_Pin_6;
All_Motor_Stop();
}
void Motor_Set_Speed(uint8_t motor_id, int16_t speed)
{
uint16_t pulse;
if(speed > 100)
speed = 100;
if(speed < 0)
speed = 0;
pulse = (uint16_t)((speed * (motors[motor_id].timer->ARR + 1)) / 100);
switch(motors[motor_id].channel)
{
case TIM_Channel_1:
TIM_SetCompare1(motors[motor_id].timer, pulse);
break;
case TIM_Channel_2:
TIM_SetCompare2(motors[motor_id].timer, pulse);
break;
case TIM_Channel_3:
TIM_SetCompare3(motors[motor_id].timer, pulse);
break;
case TIM_Channel_4:
TIM_SetCompare4(motors[motor_id].timer, pulse);
break;
}
}
void Motor_Set_Direction(uint8_t motor_id, uint8_t direction)
{
switch (direction)
{
case MOTOR_DIR_FORWARD:
GPIO_SetBits(motors[motor_id].in1_port, motors[motor_id].in1_pin);
GPIO_ResetBits(motors[motor_id].in2_port, motors[motor_id].in2_pin);
break;
case MOTOR_DIR_BACKWARD:
GPIO_ResetBits(motors[motor_id].in1_port, motors[motor_id].in1_pin);
GPIO_SetBits(motors[motor_id].in2_port, motors[motor_id].in2_pin);
break;
case MOTOR_DIR_STOP:
GPIO_ResetBits(motors[motor_id].in1_port, motors[motor_id].in1_pin);
GPIO_ResetBits(motors[motor_id].in2_port, motors[motor_id].in2_pin);
break;
}
}
void All_Motor_Stop(void)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Speed(i, 0);
Motor_Set_Direction(i, MOTOR_DIR_STOP);
}
}
void Car_Move_Forward(uint8_t speed)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Direction(i, MOTOR_DIR_FORWARD);
Motor_Set_Speed(i, speed);
}
}
void Car_Move_Backward(uint8_t speed)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Direction(i, MOTOR_DIR_BACKWARD);
Motor_Set_Speed(i, speed);
}
}
void Car_Turn_Left(uint8_t speed)
{
Motor_Set_Direction(MOTOR1, MOTOR_DIR_BACKWARD);
Motor_Set_Direction(MOTOR2, MOTOR_DIR_FORWARD);
Motor_Set_Direction(MOTOR3, MOTOR_DIR_BACKWARD);
Motor_Set_Direction(MOTOR4, MOTOR_DIR_FORWARD);
Motor_Set_Direction(MOTOR5, MOTOR_DIR_BACKWARD);
Motor_Set_Direction(MOTOR6, MOTOR_DIR_FORWARD);
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Speed(i, speed);
}
}
void Car_Turn_Right(uint8_t speed)
{
Motor_Set_Direction(MOTOR1, MOTOR_DIR_FORWARD);
Motor_Set_Direction(MOTOR2, MOTOR_DIR_BACKWARD);
Motor_Set_Direction(MOTOR3, MOTOR_DIR_FORWARD);
Motor_Set_Direction(MOTOR4, MOTOR_DIR_BACKWARD);
Motor_Set_Direction(MOTOR5, MOTOR_DIR_FORWARD);
Motor_Set_Direction(MOTOR6, MOTOR_DIR_BACKWARD);
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Speed(i, speed);
}
}
void Car_Turn_For_Left(uint8_t speed)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Direction(i, MOTOR_DIR_FORWARD);
}
Motor_Set_Speed(0, speed*0.7);
Motor_Set_Speed(1, speed);
Motor_Set_Speed(2, speed*0.7);
Motor_Set_Speed(3, speed);
Motor_Set_Speed(4, speed*0.7);
Motor_Set_Speed(5, speed);
}
void Car_Turn_For_Right(uint8_t speed)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Direction(i, MOTOR_DIR_FORWARD);
}
Motor_Set_Speed(0, speed);
Motor_Set_Speed(1, speed*0.7);
Motor_Set_Speed(2, speed);
Motor_Set_Speed(3, speed*0.7);
Motor_Set_Speed(4, speed);
Motor_Set_Speed(5, speed*0.7);
}
void Car_Turn_Back_Left(uint8_t speed)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Direction(i, MOTOR_DIR_BACKWARD);
}
Motor_Set_Speed(0, speed);
Motor_Set_Speed(1, speed*0.7);
Motor_Set_Speed(2, speed);
Motor_Set_Speed(3, speed*0.7);
Motor_Set_Speed(4, speed);
Motor_Set_Speed(5, speed*0.7);
}
void Car_Turn_Back_Right(uint8_t speed)
{
for(uint8_t i = 0; i < 6; i++)
{
Motor_Set_Direction(i, MOTOR_DIR_BACKWARD);
}
Motor_Set_Speed(0, speed*0.7);
Motor_Set_Speed(1, speed);
Motor_Set_Speed(2, speed*0.7);
Motor_Set_Speed(3, speed);
Motor_Set_Speed(4, speed*0.7);
Motor_Set_Speed(5, speed);
}
void Car_Stop(void)
{
All_Motor_Stop();
} motor.c
#include "stm32f10x.h"
#define MOTOR1 0
#define MOTOR2 1
#define MOTOR3 2
#define MOTOR4 3
#define MOTOR5 4
#define MOTOR6 5
#define MOTOR_DIR_FORWARD 0
#define MOTOR_DIR_BACKWARD 1
#define MOTOR_DIR_STOP 2
typedef struct
{
TIM_TypeDef* timer;
uint16_t channel;
GPIO_TypeDef* in1_port;
uint16_t in1_pin;
GPIO_TypeDef* in2_port;
uint16_t in2_pin;
} Motor_TypeDef;
void Motor_Init(void);
void Motor_Set_Speed(uint8_t motor_id, int16_t speed);
void Motor_Set_Direction(uint8_t motor_id, uint8_t direction);
void All_Motor_Stop(void);
void Car_Move_Forward(uint8_t speed);
void Car_Move_Backward(uint8_t speed);
void Car_Turn_Left(uint8_t speed);
void Car_Turn_Right(uint8_t speed);
void Car_Turn_For_Left(uint8_t speed);
void Car_Turn_For_Right(uint8_t speed);
void Car_Turn_Back_Left(uint8_t speed);
void Car_Turn_Back_Right(uint8_t speed);
void Car_Stop(void);
#endif motor.h
#include "ax_ps2.h"
#include "ax_delay.h"
#include "ax_sys.h"
//PS2ÊÖ±úµÄÊäÈëÊä³ö¿Ú
#define DI() PAin(4) //Êý¾ÝÊäÈëÒý½Å
#define CMD_H() PAout(5)=1 //ÃüÁîλ¸ß
#define CMD_L() PAout(5)=0 //ÃüÁîλµÍ
#define CS_H() PAout(8)=1 //CSÀ¸ß(±ðÃûATT)
#define CS_L() PAout(8)=0 //CSÀµÍ(±ðÃûATT)
#define CLK_H() PAout(9)=1 //ʱÖÓÀ¸ß
#define CLK_L() PAout(9)=0 //ʱÖÓÀµÍ
const uint8_t PS2_cmnd[9] = {0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; //ÇëÇó»ñÈ¡Êý¾ÝÃüÁî
static uint8_t PS2_data[9] = {0}; //½ÓÊÕµÄÊý¾Ý
/**
* @¼ò Êö PS2³õʼ»¯
* @²Î Êý ÎÞ
* @·µ»ØÖµ ÎÞ
*/
void AX_PS2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//GPIOÅäÖÃ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
//DATA ÐźŴÓÊÖ±úµ½Ö÷»ú ÊäÈë¿Ú
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//COMMMAND ÐźŴÓÖ÷»úµ½ÊÖ±ú Êä³ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CS ÊÖ±ú³ö·¢ÐźŠÐźÅÔÚͨÐÅÆÚ¼ä´¦ÓÚµÍµçÆ½
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CLK ÐźŴÓÖ÷»úµ½ÊÖ±ú Êä³ö¿Ú
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//¹Ø±ÕPS2ÊÖ±úʹÄÜ
CS_H();
}
/**
* @¼ò Êö PS2Êý¾Ý¶Áдº¯Êý
* @²Î Êý cmd:ҪдÈëµÄÃüÁî
* @·µ»ØÖµ ¶Á³öÊý¾Ý
*/
static uint8_t PS2_ReadWriteData(uint8_t cmd)
{
volatile uint8_t res = 0;
volatile uint8_t ref;
//дÈëÃüÁ²¢¶Áȡһ¸ö1×Ö½ÚÊý¾Ý
for(ref = 0x01; ref > 0x00; ref <<= 1)
{
////Êä³öһλÊý¾Ý
if(ref&cmd)
CMD_H();
else
CMD_L();
CLK_L();
AX_Delayus(16);
//¶ÁȡһλÊý¾Ý
if(DI())
res |= ref;
CLK_H();
AX_Delayus(16);
}
//·µ»Ø¶Á³öÊý¾Ý
return res;
}
/**
* @¼ò Êö PS2»ñÈ¡°´¼ü¼°Ò¡¸ËÊýÖµ¡£
* @²Î Êý *JoystickStruct ÊÖ±ú¼üÖµ½á¹¹Ìå
* @·µ»ØÖµ ÎÞ
*/
void AX_PS2_ScanKey(JOYSTICK_TypeDef *JoystickStruct)
{
uint8_t i;
//ʹÄÜÊÖ±ú
CS_L();
//¶ÁÈ¡PS2Êý¾Ý
for(i=0; i<9; i++)
{
PS2_data[i] = PS2_ReadWriteData(PS2_cmnd[i]);
}
//¹Ø±ÕʹÄÜ
CS_H();
//ÊýÖµ´«µÝ
JoystickStruct->mode = PS2_data[1];
JoystickStruct->btn1 = ~PS2_data[3];
JoystickStruct->btn2 = ~PS2_data[4];
JoystickStruct->RJoy_LR = PS2_data[5];
JoystickStruct->RJoy_UD = PS2_data[6];
JoystickStruct->LJoy_LR = PS2_data[7];
JoystickStruct->LJoy_UD = PS2_data[8];
} ax_ps2.c
#ifndef __AX_PS2_H
#define __AX_PS2_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
//PS2ÊÖ±ú¼üÖµÊý¾Ý½á¹¹Ìå
typedef struct
{
uint8_t mode; /* ÊÖ±úµÄ¹¤×÷ģʽ */
uint8_t btn1; /* B0:SLCT B1:JR B0:JL B3:STRT B4:UP B5:R B6:DOWN B7:L */
uint8_t btn2; /* B0:L2 B1:R2 B2:L1 B3:R1 B4:Y B5:B B6:A B7:X */
uint8_t RJoy_LR; /* ÓÒ±ßÒ¡¸Ë 0x00 = ×ó 0xff = ÓÒ */
uint8_t RJoy_UD; /* ÓÒ±ßÒ¡¸Ë 0x00 = ÉÏ 0xff = Ï */
uint8_t LJoy_LR; /* ×ó±ßÒ¡¸Ë 0x00 = ×ó 0xff = ÓÒ */
uint8_t LJoy_UD; /* ×ó±ßÒ¡¸Ë 0x00 = ÉÏ 0xff = Ï */
}JOYSTICK_TypeDef;
/*** PS2ÎÞÏßÊÖ±ú²Ù×÷º¯Êý **********/
void AX_PS2_Init(void); //PS2³õʼ»¯
void AX_PS2_ScanKey(JOYSTICK_TypeDef* JoystickStruct);//PS2»ñÈ¡°´¼ü¼°Ò¡¸ËÊýÖµ
#endif
/******************* (C) °æÈ¨ 2023 XTARK **************************************/ ax_ps2.h
#include "ps2_adapter.h"
#include "ax_ps2.h"
#include "ax_delay.h"
static JOYSTICK_TypeDef joystick;
void PS2_Init(void)
{
AX_PS2_Init();
}
uint8_t PS2_IsConnected(void)
{
return (joystick.mode == 0x73);
}
void PS2_ReadData(PS2_State_t* state)
{
AX_PS2_ScanKey(&joystick);
state->Button = 0;
if(joystick.btn1 & 0x01) state->Button |= PSB_SELECT;
if(joystick.btn1 & 0x02) state->Button |= PSB_JOYR;
if(joystick.btn1 & 0x04) state->Button |= PSB_JOYL;
if(joystick.btn1 & 0x08) state->Button |= PSB_START;
if(joystick.btn1 & 0x10) state->Button |= PSB_PAD_UP;
if(joystick.btn1 & 0x20) state->Button |= PSB_PAD_RIGHT;
if(joystick.btn1 & 0x40) state->Button |= PSB_PAD_DOWN;
if(joystick.btn1 & 0x80) state->Button |= PSB_PAD_LEFT;
if(joystick.btn2 & 0x01) state->Button |= PSB_L2;
if(joystick.btn2 & 0x02) state->Button |= PSB_R2;
if(joystick.btn2 & 0x04) state->Button |= PSB_L1;
if(joystick.btn2 & 0x08) state->Button |= PSB_R1;
if(joystick.btn2 & 0x10) state->Button |= PSB_Y;
if(joystick.btn2 & 0x20) state->Button |= PSB_B;
if(joystick.btn2 & 0x40) state->Button |= PSB_A;
if(joystick.btn2 & 0x80) state->Button |= PSB_X;
state->LJoy_LR = joystick.LJoy_LR;
state->LJoy_UD = joystick.LJoy_UD;
state->RJoy_LR = joystick.RJoy_LR;
state->RJoy_UD = joystick.RJoy_UD;
} ps2_adapter.c#ifndef __PS2_ADAPTER_H
#define __PS2_ADAPTER_H
#include "ax_ps2.h"
#include "ax_delay.h"
#define PSB_SELECT 0x0001
#define PSB_JOYR 0x0002
#define PSB_JOYL 0x0004
#define PSB_START 0x0008
#define PSB_PAD_UP 0x0010
#define PSB_PAD_RIGHT 0x0020
#define PSB_PAD_DOWN 0x0040
#define PSB_PAD_LEFT 0x0080
#define PSB_L2 0x0100
#define PSB_R2 0x0200
#define PSB_L1 0x0400
#define PSB_R1 0x0800
#define PSB_Y 0x1000
#define PSB_B 0x2000
#define PSB_A 0x4000
#define PSB_X 0x8000
typedef struct {
uint16_t Button;
uint8_t LJoy_LR;
uint8_t LJoy_UD;
uint8_t RJoy_LR;
uint8_t RJoy_UD;
} PS2_State_t;
void PS2_Init(void);
uint8_t PS2_IsConnected(void);
void PS2_ReadData(PS2_State_t* state);
#endif ps2_adapter.h
请帮我检查一下代码的正确性,为什么ps2接收器的绿色LED不亮
最新发布