所需:
PA7 PWM LED(锁存器) 串口9600 LCD 按键4个,整体难在逻辑,我们先配置好硬件,进入工程
PA7要求:2KHZ,初始化占空比0 串口一,打开接收中断
首先我们大概想一下轮廓,首先一辆车进来,我们第一要判断他这个车在不在我们的停车场里,然后如果在的话,就给他结账,如果不在的话,我们需要判断现在停车场里是否有车位,如果有,则保存其信息,如果没有,则不管。
先把八股文写一下:
按键:
uint8_t Key_Scan()
{
static uint8_t value;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET) value = 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET) value = 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == GPIO_PIN_RESET) value = 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET) value = 4;
else value = 0;
return value;
}
void Key_Proc()
{
if(uwTick - uwTick_Key_Speed < 100) return;
else uwTick_Key_Speed = uwTick;
key_value = Key_Scan();
key_up = -key_value&(key_value ^ key_old);
key_down = key_value&(key_value ^ key_old);
key_old = key_value;
switch(key_down)
{
case 1:
LCD_flag^=1;
break;
case 2:
if(LCD_flag == 1)
{
CNBR_Price += 0.5;
VNBR_Price += 0.5;
}
break;
case 3:
if(LCD_flag == 1)
{
CNBR_Price -= 0.5;
VNBR_Price -= 0.5;
if(VNBR_Price < 0)
{
VNBR_Price = 0;
}
if(CNBR_Price < 0)
{
CNBR_Price = 0;
}
}
break;
case 4:
control_flag ^= 1;
break;
}
LCD
void LCD_DISPLAY_Data()
{
sprintf((char *)str," Data ");
LCD_DisplayStringLine(Line1,str);
sprintf((char *)str," CNBR: ");
LCD_DisplayStringLine(Line3,str);
sprintf((char *)str," VNBR: ");
LCD_DisplayStringLine(Line5,str);
sprintf((char *)str," IDLE: ");
LCD_DisplayStringLine(Line7,str);
}
void LCD_DISPLAY_Para()
{
sprintf((char *)str," Para ");
LCD_DisplayStringLine(Line1,str);
sprintf((char *)str," CNBR:%.2f ",CNBR_Price);
LCD_DisplayStringLine(Line3,str);
sprintf((char *)str," VNBR:%.2f ",VNBR_Price);
LCD_DisplayStringLine(Line5,str);
sprintf((char *)str," ");
LCD_DisplayStringLine(Line7,str);
}
void LCD_Proc()
{
if(uwTick - uwTick_LCD_Speed < 100) return;
else uwTick_LCD_Speed = uwTick;
if(LCD_flag == 0) LCD_DISPLAY_Data();
else LCD_DISPLAY_Para();
if( control_flag == 0) TIM3->CCR2 = 0;
else TIM3->CCR2 = 100;
if(process_flag == 1) data_process(car_data[22]);
else return;
}
LED
void LED_Disp(uint8_t ucled)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void LED_Proc()
{
int sum = 0;
if(uwTick - uwTick_LED_Speed < 100) return;
else uwTick_LED_Speed = uwTick;
for(int i = 0;i<8;i++)
{
sum += car_postion.idle[i];
}
if(sum !=8) LED_Disp(0x01);
else LED_Disp(0x00);
sprintf((char *)str," NUMBER:%d ",sum);
LCD_DisplayStringLine(Line6,str);
}
串口
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
sprintf((char *)tx_buff,"uart");
HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
// sscanf((char *)rx_buff,"%4s:%4s",type,id);
// sprintf((char *)tx_buff,"ID: %4s",id);
// HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
for(i = 0;i<22;i++)
{
car_data[i] = rx_buff[i];
}
process_flag = 1;
HAL_UART_Receive_IT(&huart1,rx_buff,22);
}
逻辑部分,先检查ID,在判断,是否有车位
uint8_t check_car_id()
{
for( i = 0;i<8;i++)
{
if((car_postion.car_id[4*i+0] == id[0])&&(car_postion.car_id[4*i+1] == id[1])
&&(car_postion.car_id[4*i+2] == id[2])&&(car_postion.car_id[4*i+3] == id[3]))
{
sprintf((char *)tx_buff,"i = %d",i);
HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
return i;
}
}
return 30;
}
数据处理
void data_process(uint8_t data)
{
uint8_t check = check_car_id();
if(check !=30)
{
sscanf((char *)data,"%4s:%4s:%2d%2d%2d%2d%2d",&car_postion.type[4*check],&car_postion.car_id[4*check],
&car_postion.Start_Year[check],&car_postion.Start_Month[check],
&car_postion.Start_Min[check],&car_postion.Start_Hour[check]);
put_price();
for(i = 0;i<4;i++)
{
car_postion.car_id[4*check+i] = 28;
car_postion.type[4*check+i] = 28;
}
car_postion.idle[check] = 0;
// sprintf((char *)tx_buff,"haaa");
// HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
}
else //reach the park
{
for(i = 0;i<8;i++)
{
sum += car_postion.idle[i];
}
if(sum !=8)
{
// sprintf((char *)tx_buff,"idle = %d",car_postion.idle[0]);
// HAL_UART_Transmit(&huart1,tx_buff,100,0xFF);
for(i= 0;i<8;i++)
{
if(car_postion.idle[i] == 0)
{
car_postion.idle[i] = 1;
sprintf((char *)str," bomm ");
LCD_DisplayStringLine(Line9,str);
// sscanf((char *)data,"%4s:%4s",&car_postion.type[4*i],&car_postion.car_id[4*i]);
for(j = 0;j<4;j++)
{
car_postion.car_id[4*i+j] = rx_buff[5+j];
}
// sscanf((char *)rx_buff,"%4s:%4s",&car_postion.type[4*i],&car_postion.car_id[4*i]);
sprintf((char *)str," %4s ",&car_postion.car_id[4*i]);
LCD_DisplayStringLine(Line8,str);
LED_Disp(0x55);
break;
}
}
}
}
process_flag = 0;
}
put_price俺就不写了,具体就是清算费用,然后把对应的idle置0,明天就是国赛了,俺感觉RTC、长短按、局部高亮、EEPROM存取多字节数据,这几个会考,今天看看客观题,睡个好觉,明天希望大家都拿国一。



