蓝桥杯嵌入式第十三届省赛第一场——密码锁

主要代码如下(除了按键扫描和点灯):

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "lcd.h"
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void lcd_pro(void);
void lcd_psd(void);
void lcd_sta(void);

void led_pro(void);
void pwm_pro(void);
void usart_pro(void);

void L1_pro(void);
void L2_pro(void);

void key_pro(void);
uint8_t mima_check(void);

int lcd_flag=0;
uint8_t lcdstring[50];
uint8_t rxstring[50]={0};
int b1=-1;
int b2=-1;
int b3=-1;
int b1_flag=0;
int b2_flag=0;
int b3_flag=0;

int mima[3]={0,0,0};
uint16_t ucled=0x00;

int led_flag=0;

__IO uint32_t led1_setpoint=0;
__IO uint32_t led2_setpoint=0;
__IO uint32_t led3_setpoint=0;
__IO uint32_t pwm_setpoint=0;

int cuo_cnt=0;
int i=0;
int pwm_flag=0;
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
    LCD_Init();
    LCD_Clear(Black);
    LCD_SetBackColor(Black);
    LCD_SetTextColor(White);
    
    

    HAL_UART_Receive_IT(&huart1,rxstring, 50);
    
    
    
    
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        lcd_pro();
        key_pro();
        led_pro();
        L1_pro();
        L2_pro();
        pwm_pro();
//        usart_pro();
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */

/* USER CODE BEGIN 4 */
void lcd_pro(void)
{
    if(lcd_flag==0)
        lcd_psd();
    else
        lcd_sta();
    
}
void lcd_psd(void)
{
    sprintf((char *)lcdstring,"       PSD           ");
    LCD_DisplayStringLine(Line1,lcdstring);
        
    if(b1_flag==0)
    sprintf((char *)lcdstring,"    B1:@          ");
    else
    sprintf((char *)lcdstring,"    B1:%d          ",b1);    
    LCD_DisplayStringLine(Line3,lcdstring);

    if(b2_flag==0)
    sprintf((char *)lcdstring,"    B2:@          ");
    else
    sprintf((char *)lcdstring,"    B2:%d          ",b2);    
    LCD_DisplayStringLine(Line4,lcdstring);
    
    if(b3_flag==0)
    sprintf((char *)lcdstring,"    B3:@          ");
    else
    sprintf((char *)lcdstring,"    B3:%d          ",b3);    
    LCD_DisplayStringLine(Line5,lcdstring);
    
}
void lcd_sta(void)
{
    sprintf((char *)lcdstring,"       STA           ");
    LCD_DisplayStringLine(Line1,lcdstring);
    
    sprintf((char *)lcdstring,"    F:2000HZ           ");
    LCD_DisplayStringLine(Line3,lcdstring);
    
    sprintf((char *)lcdstring,"    D:10%s           ","%");
    LCD_DisplayStringLine(Line4,lcdstring);
    
    
}

void led_pro(void)
{
    led_disp(ucled);    
}
void L1_pro(void)
{
    if(led_flag==1)
    {
        if(uwTick-led1_setpoint>5000) 
        {
            led_flag=0;
            ucled=ucled&0xfe;
            lcd_flag=0;
            LCD_Clear(Black);
            b1_flag=0;
            b2_flag=0;
            b3_flag=0;
            b1=-1;
            b2=-1;
            b3=-1;
            return;
        }
            ucled=ucled|0x01;
        
    }
        
    
}
void L2_pro(void)
{
    if(cuo_cnt>=3&&led_flag==2)
    {
            if(uwTick-led2_setpoint>5000) 
        {
            ucled=ucled&0xfd;
            led_flag=0;
            return;
        }
         
         if(uwTick-led3_setpoint<100)  return;
         else
             led3_setpoint=uwTick;
        i++;
         if(i%2==0)
                ucled=ucled|0x02;
         else
             ucled=ucled&0xfd;
    }
    

}


void pwm_pro(void)
{
    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
    if(pwm_flag==0)
    {    
        __HAL_TIM_SET_AUTORELOAD(&htim2, 999);
        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2, 500);
    }
    else if(pwm_flag==1)
    {
        if(uwTick-pwm_setpoint>5000) 
        {
          pwm_flag=0;
            return;
        }
        __HAL_TIM_SET_AUTORELOAD(&htim2, 499);
        __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2, 50);
        
        
    }
    
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    
    if(rxstring[0]-48==mima[0]&&rxstring[1]-48==mima[1]&&rxstring[2]-48==mima[2]&&rxstring[3]=='-')
    {
        ucled=ucled|0x01;
        mima[0]=rxstring[4]-48;
        mima[1]=rxstring[5]-48;
        mima[2]=rxstring[6]-48;
    }
    
    
}
void key_pro(void)
{
    if(key_scan()==1)
    {
        while(key_scan()!=0);
        b1_flag=1;
        b1++;
        if(b1==10)
            b1=0;
    }
        if(key_scan()==2)
    {
        while(key_scan()!=0);
        b2_flag=1;
        b2++;
        if(b2==10)
            b2=0;
    }
        if(key_scan()==3)
    {
        while(key_scan()!=0);
        b3_flag=1;
        b3++;
        if(b3==10)
            b3=0;
    }
        if(key_scan()==4)
    {
        while(key_scan()!=0);
        if(mima_check()==1)
        {
            LCD_Clear(Black);
            lcd_flag=1;
            led_flag=1;
            uwTick=0;
            cuo_cnt=0;
            pwm_flag=1;
        }
        else
        {
            uwTick=0;
            cuo_cnt++;
            led_flag=2;
            
            
        }
        
        
        
    }
    
}
uint8_t mima_check(void)
{
    if(b1==mima[0]&&b2==mima[1]&&b3==mima[2])
        return 1;
    else
        return 0;
}
/* USER CODE END 4 */

写的比较急,没有注释,看不懂的可私聊
 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值