蓝桥杯第十届真题

        简介:好久不来更新啦!因为学业忙碌,所以码代码的时间持续减少,不过最近省赛临近,应该会陆续更新。废话少说,直接上干货。这次做的真题是第十届省赛题,题目难度不大。

一.题目

 

 二.CubeMX的配置

外设的配置很少,常规的LED,按键和LCD,唯一不同的他需要采集ADC采集内部电压。

三.代码的编写 

主函数

unsigned char str1pre[20],str1[20],status[10],status_pre[10];
unsigned char LCD_flag,LEDU_flag=1,LEDL_flag=2,light_flag=1;//light_flag-高亮标志符,LEDL_flag-低位LED标志符,LEDU_flag高位标志符
//LCD_flag页面标志符
uint16_t LED[9]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
float ADC_Value,ADC_Upper=2.4,ADC_Lower=1.2;

ADC的采集

float ADC(void)
{
	float adc_value;
	HAL_ADC_Start(&hadc2);
	HAL_ADC_PollForConversion(&hadc2,0xffff);
	adc_value=HAL_ADC_GetValue(&hadc2)*3.3/4096;
	return adc_value;
}

LCD的显示

void LCD_Disp(void)
{
	unsigned char str[50];	
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);

	if(LCD_flag==0)
	{	
		if(ADC_Value>ADC_Upper)
	{
		strcpy(status,"Upper");
		LED_Disp(LED[LEDU_flag]);
		HAL_Delay(200);
		LED_Disp(LED[0]);
		HAL_Delay(200);
	}
	else if(ADC_Value<ADC_Lower)
	{
		strcpy(status,"Lower");
		LED_Disp(LED[LEDL_flag]);
		HAL_Delay(200);
		LED_Disp(LED[0]);
		HAL_Delay(200);
	}
	else
	{
		strcpy(status,"Normal");
		LED_Disp(LED[0]);
	}
	if(strlen(status)<strlen(status_pre))
	{
		LCD_Clear(Blue);
	}
	strcpy(status_pre,status);
		sprintf(str1,"       Main   ");
		LCD_DisplayStringLine(Line2,str1);
		sprintf(str,"  Volt: %.2fV",ADC_Value);
		LCD_DisplayStringLine(Line4,str);
		sprintf(str,"  Status: %s",status);	
		LCD_DisplayStringLine(Line6,str);		

	}
	else 
	{
		LED_Disp(LED[0]);
		sprintf(str1,"       Setting     ");
		LCD_DisplayStringLine(Line2,str1);
	if(light_flag==1)
		LCD_SetBackColor(Green);
		sprintf(str,"  Max Volt: %.2fV",ADC_Upper);
		LCD_DisplayStringLine(Line3,str);		
		LCD_SetBackColor(Blue);
		if(light_flag==2)
		LCD_SetBackColor(Green);
		sprintf(str,"  Min Volt: %.2fV",ADC_Lower);
		LCD_DisplayStringLine(Line4,str);
		LCD_SetBackColor(Blue);
		if(light_flag==3)
		LCD_SetBackColor(Green);
		sprintf(str,"  Upper: LD%d",LEDU_flag);
		LCD_DisplayStringLine(Line5,str);	
		LCD_SetBackColor(Blue);
		if(light_flag==4)
		LCD_SetBackColor(Green);
		sprintf(str,"  Lower: LD%d",LEDL_flag);
		LCD_DisplayStringLine(Line6,str);			
		LCD_SetBackColor(Blue);
	}
	if(strlen(str1pre)!=strlen(str1))
	{
		LCD_Clear(Blue);
	}
	strcpy(str1pre,str1);
}

 按键程序的编写

unsigned char keynum;
void Key_Scan(void)
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)//切换页面
	{
		keynum++;
		if(keynum>20)
		{
			keynum=0;
			while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0);
			LCD_flag=!LCD_flag;
		}
	}

	if(LCD_flag==1)
	{
		//页面设置
		if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)
	{
		keynum++;
		if(keynum>20)
		{
			keynum=0;
			while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0);
			light_flag++;
			if(light_flag>4)
				light_flag=1;
		}
	}
	//加
			if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
	{
		keynum++;
		if(keynum>20)
		{
			keynum=0;
			while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0);
		if(light_flag==1)
		{
			if(ADC_Upper<3.29)
			ADC_Upper+=0.3;
		}
		if(light_flag==2)
		{
			if(ADC_Lower<3.29)
			ADC_Lower+=0.3;
		}	
		if(light_flag==3)
		{
			do
			{	
				LEDU_flag++;
				if(LEDU_flag>8)
				{
				LEDU_flag=1;
				}
			}
			while(LEDL_flag==LEDU_flag);
		}
				if(light_flag==4)
		{
			do
			{	
				LEDL_flag++;
				if(LEDL_flag>8)
				{
				LEDL_flag=1;
				}
			}
			while(LEDL_flag==LEDU_flag);
		}
		}
	}
	//减
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)
	{
		keynum++;
		if(keynum>20)
		{
			keynum=0;
			while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0);
					if(light_flag==1)
		{
			if(ADC_Upper>0.01)
			ADC_Upper-=0.3;
		}
		if(light_flag==2)
		{
			if(ADC_Lower>0.01)
			ADC_Lower-=0.3;
		}	
		if(light_flag==3)
		{
			do
			{	
				LEDU_flag--;
				if(LEDU_flag<1	)
				{
				LEDU_flag=8;
				}
			}
			while(LEDL_flag==LEDU_flag);
		}
				if(light_flag==4)
		{
			do
			{	
				LEDL_flag--;
				if(LEDL_flag<1)
				{
				LEDL_flag=8;
				}
			}
			while(LEDL_flag==LEDU_flag);
		}
		}
	}
}
}

LED的函数编写

void LED_Disp(uint16_t led)
{
	GPIOC->ODR=~(led<<8);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

主要的难点是文字的高亮,对于一些错误的处理。

工程文件如下:

链接:https://pan.baidu.com/s/1v0wRP633itRlGC6yDHRWFA 
提取码:ascd

        征途漫漫,你我皆是逆旅,因为曾经淋雨时有人撑伞,今日也希望我的点点微薄之力可以给你的征途带来些许光亮

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值