目录

前言

代码实现

全局变量部分

函数部分

led部分

lcd部分

pwm部分

ADC部分

key部分

总结


前言

本届省赛题相对来说应该是很简单的了,主要模块led,lcd,key,adc,pwm便没有了,基本上不会有什么大问题,会出现问题的地方大概在pwm这里。本次我便不使用思维导图的形式了。直接看代码吧。

代码实现

全局变量部分

struct keys{
	uchar sw_sta;
	bool key_sta;
	bool long_sta;
	bool short_sta;
	uint16_t key_time;
};

struct keys key[4]={0};

bool p_flag=0;
bool mode_flag=0;
uint8_t pa6_sta=10;
uint8_t pa7_sta=10;

char text[30];

上面的结构体是用于按键的,可以参考:蓝桥嵌入式第九届部分功能实现——按键长短按+LCD高亮显示

函数部分

void key_use(void);
void led_use(void);
void lcd_use(void);
void p1(void);
void p2(void);
void pwm_use(void);
uint16_t ADC_Get(void);

p1,p2为两个页面。

led部分

void led_use(void){
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
	
	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);
	
	if(mode_flag==0){
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
	}else{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
	}
	
	if(p_flag==1){
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
	}else{
		HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
	}
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}

lcd部分

void lcd_use(void){
	if(p_flag==0)
		p1();
	else
		p2();
}

void p1(void){
	sprintf(text,"      Data    ");
	LCD_DisplayStringLine(Line0,(uint8_t *)text);
	sprintf(text,"    V:%.2lf V    ",ADC_Get()*3.3/4096);
	LCD_DisplayStringLine(Line2,(uint8_t *)text);
	if(mode_flag==0){
		sprintf(text,"    Mode:AUTO    ");
	}else{
		sprintf(text,"    Mode:MANU    ");
	}
	LCD_DisplayStringLine(Line4,(uint8_t *)text);
}

void p2(void){
	sprintf(text,"      Para    ");
	LCD_DisplayStringLine(Line0,(uint8_t *)text);
	
	sprintf(text,"    PA6:%d%%    ",pa6_sta);
	LCD_DisplayStringLine(Line2,(uint8_t *)text);
	
	sprintf(text,"    PA7:%d%%    ",pa7_sta);
	LCD_DisplayStringLine(Line4,(uint8_t *)text);
}

在使用时可能会出现led和lcd冲突的情况,可以参考:蓝桥嵌入式第十届省赛做题分享(ADC校准、LED与LCD冲突)

pwm部分

void pwm_use(void){
	if(mode_flag==0){
		//auto
		pa6_sta=pa7_sta;
		__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,100*(ADC_Get()*3.3/4096)/3.3);
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,100* (ADC_Get()*3.3/4096)/3.3);
	}else{
		//manu
		__HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_sta);
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_sta);
	}
}

ADC部分

uint16_t ADC_Get(void){
	uint16_t temp=0;
	HAL_ADC_Start(&hadc2);
	temp = HAL_ADC_GetValue(&hadc2);
	HAL_ADC_Stop(&hadc2);
	return temp;
}

这里要记得进行ADC的校准,参考:蓝桥嵌入式第十届省赛做题分享(ADC校准、LED与LCD冲突)

key部分

void key_use(void){
	if(key[0].short_sta==1){
		p_flag = !p_flag;//0-data  1-para
		key[0].short_sta=0;
	}
	
	if(key[1].short_sta==1){
		if(p_flag==1){
			pa6_sta+=10;
			if(pa6_sta>=100)
				pa6_sta=10;
		}
		key[1].short_sta=0;
	}
	
	if(key[2].short_sta==1){
		if(p_flag==1){
			pa7_sta+=10;
			if(pa7_sta>=100)
				pa7_sta=10;
		}
		key[2].short_sta=0;
	}
	
	if(key[3].short_sta==1){
		mode_flag = !mode_flag;//0-auto  1-manu
		key[3].short_sta=0;
	}
}

关于这个key函数如何写,可以参考:蓝桥嵌入式第九届部分功能实现——按键长短按+LCD高亮显示

总结

本次需要实现的功能在往期大部分都有,只需要把各个模块串联起来即可。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐