利用STM32CubeMX配置OLED多级菜单-简单的实现方法

本文详细描述了如何在嵌入式系统中使用OLED显示器构建一个具有多级选择的菜单系统,包括配置、按键处理和代码示例,主要涉及CubeMX配置、IIC通信和Menu类的使用。

前言

本篇文章来给大家讲解如何简单的实现一个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多级菜单的显示方法,如果有不足的地方请多包涵和指出,希望对大家有帮助。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值