STM32与OLED多级菜单学习记录

在比赛中我们要实现多种不同的题目时,在这个时候我们就需要多级菜单来依次实现各个功能,有俩种选择,OLED与串口屏,今天我学习的是OLED多级菜单,可用来完成各个功能的实现,这是我们队对电赛的准备工作。

文章后面有完整代码。

一,引脚介绍

GND   电源地
VCC   接5V或3.3v电源
SCL   接PB5(SCL)
SDA   接PB7(SDA)  

二,原理分析

代码理解:
在.h文件里面定义结构体,里面存放基本需求。在.c文件定义结构体数组,每一个数组元素代表一种选择的情况。
才开始进去的时候,uint8_t func_index = 0所以当前的索引就为0,而当按键按下的时候,即enter被触发,此时进入到【1】也就是二级菜单。以此类推,此时的索引为1,所以位于1界面,按下key0则将next给func_index,则下一个则指向2对应的界面,紧接着如果wake_up被按下,enter触发,则进入到6所对应的函数。如果没有按下key0【相当于未进行next】,此时按下wake_up则进行入到5页面。

结构体

typedef struct
{
    uint8_t current;  //???????????
    uint8_t next;     //???°? 
    uint8_t enter;    //???????
    void (*current_operation)(void);//??????????е????
}Menu_table;
Menu_table table[19] =
{
		{0, 0, 1, (*fun0)},     //???????
		
		{1,2,7,(*fun1)},
		{2,1,3,(*fun2)},
		
		{3,4,11,(*fun3)},
		{4,5,12,(*fun4)},
		{5,6,13,(*fun5)},
		{6,3,14,(*fun6)},

		{7,8,15,(*fun7)},
		{8,9,16,(*fun8)},
		{9,10,17,(*fun9)},
		{10,7,18,(*fun10)},
		
		{11,11,1,(*fun11)},
		{12,12,1,(*fun12)},
		{13,13,1,(*fun13)},
		{14,14,1,(*fun14)},
		
		{15,15,1,(*fun15)},
		{16,16,1,(*fun16)},
		{17,17,1,(*fun17)},
		{18,18,1,(*fun18)},
		
};

三,主要代码

menu.h

#ifndef __MENU_H
#define __MENU_H

#include "stm32f10x.h"

extern u8 taskFlag;

//??ж???
void Menu_key_set(void);
void menu1_func(void);
void menu2_func(void);
void menu3_func(void);
void menu4_func(void);

void fun0(void);
void fun1(void);
void fun2(void);
void fun3(void);
void fun4(void);
void fun5(void);
void fun6(void);
void fun7(void);
void fun8(void);
void fun9(void);
void fun10(void);
void fun11(void);
void fun12(void);
void fun13(void);void fun14(void);
void fun15(void);
void fun16(void);
void fun17(void);
void fun18(void);

typedef struct
{
    uint8_t current;  //???????????
    uint8_t next;     //???°? 
    uint8_t enter;    //???????
    void (*current_operation)(void);//??????????е????
}Menu_table;

extern uint8_t Data_current[8];
#endif /* __MENU_H */

menu.c

Menu_table table[19] =
{
		{0, 0, 1, (*fun0)},     //???????
		
		{1,2,7,(*fun1)},
		{2,1,3,(*fun2)},
		
		{3,4,11,(*fun3)},
		{4,5,12,(*fun4)},
		{5,6,13,(*fun5)},
		{6,3,14,(*fun6)},

		{7,8,15,(*fun7)},
		{8,9,16,(*fun8)},
		{9,10,17,(*fun9)},
		{10,7,18,(*fun10)},
		
		{11,11,1,(*fun11)},
		{12,12,1,(*fun12)},
		{13,13,1,(*fun13)},
		{14,14,1,(*fun14)},
		
		{15,15,1,(*fun15)},
		{16,16,1,(*fun16)},
		{17,17,1,(*fun17)},
		{18,18,1,(*fun18)},
		
};
void Menu_key_set(void)
{
    key_state = KEY_Scan(0);
    if (key_state == 1)
    {
			  OLED_Clear();
        func_index = table[func_index].next;
    }
		if(key_state == 2)
		{
		    TIM_SetCompare1(TIM3,14.5);
		}
    if(key_state == 3)
		{
			  OLED_Clear();
				func_index = table[func_index].enter;
		}
    current_operation_index = table[func_index].current_operation;
    (*current_operation_index)();
	}

四。完整代码

链接:https://pan.baidu.com/s/11qmBzyHP8_JG4XrbMMy9dg 
提取码:1234 
谢谢观看。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值