蓝桥杯嵌入式第八届程序设计

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、题目分析

二、代码

1.定义变量

2.按键

3.处理数据

4.其他函数

5.每一个状态

5.1状态0

5.2状态1

5.3状态2

5.4状态3

5.5状态4

5.6状态5

5.7状态6

5.8状态7

5.9状态8

6主程序

总结


前言

蓝桥杯嵌入式赛道练习,只是记录自己的练习代码,如果有误,欢迎指出!!!

一、题目分析

这是我的第一个练习,所以看到题目有点懵,感觉不难,但是无从下手,所有在写完一些基础的程序后,参考了哔哩哔哩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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值