简介:好久不来更新啦!因为学业忙碌,所以码代码的时间持续减少,不过最近省赛临近,应该会陆续更新。废话少说,直接上干货。这次做的真题是第十届省赛题,题目难度不大。
一.题目
二.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
征途漫漫,你我皆是逆旅,因为曾经淋雨时有人撑伞,今日也希望我的点点微薄之力可以给你的征途带来些许光亮