用于单片机的轻量级菜单

发布者:紫菜包饭最新更新时间:2023-03-24 来源: zhihu关键字:单片机  操作系统 手机看文章 扫描二维码
随时随地手机看文章

有时要用单片机写一些大点的程序,但又没必要使用一些操作系统的时候,我写出了下面这种轻量级菜单状态机,配备一个显示设备加5个输入(上下左右和按下)

先看看效果图



上面的 ABC, BCD,EFG分别是一个菜单列表的菜单

菜单的结构框图为



对于单个菜单的结构为

对于每个菜单,分别有指向它上面的菜单,下面的菜单,它的子菜单,它的父菜单,它的菜单列表,和这个菜单对应执行的函数的指针



对于一组菜单列表为


使用非常方便,我们来看下对于刚才效果图所展示的菜单的使用

首先定义有几个菜单列表



和一个指向当前状态的菜单



菜单的初始化

首先先给每个菜单列表里添加相应的菜单



然后把各个菜单列表连接起来



上图中RefreshMenu函数是根据CurrentMenu来刷新液晶屏的,这个要各位自己实现

然后再主函数里不停的执行



MenuHandler是这样处理得到的按键的





以上只给出了如何使用

其实还有些函数如 获得当前菜单为当前菜单列表中第几项 等子函数没列出来,这些通过都是链表的指针实现的


关键字:单片机  操作系统 引用地址:用于单片机的轻量级菜单

上一篇:单片机应用中的干扰因素分析
下一篇:单片机指针基本知识

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

STM32F1xx系列单片机通过程序获取MCU信息
在使用STM32F1xx系列单片机时可以直接在指定地址中读取单片机相关信息,在参考手册上的相关介绍如下。 通过上面的介绍可以看到,直接去这些指定地址中读取数据,就可以获取到MCU的相关信息。下来就直接通过代码去获取这些信息。 #include sys.h #include delay.h #include usart.h #include led.h u32 flash_id ; u16 flash_size; u32 mcu_id; int main( void ) { while( 1 ) { flash_size = *( unsigned int * )( 0x1FFFF
[单片机]
STM32F1xx系列<font color='red'>单片机</font>通过程序获取<font color='red'>MCU</font>信息
单片机设置和中断程序及仿真
1寄存器 1)特殊功能寄存器 2)存储器 2 定时与中断 1)定时与计数设置 2)中断设置 单片机中断程序,T1中断 ORG 0000h Ljmp main clr a mov r7,#00h ORG 0013h main: setb EA setb ET1 setb PT1 mov TMOD,#0e0h setb TR1 mov p0,TL1 jnb p1.7
[单片机]
<font color='red'>单片机</font>设置和中断程序及仿真
51单片机实验——十六进制计数器
1.实验题目: 用P0.0- P0.03设计一个在0-15之间自动计数的十六进制计数器,每个数持0.2s。 代码采用SWITCH语句,利用for循环实现16进制的计数器设计。 四个IO口相连接的LED灯按照0000-1111的二进制变化顺序进行计数。 2.KEIL代码 #include reg51.h #include intrins.h sbit P00=P0^0; sbit P01=P0^1; sbit P02=P0^2; sbit P03=P0^3; void Delay200ms();//声明延时函数 void main() { int i=0; while(1) { for(i=0;i 1
[单片机]
51<font color='red'>单片机</font>实验——十六进制计数器
单片机红外发射程序与原理详解
用AT89S51单片机制作红外电视遥控器 制作的实物如下图所示: 一般红外电视遥控器的输出都是用编码后串行数据对38~40kHz的方波进行脉冲幅度调制而产生的。 当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。这种遥控码具有以下特征: 采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。 上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制,然后再通过红外发射二极管产生红外线向空间发射。一般电视遥控器的遥控编码是连续的32位二进制码组,其中
[单片机]
<font color='red'>单片机</font>红外发射程序与原理详解
51单片机实验11:串口通信
目的:通过电脑向单片机发送字符,单片机收到字符后,向电脑回应相同的字符。 开发板时钟频率为12MHz。程序设置波特率为4800,加倍。 #include reg52.h #define uc unsigned char void usartinit() { TMOD=0X20; TH1=0XF3; TL1=0XF3; PCON=0X80; SCON=0X50; TR1=1; ES=1; EA=1; } void usart() interrupt 4 { uc receive_data; receive_data=SBUF; RI=0; SBUF=receive_data
[单片机]
单片机里面的中断优先级相关寄存器详解
中断优先级的内容,有一般紧急的中断,有特别紧急的中断,这取决于具体的系统设计,这就涉及到中断优先级和中断嵌套的概念,今天先简单介绍一下相关寄存器,不做例程说明。 中断的产生背景,实际生活当中还有更复杂的,比如我正在看电视,这个时候来电话了,我要进入接电话的“中断”程序当中去,就在接电话的同时,听到了水开的声音,水开的“中断”也发生了,我们就必须要放下手上的电话,先把煤气关掉,然后再回来听电话,最后听完了电话再看电视,这里就产生了一个优先级的问题。 还有一种情况,我们在看电视的时候,这个时候听到水开的声音,水开的“中断”发生了,我们要进入关煤气的“中断”程序当中,而在关煤气的同时,电话声音响了,而这个时候,我们的处理方式是先
[单片机]
<font color='red'>单片机</font>里面的中断优先级相关寄存器详解
51单片机PWM控制LED的亮度仿真程序图谱
单片机输出PWM斩波,控制LED的亮度并在图谱上面显示出来 仿真开启 参考代码: #include “reg51.h” unsigned int cd,dd; unsigned char cc,ee; sbit LED=P2^0; void led_int() interrupt 1 using 0 { TH0=0xf1; TL0=0xf1; TR0=1; dd++; if(dd11) { if((cc0x50)&&(ee0)){cd=0;} if((cc0)&&(ee==0x50)){cd=1;} if(cd){cc++;ee–;} else {cc–;ee++;} dd=0; } } void delay(uns
[单片机]
51<font color='red'>单片机</font>PWM控制LED的亮度仿真程序图谱
MCU助推居家移动医疗微型化
    随着行动装置的快速普及,近几年行动医疗成为热门话题,市场成长迅速,也引发了不少新的商业模式。根据美通社一份市场调查报告指出,行动医疗市场在2018年将达到234.9亿美元的规模,2013至2018年期间复合年增长率达到30.5%。     此外,据BCC Research预测,全球家用医疗设备规模将从2011年190亿美金成长到2016年262亿美金,其中辅助復健设备、监控装置等都会是成长的主要动力,可携式医疗设备也将会有大幅度的成长。经济部技术处科技专家赖建勋表示:「整个医疗趋势正在转变,未来会卖、会赚钱的都是微小化的医疗设备。」     当医疗设备走入家庭,医疗电子也有了不一样的发展趋势。有别于传统医疗设备大型
[医疗电子]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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