基于STM32之OLED菜单界面框架搭建

基于STM32驱动OLED屏显示三级菜单界面框架搭建

个人总结的一些经验,写的不好勿喷。

  1. 硬件要求
    (1)处理器:STM32F103系列。
    (2)OLED屏,SPI或IIC接口都可以。
    (3)按键,用于控制界面的切换。

一个基本的菜单界面最少有有一个主界,所以所有先设计一个主界面。
1.什么是主界面?
/******** 这里说的主界面是本次需要设计的主界面 ********/
主界面是电路上电程序启动完成后屏幕显示的第一个界面,就是主界面。
主界面根据自己的爱好来设计,比如:
在这里插入图片描述

界面中的图形和文字可自己设计,这里我设计的就如上图所示。
主界面设计好后,那么根据自己的需求来添加多级界面。
我这里就设计了三级菜单界面。

在这里插入图片描述

在这里插入图片描述

好,那么对应的界面做好后,就是如何控制界面之间的切换。

/*********************************************
 * 创建一个结构体
 * 存放界面标志位
*/
typedef struct
{
    u8 Interface_Mark;     //界面状态
    u8 Task_Mark;          //任务状态
    u8 Run_Task;           //开始运行任务
} Mark;
Mark Mark_Sign;//状态标志位

/*********************************************
 * 创建一个枚举
 * 存放界面变量
*/
enum
{
    Main_Interface = 0x10, /****主界面*****/
    Menu_Interface = 0x20, /****菜单界面***/
    Task_Interface = 0x30, /****任务界面***/
};
/*******************************************/
switch(Mark_Sign.Interface_Mark)
{
	//状态标志位 主界面
	case Main_Interface:
    	Main_Interface_APP();//显示主界面
    break;

	//状态标志位 菜单界面
	case Menu_Interface:
    	Menu_Interface_APP();//显示菜单界面
    break;

	//状态标志位 任务界面
	case Task_Interface:
   	 	Function_Menu_APP();//显示功能界面
    break;
default:
    break;
}

上面这段代码用来判断是三级中哪一级界面。
里面创建了一个结构体,通过改变结构体里面的一个标志位来控制三级界面之间的切换。

那么就要用到按键来改变标志位的值,这里我采用了外部中断来控制。

    /*************左摇杆按键*****菜单 确认按键**********************/
    if(DISABLE == KEY_Rocker_Left)
    {
        //当按下菜单键时,判断当前界面
        /************判断当前界面为主界面***********************/
        if(Main_Interface == Mark_Sign.Interface_Mark)
        {
            /**************进入菜单界面*************/
            Mark_Sign.Interface_Mark = Menu_Interface;
        }
        /************判断当前界面为菜单界面*******************/
        else if(Menu_Interface == Mark_Sign.Interface_Mark)
        {
            /***************进入任务界面************/
            Mark_Sign.Interface_Mark = Task_Interface;

            /**************进入指定的功能任务*******/
            switch(Mark_Sign.Task_Mark)
            {
            /**************开始运行2.4G任务*******/
            case NRF24L01_Task:
                Mark_Sign.Run_Task = NRF24L01_Task;
                break;
            /**************开始运行蓝牙任务*******/
            case Bluetooth_Task:
                Mark_Sign.Run_Task = Bluetooth_Task;
                break;
            /**************开始运行WIFI任务*******/
            case WIFI_Task:
                Mark_Sign.Run_Task = WIFI_Task;
                break;
            /**************开始运行USB任务*******/
            case USB_Task:
                Mark_Sign.Run_Task = USB_Task;
                break;
            /**************开始运行设置任务*******/
            case Set_Task:
                Mark_Sign.Run_Task = Set_Task;
                break;
            default:
                break;
            }
        }
        /************判断当前界面为任务界面******************/
        else if(Task_Interface == Mark_Sign.Interface_Mark)
        {
            /*******判断当前正在运行的任务*******/
            switch(Mark_Sign.Run_Task)
            {
            /*当前正在运行 2.4G任务*/
            case NRF24L01_Task:

                break;
            /*当前正在运行 2.4G任务*/
            case Bluetooth_Task:

                break;
            /*当前正在运行 2.4G任务*/
            case WIFI_Task:

                break;
            /*当前正在运行 2.4G任务*/
            case USB_Task:

                break;
            /*当前正在运行 2.4G任务*/
            case Set_Task:
            
                break;
            default:
                break;
            }
        }
    }

上面这段代功能

/*
 * 1,检测当前按下的按键为确认键
 * 2,检测当前的界面
 *                (1)如果是主界面,则进入菜单界面
 *                (2)如果是菜单界面,则进入任务界面
 *                (3)如果是任务界面,则开执行被选中的任务
 */   

那么可以从主界面进入,那怎么退出呢?
同样这里采用外部中断来控制

/****************右摇杆按键****返回按键*************************/
    if(DISABLE == KEY_Rocker_Right)
    {
        //当按下返回键时,判断当前界面
        /************判断当前界面为菜单界面*******************/
        if(Menu_Interface == Mark_Sign.Interface_Mark)
        {
            /*******退出菜单界面***进入主界面**/
            Mark_Sign.Interface_Mark = Main_Interface;
        }
        /************判断当前界面为任务界面******************/
        else if(Task_Interface == Mark_Sign.Interface_Mark)
        {
            /***退出正在运行的任务***/
            Mark_Sign.Run_Task = Stop;
            /*******退出任务界面*****/
            Mark_Sign.Interface_Mark = Menu_Interface;
        }
    }

上面这段代码的功能

/*
 * 1,检测当前按下的按键为返回键
 * 2,检测当前的界面
 *             (1)如果是任务界面,则停止正在运行的任务,返回到菜单界面
 *             (2)如果是菜单界面,则返回到主界面
 */


通过确认按键控制从主界面到菜单界面到任务界面的切换。
通过返回按键控制从任务界面到菜单界面到主界面的切换。

以上就是菜单界面的内容,不管你是小白还是正在学习STM32的你,根据这套框架你一样可以写出霸气的菜单界面,如果你们还有更好的写法,欢迎一起讨论。

### 回答1: STM32是一款常用的嵌入式微控制器,而HAL (Hardware Abstraction Layer)是ST公司为其提供的一种高级抽象层,可以方便开发者进行底层硬件操作。而OLED是一种基于有机发光二极管的显示屏幕,具有低功耗、高对比度和快速响应等优点。 在使用STM32 HAL库来实现OLED菜单时,我们可以按照以下步骤进行: 1. 硬件连接:将OLED屏幕的引脚与STM32的对应引脚进行连接。 2. 初始化:使用HAL库的相关函数来初始化OLED屏幕的硬件连接和配置。 3. 显示菜单:在屏幕上绘制菜单,并使用HAL库的相关函数将菜单内容显示在OLED屏幕上。可以使用HAL库提供的绘图函数来绘制文本、图像等。 4. 用户交互:使用HAL库提供的中断处理函数或轮询方式来获取用户的输入操作,例如按键或触摸屏输入等。 5. 处理用户输入:根据用户的输入操作,进行相应的菜单项选择或操作。可以使用HAL库提供的按键检测或触摸屏事件处理函数来获取用户的输入。 6. 更新显示:根据用户的选择或操作,更新菜单的显示内容,并使用HAL库提供的相关函数将更新后的菜单显示在OLED屏幕上。 7. 循环执行:使用一个循环来保持菜单的持续显示和用户的交互响应。可以使用HAL库提供的延时函数来实现适当的刷新频率。 通过以上步骤,我们可以使用STM32 HAL库实现一个基于OLED屏幕的菜单系统。这样用户可以通过菜单进行选择和操作,从而实现对STM32微控制器的功能控制和配置。 ### 回答2: STM32 是一款广泛应用于嵌入式系统的微控制器,它具有高性能和低功耗的特点。HAL (Hardware Abstraction Layer) 是STM32的一种软件开发库,它提供了一组不依赖于特定硬件平台的API,简化了编程的复杂度。 OLED(Organic Light Emitting Diode)是一种新型显示技术,它具有高亮度、高对比度和低功耗的特点。在STM32中,我们可以使用HAL库来控制OLED显示屏,实现各种菜单界面。 在设计菜单界面时,首先我们需要初始化OLED屏幕。通过HAL I2C 或 SPI API,我们可以设置OLED的参数,如显示分辨率、亮度和对比度等。 接下来,我们可以使用HAL库提供的字符串处理函数来实现菜单项的显示。我们可以定义一个菜单结构体,包含菜单选项的名称和对应的功能。对于每个菜单项,我们可以使用HAL库提供的函数将其显示在OLED屏幕上。 为了实现用户对菜单项的选择,我们可以使用HAL库的按键检测功能。通过检测用户按下的按键,我们可以改变当前所显示的菜单项,或者执行对应菜单项的功能。 当用户选择一个菜单项时,我们可以执行相应的操作。这可能涉及到更复杂的功能,比如显示某个界面、执行某个功能或者调用其他模块的接口。 总之,利用STM32的HAL库以及OLED显示屏,我们可以实现一个功能丰富的菜单系统。通过合理的设计和调用HAL库的函数,我们可以实现菜单的显示、选择和功能执行,为用户提供良好的交互体验。 ### 回答3: STM32 HAL是一套开发库,用于简化STM32微控制器的开发和编程。OLED菜单是一种用户界面,通过OLED显示屏来展示可选的菜单选项,并且可以通过按键或其他输入设备与用户进行交互。 在使用STM32 HAL开发OLED菜单时,我们首先需要初始化OLED显示屏和按键等外设。之后,我们可以创建菜单选项,并在OLED上显示它们。 使用STM32 HAL,我们可以通过以下步骤实现OLED菜单: 1. 初始化OLED显示屏和按键外设。 2. 设置OLED显示屏的初始界面,例如显示欢迎信息或主菜单。 3. 监听按键输入,并根据按键的不同来切换菜单选项或执行相关操作。 4. 使用HAL库中的函数来控制OLED显示屏的内容,例如显示文本、图标或绘制图形。 5. 可以使用菜单选项之间的层次结构,例如主菜单和子菜单,通过连接不同的菜单选项来实现更复杂的功能。 6. 在菜单选项之间切换时,及时更新OLED显示屏上的内容,以确保用户可以看到最新的界面。 使用STM32 HAL编写OLED菜单可以提高开发效率,减少开发周期。HAL库提供了丰富的函数来控制STM32微控制器的外设,并且具有良好的可移植性。 总之,通过利用STM32 HAL和OLED显示屏,我们可以轻松创建交互式的用户菜单,为用户提供简洁、直观的界面,并实现更丰富的功能。
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值