基于STM32之OLED菜单界面框架搭建

发布者:Changsheng520最新更新时间:2023-08-24 来源: zhihu关键字:STM32  OLED  菜单界面  框架搭建 手机看文章 扫描二维码
随时随地手机看文章

随着科技的不断发展,嵌入式系统在各个领域中得到了广泛的应用。而STM32是一款在嵌入式系统中应用较为广泛的芯片。它的主频高、功耗低、性能稳定,以及强大的外设功能都使得它成为了许多开发者的首选。本文将介绍如何基于STM32搭建一个OLED菜单界面框架。

首先,我们需要准备以下材料:


1. STM32F103C8T6主控制板

2. 0.96寸OLED显示屏模块

3. dupont线若干


接下来就可以开始搭建了。


步骤1:连接硬件


先将OLED模块通过dupont线连接至STM32主控制板。具体连接方式可以参考如下:


OLED模块 | STM32主控制板

VCC | 3.3V

GND | GND

SCL | B6

SDA | B7


步骤2:安装必要的软件库


我们需要安装u8glib和STemWin这两个软件库。u8glib是一款轻量级的图形库,用于驱动OLED显示屏。STemWin是一款跨平台的GUI软件库,具有高度的可移植性。它支持多种操作系统和嵌入式平台,并且提供了大量的GUI组件。


步骤3:设计GUI菜单界面


接下来我们需要设计OLED菜单界面。


首先,在Keil中新建一个工程。选择相应的芯片型号,然后添加u8glib和STemWin这两个软件库。


然后在工程中新建一个.c文件,命名为Menu.c。在Menu.c中,我们可以自定义多层菜单的数据结构。每一个菜单项都包括菜单名称、菜单项编号、与之关联的事件函数等。例如:


typedef struct menuitem

{

char *itemname;

uint16_t itemid;

void (*eventfunction)(void);

struct menuitem *parentmenu;

struct menuitem *childmenu;

} MenuItem;


接下来,在main函数中,我们可以初始化OLED显示屏和STemWin库,然后将菜单的根节点设置为当前选项。例如:


int main()

{

// 初始化OLED显示屏和STemWin库

OLED_Init();

GUI_Init();

// 创建菜单项

MenuItem mainmenu = {"Main Menu", 0, NULL, NULL, NULL};

MenuItem submenu1 = {"Submenu 1", 1, eventhandler1, &mainmenu, NULL};

MenuItem submenu2 = {"Submenu 2", 2, eventhandler2, &mainmenu, NULL};

MenuItem submenu3 = {"Submenu 3", 3, eventhandler3, &mainmenu, NULL};

MenuItem subsubmenu1 = {"Sub-submenu 1", 4, eventhandler4, &submenu1, NULL};

MenuItem subsubmenu2 = {"Sub-submenu 2", 5, eventhandler5, &submenu1, NULL};

submenu1.childmenu = &subsubmenu1;

subsubmenu1.parentmenu = &submenu1;

submenu2.childmenu = &subsubmenu2;

subsubmenu2.parentmenu = &submenu2;

mainmenu.childmenu = &submenu1;

submenu1.childmenu = &subsubmenu1;

subsubmenu1.childmenu = &subsubmenu2;

// 设置当前选项为根节点

MenuItem *currentmenu = &mainmenu;

// 循环执行菜单项事件

while(1)

{

currentmenu->eventfunction(currentmenu);

}

}


步骤4:添加事件处理函数


在上述代码中,我们定义了多个菜单项,并将它们组织成了菜单树。还需要为每个菜单项添加事件处理函数。当用户选择某个菜单项时,该菜单项关联的事件处理函数将会被执行。例如:


void eventhandler1(MenuItem *menuitem)

{

uint16_t selecteditemid = 0;

while(1)

{

selecteditemid = ShowSubMenu(menuitem);

if(selecteditemid == 4)

{

eventhandler4(&menuitem->childmenu[subsubmenu1]);

}

else if(selecteditemid == 5)

{

eventhandler5(&menuitem->childmenu[subsubmenu2]);

}

else

{

break;

}

}

}


步骤5:实现菜单界面交互

最后,我们需要实现菜单界面的交互。用户可以通过按键来选择菜单项,并且可以在菜单项之间进行上下滚动。例如:


uint16_t ShowMenu(MenuItem *menuitem)

{

uint16_t selecteditemid = 0;

uint16_t menuindex = 0;

uint16_t numentries = GetNumEntries(menuitem->childmenu);

while(1)

{

DrawMenu(menuitem, menuindex);

uint8_t key = GetKey();

if(key == KEY_UP && menuindex > 0)

{

menuindex--;

}

else if(key == KEY_DOWN && menuindex < numentries - 1)

{

menuindex++;

}

else if(key == KEY_ENTER)

{

selecteditemid = menuitem->childmenu[menuindex].itemid;

break;

}

}

return selecteditemid;

}


通过以上步骤,我们就可以基于STM32搭建一个完整的OLED菜单界面框架了。该菜单界面框架可以作为嵌入式系统的用户交互界面,提供更加友好的操作体验。


关键字:STM32  OLED  菜单界面  框架搭建 引用地址:基于STM32之OLED菜单界面框架搭建

上一篇:【STM32】一种基于Cortex-M内核的精确延时方法
下一篇:如何利用PCB设计stm32单片机

推荐阅读最新更新时间:2024-11-07 10:38

怎样去设计一种基于STM32单片机的智能手环脉搏心率计步器
一:功能 基于STM32单片机智能手环心率计步器体温显示设计 本设计由STM32F103C8T6单片机核心板电路+ADXL345传感器电路+心率传感器电路+温度传感器+lcd1602电路组成。 1、通过重力加速度传感器ADXL345检测人的状态,计算出走步数、走路距离和平均速度。 2、通过心率传感器实时检测心率,通过温度传感器检测温度。 3、lcd1602实时显示步数、距离和平均速度、心率以及温度值。 二:电路图 三:源代码 #include led.h #include delay.h #include sys.h #include usart.h #include #include t
[单片机]
怎样去设计一种基于<font color='red'>STM32</font>单片机的智能手环脉搏心率计步器
stm32 常量 指定位置_STM32寄存器讲解
原理讲解芯片讲解STM32F103芯片 我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的 CPU与主板、内存、显卡、硬盘的关系。 STM32F103采用的是 Cortex-M3内核,内核即 CPU,由 ARM公司设计。ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如 ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如 GPIO、USART(串口)、I2C、SPI等都叫做片上外设。(采用野火官方的介绍)。 芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动
[单片机]
<font color='red'>stm32</font> 常量 指定位置_<font color='red'>STM32</font>寄存器讲解
stm32 spi从模式配置解答
目标:stm32(战舰) 和 stm32(迷你)的spi对传(战舰做从,迷你做主) 结果:对传成功 代码不写,你网上搜索到的可以用; 但提示:我用的是(主从片选都是软件配置); 关键点介绍:重要的是极性和相位的配置(stm32的spi对传有问题); 我stm32迷你用的极性和相位选的都为0(即Low和边沿1触发);stm32战舰极性和相位选的为1(即High和边沿2触发) 过程介绍:开始我配置着相同的极性和相位,发现Master发送4bytes数据,A1,A2,A3,A4,slave接收到的数据是D0,D1,51,D2; 经如下计算: A1 A2 A3 A4 1010 0001 1010 0010
[单片机]
基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)
简介:本实验基于stm32最小系统、0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏。 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯),stc32f103c8t6最小系统开发板,如下所示。 器件齐全后,用杜邦线将摇杆和oled正确地连接到stm32开发板上,注意各个器件的电源需要接到同一电压,下图是接线说明: 接好线之后,将源码编译下载,进入调试,正常运行如下图所示,如果屏幕出现花屏,那么将res引脚接到GND进行复位,再重新进行调试或单片机复位: 接着按下摇杆的中键就可以进入游戏: 屏幕的上方显示得分,通过摇杆控制蛇的运动方向。 游戏失败后可按下摇杆中键重
[单片机]
基于<font color='red'>stm32</font>、0.96寸<font color='red'>OLED</font>实现的贪吃蛇小游戏(详细源码注释)
STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击
前言 状态机是一种根据当前状态来执行相应动作,根据输入去改变状态的方法,出处应该在数字电路中。 我们利用状态机的思想来实现按键的消抖和一些其他功能的实现 一、状态图 我们的按键实验,就是以此状态图为基础,然后做延申,实现长短按和双击。 二、Cubemax配置 1、IO口配置 这个配置很简单,看自己的板子上按键的IO口是哪个,我这里以KEY0做演示 配置PH3为输出IO,而且由电路图可知,应该设置为上拉。 2、定时器配置 我们需要配置一个10ms的定时器,以10ms去检测按键的状态 三、代码 1、编写有关按键的结构体和定义相关参数 #define IOSTATE HAL_GPIO_ReadPin(GPI
[单片机]
<font color='red'>STM32</font> Cubemax(十二) ——利用状态机实现按键的长短按和双击
照明产业LED是方向OLED是未来
绿色、低碳已经成为了技术创新和发展的主旋律之一。2010年2月3日,胡锦涛总书记呼吁加快经济发展方式转变,提高内需与新兴创新产业在经济发展中的作用。中国已着手将刺激政策的重点转向产业升级,转向靠科技进步、劳动力素质提高、管理创新推动经济发展。史无前例的37个“加快”,充分表明此番讲话是迄今为止中国领导人就转变经济发展方式问题发表的语气最坚决的言论之一,表明经济发展方式的转变已成为一项更加紧迫的任务。而绿色低碳经济将成为经济增长、产业升级的主要动力之一,以真正实现绿色复苏。   核心技术+规模应用=LED行业王者。LED具有体积小、发光效率高、耗电量少、使用寿命长、安全可靠性强、节能环保等特点,其内在特征决定了它是最理想取代传统光
[电源管理]
关于STM32进入低功耗模式后无法烧写程序的解决办法
我们经常要设置STM32在某个时候进入低功耗模式,很多人在进入低功耗模式调试的时候,无法再次烧写程序,解决办法是: 1.必须将boot0拉高,boot1(PB2)拉低,然后(必须)重启电源,单片机会进入ISP编程模式,这时候通过串口1就可以下载程序。 2.先按住复位按钮,然后点击MDK的下载,然后放开复位,有的板子没有复位脚,将NRST引出也可以。 3.用仿真 器下载时,如果仿真器连了复位线,下载设置里将硬复位打开就可以。(目前问题boot0拉高才可以,但是应该跟启动方式无关) HW RESER 跟SYSRESERREQ都可以 使用ST-Link下载程序时提示“flash timeout.reset the target
[单片机]
关于<font color='red'>STM32</font>进入低功耗模式后无法烧写程序的解决办法
STM32学习之:定时器程序设计探讨
假设使用定时器3每1毫秒定时;保存至SD卡的函数是StartSave(); 第一种情况:定时器快,主循环慢 1、代码设计1(错误的设计) view plain copy int cnt = 0; //计数 //TIM3中断处理函数 void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); cnt ++; } } void main(void) { 代码段1 while(1) {
[单片机]

推荐帖子

【跟TI学电源】系列------TI电源DC-DC基础知识课件
“电源基础培训系列课程——DC-DC基础知识”课件2012TI“电源基础培训系列课程——DC-DC基础知识”讲不错,有的网友早已经学完了,有的想收藏课件,总共5个课件,那就到这里下载吧,, 【跟TI学电源】系列------TI电源DC-DC基础知识课件学习了xiexie`````````````````````这个就是那个TI老师的课件,尽快拿走,,不客气回复6楼内洛的帖子太感谢了。不知道视频可以下载不当然只用于学习现在好像没有发现讲课的视频
qwqwqw2088 模拟与混合信号
嵌入式java
我现在学习了javase,并有javame的一些基础。现在想学嵌入式开发,请高手们指点一下,应该怎么学啊???希望与java联系起来嵌入式javawince下用java?应该不会很好用,不合适。可以学习Linux下的Java应用。建议了解一下Android楼上正解,建议在andriod下去做JAVA不懂的顶上!要再wince上用java,首先得搭建java的运行环境,--、---wince下的java应用肯定是有市场的CE下,可以考虑使用Phone
wdzywl 嵌入式系统
电路常识性概念四 --VCC、VDD和VSS三种标号的区别
在电子电路中,常可以看到VCC、VDD和VSS三种不同的符号,它们有什么区别呢?一、解释VCC:C=circuit表示电路的意思,即接入电路的电压;VDD:D=device表示器件的意思,即器件内部的工作电压;VSS:S=series表示公共连接的意思,通常指电路公共接地端电压。二、说明1、对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常VccVdd),VSS是接地点。(例如,对于ARM单片机电路,其供电电压
qinkaiabc 电源技术
【转帖】电容的分类、用途及图片识别
电容器,通常简称其容纳电荷的本领为电容,用字母C表示。定义1:电容器,顾名思义,是‘装电的容器’,是一种容纳电荷的器件。英文名称:capacitor。电容器是电子设备中大量使用的电子元件之一,广泛应用于电路中的隔直通交,耦合,旁路,滤波,调谐回路,能量转换,控制等方面。定义2:电容器,任何两个彼此绝缘且相隔很近的导体(包括导线)间都构成一个电容器。电容与电容器不同。电容为基本物理量,符号C,单位为F(法拉)。通用公式C=Q/U平行板电容器专用公式:板间电场强度E=U/
Ameya360皇华 综合技术交流
IO口模拟串口、PWM、IIC功能和芯片本身硬件自带的串口、PWM、IIC有哪些异同?
IO口模拟串口、PWM、IIC功能和芯片本身硬件自带的串口、PWM、IIC有哪些异同?IO口模拟串口、PWM、IIC功能和芯片本身硬件自带的串口、PWM、IIC有哪些异同?软件缺点:没有中断,不能使用DMA,时序有误差,不好配置;软件优点:能非常清晰读懂通信的时序!你把它们当作专业时序发生器就好了,配置完了就能统一处理。IO模拟的时序加深理解可以,用起来总会有比如中断打乱等问题。最大的优点就是时序可控,个人习惯都是IO先模拟,判断通路,再转换成自带的功能据说
QWE4562009 单片机
[X-NUCLEO-53L4A3 TOF评估板]1.测试和代码移植
首先感谢EEWORLD以及得捷电子给予这次测评的机会。先了解一下VL53L4ED官方参数特性首先运行一下官方例程,让传感器先工作起来,打开STM32CUBEMX,安装TOF扩展包安装完成后在本地磁盘找到软件包后打开VL53L4A3的例程例程有3个分别为多传感器测距、单传感器测距、阈值检测,由于本次测评的硬件只有1个中间传感器,所以打开第二个例程编译下载即可体验简单的测距功能。需要注意例程的波特率是460800接下来体验一下官方的VL53L4ED_GUI软件,软
镜花水月000 传感器
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved