蓝桥嵌入式第十一届省赛做题分析
本届省赛题相对来说应该是很简单的了,主要模块led,lcd,key,adc,pwm便没有了,基本上不会有什么大问题,会出现问题的地方大概在pwm这里。本次我便不使用思维导图的形式了。直接看代码吧。本次需要实现的功能在往期大部分都有,只需要把各个模块串联起来即可。
·
目录
前言
本届省赛题相对来说应该是很简单的了,主要模块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高亮显示
总结
本次需要实现的功能在往期大部分都有,只需要把各个模块串联起来即可。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)