单片机多级菜单的简单实现

多级菜单的思路

最近想把stm32上的oled显示屏做的好看一些,于是动手写了写一个多级菜单,思路很简单,每个页面用单独的函数封装好,每个功能也是用单独的函数进行封装,用了3个按键,两个切换键,一个确定键。

  1. 首先来看看用啥判断页面的(这偷个懒,希望没人打我)
//页面标志位
uint8_t s1 = 0;            //主页面功能号
uint8_t s2 = 0;            //主次页面判断标志位
uint16_t s3 = 1;       //次页面功能号
  1. 主页面的显示函数,这是个很枯燥的一个显示函数。将功能图标显示出来,Draw_BMP()中的第一个形参判断图片是否反白,0是不反白,1是反白。
void function_primary(void) //一级界面,显示功能图标
{   Draw_BMP(0,0,0,32,4,BMP5);Draw_BMP(0,48,0,80,4,BMP6);Draw_BMP(0,95,0,127,4,BMP7);Draw_BMP(0,0,4,32,8,BMP8);Draw_BMP(0,48,4,80,8,BMP9);Draw_BMP(0,95,4,127,8,BMP10);switch(s1)       //一级页面功能号{case 1: Draw_BMP(1,0,0,32,4,BMP5); break;case 2: Draw_BMP(1,48,0,80,4,BMP6); break;case 3: Draw_BMP(1,95,0,127,4,BMP7); break;case 4: Draw_BMP(1,0,4,32,8,BMP8); break;case 5: Draw_BMP(1,48,4,80,8,BMP9); break;case 6: Draw_BMP(1,95,4,127,8,BMP10); break;default: break;}
}
  1. 二级页面的显示函数,其实和一级页面差不多,无非是换了个标志位。这里就放一个次页面的就好了,其他的想加几个就复制几个。同样OLED_P8x16Str()中的第一个形参判断文字是否反白,0是不反白,1是反白。
void function_level1(void)
{sprintf(buf,"1.1");OLED_P8x16Str(0u,0u,0u,(uint8_t *)buf);sprintf(buf,"1.2");OLED_P8x16Str(0u,0u,2u,(uint8_t *)buf);sprintf(buf,"1.3");OLED_P8x16Str(0u,0u,4u,(uint8_t *)buf);sprintf(buf,"1.4  exit");OLED_P8x16Str(0u,0u,6u,(uint8_t *)buf);switch(s3)   //次页面功能号{case 1:sprintf(buf,"1.1");OLED_P8x16Str(1u,0u,0u,(uint8_t *)buf);break;case 2:sprintf(buf,"1.2");OLED_P8x16Str(1u,0u,2u,(uint8_t *)buf);break;case 3:sprintf(buf,"1.3");OLED_P8x16Str(1u,0u,4u,(uint8_t *)buf);break;case 4:sprintf(buf,"1.4  exit");OLED_P8x16Str(1u,0u,6u,(uint8_t *)buf);break;default:break;}
}
  1. 这里是确定按键,负责选中主界面或次界面的某个功能,按下后进行判断是哪个功能被选中并执行
void function(void)          //主页面切换至次界面
{   if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==RESET){HAL_Delay(200);if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin) == SET){   if(s2 == 0)       //位于主界面{switch(s1)      //判断切换至哪个次界面{case 1: OLED_CLS();s2 = 1;function_level1();break;case 2: OLED_CLS();s2 = 2;function_level2();break;case 3: OLED_CLS();s2 = 3;function_level3();break;case 4: OLED_CLS();s2 = 4;function_level4();break;case 5: OLED_CLS();s2 = 5;function_level5();break;case 6: OLED_CLS();s2 = 6;function_level6();break;default:OLED_CLS(); break;}}if(s2 != 0)     //判断是否位于次界面{if(s3 == 4)       //位于次界面时,选中次界面中功能四,执行切换回主界面{OLED_CLS();function_primary();s2 = 0;            //s2恢复初值s3 = 1;            //s3恢复初值}}}}
}
  1. 这里则是移动按键,负责选中某个功能对应的显示名称,并且将该功能对应的显示反白。这边放的是功能号递增
void key_scan1(void)     //功能切换按键1
{if(HAL_GPIO_ReadPin(KEYS_GPIO_Port,KEYS_Pin) == RESET){switch(s2)        //判断是主界面中哪个功能的次界面{case 0:HAL_Delay(200);if(HAL_GPIO_ReadPin(KEYS_GPIO_Port,KEYS_Pin) == SET){OLED_CLS();s1+=1;}if(s1 > 6)s1 = 1;elses1 = s1;display();break;case 1:HAL_Delay(200);if(HAL_GPIO_ReadPin(KEYS_GPIO_Port,KEYS_Pin) == SET){OLED_CLS();s3+=1;}if(s3 > 4)s3 = 1;elses3 = s3;function_level1();break;case 2:HAL_Delay(200);if(HAL_GPIO_ReadPin(KEYS_GPIO_Port,KEYS_Pin) == SET){OLED_CLS();s3+=1;}if(s3 > 4)s3 = 1;elses3 = s3;function_level2();break;case 3:HAL_Delay(200);if(HAL_GPIO_ReadPin(KEYS_GPIO_Port,KEYS_Pin) == SET){OLED_CLS();s3+=1;}if(s3 > 4)s3 = 1;elses3 = s3;function_level3();break;//后面你有多少功能就加多少case语句判断,格式一样......default:break;}}
}
  1. 这里是执行功能号递减的按键,只放上面对应要修改的部分,这里要说明一下,按键的函数是对所有的界面判断了功能号,即对s2进行判断,当 s2 = 0 的时候,显示的是一级界面,后面的才是二级界面的功能号。(s2作为功能号,放的是所有功能的序号。即后面有三级界面啥的,功能号都放着里面)
  • 注意:每个页面可能对应的功能不同,s1,s3作为主次界面的判断标志,其界面内拥有的功能数量可能有所不同,可以自行修改。
         case 0:HAL_Delay(200);if(HAL_GPIO_ReadPin(KEYS_GPIO_Port,KEYS_Pin) == SET){OLED_CLS();s1-=1;}if(s1 < 1)s1 = 6;elses1 = s1;display();break;
  1. 最后在main函数这个大循环里,只要加上那三个按键的函数就行了
  while (1){function();      //先执行确定,显示出主页面key_scan1();   //再进行功能选择key_scan2();}
  1. 到这边这个多级菜单也算是完成了,其实这些代码都是没啥难度,想明白思路基本就是敲完一个模板,其他的就C+V操作,改好参数就好了,要实现具体的切换功能键选中后再执行相应的功能,直接在显示的函数里加就好了。其实还有许多复杂的方法可以写多级菜单,链表啊啥的,奈何学艺不精,数据结构想从理论运用到实际还是有难度的。不过这简单的代码虽然看上去还是挺枯燥没啥味道,用起来还是可以的。最后个人认为按键最好加硬件消抖,用户体验提高不少。

单片机多级菜单的简单实现相关推荐

  1. qml中使用combobox实现多级菜单_Excel教程:还不会做Excel三级下拉菜单?其实它跟复制粘贴一样简单...

    关注回复[目录]学习113篇Excel教程 全套Excel视频教程,扫码观看 编按: 哈喽,大家好!说到做下拉菜单,小伙伴们都知道直接使用Excel中的数据验证就可以实现,但是二级.三级,甚至更多级的 ...

  2. 【shell 练习5】编写简单的多级菜单

    一.简单的多级菜单 [root@web129 ~]# cat menu.sh #!/bin/bash #shell菜单演示 function menu() { echo -e `date` cat & ...

  3. python编写电子菜单_Python简单实现多级菜单

    1 #-*- coding: utf-8 -*- 2 #@Time : 2018-06-01 13:40 3 #@Author : 超人 4 #@Email : huxiaojiu111@gmail. ...

  4. STM32+0.96OLED的多级菜单设计

    硬件 硬件选型 STM32F103C8T6最小核心板 0.96寸四脚OLED屏幕IIC接口 普通按键5个 硬件连线 SCL ---- PA1 SDA ---- PA2 KEY_UP ---- PA4 ...

  5. 基于链表的多级菜单设计

    基于链表的多级菜单设计 前言 主体 前言 最近在做一个简单的界面,需要用到多级菜单,一开始使用的是传统的索引法,在修改时比较乱,在网上有用链表写的,虽然一致都在用c语言,却很少使用链表,于是今天早上便 ...

  6. STM32简易多级菜单(数组查表法)

    单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了. 1 多级菜单 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单 ...

  7. java中菜单分几级_JAVA构造多级菜单

    很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...

  8. c# mvc5 view 多层_MVC5+EF6 入门完整教程13 -- 动态生成多级菜单

    稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...

  9. qml中使用combobox实现多级菜单_excel实用技巧:如何构建多级下拉菜单

    编按:哈喽,大家好!说到做下拉菜单,小伙伴们都知道直接使用Excel中的数据验证就可以实现,但是二级.三级,甚至更多级的下拉菜单,可能就有点蒙圈了.其实用Excel制作三级下拉菜单,一点都不难,它就跟 ...

  10. java多级菜单列表怎么做_JAVA构造多级菜单

    很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...

最新文章

  1. R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)、输出异常值对应的统计量、p值以及Bonferonnii校正p值
  2. TensorFlow – A Collection of Resources
  3. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)
  4. python3(七)os模块
  5. AngularJS学习笔记(1)——MVC模式的清单列表效果
  6. a href=#与 a href=javascript:void(0) 的区别
  7. happy 2016, happy 11111100000
  8. iOS 开发应用内跳转到App Store
  9. 阿里云云计算 21 VPC的概念
  10. python chardet模块,没有名为“chardet”的模块
  11. Java中的设计模式【我终于懂设计模式了】
  12. java base64图片计算图片大小
  13. 微信小程序–二维码生成器
  14. 163邮箱登录不了Outlook解决方案
  15. 阿里云视频点播解密DecryptKMSDataKeyRequest爬坑
  16. 和Ajax斗志斗勇的日子
  17. Iterator 的用法
  18. win10 设置ctrl+shift 切换 中文输入法 英文输入法
  19. pandas删除包含特定字符串所在的行
  20. OpenPAI1.3.0 部署

热门文章

  1. 修复漏洞显示连接服务器失败,服务器安全狗漏洞补丁失败怎么办
  2. 随滚动条移动的QQ在线客服代码
  3. 佳能dpp4中文版 附使用教程
  4. HttpClient4 基本操作
  5. 计算机机房的维护方案,机房设备维护方案.doc
  6. 阿里云服务器搭建ftp服务器
  7. 可视化实验三:大数据可视化工具—ECharts(一)
  8. java集成信鸽推送
  9. 深度卷积神经网络(AlexNet)
  10. 计算机中英文打字文章,中英文打字练习文章优美范文