前言:本篇励志教会小白,从基础讲起,参考文章链接放在最后。
#相关基础知识
#结构体基础定义
结构体定义:结构体由用户自定义的复合数据类型,用于整合不同类型的元素到一个单独的数据单元中。
// 定义一个结构体类型 Student
struct Student {
int id;
char name[50];
float grade;
};
这里的复合数据类型,不仅仅只有基本数据类型,同时可以,函数指针,指针变量,数组,进行混着,只混合基本数据类型,较为简单。
typedef struct {
int current;
uint8_t next;
float enter;
void (*current_operation)(void);
} MENU;//定义匿名结构体
typedef关键字:为已存在的数据类型(基本数据类型,结构体,联合体,枚举)定义一个新的名称,可以使用这个新的名称进行声明,这个关键字的作用在于,简化复杂数据类型的声明,语法如下。
typedef 已存在的数据类型 新类型名称;
typedef定义基本数据类型,代码如下。
typedef int Integer;
Integer num = 10;
typedef定义结构体类型,定义过后只需要使用,新的类型名称去声明结构体,不用在加struct这中关键字。
typedef struct {
int id;
char name[50];
float grade;
} Stu;
Stu student1 = { 1, "Alice", 85.5 };
#数组基础定义
数组:数组中所用元素必须为同类型元素,这种元素可以是基本数据类型,组合数据类型(结构体类型),在内存中连续存储,且通过下标访问。
int numbers[5] = {1, 2, 3, 4, 5};
这种写法是存储基本数据类型元素,同时不要忘记,数组可以用来存储,组合数据类型也就是结构体类型的元素。当大量数据需要存储使用这种写法,避免了大量声明变量,同时节省了存放变量内存空间的作用。
typedef struct {
uint8_t current;
uint8_t next;
uint8_t enter;
void (*current_operation)(void);
} MENU;//定义匿名结构体
MENU menu[10];//声明一个 MENU结构体类型的数组
这里数组里面,存放的是结构体定义的组合数据类型。
#函数指针基础定义
函数指针:函数指针,指针的一种,指向的是函数地址而不是数据地址,当完成声明之后,可以通过函数指针,调用函数,固定声明格式如下所示。
返回类型 (*指针变量名)(参数类型1, 参数类型2, ...);
函数指针指向函数地址,通过调用函数指针去调用取地址的函数。
void GPIO_Init(void){}//定义函数
int main(){
(void)(*GPIO_INIT)(void);//声明函数指针
GPIO_INIT =GPIO_Init;//函数指针指向
GPIO_INIT();//通过函数指针调用函数
return 0;
}
到这里经介绍完了,实时的基础,接下来将其进行混合应用,如果有的小伙伴还是不清楚可以,找更加基础的教程,多练练,接下来开始进行混合应用率练习。
#0.96寸OLED实现多级菜单部分代码
typedef struct {
uint8_t current; // 当前状态索引号
uint8_t next; // 下一个状态索引号
uint8_t enter; // 确定操作索引号
void (*current_operation)(void); // 当前状态应该执行的操作函数指针
} MENU;
MENU menu[9] = {
{0, 1, 1, menu0}, // 首界面
{1, 2, 4, menu1}, // 第二界面 mode1
{2, 3, 6, menu2}, // 第二界面 mode2
{3, 1, 0, menu3}, // BACK
{4, 5, 4, menu4}, // mode1对应的界面
{5, 4, 3, menu5}, // mode1 BACK
{6, 7, 8, menu6}, // mode2对应的界面
{7, 8, 3, menu7}, // mode2 BACK
{8, 7, 8, temperature_result} // 执行对应的函数
};
void menu0(void) {
OLED_ShowString(1, 1, "menu");
OLED_ShowString(2, 1, "mode1");
OLED_ShowString(3, 1, "mode2");
}
void menu1(void) {
OLED_ShowString(1, 1, "mode1 <");
OLED_ShowString(2, 1, "menu2");
OLED_ShowString(4, 1, "Back");
}
void menu2(void) {
OLED_ShowString(1, 1, "menu1");
OLED_ShowString(2, 1, "menu2 <");
OLED_ShowString(4, 1, "Back");
}
void menu3(void) {
OLED_ShowString(1, 1, "menu1");
OLED_ShowString(2, 1, "menu2");
OLED_ShowString(4, 1, "Back <");
}
void menu4(void) {
OLED_ShowString(1, 1, "adc <");
OLED_ShowString(4, 1, "Back");
}
void menu5(void) {
OLED_ShowString(1, 1, "adc");
OLED_ShowString(4, 1, "Back <");
}
void menu6(void) {
OLED_ShowString(1, 1, "tep <");
OLED_ShowString(4, 1, "Back");
}
void menu7(void) {
OLED_ShowString(1, 1, "tep");
OLED_ShowString(4, 1, "Back <");
}
void temperature_result(void) {
// 假设这里是显示温度结果的函数
printf("Temperature result function executed.\n");
}
有关stm32oled的按键中断多级菜单并实现对应的功能(基于HAL库)(附带源码)_stm32 多级菜单的代码-CSDN博客