一、题目解析

- 按键短按
 - LCD显示两个界面
 - LED指示灯
 - PWM脉冲输出
 
二、led控制
控制两个led灯,两种状态
//led
void led_set(uint8_t led_dis)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,led_dis << 8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void led_proc(void)
{
    if((pwm_change_flag == 1)&&(IDLE_num >0)){
        led_set(0x03);
    }else if((pwm_change_flag == 1)&&(IDLE_num == 0)){
        led_set(0x02);
    }else if((pwm_change_flag != 1)&&(IDLE_num > 0)){
        led_set(0x01);
    }else{
        led_set(0x00);
    }
} 
三、LCD显示
void display_init(void)
{
    LCD_Init();
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
}
void display_menu(void)
{
    char text[25];
    if(menu == Data_menu){
        sprintf(text,"       Data                ");
        LCD_DisplayStringLine(Line1,(u8*)text);
        sprintf(text,"   CNBR:%d                ",CNBR_num);
        LCD_DisplayStringLine(Line3,(u8*)text);
        sprintf(text,"   VNBR:%d                ",VNBR_num);
        LCD_DisplayStringLine(Line5,(u8*)text);
        IDLE_num = Car_stall - CNBR_num - VNBR_num;
        sprintf(text,"   IDLE:%d                ",IDLE_num);
        LCD_DisplayStringLine(Line7,(u8*)text); 
    }else 
    {
        sprintf(text,"       Para                ");
        LCD_DisplayStringLine(Line1,(u8*)text);
        sprintf(text,"   CNBR:%.2f                ",CNBR_fee);
        LCD_DisplayStringLine(Line3,(u8*)text);
        sprintf(text,"   VNBR:%.2f                ",VNBR_fee);
        LCD_DisplayStringLine(Line5,(u8*)text);
        LCD_ClearLine(Line7); 
    }
} 
四、串口
这个题目的最头痛的就是串口了,在此写下我的思路
struct cars{
    char  type[5];       //车辆类型
    char   num[5];       //车辆编号
    uint8_t  year;       //进入年
    uint8_t month;       //进入月
    uint8_t  date;       //进入日
    uint8_t  hour;       //进入时
    uint8_t   min;       //进入分
    uint8_t   sec;       //进入秒
    uint8_t state;       //0为IDLE,1为有车位
}; 
定义一个结构体数组,存放每个车位的信息
#define IN  0
#define OUT 1 
宏定义两个变量 车辆进入和出去
if((receive_data[4]==':')&&(receive_data[9]==':')) 
判断字符接收格式 如果上面条件不满足就输出error
sscanf(time_tem,"%2c%2c%2c%2c%2c%2c",year,month,date,hour,min,sec); 
字符分割函数 sscanf 存放在Stdio.h头文件中
                        car[car_stall_num].year   =   (year[0]-'0')*10+(year[1]-'0');
                        car[car_stall_num].month  =   (month[0]-'0')*10+(month[1]-'0'); 
                        car[car_stall_num].date   =   (date[0]-'0')*10+(date[1]-'0'); 
                        car[car_stall_num].hour   =   (hour[0]-'0')*10+(hour[1]-'0'); 
                        car[car_stall_num].min    =   (min[0]-'0')*10+(min[1]-'0'); 
                        car[car_stall_num].sec    =   (sec[0]-'0')*10+(sec[1]-'0'); 
将字符型转换为整型
dir 
车的出入变量设置
            for(uint8_t i=0;i<8;i++){
                if(strcmp(id_tem,car[i].num)==0){
                    //出车库
                    dir = OUT;
                    printf("出车库\n");
              //      car_stall_num = i;
                    //计算时间
                    break;
                }
                if(car[i].state == 0){
                    car_stall_num = i;
                    break;
                }
                
            } 
存放位置选择
                        CNBR_num --;              //对应车辆类型+1
                        car[car_stall_num].state = 0;       //车位无车,退出停车场
                        sscanf(time_tem,"%2c%2c%2c%2c%2c%2c",year,month,date,hour,min,sec);
                        strcpy(car[car_stall_num].type,"");
                        strcpy(car[car_stall_num].num,"");
                        uint8_t year_temp   =   (year[0]-'0')*10+(year[1]-'0');
                        uint8_t month_temp  =   (month[0]-'0')*10+(month[1]-'0'); 
                        uint8_t date_temp   =   (date[0]-'0')*10+(date[1]-'0'); 
                        uint8_t hour_temp   =   (hour[0]-'0')*10+(hour[1]-'0'); 
                        uint8_t min_temp    =   (min[0]-'0')*10+(min[1]-'0'); 
                        uint8_t sec_temp    =   (sec[0]-'0')*10+(sec[1]-'0'); 
                        printf("日期信息%2d-%2d-%2d-%2d-%2d-%2d\n",car[car_stall_num].year,car[car_stall_num].month,car[car_stall_num].date    \
                                  ,car[car_stall_num].hour,car[car_stall_num].min,car[car_stall_num].sec);
                        printf("车辆类型和编号 %s,%s\n",car[car_stall_num].type,car[car_stall_num].num); 
车出去
字符串比较
strcmp("VNBR",type_tem)==0 
字符串复制
strcpy(car[car_stall_num].type,"VNBR"); 
串口重定向
int fputc(int ch, FILE *f) 
{
  HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);
  return ch;
} 
车费计算还没有写喔
五、PWM
//pwm
void pwm_on(void)
{
    __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,100-1);
}
void pwm_off(void)
{
    __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,0);
}
                
















![[数据结构]不带头单向非循环链表](https://img-blog.csdnimg.cn/direct/ded8719e310d491f912e5ac8e02551eb.png)

