FQQQ的蓝桥杯

蓝桥杯15届备战Day2

13届蓝桥杯省赛



前言

备战蓝桥杯嵌入式,刷题第二天,对象为13届蓝桥杯省赛题
工程代码在此 网盘
提取码:xrpg

提示:以下是本篇文章正文内容,下面案例可供参考

主观题程序设计

1.CUBEMAX配置

时钟配置 选择外部高速时钟 80M就行了官方用的80M
在这里插入图片描述

在这里插入图片描述

按键配置
在这里插入图片描述
定时器配置 10ms 80M / (80 - 1) / (10000 - 1)
在这里插入图片描述
PA1 配置PWM输出 f = Clock/(psc + 1)/(counter + 1)
在这里插入图片描述

串口配置 异步模式 一定要勾选串口中断
在这里插入图片描述
在这里插入图片描述

2.代码部分(分享思路和简单实现任务)

按键的代码如下:

struct My_Key_Structure
{
	uint8_t key_flag;
	uint8_t key_state;
	uint8_t key_short;
	uint8_t key_long;
	uint8_t key_zt;
	uint16_t key_tim;

};
struct My_Key_Structure mykey[4]={0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	uint8_t i = 0;
	if(htim->Instance == TIM17)
	{
		mykey[0].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
		mykey[1].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
		mykey[2].key_state = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
		mykey[3].key_state = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	}
	for(i = 0;i < 4 ;i++)
	{
			if(mykey[i].key_zt == 0 && mykey[i].key_state == 0)
				{
					mykey[i].key_tim = 0;
					mykey[i].key_zt++;
				}
				else if(mykey[i].key_zt == 1 && mykey[i].key_state == 0)
				{
						mykey[i].key_zt++;
				}
				else if(mykey[i].key_zt == 2 && mykey[i].key_state == 0)
				{
					mykey[i].key_tim++;
					if(mykey[i].key_tim>=200)
					{
					mykey[i].key_long = 1;
					}
					
				}
				else if(mykey[i].key_zt == 2 && mykey[i].key_state == 1)//松手时释放状态
				{
					mykey[i].key_zt = 0;
					if(mykey[i].key_tim<50)
					{
					mykey[i].key_short = 1;
					}
				}

		

	}

}

//串口部分,只有7个字符所以我们有8位,最后一位是字符串的结束符'\0'
uint8_t tdata;
uint8_t data_s[8];
uint8_t rx_flag = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	static uint8_t cnt;
	if(huart->Instance == USART1)
	{
		if(rx_flag == 0)
		{
		data_s[cnt] = tdata;
		cnt++;
		if(cnt == 7)
		{
			data_s[cnt] = '\0';
			rx_flag = 1;
			cnt = 0;
		
		}
		}
	}
		HAL_UART_Receive_IT(huart,&tdata,1);




}



//任务部分
uint8_t check_code(void)//密码检查
{
	uint8_t ta_num = 0;
	for(uint8_t i = 0 ; i < 3 ;i++)
	{
		if(my_code[i] == my_taget_code[i])
		{
			ta_num++;
		}
	
	
	}
	return ta_num;



}

void Change_code(void)//密码更改
{
		uint8_t ta_num = 0;
	for(uint8_t i = 0 ; i < 3 ;i++)
	{
		my_taget_code[i] = data_s[4+i];
	
	}

}
void return_code(void)//密码还原
{

			uint8_t ta_num = 0;
	for(uint8_t i = 0 ; i < 3 ;i++)
	{
		my_code[i] = '@';
	
	}



}

注意一定要在while前初始化这些外设

 /* USER CODE BEGIN 2 */
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	HAL_TIM_Base_Start_IT(&htim17);
	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	HAL_UART_Receive_IT(&huart1,&tdata,1);//很重要
  /* USER CODE END 2 */

总结

以上就是今天要讲的内容,蓝桥杯不要纠结什么好看的代码,目标是能在规定的时间内完成尽可能多的任务,以及复习了数电模电单片机的相关知识,看完不要忘记点赞谢谢铁铁们,可以在评论区交流

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值