题目
这套真题不难,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);
}
这套比较简单,注释我就不写了,看不懂的可以评论区发邮箱我给你发源码。