蓝桥杯嵌入式第十一届(第一场)省赛

一.题目

在这里插入图片描述

二.解题思路

这套题也比较常规,考察LED,LCD,按键,ADC以及定时器的使用。
同前面的题目一样,套模板即可。

2.1 按键模块

struct key
{
   int flag;
   int count;
   int press;

};
struct key keys[4]={0};
void scan_key()
{
   
    keys[0].flag=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
    keys[1].flag=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
    keys[2].flag=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
    keys[3].flag=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
    for(int i=0;i<4;i++)
    {
      switch(keys[i].count)
      {
          case 0:
              if(keys[i].flag==0)
                  keys[i].count++;
               break;
          case 1:
              if(keys[i].flag==0)
                  keys[i].count++;
              else keys[i].count=0;
              break;
          case 2:
              if(keys[i].flag==1)
              {
                keys[i].press=1;
                keys[i].count=0;
              
              }
              break;
          default :break;
       
      }
    
    }
  
}

2.2 ADC模块

double Get_ADC(ADC_HandleTypeDef  adc)
{
    uint16_t temp = 0;
    HAL_ADC_Start(&adc);                  
    temp = HAL_ADC_GetValue(&adc);       
    HAL_ADC_Stop(&adc);                     
    return temp*3.3/4096;
 
 
}

2.3 LED模块

void led_proc()
{
    
    uint16_t Led_Gpio;
    Led_Gpio=(uint16_t)(LED_s<<8);
    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);
    
    
     HAL_GPIO_WritePin(GPIOC, Led_Gpio, GPIO_PIN_RESET);
    
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); 



}

2.4 主函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM3)
  {   
      
      scan_key();
       do_key();
      led_proc();
     
      if(_UI==0)
      { 
        V_value=Get_ADC(hadc2);
          if(V_value<UI_min)flag=1;
        if(V_value>=UI_min&&flag==1)
        {
            flag=0;
            time_now=uwTick;
            T_start=1;
            LED_s|=0x02;
            LCD_ClearLine(Line3);
                    
        }
        if(V_value>=UI_max)
        {  
            T_start=0;
            LED_s&=0xfd;

        }            
        if(T_start==1)T_time=(uwTick-time_now)/100;        
        sprintf(text,"  V:%.2fV",V_value);
        LCD_DisplayStringLine(Line0,(unsigned char *)"      Data");	
        LCD_DisplayStringLine(Line2,(unsigned char *)text);	
        sprintf(text,"  T:%ds",T_time);         
        LCD_DisplayStringLine(Line3,(unsigned char *)text);	
     
      }
      else if(_UI==1)
      {
      
        LCD_DisplayStringLine(Line0,(unsigned char *)"      Para");	
          sprintf(text," Vmax:%.1fV",V_max);
        LCD_DisplayStringLine(Line2,(unsigned char *)text);
          sprintf(text," Vmin:%.1fV",V_min);
        LCD_DisplayStringLine(Line3,(unsigned char *)text);  
      
      }
  }
}

三.工程文件

这届蓝桥杯难度较易,工程文件在这里,你们可以参考使用,如有什么问题可以讨论,谢谢阅读。

链接:https://pan.baidu.com/s/1rOe4auzJPswFoqD7lRIw3A?pwd=6666
提取码:6666

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VersionGod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值