蓝桥杯学习笔记 ——十三届第一场

本文详细描述了使用STM32进行界面转换,包括PSD和STA两种模式,利用按键控制密码输入和LED指示,通过串口通信接收数据,并实现PWM信号输出和定时器定时功能。展示了如何处理中断和状态管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

前言

一、界面转换

二、按键

三、LED

四、串口通信

五、PWM信号输出

 六、定时器定时

总结


前言


一、界面转换

通过枚举变量设置两个界面,改变界面时只需要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++;
	}
}


总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值