一. main.c
void Key_Proc(void)
{
if(uwTick-uwTick_key<10) return;
uwTick_key=uwTick;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)//B1
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_state==0))//B1
{
Key_state=1;
LCD_SHOW++;
LCD_Clear(Black);
if(LCD_SHOW>=2)
{
LCD_SHOW=0;
}
}
}
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_state==1))//B1
{
Key_state=0;
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)//B2
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)&&(Key_state==0)&&(LCD_SHOW==1))//B2
{
Key_state=2;
Parking_fee[0]+=50;
Parking_fee[1]+=50;
}
}
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)!=GPIO_PIN_RESET)&&(Key_state==2))//B2
{
Key_state=0;
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)//B3
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)&&(Key_state==0)&&(LCD_SHOW==1))//B3
{
Key_state=3;
Parking_fee[0]-=50;
Parking_fee[1]-=50;
}
}
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)!=GPIO_PIN_RESET)&&(Key_state==3))//B3
{
Key_state=0;
}
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)//B4
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_state==0))//B4
{
Key_state=4;
PA7_sign^=1;
}
}
if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_state==4))//B4
{
Key_state=0;
}
}
void LCD_Proc(void)
{
if(LCD_SHOW==0)
{
sprintf((char *)LCD_STR,"123456789A123456789B");
LCD_DisplayStringLine(Line0,LCD_STR);
sprintf((char *)LCD_STR," Data");
LCD_DisplayStringLine(Line1,LCD_STR);
sprintf((char *)LCD_STR," CNBR:%d",Car_num[0]);
LCD_DisplayStringLine(Line3,LCD_STR);
sprintf((char *)LCD_STR," VNBR:%d",Car_num[1]);
LCD_DisplayStringLine(Line5,LCD_STR);
sprintf((char *)LCD_STR," IDLE:%d",Car_num[2]);
LCD_DisplayStringLine(Line7,LCD_STR);
sprintf((char *)LCD_STR," %d",Str_num);
LCD_DisplayStringLine(Line8,LCD_STR);
sprintf((char *)LCD_STR," %s%s ",packing[0].car_name,car_id);
LCD_DisplayStringLine(Line9,LCD_STR);
}
else if(LCD_SHOW==1)
{
sprintf((char *)LCD_STR,"123456789A123456789B");
LCD_DisplayStringLine(Line0,LCD_STR);
sprintf((char *)LCD_STR," Para");
LCD_DisplayStringLine(Line1,LCD_STR);
sprintf((char *)LCD_STR," CNBR:%d.%d%d",Parking_fee[0]/100,Parking_fee[0]/10%10,Parking_fee[0]%10);
LCD_DisplayStringLine(Line3,LCD_STR);
sprintf((char *)LCD_STR," VNBR:%d.%d%d",Parking_fee[1]/100,Parking_fee[1]/10%10,Parking_fee[1]%10);
LCD_DisplayStringLine(Line5,LCD_STR);
}
}
void PA7_Proc(void)
{
if(PA7_sign==0)
{
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,100);
}
else
{
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_2,0);
}
}
void LED_Init(void)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
void LED_SHOW(uint8_t led)
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, led<<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)
{
LED_SHOW(LED);
if(Pack_id()!=0xff)//有停车位
{
LED|=0x01;
}
else if(Pack_id()==0xff)
{
LED&=0xfe;
}
if(PA7_sign==0)//有脉冲
{
LED|=0x02;
}
else
{
LED&=0xfd;
}
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM6_Init();
MX_USART1_UART_Init();
MX_RTC_Init();
/* USER CODE BEGIN 2 */
LCD_Init();
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
LCD_Clear(Black);
HAL_TIM_Base_Start_IT(&htim6);
HAL_UART_Receive_IT(&huart1,Rx_buf,1);
HAL_TIM_PWM_Start_IT(&htim3,TIM_CHANNEL_2);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
LED_Proc();
PA7_Proc();
LCD_Proc();
Packing_Proc();
Key_Proc();
}
/* USER CODE END 3 */
}
二 . usart.c
int a;
__IO uint32_t uwTick_pack;
uint8_t Rx_str[99];//接收的字符串
uint8_t Tx_str[20];
uint32_t Str_num=0;
uint8_t Rx_buf[1];
uint8_t Rx_sign=0;//接收标志位
uint8_t Inspect_sign=0;// 0-待定状态 1-错误 2-正确出库
int Packing_time=0;
int Parking_cost=0;
struct Packing packing[8];
int tsxt;
int sing=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
if(Str_num==0)
{
sing=1;
}
if(sing==1)
{
Rx_str[Str_num]=Rx_buf[0];
Str_num++;
}
else
{
Str_num=0;
}
HAL_UART_Receive_IT(&huart1,Rx_buf,1);
}
}
uint8_t Str_correct(uint8_t* str)//检查字符串是否正确
{
uint8_t i=0;
if(Str_num==22)
{
if( ((str[0]=='C')||(str[0]=='V'))&&(str[1]=='N')&&(str[2]=='B')&&(str[3]=='R')&&(str[4]==':')&&(str[9]==':') )
{
for(i=10;i<=21;i++)
{
if((str[i]<'0')||(str[i]>'9'))
{
return 4;//时间数字错误
}
}
if( (str[12]==0)&&((str[13]<'0')||(str[13]>'9')) )//1-9月
{
return 5;//月份错误
}
else if( (str[12]==1)&&((str[13]<'0')||(str[13]>'2')) )//10-12月
{
return 5;//月份错误
}
}
else//类型等字符不正确
{
return 1;
}
}
else if(Str_num==0)//无数据
{
return 2;
}
else//字符数量错误
{
return 3;
}
return 0;
}
uint32_t Pack_id(void)//判断有无车位-并且返回停车号
{
uint32_t i=0;
for(i=0;i<8;i++)
{
if(packing[i].Packing_id ==0 )
return i;
}
return 0xff;
}
uint32_t Car_type(void)//判断停车类型
{
uint32_t i;
if(Rx_str[0]=='C')
{
i= 1;
}
else if(Rx_str[0]=='V')
{
i= 2;
}
return i;
}
void Str_txtrat(uint8_t* Str_targe,uint8_t *Str,uint8_t start,uint8_t end)
{
char i;
for(i=0;i<=end;i++)
{
Str_targe[i]=Str[start+i];
}
Str[end+1]='\0';
}
void substr(uint8_t* d_str, uint8_t* s_str, uint8_t locate, uint8_t length)//从长字符串里边提取出一段给短字符串
{
uint8_t i = 0;
for(i=0; i<length; i++)
{
d_str[i] = s_str[locate + i];
}
d_str[length] = '\0';
}
uint8_t Car_id_correct(uint8_t *Str)// 0-车库内没有该车辆 1-车库内有该车辆
{
uint8_t i=0;
for(i=0;i<8;i++)
{
if(strcmp((const char *)Str,packing[i].car_name)==0)
{
return i;
}
}
return 0xff;
}
uint8_t car_id[5];
uint8_t car_type;
uint8_t year_temp,month_temp,day_temp,hour_temp,min_temp,sec_temp;
int str_id;
int tsxt;
void Packing_Proc(void)
{
if(uwTick-uwTick_pack<200) return;
uwTick_pack=uwTick;
int id,i;
if(Str_num==22)
{
if(Str_correct(Rx_str)==0)//接收到字符串并且正确
{
year_temp = (((Rx_str[10] - '0')*10) + (Rx_str[11] - '0'));
month_temp = (((Rx_str[12] - '0')*10) + (Rx_str[13] - '0'));
day_temp = (((Rx_str[14] - '0')*10) + (Rx_str[15] - '0'));
hour_temp = (((Rx_str[16] - '0')*10) + (Rx_str[17] - '0'));
min_temp = (((Rx_str[18] - '0')*10) + (Rx_str[19] - '0'));
sec_temp = (((Rx_str[20] - '0')*10) + (Rx_str[21] - '0'));
if((month_temp>12)||(day_temp>31)||(hour_temp>23)||(min_temp>59)||(sec_temp>59))//验证日期和时间是否合法
{
Inspect_sign=1;//时间不合法
tsxt=1;
}
for(i=5;i<=8;i++)//存车牌号到预备数组
{
car_id[i-5]=Rx_str[i];
}
car_id[4]='\0';
car_type=Car_type();//存停车类型到预备数组
if(Car_id_correct(car_id)==0xff)//车库内没有这辆车----开始录入信息
{
id=Pack_id();
if(id == 0xFF)//没有找到哪个地方是空的
{
Inspect_sign=1;//无车位
tsxt=2;
}
if(Inspect_sign!=1)
{
packing[id].type=car_type;//把当前车的类型存入
// substr((uint8_t *)packing[id].car_name, car_id, 0, 4);//把当前车的id存入
for(i=0; i<4; i++)
{
packing[id].car_name[i] = car_id[i];
}
packing[id].car_name[4] = '\0';
packing[id].Packing_id=1;
packing[id].time.year = year_temp;
packing[id].time.month = month_temp;
packing[id].time.date = day_temp;
packing[id].time.huor = hour_temp;
packing[id].time.minute = min_temp;
packing[id].time.second = sec_temp;
if(car_type == 1)
Car_num[0]++;
else if(car_type == 2)
Car_num[1]++;
Car_num[2]--;
}
}
else if(Car_id_correct(car_id)!=0xff)//车库内有这辆车
{
id=Car_id_correct(car_id);//得到该车得停车位
str_id=id;
//把时间算出来
Packing_time=(((year_temp-packing[id].time.year)*8640)+ ((month_temp-packing[id].time.month)*720)+((day_temp-packing[id].time.date)*24)+(hour_temp-packing[id].time.huor));
if(Packing_time<0)//时间小于入库时间-有错误
{
Inspect_sign=1;//错误
tsxt=3;
}
else if(Packing_time>=0)//不足一个小时按一个小时算
{
Packing_time=1;
}
//把该停车位置零
packing[id].Packing_id=0;
//把名字清除因为先判断有没有这辆车再判断有没有车位
// Inspect_sign=2;//发送字符串
if(Inspect_sign==0)
{
if(car_type == 1)//
{
Car_num[0]--;
Parking_cost=Parking_fee[0]*Packing_time;
}
else if(car_type == 2)
{
Car_num[1]--;
Parking_cost=Parking_fee[1]*Packing_time;
}
Car_num[2]++;
if(car_type==1)
{
sprintf((char *)Tx_str,"CNBR:%s:%d:%d.%d%d\r\n",packing[str_id].car_name,Packing_time,Parking_cost/100,Parking_cost/10%10,Parking_cost%10);
}
else if(car_type==2)
{
sprintf((char *)Tx_str,"VNBR:%s:%d:%d.%d%d\r\n",packing[str_id].car_name,Packing_time,Parking_cost/100,Parking_cost/10%10,Parking_cost%10);
}
HAL_UART_Transmit(&huart1,Tx_str,strlen((const char *)Tx_str),50);
}
for(i=0;i<=strlen((const char *)Rx_str);i++)
{
Rx_str[i]='\0';
}
strcpy(packing[id].car_name," ");
tsxt=6;
}
}
else if(Str_correct(Rx_str)==2)return;
else
{
Inspect_sign=1;//字符串错误
tsxt=5;
}
if(Inspect_sign==1)//错误
{
sprintf((char *)Tx_str,"Error\r\n");
HAL_UART_Transmit(&huart1,Tx_str,strlen((const char *)Tx_str),50);
}
// strcpy((char *)Rx_str, "");
Inspect_sign=0;
for(i=0;i<=strlen((const char *)car_id);i++)
{
car_id[i]='\0';
}
Str_num=0;
sing=0;
}
}