单片机多级菜单的简单实现
单片机多级菜单的简单实现
多级菜单的思路
最近想把stm32上的oled显示屏做的好看一些,于是动手写了写一个多级菜单,思路很简单,每个页面用单独的函数封装好,每个功能也是用单独的函数进行封装,用了3个按键,两个切换键,一个确定键。
- 首先来看看用啥判断页面的(这偷个懒,希望没人打我)
//页面标志位
uint8_t s1 = 0; //主页面功能号
uint8_t s2 = 0; //主次页面判断标志位
uint16_t s3 = 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;}
}
- 二级页面的显示函数,其实和一级页面差不多,无非是换了个标志位。这里就放一个次页面的就好了,其他的想加几个就复制几个。同样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;}
}
- 这里是确定按键,负责选中主界面或次界面的某个功能,按下后进行判断是哪个功能被选中并执行
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恢复初值}}}}
}
- 这里则是移动按键,负责选中某个功能对应的显示名称,并且将该功能对应的显示反白。这边放的是功能号递增
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;}}
}
- 这里是执行功能号递减的按键,只放上面对应要修改的部分,这里要说明一下,按键的函数是对所有的界面判断了功能号,即对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;
- 最后在main函数这个大循环里,只要加上那三个按键的函数就行了
while (1){function(); //先执行确定,显示出主页面key_scan1(); //再进行功能选择key_scan2();}
- 到这边这个多级菜单也算是完成了,其实这些代码都是没啥难度,想明白思路基本就是敲完一个模板,其他的就C+V操作,改好参数就好了,要实现具体的切换功能键选中后再执行相应的功能,直接在显示的函数里加就好了。其实还有许多复杂的方法可以写多级菜单,链表啊啥的,奈何学艺不精,数据结构想从理论运用到实际还是有难度的。不过这简单的代码虽然看上去还是挺枯燥没啥味道,用起来还是可以的。最后个人认为按键最好加硬件消抖,用户体验提高不少。
单片机多级菜单的简单实现相关推荐
- qml中使用combobox实现多级菜单_Excel教程:还不会做Excel三级下拉菜单?其实它跟复制粘贴一样简单...
关注回复[目录]学习113篇Excel教程 全套Excel视频教程,扫码观看 编按: 哈喽,大家好!说到做下拉菜单,小伙伴们都知道直接使用Excel中的数据验证就可以实现,但是二级.三级,甚至更多级的 ...
- 【shell 练习5】编写简单的多级菜单
一.简单的多级菜单 [root@web129 ~]# cat menu.sh #!/bin/bash #shell菜单演示 function menu() { echo -e `date` cat & ...
- python编写电子菜单_Python简单实现多级菜单
1 #-*- coding: utf-8 -*- 2 #@Time : 2018-06-01 13:40 3 #@Author : 超人 4 #@Email : huxiaojiu111@gmail. ...
- STM32+0.96OLED的多级菜单设计
硬件 硬件选型 STM32F103C8T6最小核心板 0.96寸四脚OLED屏幕IIC接口 普通按键5个 硬件连线 SCL ---- PA1 SDA ---- PA2 KEY_UP ---- PA4 ...
- 基于链表的多级菜单设计
基于链表的多级菜单设计 前言 主体 前言 最近在做一个简单的界面,需要用到多级菜单,一开始使用的是传统的索引法,在修改时比较乱,在网上有用链表写的,虽然一致都在用c语言,却很少使用链表,于是今天早上便 ...
- STM32简易多级菜单(数组查表法)
单片机开发中,有时会用到屏幕来显示内容,当需要逐级显示内容时,就需要使用多级菜单的形式了. 1 多级菜单 多级菜单的实现,大体分为两种设计思路: 通过双向链表实现 通过数组查表实现 总体思路都是把菜单 ...
- java中菜单分几级_JAVA构造多级菜单
很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...
- c# mvc5 view 多层_MVC5+EF6 入门完整教程13 -- 动态生成多级菜单
稍微有一定复杂性的系统,多级菜单都是一个必备组件. 本篇专题讲述如何生成动态多级菜单的通用做法. 我们不用任何第三方的组件,完全自己构建灵活通用的多级菜单. 需要达成的效果:容易复用,可以根据mode ...
- qml中使用combobox实现多级菜单_excel实用技巧:如何构建多级下拉菜单
编按:哈喽,大家好!说到做下拉菜单,小伙伴们都知道直接使用Excel中的数据验证就可以实现,但是二级.三级,甚至更多级的下拉菜单,可能就有点蒙圈了.其实用Excel制作三级下拉菜单,一点都不难,它就跟 ...
- java多级菜单列表怎么做_JAVA构造多级菜单
很多时候我们在前段展现时要用到多级菜单,刚好今天做了个简单的,整理一下: 首先我们要确定要展现的菜单结构: --根菜单 --一级菜单A --二级菜单A --三级菜单A --一级菜单B 与Hiberna ...
最新文章
- R语言使用car包的outlierTest函数通过假设检验的方法检测回归模型中的异常值(outlier)、输出异常值对应的统计量、p值以及Bonferonnii校正p值
- TensorFlow – A Collection of Resources
- BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)
- python3(七)os模块
- AngularJS学习笔记(1)——MVC模式的清单列表效果
- a href=#与 a href=javascript:void(0) 的区别
- happy 2016, happy 11111100000
- iOS 开发应用内跳转到App Store
- 阿里云云计算 21 VPC的概念
- python chardet模块,没有名为“chardet”的模块
- Java中的设计模式【我终于懂设计模式了】
- java base64图片计算图片大小
- 微信小程序–二维码生成器
- 163邮箱登录不了Outlook解决方案
- 阿里云视频点播解密DecryptKMSDataKeyRequest爬坑
- 和Ajax斗志斗勇的日子
- Iterator 的用法
- win10 设置ctrl+shift 切换 中文输入法 英文输入法
- pandas删除包含特定字符串所在的行
- OpenPAI1.3.0 部署