文章目录
前言
一、界面转换
通过枚举变量设置两个界面,改变界面时只需要Interface赋PSD或STA值就行。
代码如下:
enum Interface_m{
PSD = 0,
STA = 1
};
enum Interface_m Interface;
void PSD_Interface()
{
uint8_t display[20];
sprintf((char *)display," PSD");
LCD_DisplayStringLine(Line2,display);
sprintf((char *)display," B1:%c",NewSecrect[0]);
LCD_DisplayStringLine(Line4,display);
sprintf((char *)display," B2:%c",NewSecrect[1]);
LCD_DisplayStringLine(Line5,display);
sprintf((char *)display," B3:%c",NewSecrect[2]);
LCD_DisplayStringLine(Line6,display);
}
void STA_Interface()
{
uint8_t display[20];
if(ClearFlg == 1)
{
ClearFlg = 0;
LCD_ClearLine(Line4);LCD_ClearLine(Line5);LCD_ClearLine(Line6);
}
sprintf((char *)display," STA");
LCD_DisplayStringLine(Line2,display);
sprintf((char *)display," F:2000HZ");
LCD_DisplayStringLine(Line4,display);
sprintf((char *)display," D:10%%");
LCD_DisplayStringLine(Line5,display);
if(Count >= 50)
{
htim2.Instance->ARR = 99;
htim2.Instance->CCR2= 10;
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
Count = 0;
StateFlg = 0;
LCD_ClearLine(Line4);LCD_ClearLine(Line5);LCD_ClearLine(Line6);
NewSecrect[0] = '@';NewSecrect[1] = '@';NewSecrect[2] = '@';
Interface = PSD;LD1Flg = 0;
}
}
void LCD_Prosess()
{
if(Interface == PSD) PSD_Interface();
else if(Interface == STA) STA_Interface();
}
二、按键
按键写在定时器15的中断中,定时器溢出时间设置为20ms
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t b1Flg,b2Flg,b3Flg,b4Flg;
if(htim == &htim16)
{
if(Interface == PSD)//题目要求B1,B2,B3只在密码输入界面作用
{
if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == 1 && b1Flg == 0)
{
b1Flg = 1;
}
else if(HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin) == 0 && b1Flg == 1)
{
b1Flg = 0;
if(NewSecrect[0] == '@') NewSecrect[0] = '0';//@是字符,所以直接用字符显示
else
{
NewSecrect[0]++;//‘0’-‘9’=0x30=0x39
if(NewSecrect[0] > '9') NewSecrect[0] = '0';
}
}
if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin) == 1 && b2Flg == 0)
{
b2Flg = 1;
}
else if(HAL_GPIO_ReadPin(B2_GPIO_Port,B2_Pin) == 0 && b2Flg == 1)
{
b2Flg = 0;
if(NewSecrect[1] == '@') NewSecrect[1] = '0';
else
{
NewSecrect[1]++;
if(NewSecrect[1] > '9') NewSecrect[1] = '0';
}
}
if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin) == 1 && b3Flg == 0)
{
b3Flg = 1;
}
else if(HAL_GPIO_ReadPin(B3_GPIO_Port,B3_Pin) == 0 && b3Flg == 1)
{
b3Flg = 0;
if(NewSecrect[2] == '@') NewSecrect[2] = '0';
else
{
NewSecrect[2]++;
if(NewSecrect[2] > '9') NewSecrect[2] = '0';
}
}
}
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin) == 1 && b4Flg == 0)
{
b4Flg = 1;
}
else if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin) == 0 && b4Flg == 1)
{
b4Flg = 0;
if(NewSecrect[0] == OldSecrect[0] && NewSecrect[1] == OldSecrect[1] && NewSecrect[2] == OldSecrect[2])//密码正确
{
ClearFlg = 1;//清屏
Interface = STA;//转到输出状态界面
LD1Flg = 1;//LED1亮
htim2.Instance->ARR = 499;//设置2KHz
htim2.Instance->CCR2= 50;//10%占空比
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);//输出PWM
StateFlg = 1;//PWM输出时间计数
}
else //密码错误
{
errCount++;//错误次数
if(errCount >= 3) ErrFLg = 1;//大于3,LED2闪烁
NewSecrect[0] = '@';//密码显示重置
NewSecrect[1] = '@';
NewSecrect[2] = '@';
}
}
}
}
三、LED
void LED_Control()
{
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
if(LD1Flg == 1) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
else if(LD1Flg == 0) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
if(LD2Flg) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
else if(LD2Flg == 0) HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
四、串口通信
使用DMANormal中断接收数据
int main(void)
{
HAL_UART_Receive_DMA(&huart1,(uint8_t*)RxData,sizeof(RxData));
while(1)
{
if(RxFlg == 1)
{
RxFlg = 0;
//密码正确
if(OldSecrect[0] == RxData[0] && OldSecrect[1] == RxData[1] && OldSecrect[2] == RxData[2])
{
OldSecrect[0] = RxData[3];//修改密码
OldSecrect[1] = RxData[4];
OldSecrect[2] = RxData[5];
}
}
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//注意引脚是A9,A10
{
if(huart == &huart1)
{
RxFlg = 1;
HAL_UART_Receive_DMA(&huart1,(uint8_t*)RxData,sizeof(RxData));
}
}
五、PWM信号输出
if(Count >= 50)//五秒之后
{
htim2.Instance->ARR = 99;//1KHz
htim2.Instance->CCR2= 10;//10%占空比
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
Count = 0;//清零
StateFlg = 0;//关闭时间计数
LCD_ClearLine(Line4);LCD_ClearLine(Line5);LCD_ClearLine(Line6);
NewSecrect[0] = '@';NewSecrect[1] = '@';NewSecrect[2] = '@';
Interface = PSD;//改变界面
LD1Flg = 0;//LED1熄灭
}
六、定时器定时
设置定时器15 0.1秒溢出中断,预分频7999,自动重装载999
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint8_t ErrFLg,blinkCount,errCount;
if(htim == &htim15)
{
if(ErrFLg == 1)
{
LD2Flg = ~LD2Flg;//LED2闪烁
blinkCount++;//LED计时
if(blinkCount >= 50) //超过5秒
{
ErrFLg = 0;
blinkCount = 0;//清零
}
}
if(StateFlg == 1) Count++;
}
}