提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
蓝桥杯嵌入式赛道练习,只是记录自己的练习代码,如果有误,欢迎指出!!!
一、题目分析
这是我的第一个练习,所以看到题目有点懵,感觉不难,但是无从下手,所有在写完一些基础的程序后,参考了哔哩哔哩Up主蚂蚁工厂分析
二、代码
1.定义变量
extern Keys keys[4]; // 按键数组
uchar Led = 0;
RTC_TimeTypeDef T; // RTC时间
RTC_DateTypeDef D; // RTC日期
uint ral_time; // 当前时间
uint last_time; // 上一次的时间
int ral_floor; // 目前所在楼层
int Floor[3] = {0, 0, 0}; // 要运行的楼层数组
int Up[4] = {0, 0, 0, 0}; // 要上升运行的楼层数组
int down[4] = {0, 0, 0, 0}; // 要下降运行的楼层数组
int p_arrUp = 0, p_arrdown = 0, p_run = 0; // 指向数组的运行位置
char text[30]; // LCD打印
int class_state; // 运行的步骤
2.按键
Keys keys[4]={0,0,0};//按键函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//识别按键并消抖
{
if(htim->Instance==TIM4)//判断中断是不是定时器4,定时器设置时间是10ms
{
keys[0].key_ral=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);//更新按键电平
keys[1].key_ral=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
keys[2].key_ral=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
keys[3].key_ral=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i=0;i<4;i++)
{
switch(keys[i].key_sta)//判断按键
{
case 0:
{
if(keys[i].key_ral==0)
{
keys[i].key_sta=1;
}
}break;
case 1:
{
if(keys[i].key_ral==0)
{
keys[i].key_sta=2;
keys[i].key_flag=1;
}
else
{
keys[i].key_sta=0;
}
}break;
case 2:
{
if(keys[i].key_ral==1)
{
keys[i].key_sta=0;
}
}break;
}
}
}
}
/// @brief 读按键
/// @param 空
void Read_key(void)
{
if (keys[0].key_flag == 1)
{
Led |= 1; // 写Led
if (keys[0].key_reapt++ == 0)
{
tianarr(1); // 把按键写入数组
}
GetSecd();
last_time = ral_time; // 更新时间
keys[0].key_flag = 0;
}
if (keys[1].key_flag == 1)
{
Led |= 0x02;
if (keys[1].key_reapt++ == 0)
{
tianarr(2);
}
GetSecd();
last_time = ral_time;
keys[1].key_flag = 0;
}
if (keys[2].key_flag == 1)
{
Led |= 0x04;
if (keys[2].key_reapt++ == 0)
{
tianarr(3);
}
GetSecd();
last_time = ral_time;
keys[2].key_flag = 0;
}
if (keys[3].key_flag == 1)