文章目录

  • 1、按键驱动
    • 1、硬件连接
    • 2、引脚功能配置
    • 3、程序设置
  • 2、oled驱动
  • 3、菜单移植
    • 1、菜单的思路
    • 2、菜单程序设计

作为一个成熟的项目,就必然不会只有一个方面的特点了,这里一般我们可能需要系统来进行调度,然后给一些可视化的UI,当然我前面有讲到HMI串口屏的使用,串口屏确实是非常不错的UI工具,但是一些比较小的项目就用不太到了,因此这里如果是一些低成本的DIY的项目,一般我们用OLED就足够了,足够mini,足够有感觉!

因此本文我决定记录下我在移植oled菜单的一些过程,同时也希望能帮助看到这篇文章的兄弟更快的上手OLED菜单!

1、按键驱动

这里我之前的文章讲到过一款开源的按键工具,这里为了节省代码量,我发现了一个更方便的驱动方式,下面就来介绍下:

1、硬件连接

这里肯定是越简单越好,所以这里就直接接上即可,也不做什么滤波电路了,当然有一个滤波自然是更好的哈哈哈,原理图如下所示:

下面是我用手焊的简易版本测试用的

可以看下背面就是按照原理图来进行的,如下所示

2、引脚功能配置

下面就是配置引脚模式了,因为这里引脚的另一端默认是接地的,所以我们这里接上IO口的这边就需要提前将其设置为上拉的模式,这样才不会影响我们的按键读取,使得每次都能有效检测到引脚电平的变化。

按键的扫面需要我们配置一个周期性的扫描函数,这里我们就有很多可以选择的方案了:

  • 使用freertos建立扫描任务
  • 裸机使用while循环来实现
  • 使用定时器来实现周期性扫描

这里考虑到本身只是个测试用的demo工程,就不搞系统了,直接裸机,为了移植上的方便性,我这里也就使用定时器来生成了,这里我们配置定时器6来实现功能,配置如下:

3、程序设置

这里我们开始来配置程序,这里我对关键部门来做一下说明,说明如下:

首先是对我们按键读取做一个宏,这样方便我们进行后续的操作

扫描函数说明如下,主要是使用改方案可以很好的实现按键检测

在定时器中检查扫描函数

综上我们就可以实现按键的检测工作了,实测效果还是不错的,可以自行验证。源码如下:

void KeyScan(void)
{static int keyCount = 0;static int keyState = 0;if (KEY_UP == 0 && keyState == 0) {keyCount++;if (keyCount > 2 && KEY_UP == 0 && keyState == 0) {KeyUp();keyState = 1;}}else if (KEY_DOWN == 0 && keyState == 0){keyCount++;if (keyCount > 2 && KEY_DOWN == 0 && keyState == 0){KeyDown();keyState = 1;}}else if (KEY_LEFT == 0 && keyState == 0){keyCount++;if (keyCount > 2 && KEY_LEFT == 0 && keyState == 0){KeyLeft();keyState = 1;}}else if (KEY_RIGHT == 0 && keyState == 0){keyCount++;if (keyCount > 2 && KEY_RIGHT == 0 && keyState == 0){KeyRight();keyState = 1;}}else if (KEY_ON == 0 && keyState == 0){keyCount++;if (keyCount > 2 && KEY_ON == 0 && keyState == 0){KeyOk();keyState = 1;}}else if (KEY_OFF == 0 && keyState == 0){keyCount++;if (keyCount > 2 && KEY_OFF == 0 && keyState == 0){keyState = 1;}}else if (KEY_UP == 1 && KEY_DOWN == 1 && KEY_LEFT == 1 && KEY_RIGHT == 1 && keyState == 1) {keyCount = 0;keyState = 0;}
}

2、oled驱动

oled驱动可以见我之前的博客,这里不在进行介绍,之前有介绍过SPI还有IIC版本的,也都介绍了使用软件还有硬件的方式进行驱动,软件驱动的话就可以比较方便的进行其他型号单片机的移植了,下面是相关博客的链接,可以自行查阅:

SPI驱动:SPI写OLED(软硬件切换)

IIC驱动:stm32配置总结-iic的使用

3、菜单移植

1、菜单的思路

之前在网上也看到很多大佬讲过oled菜单,但是根绝实现起来都不太方便,最简单的肯定就是自己写好页面然后刷新,使用按键这样一个个的函数进行跳转,感觉这样就很麻烦了,不推荐使用这样的方式,如果菜单比较简单就还好,菜单一旦复杂就不行了,那也太难搞了!

所以这里我移植了另一位大佬的方案,感觉还是很不错的,感谢这位大佬,源地址如下:https://gitee.com/snqx-lqh/screen-design-using-gui/tree/master/2%E3%80%81STM32C8T6+IIC+OLED0.96GUI%E8%AE%BE%E8%AE%A1

首先我们看下菜单结构体,每个菜单结构体包含了菜单页的一些参数,说明如下:

  • 菜单个数
  • 滚动条长度(就是比如如果选用16的字体的话,一页最多显示四行,这样长度0,因为不需要滚动,如果需要显示大于4行,比如5行,这样菜单就需要滚动一下才能看到下面的一行,这样滚动条长度就是1了。
  • 菜单的名称等
  • 菜单的功能函数
  • 父级菜单
  • 子菜单

其实这里比较重要的就还是父级菜单和子菜单,使用他们我们就可以进行菜单之间的跳转了!

2、菜单程序设计

上面介绍了菜单的思路,下面就可以看看菜单是怎么生成的了,不过在这之前可以看下作者设计的封面,封面显示如下所示:

可以看下程序上的设置:

这里时间上是使用了一个定时器来执行的,然后通过参数结构体进行更新,其中年月日的更新也在定时器中来执行,下面就可以看下菜单的定义了。主要是看子菜单和父级菜单的定义。

下面看给菜单添加的内容描述,这里如果我们后续要使用中文的话后面的显示函数也需要做相应的修改,所以这里为了整个过程显得不繁琐,就还是英文字符吧

下面是我之前说的滑动窗口的定义了

下面是箭头的刷新函数指示

效果如下:

下面是对于内部的定义的一些变量的刷新

子菜单的内部变量刷新效果如下所示:

之后就是把刚才定义的内容加入进去了

最后就是按键控制函数了,主要是一些逻辑上的选择,这里注意就是每次对索引值进行一次操作之后要刷新屏幕

在主函数中加入初始化还有刷新函数

最终效果如下所示:

OLED多级菜单记录相关推荐

  1. 基于STM32的OLED多级菜单GUI实现(简化版智能手表)

    前言:本文的OLED多级菜单UI为一个综合性的STM32小项目,使用多传感器与OLED显示屏实现智能终端的效果.项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换,搭配DH ...

  2. STM32F103 + 0.96/1.3“ I2C OLED + EC11旋转编码器多级菜单demo

    STM32F103 + 0.96/1.3" I2C OLED + EC11旋转编码器多级菜单demo

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

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

  4. Python基础-小程序练习(跳出多层循环,购物车,多级菜单,用户登录)

    一. 从第3层循环直接跳出所有循环 break_flag = False count = 0 while break_flag == False:print("-第一层")whil ...

  5. 关于若依框架多级菜单的设置

    最近从php转到java,并且被要求用了一个叫若依的框架.然后有个需求需要用到三级菜单.按照二级菜单配置后前端的element-ui显示找不到该model.最后看官方文档,外加csdn的一个博客才给解 ...

  6. 游戏程序必备spyder程序--可进可退的多级菜单系统

    文章目录 可进可退的多级菜单系统 运行结果 代码如下 可进可退的多级菜单系统 运行结果 代码如下 while True:#外循环 print('='*10) print('1.登录') print(' ...

  7. python多级菜单_多级菜单.py

    # user/bin/env python3 # -*- coding:utf-8 -*- QI = ['桃山区','新兴区','茄子河'] HA = ['道里区','南岗区','道外区'] DA = ...

  8. STM32之简易GUI(多级菜单进阶版)

    很久之前,写过一个简易的多级菜单,如今回头看,我都不敢承认那玩意是自己写的,于是打算重新写过一个,并且做成一个简易的GUI.原来用的OLED,现在改成了TFT(ST7789驱动).但是答题的思路还是不 ...

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

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

  10. vant树型菜单多级_iOS 动态树形结构 - 实现多级菜单,附带复选框功能

    关键词:递归 多级菜单 复选 目标: 1.显示多级菜单,默认显示一级. 2.可以通过点击有子级的行展开菜单 3.通过复选框,改变选中状态.状态有全选.半选.未选中 4.可以扩展获取当前所选的条目集合 ...

最新文章

  1. Spark Scala语言学习系列之完成HelloWorld程序(三种方式)
  2. 世界无人帆船大赛首次登陆中国,水手梦也能用代码实现
  3. C++ new/delete、malloc/free
  4. js重新渲染div_前端工程师必备:从浏览器的渲染到性能优化
  5. 对session的理解
  6. Apache默认端口80被占用无法启动服务问题
  7. mysql过滤效率和java过滤效率_熔喷布过滤效率测试仪详解
  8. Linux下MySQL5.6的修改字符集编码为UTF8
  9. 前端基础:vue.js跟node.js分别是什么
  10. [LeetCode]Count and Say
  11. java 快速回收_快速了解JAVA垃圾回收机制
  12. Windows命令之ping命令
  13. oracle 10g 10053事件
  14. 模电(电平转换电路)
  15. 学习笔记——STM32摄像头OV7725(二)
  16. 百战c++(数据库2)
  17. win10共享打印机搜索不到计算机,Win10专业版在局域网中搜索不到打印机
  18. mysql面试题总结
  19. 解决win11/win10在登陆界面(解锁界面)点击获取每日壁纸无效的问题 - get Daily Lockscreen and Wallpaper - Win11/10的登录界面背景图片在哪里?
  20. 页面访问量和网站访问量的统计

热门文章

  1. js数组方法的返回值总结
  2. WP-Super-Cache的使用
  3. Android实现流量统计和网速监控悬浮窗
  4. /etc/profile文件详解
  5. 华为太极magisk安装教程_【极客教程】如何让不支持指纹支付的手机也能用上指纹支付?...
  6. MySQL倒计时查询剩余时间xx年xx月xx天
  7. 如何在html上显示时间设置,如何在网页上显示日期的两种方法
  8. 结构化数据、半结构化数据、非结构化数据的划分
  9. VUE游戏设计:实现外星人的攻击冲击波
  10. 计算机专业助我成长作文600,挫折助我成长作文(精选6篇)