按键,LED配合显示多级菜单

分类:N09_单片机

标签:

typedef enum {
    MAIN_MENU,  // 一级菜单
    SUB_MENU,   // 二级菜单
} MenuState;

MenuState currentMenuState = MAIN_MENU;

void display_main_menu(void) {
    // 显示一级菜单内容,例如:
    // "1. 传感器"
    // "2. 速度控制"
    // "3. 设置"
}

void display_sub_menu(void) {
    // 显示二级菜单内容,例如:
    // "1. 校准传感器"
    // "2. 设置最大速度"
    // "3. 返回"
}

void update_menu(void) {
    switch (currentMenuState) {
        case MAIN_MENU:
            display_main_menu();  // 更新一级菜单显示
            break;
        case SUB_MENU:
            display_sub_menu();   // 更新二级菜单显示
            break;
        default:
            break;
    }
}


#define BUTTON_PIN_1   GPIO_PIN_0   // 按钮1对应的引脚
#define BUTTON_PIN_2   GPIO_PIN_1   // 按钮2对应的引脚

void scan_buttons(void) {
    // 按键扫描,根据按钮按下切换菜单
    if (HAL_GPIO_ReadPin(GPIOB, BUTTON_PIN_1) == GPIO_PIN_SET) {
        // 按钮1按下,选择下一级菜单
        if (currentMenuState == MAIN_MENU) {
            currentMenuState = SUB_MENU;  // 从一级菜单切换到二级菜单
        }
    } 
    else if (HAL_GPIO_ReadPin(GPIOB, BUTTON_PIN_2) == GPIO_PIN_SET) {
        // 按钮2按下,返回上一菜单
        if (currentMenuState == SUB_MENU) {
            currentMenuState = MAIN_MENU;  // 从二级菜单返回到一级菜单
        }
    }
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) {
    // 每次定时器中断时调用,更新菜单显示
    update_menu();
}

int main(void) {
    HAL_Init();  // 初始化硬件

    // 配置定时器,周期性中断更新菜单显示
    HAL_TIM_Base_Start_IT(&htim2);  // 启动定时器2,并使能中断

    // 配置按钮引脚输入
    // GPIO配置代码略...

    while (1) {
        scan_buttons();  // 扫描按键输入,切换菜单

        // 其他功能的代码,例如平衡控制
        // process_balance();  // 处理平衡控制
    }
}


修改内容