前言
本篇文章来给大家讲解如何简单的实现一个OLED多级菜单,主要是讲一下方法,对于OLED的驱动不做过多阐述。
一、CubeMX配置
这里省略了基本的配置步骤。
1.配置按键
2.配置IIC

3.创建工程

二、代码解析
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "i2c.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "Key_driver.h"
#include "oled.h"
#include "Menu.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
int Menu2_select=0;
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
Key_Init(); //按键初始化函数
OLED_Init(); //OLED初始化函数
OLED_Clear(); //OLED上电清屏函数
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Menu2_select=Menu1();//进入一级菜单,并返回你的选择
if(Menu2_select==1)Menu2_Tools();//二级菜单 - 工具
if(Menu2_select==2)Menu2_Games();//二级菜单 - 游戏
if(Menu2_select==3)Menu2_Setting();//二级菜单 - 设置
}
/* USER CODE END 3 */
}
这里我们先进入一级菜单函数,从中选择要进入哪个二级菜单,然后根据返回值进入对应的二级菜单函数显示二级菜单界面。
#include "Menu.h"
#include "Key_driver.h"
#include "oled.h"
/*********************************************************
以下为一级菜单
*********************************************************/
int Menu1(void)
{
int flag=1;//记录你的选择
OLED_ShowString(45,0,"MENU",16);
OLED_ShowString(30,2,"1.Tools",16);
OLED_ShowString(30,4,"2.Games",16);
OLED_ShowString(30,6,"3.Setting",16);
while(1)
{
if(KEY0_Read==0)//下一项按键
{
HAL_Delay(20);
while(KEY0_Read==0);
HAL_Delay(20);
flag++;
if(flag==4)
flag=1;
}
if(KEY1_Read==0)//确认按键,跳转到二级菜单
{
HAL_Delay(20);
while(KEY1_Read==0);
HAL_Delay(20);
OLED_Clear();
return flag;//返回你的选择
}
switch(flag)//光标移动
{
case 1:
OLED_ShowChar(18,2,'*',16);
OLED_ShowChar(18,4,' ',16);
OLED_ShowChar(18,6,' ',16);
break;
case 2:
OLED_ShowChar(18,4,'*',16);
OLED_ShowChar(18,2,' ',16);
OLED_ShowChar(18,6,' ',16);
break;
case 3:
OLED_ShowChar(18,6,'*',16);
OLED_ShowChar(18,4,' ',16);
OLED_ShowChar(18,2,' ',16);
break;
}
}
}
/*********************************************************
以下为二级菜单
*********************************************************/
int Menu2_Tools(void)
{
int flag=1;
OLED_ShowString(45,0,"Tools",16);
OLED_ShowString(30,2,"1.PWM",16);
OLED_ShowString(30,4,"2.IIC",16);
OLED_ShowString(30,6,"3.TIM",16);
while(1)
{
if(KEY0_Read==0)//下一项按键
{
HAL_Delay(20);
while(KEY0_Read==0);
HAL_Delay(20);
flag++;
if(flag==4)
flag=1;
}
switch(flag)//光标移动
{
case 1:
OLED_ShowChar(18,2,'*',16);
OLED_ShowChar(18,4,' ',16);
OLED_ShowChar(18,6,' ',16);
break;
case 2:
OLED_ShowChar(18,4,'*',16);
OLED_ShowChar(18,2,' ',16);
OLED_ShowChar(18,6,' ',16);
break;
case 3:
OLED_ShowChar(18,6,'*',16);
OLED_ShowChar(18,4,' ',16);
OLED_ShowChar(18,2,' ',16);
break;
}
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12))==0)//返回上一级按键
{
HAL_Delay(20);
while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12))==0);
HAL_Delay(20);
OLED_Clear();
return 0;
}
}
}
int Menu2_Games(void)
{
int flag=1;
OLED_ShowString(45,0,"Games",16);
OLED_ShowString(30,2,"1.Snake",16);
OLED_ShowString(30,4,"2.Snake II",16);
OLED_ShowString(30,6,"3.Snake III",16);
while(1)
{
if(KEY0_Read==0)//下一项按键
{
HAL_Delay(20);
while(KEY0_Read==0);
HAL_Delay(20);
flag++;
if(flag==4)
flag=1;
}
switch(flag)//光标移动
{
case 1:
OLED_ShowChar(18,2,'*',16);
OLED_ShowChar(18,4,' ',16);
OLED_ShowChar(18,6,' ',16);
break;
case 2:
OLED_ShowChar(18,4,'*',16);
OLED_ShowChar(18,2,' ',16);
OLED_ShowChar(18,6,' ',16);
break;
case 3:
OLED_ShowChar(18,6,'*',16);
OLED_ShowChar(18,4,' ',16);
OLED_ShowChar(18,2,' ',16);
break;
}
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12))==0)//返回上一级按键
{
HAL_Delay(20);
while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12))==0);
HAL_Delay(20);
OLED_Clear();
return 0;
}
}
}
int Menu2_Setting(void)
{
int flag=1;
OLED_ShowString(35,0,"Setting",16);
OLED_ShowString(10,2,"1.Information",16);
OLED_ShowString(10,4,"2.Function",16);
OLED_ShowString(10,6,"3.Privacy",16);
while(1)
{
if(KEY0_Read==0)//下一项按键
{
HAL_Delay(20);
while(KEY0_Read==0);
HAL_Delay(20);
flag++;
if(flag==4)
flag=1;
}
switch(flag)//光标移动
{
case 1:
OLED_ShowChar(0,2,'*',16);
OLED_ShowChar(0,4,' ',16);
OLED_ShowChar(0,6,' ',16);
break;
case 2:
OLED_ShowChar(0,4,'*',16);
OLED_ShowChar(0,2,' ',16);
OLED_ShowChar(0,6,' ',16);
break;
case 3:
OLED_ShowChar(0,6,'*',16);
OLED_ShowChar(0,4,' ',16);
OLED_ShowChar(0,2,' ',16);
break;
}
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12))==0)//返回上一级按键
{
HAL_Delay(20);
while((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12))==0);
HAL_Delay(20);
OLED_Clear();
return 0;
}
}
}
进入二级菜单后我们要注意这里要有一个返回上一级的按键,不然无法回到上一级菜单,清屏并结束函数就可以返回到主函数中,这里每一个二级菜单显示的步骤都是类似的。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
Menu2_select=Menu1();//进入一级菜单,并返回你的选择
if(Menu2_select==1)Menu2_Tools();//二级菜单 - 工具
if(Menu2_select==2)Menu2_Games();//二级菜单 - 游戏
if(Menu2_select==3)Menu2_Setting();//二级菜单 - 设置
}
/* USER CODE END 3 */
}
当二级菜单函数返回到主函数时,这一轮while循环便结束,立即开始下一轮循环又先进入一级菜单界面,这样你从二级菜单返回自然回到了一级菜单界面,那么三级、四级菜单的原理也是类似。
Menu.h
#ifndef __MENU_H__
#define __MENU_H__
int Menu1(void);
int Menu2_Tools(void);
int Menu2_Games(void);
int Menu2_Setting(void);
#endif
总结
本篇文章简单介绍了OLED多级菜单的显示方法,如果有不足的地方请多包涵和指出,希望对大家有帮助。
本文详细描述了如何在嵌入式系统中使用OLED显示器构建一个具有多级选择的菜单系统,包括配置、按键处理和代码示例,主要涉及CubeMX配置、IIC通信和Menu类的使用。
1392

被折叠的 条评论
为什么被折叠?



