zhangbo
2025-05-06 6a7313865e6dd9acb2de273c42fb257ac40d02c6
keil/sn74hc595.c
@@ -3,61 +3,147 @@
void IO_control_init(void)
{
//SDA->SER
io_open_drain_set(SER_PIN, 0);
io_pin_mux_set(SER_PIN,IO_FUNC0);//把原先io SDA变为普通GPIO
gpio_pin_set_dir(SER_PIN , GPIO_DIR_OUT, 0);//复用原先GPIO引脚为SER
io_pull_set(SER_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4);
    io_open_drain_set(SER_PIN, 0);
    io_pin_mux_set(SER_PIN,IO_FUNC0);//把原先io SDA变为普通GPIO
    gpio_pin_set_dir(SER_PIN , GPIO_DIR_OUT, 0);//复用原先GPIO引脚为SER
    io_pull_set(SER_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4);
//SRCLK
io_pin_mux_set(SRCLK_PIN,IO_FUNC0);
gpio_pin_set_dir(SRCLK_PIN , GPIO_DIR_OUT, 0);
io_pull_set(SRCLK_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4);
    io_pin_mux_set(SRCLK_PIN,IO_FUNC0);
    gpio_pin_set_dir(SRCLK_PIN , GPIO_DIR_OUT, 0);
    io_pull_set(SRCLK_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4);
//RCLK
io_pin_mux_set(RCLK_PIN,IO_FUNC0);
gpio_pin_set_dir(RCLK_PIN , GPIO_DIR_OUT, 0);
io_pull_set(RCLK_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4);
    io_pin_mux_set(RCLK_PIN,IO_FUNC0);
    gpio_pin_set_dir(RCLK_PIN , GPIO_DIR_OUT, 0);
    io_pull_set(RCLK_PIN , IO_PULL_DOWN, IO_PULL_UP_LEVEL4);
}
uint8_t data_temp,temp_bit;
void IO_LED_control_change(uint8_t data)
{
for(int i=0;i<8;i++){
   uint8_t temp=data&1;
   if(temp)//写入低位数据
      SER_1;
   else
      SER_0;
   SRCLK_1;//将数据放入移位寄存器
   SRCLK_0;
   data>>=1;
}
RCLK_1;//将数据存入存储器并输出
RCLK_0;
   data_temp=data;
   uint8_t temp;
    for(int i=0; i<8; i++) {
        temp=data&1;
            temp_bit=temp;
        if(temp)//写入低位数据
            SER_1;
        else
            SER_0;
        SRCLK_1;//将数据放入移位寄存器
        SRCLK_0;
        data>>=1;
    }
    RCLK_1;//将数据存入存储器并输出
    RCLK_0;
}
//高电平开启power,低电平关闭power
void gps_air780_power_change(uint8_t gps_state,uint8_t air_state)
{
gps_power_state=gps_state;
air780_power_state=air_state;
updata_led_power_state();//更新控制引脚
    gps_power_state=gps_state;
    air780_power_state=air_state;
    update_led_power_state();//更新控制引脚
}
void updata_led_power_state(void)
void update_led_power_state(void)
{
uint8_t control_state=air780_power_state<<7|gps_power_state<<6|motor_power_state<<5|uwb_state<<4|gps_success_state<<3|air780_success_state<<2|chaging_state<<1|changed_state;
IO_LED_control_change(control_state);
    uint8_t control_state=air780_power_state<<7|gps_power_state<<6|motor_power_state<<5|uwb_state<<4|gps_success_state<<3|air780_success_state<<2|red_charge_state<<1|green_charge_state;
    IO_LED_control_change(control_state);
}
void blink_led(uint8_t*state)
{*state=~*state;
updata_led_power_state();
delay_us(100);
*state=~*state;
updata_led_power_state();
{   if(*state==0)
        *state=1;
    else {
        *state=0;
    }
    update_led_power_state();
    delay_us(1000);
    if(*state==0)
        *state=1;
    else {
        *state=0;
    }
    update_led_power_state();
}
void gps_led_on(void)
{
    gps_success_state=1;//uwb亮起
    update_led_power_state();
}
void gps_led_off(void)
{
    gps_success_state=0;//uwb灭
    update_led_power_state();
}
void uwb_led_on(void)
{
      uwb_state=1;//uwb亮起
      updata_led_power_state();
    uwb_state=1;//uwb亮起
    update_led_power_state();
}
void uwb_led_off(void)
{
      uwb_state=0;//uwb灭
      updata_led_power_state();
    uwb_state=0;//uwb灭
    update_led_power_state();
}
void air780_led_on(void)
{
    air780_success_state=1;//uwb亮起
    update_led_power_state();
}
void air780_led_off(void)
{
    air780_success_state=0;//uwb灭
    update_led_power_state();
}
void charge_red_on(void)
{
      red_charge_state=1;//充电红灯亮起
    update_led_power_state();
}
void charge_red_off(void)
{
      red_charge_state=0;//充电红灯熄灭
    update_led_power_state();
}
void charge_green_on(void)
{
      green_charge_state=1;//充电绿灯亮起
    update_led_power_state();
}
void charge_green_off(void)
{
      green_charge_state=0;//充电绿灯熄灭
    update_led_power_state();
}
void charge_state_change(void)
{
   if(gpio_pin_get_val(INPUT_5V_Pin))
   {
            if(bat_percent==100)
            {
            red_charge_state=0;
            green_charge_state=1;
            }else{
            red_charge_state=1;
            green_charge_state=0;
            }
            enbale_blink_flag=0;
            update_led_power_state();
   }else{
            if(bat_percent>15)
            {
            charge_green_off();
            charge_red_off();
               enbale_blink_flag=0;
            }else{
//                  green_charge_state=0;
//                  if(secondtask_count%2==0)
//                  {
//                     red_charge_state=0;
//                  }else{
//                     red_charge_state=1;
//                  }
//                  update_led_power_state();
               enbale_blink_flag=1;
                  }
         }
}