STM32OLED主界面菜单任务编程思路与模板详解

目录

一、效果展示(按键控制界面切换)

二、编程模板

1.头文件

2.库文件

三、编程思路

四、使用说明


一、效果展示(按键控制界面切换)

OLED三级界面效果展示

二、编程模板

1.头文件

#ifndef __INTERFACE_H
#define __INTERFACE_H
#include "stm32f10x.h"

//任务的状态位
#define RUN 1
#define STOP 0
//任务宏
#define Task1 Temp_Task
#define Task2 Light_Task
//界面穷举
typedef enum
{
    Main_Interface = 0x10, //主界面
    Menu_Interface = 0x20, //菜单界面
    Task_Interface = 0x30, //任务界面
}Interface;
//任务穷举
typedef enum
{
    Task1 = 0x10, //任务1显示界面
    Task2 = 0x20, //任务2显示界面
}Task;
typedef struct 
{
	uint8_t Interface;    //界面选择位
	uint8_t Task_Mark;    //任务选择位
  uint8_t Task;         //任务运行启停位
}Mark;

void point(Mark *Mark_Sign);
void Mark_config(Mark *Mark_Sign);
void interface_show(Mark *Mark_Sign);
void interface_switch(Mark *Mark_Sign);
void interface_menu(Mark *Mark_Sign);
void interface_main(void);
void interface_temp(void);
void interface_light(void);
#endif /*__INTERFACE_H*/

2.库文件

#include "interface.h"
#include "key.h"

void Mark_config(Mark *Mark_Sign)
{
	Mark_Sign->Interface = Main_Interface;	//界面选择位
	Mark_Sign->Task = Task1;				//任务选择位
	Mark_Sign->Task_Mark = STOP;			//任务运行启停位
}
//显示界面内容
void interface_show(Mark *Mark_Sign)
{
	switch(Mark_Sign->Interface )
	{
		case Main_Interface:
				interface_main();//显示主界面
			break;
		case Menu_Interface:
				interface_menu(Mark_Sign);//显示菜单界面
			break;
		case Task_Interface:
		{
			//显示任务界面
			if(Mark_Sign->Task  == Task1)
				interface_temp();//显示任务1界面
			else if(Mark_Sign->Task  == Task2)
				interface_light();//显示任务2界面
			break;
		}
	default:
			break;
	}
}
//控制界面和任务
void interface_switch(Mark *Mark_Sign)
{
	//界面的切换
	if(KEY_2_Scan()==1)
	{
		OLED_Clear();
		switch(Mark_Sign->Interface)
		{
			case Main_Interface:
				Mark_Sign->Interface  = Menu_Interface;
					break;
			case Menu_Interface:
			{
				Mark_Sign->Interface  = Task_Interface;
					break;
			}
			case Task_Interface: Mark_Sign ->Task_Mark = RUN; break;
			default: break;
		}
	}
	if(KEY_0_Scan()==1)
	{
		OLED_Clear();
		switch(Mark_Sign->Interface)
		{
			case Menu_Interface:
			{
				Mark_Sign->Interface  = Main_Interface;
				break;
			}
			case Task_Interface:
			{
				Mark_Sign->Task_Mark  = STOP;
				Mark_Sign->Interface = Menu_Interface;
				break;
			}
			default: break;
		}
	}
	//菜单界面的任务选择
	if(Mark_Sign->Interface  == Menu_Interface)
	{
		//向上选择
		if(KEY_1_Scan()==1)
		{
			OLED_Clear();
			switch(Mark_Sign->Task)
			{
				case Task1:  break;
				case Task2: Mark_Sign->Task = Task1;break;
				default: break;
			}
		}
		//向下选择
		if(KEY_3_Scan()==1)
		{
			OLED_Clear();
			switch(Mark_Sign->Task)
			{
				case Task1: Mark_Sign->Task = Task2; break;
				case Task2: break;
				default: break;
			}
		}
	}
}
//以下函数为OLED显示
//菜单索引
void point(Mark *Mark_Sign)
{
	if(Mark_Sign->Task==Task1)
		OLED_ShowString(90,16,"<-",16,1);//<-
	else if(Mark_Sign->Task==Task2)
		OLED_ShowString(90,32,"<-",16,1);//<-
}
//菜单界面
void interface_menu(Mark *Mark_Sign)
{
//显示内容可自行编辑
}
//主界面
void interface_main(void)
{
}
//温度界面
void interface_temp(void)
{
}
//亮度界面
void interface_light(void)
{
}

三、编程思路

1.先填充好每一个要显示的界面,确保界面显示没问题。

2.确保条件能触发,我这里选择的是4个按键控制。

3.先编写界面的横向切换,如下图所示。

 4.再变写菜单里纵向的任务选择,并搭配上索引。

四、使用说明

我的模板是仿照STM32标准库写的,所以使用前要先初始化

使用的时候把界面内容填充一下,任务宏改一下就可以了。

#include "stm32f10x_conf.h"

int main(void)
{
	Mark interface_mark;
	KEY_Init();	//初始化按键
	delay_init();//初始化延时函数
	OLED_Init(); //oled屏幕初始化
	OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
	Mark_config(&interface_mark);//记录位结构体初始化
	while(1)
	{
		interface_show(&interface_mark);
		interface_switch(&interface_mark);
	}
}
物联沃分享整理
物联沃-IOTWORD物联网 » STM32OLED主界面菜单任务编程思路与模板详解

发表评论