相信对于电子类专业的小伙伴来说,在做课设或者毕设的时候都会需要用到写界面,在这里我把我自己写的界面代码分享给大家,希望对大家的界面设计有所帮助。
#include "stm32f10x.h" // Device header
#include "menu.h"
#include "OLED.h"
#include "Key.h"
//定义菜单结构体
typedef struct
{
char title[20];
uint8_t num_sub;
char sub[5][20];
const uint8_t *image[5];
}MenuItem;
//定义菜单内容
MenuItem main_menu = {
.title = "Main Menu",
.num_sub = 4,
.sub = {" time ", " weather", " game "," heart "},
.image = {Clock, Sun, Player, Heart}
};
MenuItem time_menu = {
.title = "Time Menu",
.num_sub = 4,
.sub = {}
};
MenuItem weather_menu = {
.title = "Weather Menu",
.num_sub = 4,
.sub = {}
};
MenuItem game_menu = {
.title = "Game Menu",
.num_sub = 4,
.sub = {}
};
MenuItem heart_menu = {
.title = "Heart Menu",
.num_sub = 4,
.sub = {}
};
//定义当前菜单及子菜单选项
MenuItem *current_menu = &main_menu;
uint8_t current_selection = 0;
//获取按键
uint8_t KeyNum;
//按键1(退出)
static void quit(void)
{
KeyNum = Get_KeyNum();
if(KeyNum == 1)
{
}
}
//按键2(选择)
static void select(void)
{
KeyNum = Get_KeyNum();
if(KeyNum == 2)
{
if(++ current_selection ==4) current_selection = 0;
}
}
//按键3(确认)
static void confirm(void)
{
KeyNum = Get_KeyNum();
if(KeyNum == 3)
{
}
}
//模拟按键控制
static void button_pressed(void)
{
if(current_menu == &main_menu)
{
if(current_selection == 0)
{
current_menu = &time_menu;
}
else if(current_selection == 1)
{
current_menu = &weather_menu;
}
else if(current_selection == 2)
{
current_menu = &game_menu;
}
else if(current_selection == 3)
{
current_menu = &heart_menu;
}
}
}
//显示当前菜单
void display_menu(void)
{
select();
OLED_ShowString(35,0,current_menu->title,OLED_6X8);
OLED_ShowImage(40,10,45,45,current_menu->image[current_selection]);
OLED_ShowString(40,55,current_menu->sub[current_selection],OLED_6X8);
OLED_Update();
}
以下是对代码的部分解说:
-
菜单结构体定义:使用了结构体
MenuItem
来定义菜单,包括菜单标题、子菜单数量、子菜单名称以及与每个子菜单相关联的图标。这样的设计使得菜单的管理更加清晰和方便。 -
按键控制函数:实现了几个按键控制函数,包括退出、选择和确认。这些函数根据用户按键操作来切换菜单或执行相应的动作,从而增强了菜单的交互性。
-
菜单切换逻辑:通过
button_pressed
函数,根据用户选择的菜单项来切换到相应的子菜单,这样用户可以方便地浏览和操作不同的菜单内容。 -
显示当前菜单:
display_menu
函数用于在 OLED 上显示当前菜单的标题、选项和相关图标,为用户提供了直观的菜单界面。