标题: 基于STM32之OLED菜单界面框架搭建 [打印本页]

作者: xiaolibo    时间: 2018-10-3 21:41
标题: 基于STM32之OLED菜单界面框架搭建
基于STM32驱动OLED屏显示三级菜单界面框架搭建
个人总结的一些经验,写的不好勿喷。
一个基本的菜单界面最少有有一个主界,所以所有先设计一个主界面。
1.什么是主界面?
/******** 这里说的主界面是本次需要设计的主界面 ********/
主界面是电路上电程序启动完成后屏幕显示的第一个界面,就是主界面。
主界面根据自己的爱好来设计,比如:

界面中的图形和文字可自己设计,这里我设计的就如上图所示。
主界面设计好后,那么根据自己的需求来添加多级界面。
我这里就设计了三级菜单界面。


好,那么对应的界面做好后,就是如何控制界面之间的切换。
  1. /*********************************************
  2. * 创建一个结构体
  3. * 存放界面标志位
  4. */
  5. typedef struct
  6. {
  7.     u8 Interface_Mark;     //界面状态
  8.     u8 Task_Mark;          //任务状态
  9.     u8 Run_Task;           //开始运行任务
  10. } Mark;
  11. Mark Mark_Sign;//状态标志位

  12. /*********************************************
  13. * 创建一个枚举
  14. * 存放界面变量
  15. */
  16. enum
  17. {
  18.     Main_Interface = 0x10, /****主界面*****/
  19.     Menu_Interface = 0x20, /****菜单界面***/
  20.     Task_Interface = 0x30, /****任务界面***/
  21. };
  22. /*******************************************/
  23. switch(Mark_Sign.Interface_Mark)
  24. {
  25.         //状态标志位 主界面
  26.         case Main_Interface:
  27.             Main_Interface_APP();//显示主界面
  28.     break;

  29.         //状态标志位 菜单界面
  30.         case Menu_Interface:
  31.             Menu_Interface_APP();//显示菜单界面
  32.     break;

  33.         //状态标志位 任务界面
  34.         case Task_Interface:
  35.                     Function_Menu_APP();//显示功能界面
  36.     break;
  37. default:
  38.     break;

复制代码

上面这段代码用来判断是三级中哪一级界面。
里面创建了一个结构体,通过改变结构体里面的一个标志位来控制三级界面之间的切换。

那么就要用到按键来改变标志位的值,这里我采用了外部中断来控制。


  1. <font color="rgb(79, 79, 79)"><font face="-apple-system, &quot;"><font style="font-size: 16px">/*************左摇杆按键*****菜单 确认按键**********************/
  2.     if(DISABLE == KEY_Rocker_Left)
  3.     {
  4.         //当按下菜单键时,判断当前界面
  5.         /************判断当前界面为主界面***********************/
  6.         if(Main_Interface == Mark_Sign.Interface_Mark)
  7.         {
  8.             /**************进入菜单界面*************/
  9.             Mark_Sign.Interface_Mark = Menu_Interface;
  10.         }
  11.         /************判断当前界面为菜单界面*******************/
  12.         else if(Menu_Interface == Mark_Sign.Interface_Mark)
  13.         {
  14.             /***************进入任务界面************/
  15.             Mark_Sign.Interface_Mark = Task_Interface;

  16.             /**************进入指定的功能任务*******/
  17.             switch(Mark_Sign.Task_Mark)
  18.             {
  19.             /**************开始运行2.4G任务*******/
  20.             case NRF24L01_Task:
  21.                 Mark_Sign.Run_Task = NRF24L01_Task;
  22.                 break;
  23.             /**************开始运行蓝牙任务*******/
  24.             case Bluetooth_Task:
  25.                 Mark_Sign.Run_Task = Bluetooth_Task;
  26.                 break;
  27.             /**************开始运行WIFI任务*******/
  28.             case WIFI_Task:
  29.                 Mark_Sign.Run_Task = WIFI_Task;
  30.                 break;
  31.             /**************开始运行USB任务*******/
  32.             case USB_Task:
  33.                 Mark_Sign.Run_Task = USB_Task;
  34.                 break;
  35.             /**************开始运行设置任务*******/
  36.             case Set_Task:
  37.                 Mark_Sign.Run_Task = Set_Task;
  38.                 break;
  39.             default:
  40.                 break;
  41.             }
  42.         }
  43.         /************判断当前界面为任务界面******************/
  44.         else if(Task_Interface == Mark_Sign.Interface_Mark)
  45.         {
  46.             /*******判断当前正在运行的任务*******/
  47.             switch(Mark_Sign.Run_Task)
  48.             {
  49.             /*当前正在运行 2.4G任务*/
  50.             case NRF24L01_Task:

  51.                 break;
  52.             /*当前正在运行 2.4G任务*/
  53.             case Bluetooth_Task:

  54.                 break;
  55.             /*当前正在运行 2.4G任务*/
  56.             case WIFI_Task:

  57.                 break;
  58.             /*当前正在运行 2.4G任务*/
  59.             case USB_Task:

  60.                 break;
  61.             /*当前正在运行 2.4G任务*/
  62.             case Set_Task:
  63.             
  64.                 break;
  65.             default:
  66.                 break;
  67.             }
  68.         }
  69.     }
  70. </font></font></font>
复制代码

上面这段代功能


  1. <font color="rgb(79, 79, 79)"><font face="-apple-system, &quot;"><font style="font-size: 16px">/*
  2. * 1,检测当前按下的按键为确认键
  3. * 2,检测当前的界面
  4. *                (1)如果是主界面,则进入菜单界面
  5. *                (2)如果是菜单界面,则进入任务界面
  6. *                (3)如果是任务界面,则开执行被选中的任务
  7. */
  8. </font></font></font>
复制代码

那么可以从主界面进入,那怎么退出呢?
同样这里采用外部中断来控制


  1. <font color="rgb(79, 79, 79)"><font face="-apple-system, &quot;"><font style="font-size: 16px">/****************右摇杆按键****返回按键*************************/
  2.     if(DISABLE == KEY_Rocker_Right)
  3.     {
  4.         //当按下返回键时,判断当前界面
  5.         /************判断当前界面为菜单界面*******************/
  6.         if(Menu_Interface == Mark_Sign.Interface_Mark)
  7.         {
  8.             /*******退出菜单界面***进入主界面**/
  9.             Mark_Sign.Interface_Mark = Main_Interface;
  10.         }
  11.         /************判断当前界面为任务界面******************/
  12.         else if(Task_Interface == Mark_Sign.Interface_Mark)
  13.         {
  14.             /***退出正在运行的任务***/
  15.             Mark_Sign.Run_Task = Stop;
  16.             /*******退出任务界面*****/
  17.             Mark_Sign.Interface_Mark = Menu_Interface;
  18.         }

  19. </font></font></font>
复制代码

上面这段代码的功能

  1. <font color="rgb(79, 79, 79)"><font face="-apple-system, &quot;"><font style="font-size: 16px">/*
  2. * 1,检测当前按下的按键为返回键
  3. * 2,检测当前的界面
  4. *             (1)如果是任务界面,则停止正在运行的任务,返回到菜单界面
  5. *             (2)如果是菜单界面,则返回到主界面
  6. */</font></font></font>
复制代码



通过确认按键控制从主界面到菜单界面到任务界面的切换。
通过返回按键控制从任务界面到菜单界面到主界面的切换。

以上就是菜单界面的内容,不管你是小白还是正在学习STM32的你,根据这套框架你一样可以写出霸气的菜单界面,如果你们还有更好的写法,欢迎一起讨论。





IMG_20181001_141038.jpg (2.12 MB, 下载次数: 186)

IMG_20181001_141038.jpg

STM32_OLED_三级菜单框架.rar

397.21 KB, 下载次数: 799, 下载积分: 黑币 -5


作者: ebingyu    时间: 2018-10-11 15:58
学习了
作者: cxy760307    时间: 2018-11-2 16:03
学习了,不错!
作者: 雨落冰心    时间: 2018-11-12 00:28
最近正在学习OLED,感谢楼主的分享
作者: j182010    时间: 2018-11-12 15:51
多谢分享
作者: 阳ing    时间: 2018-11-23 17:08
多谢共享

作者: gl542400    时间: 2018-11-24 16:19

最近正在学习OLED
作者: quanhengwen    时间: 2018-12-17 16:35
感谢楼主 分享,学习一下
作者: yjwpm    时间: 2018-12-17 17:44
最近正在学习OLED
作者: tonyhy1975    时间: 2018-12-19 22:47
不错,值得学习
作者: 2262744322    时间: 2019-2-12 21:18
仔细 学习 一下  最近在学习怎么 写一个 菜单 的程序
作者: qq286907986    时间: 2019-2-23 13:52
学习一下
作者: 1843    时间: 2019-4-11 16:31
666,学习一下
作者: 1843    时间: 2019-4-12 11:57
怎么判断按下的是哪一个按键,DISABLE跳转到了stm32f10x.h了,有点看不懂,请教一下。
作者: bohe    时间: 2019-5-23 22:23
谢谢分享,
作者: 111aou    时间: 2019-6-20 13:44
刚好需要,学习一下
作者: 111aou    时间: 2019-6-20 13:46
学习一下,刚好需要
作者: 1813298696    时间: 2019-7-2 12:03
能发一下代码吗1813298696@qqcom
作者: 右走    时间: 2019-7-12 06:37
看着非常不错
作者: 1245303587    时间: 2019-7-15 16:59
怎么我用IIC模式没显示,是不是我哪没配置好?
作者: 木易呐    时间: 2019-7-19 17:13
额,那个mini版烧进去程序屏就黑了,咋啥都没有,是不是烧了 啊

作者: lyw98    时间: 2019-7-19 22:04
great,学习
作者: lyl_420819    时间: 2019-7-24 13:30
颇有收获,谢了。
作者: 有梦即远方    时间: 2019-7-28 11:53
请问是要外接摇杆按键吗,具体要怎么做呢

作者: ww1647346515    时间: 2019-7-28 15:47
正好学习OLED,谢谢楼主资料分享
作者: w296532983    时间: 2019-8-14 12:26
学习学习
作者: sunjixiangok    时间: 2019-8-29 12:51
学习一下
作者: prettytank    时间: 2019-8-30 06:42
先收藏,感觉肯定会有一天能用上!
作者: yupengwei    时间: 2019-9-4 18:04
谢谢分享
作者: mayorma    时间: 2019-9-4 21:12
学习了
作者: yupengcheng    时间: 2019-9-11 14:50
你好,我最近有一个项目,需要用到stm32 oled屏显示菜单界面的框架,但是不理解框架架构关系,方便加我Q沟通探讨下吗?
作者: yupengwei    时间: 2019-9-28 20:01
最近正在学习OLED,感谢楼主的分享&#128076;
作者: renjianbo    时间: 2019-10-7 15:38
我记得下载了
作者: lyMarvin    时间: 2019-10-8 08:42
很棒!谢谢分享!
作者: 完完全全    时间: 2019-10-9 11:09
这就是算法吗?希望多一些这样的教程
作者: yupengwei    时间: 2019-10-10 20:50
厉害了  学习下怎么写的
作者: w1685188403    时间: 2019-12-14 22:50
学习一下,感谢楼主分享。
作者: wyy19970316    时间: 2019-12-15 22:01
真的非常好啊,感谢楼主
作者: ben0148    时间: 2020-1-13 10:52
学习了谢谢!!!
作者: phy123    时间: 2020-2-6 20:44
请问2.8寸彩屏能使用吗
作者: guangshi_wq    时间: 2020-2-8 22:36
这个三级菜单写的好,说明很详细.值得学习
作者: 1342732985    时间: 2020-3-13 12:13
有代码吗?

作者: 1342732985    时间: 2020-3-13 12:14
能给我发下代码吗?1342732985@qq.com
作者: kanwoe    时间: 2020-3-13 13:08
这个资料相当给力,多谢分享!
作者: 小刀hait    时间: 2020-3-14 11:07
学习了,我也试试
作者: quicklee    时间: 2020-3-15 14:44
日常学习
作者: waerdeng    时间: 2020-3-15 21:37
学习12864,感谢楼主的分享,希望能学会
作者: xda    时间: 2020-3-23 23:39
在读完代码以后专程回来回复!不错的资源,有很多值得学习的地方!!!
作者: billaj    时间: 2020-3-24 10:40
虽然我暂不需要,但看了下回复,好多人说解说的很好,所以先留个言作个MARK,日后有需要再来学习学习,感谢楼主分享
作者: quicklee    时间: 2020-3-25 15:48
楼主的范例不错。学习了
作者: 1342732985    时间: 2020-4-1 11:34
下载之后怎么编译?

作者: zhangkaiy1220    时间: 2020-4-14 09:14
不错的贴子
作者: xda    时间: 2020-4-19 11:37
问个问题,代码里面的#define Page(ARE) (ARE/2+1)这个是干啥的呢,跳转过去找不到相关的
作者: 云梦空间    时间: 2020-5-12 19:40
感谢楼主的分享,很实用
作者: andyliu82    时间: 2021-1-18 17:57
看上去挺好的,完整工程,程序段全!
作者: @陌途    时间: 2021-4-6 11:06
资料不错,DIY小玩意正好用得上
作者: zyluglugl    时间: 2023-3-24 13:21
多谢分享,下载下来学习一下。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1