蓝桥杯嵌入式第十三届省赛真题一

 

 

题目

这套真题不难,CubeMX配置这里我就不放了,大家不懂的可以看之前的或者在评论区提问也可以。我们直接看代码实现。

CubeMX引脚配置

代码实现

中断回调函数

#include "interrupt.h"
#include "usart.h"

extern int error_flag;
int led_time;
struct keys key[4]={0,0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM4)
    {
        key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
        key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
        key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
        key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
        for(int i=0;i<4;i++)
        {
            switch(key[i].judge_sta)
            {
                case 0:
                {
                    if(key[i].key_sta==0)
                        key[i].judge_sta=1;
                }
                break;
                case 1:
                {
                    if(key[i].key_sta==0)
                    {
                        key[i].judge_sta=2;
                        key[i].single_flag=1;
                    }
                    else
                        key[i].judge_sta=0;
                }
                break;
                case 2:
                {
                    if(key[i].key_sta==1)
                        key[i].judge_sta=0;
                }
                break;
            }
        }
    }
    if(htim->Instance==TIM6)
    {
        if(error_flag>=3)
            led_time++;
        if(led_time>=50)
        {
            error_flag =0;
            led_time=0;
        }
    }
}

char rxdata[30];
int rx_pointer;
uint8_t rxda;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    rxdata[rx_pointer++] = rxda;
    HAL_UART_Receive_IT(&huart1,&rxda,1);
}

LCD

void lcd_pro(void)
{
    if(view==0)
    {
        LCD_DisplayStringLine(Line1,(u8 *)"       PSD  ");
        sprintf(text,"    B1:%c  ",num1[i]);
        LCD_DisplayStringLine(Line3,(u8 *)text);
        sprintf(text,"    B2:%c  ",num2[j]);
        LCD_DisplayStringLine(Line4,(u8 *)text);
        sprintf(text,"    B3:%c  ",num3[k]);
        LCD_DisplayStringLine(Line5,(u8 *)text);
        
        sprintf(text,"    m1:%c  ",mes[0]);
        LCD_DisplayStringLine(Line6,(u8 *)text);
        sprintf(text,"    m2:%c  ",mes[1]);
        LCD_DisplayStringLine(Line7,(u8 *)text);
        sprintf(text,"    m2:%c  ",mes[2]);
        LCD_DisplayStringLine(Line8,(u8 *)text);

    }
    if(view==1)
    {
        LCD_DisplayStringLine(Line1,(u8 *)"       STA  ");
        sprintf(text,"    F:%dHz  ",pa1_frq);
        LCD_DisplayStringLine(Line3,(u8 *)text);
        sprintf(text,"    D:%.2d%%  ",pa1_duty);
        LCD_DisplayStringLine(Line4,(u8 *)text);
        
        sprintf(text,"    t:%d  ",uwTick);
        LCD_DisplayStringLine(Line6,(u8 *)text);
    }
}

KEY

void key_pro(void)
{
    if(view==0)
    {
        if(key[0].single_flag==1)
        {
            i++;
            if(i==11)
                i=1;
            key[0].single_flag=0;
        }
        if(key[1].single_flag==1)
        {
            j++;
            if(j==11)
                j=1;
            key[1].single_flag=0;
        }
        if(key[2].single_flag==1)
        {
            k++;
            if(k==11)
                k=1;
            key[2].single_flag=0;
        }
        if(key[3].single_flag==1)
        {
            if(num1[i]==mes[0]&&num2[j]==mes[1]&&num3[k]==mes[2])
            {
                error_flag=0;
                view=1;
                LCD_Clear(Black);
            }
            else
            {
                error_flag++;
                view=0;
                i=0;
                j=0;
                k=0;
            }
            key[3].single_flag=0;
        }
    }
}

USART

void rx_pro(void)
{
    if(rx_pointer>0)
    {
        if(rx_pointer==7)
        {
            if(rxdata[0]==mes[0]&&rxdata[1]==mes[1]&&rxdata[2]==mes[2]&&rxdata[3]=='-')
            {
                mes[0] = rxdata[4];
                mes[1] = rxdata[5];
                mes[2] = rxdata[6];
            }
        }
        rx_pointer=0;
        memset(rxdata,0,30);
    }
}

PWM

void pwm_pro(void)
{
    if(view==0)
    {
        uwTick=0;
        pa1_frq = 1000;
        TIM2->ARR = 1000000/1000 -1;
        __HAL_TIM_SetCounter(&htim2,0);
        TIM2->CCR2 = 0.5 * TIM2->ARR ;
    }
    if(view==1)
    {
        pa1_frq=2000;
        TIM2->ARR = 1000000/2000 -1;
        __HAL_TIM_SetCounter(&htim2,0);
        TIM2->CCR2 = 0.1 * TIM2->ARR ;
        if(uwTick>=5000)
        {
            view=0;
            LCD_Clear(Black);
            i=0;
            j=0;
            k=0;
        }
    }
}

LED

void led_disp(unsigned char dsled)
{
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOC,dsled<<8,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}


void led_pro(void)
{
    if(view==1)
        led |= 0x01;
    else
        led &= ~0x01;
    if(led_time%2==1)
        led |= 0x02;
    if(led_time%2==0)
        led &= ~0x02;
    led_disp(led);
}

这套比较简单,注释我就不写了,看不懂的可以评论区发邮箱我给你发源码。

 

 

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值