vishay欢迎光临。

开源按钮组件MultiButton支持菜单操作(事件驱动)

对以前由老朋友编写的MultiButton开源按钮组件的分析和解释,其设计思想简单高效,我上周也分享了这篇文章,供大家一起学习。

& nbsp;第1期MultiButton,一个小型且易于使用的事件驱动的密钥驱动程序模块。

至于介绍和使用,在这里我就不多说了。

我相信您在阅读了以上文章后应该了解它,但是我认为它不能与菜单操作联系在一起吗?这样,我不能使用它来实现菜单+按钮组合的高效,稳定的状态机框架吗?在整个Internet上,许多编写菜单框架的人要么太死板,要么太冗长,而另一些人则难以理解和繁琐。

尽管每个人都有自己的实现方式,但是它们都不错。

但是,其中一些确实很难维护和升级,例如以下内容,它应该是Internet上广泛流传的菜单框架的一个版本。

但是我想我受不了了。

还有一些旧论文:https://wenku.baidu.com/view/576bae38ee06eff9aef807b9.htmlhttps://blog.csdn.net/embedded_guzi/article/details/35835755https://blog.csdn.net/cjqqschoolqq/文章/ details / 8701387我的项目设计原则:易于理解,实用,稳定,高效和可扩展。

通常,某些手持设备具有各种按钮,例如左,中,右,确定,返回,电源按钮等(非矩阵键盘)。

在我当前公司的产品中,通常使用这些按钮。

我们公司产品的主要业务逻辑仍然是应用程序。

实际上,应用程序逻辑的最大工作量体现在按钮+页面的形式上,这不可避免地需要一组简单,高效,稳定,可扩展和可维护的菜单+按钮。

有了这样一个易于使用的框架,如果我们拥有如此有用的框架,我们就无需重新开发新产品。

我们可以专注于应用程序实现,也可以专注于更有意义的软件业务逻辑。

接下来,我们在MultiButton的.h文件中添加与菜单框架和一些枚举有关的结构:/ * Menu,该页面是特定的,这留给用户添加* / typedef enum {MAIN_PAGE = 0,LOG_PAGE, } MENU; / *事件值可以留给用户定义,在这里我定义了一些我需要的事件* / typedef枚举{/ *第一个事件是-1,以定义一个值以防止重复触发* / NULL_KEY_EVENT =- 1,LEFT_KEY_SHORT = 0,LEFT_KEY_LONG = 1,ENTER_KEY_SHORT = 2,ENTER_KEY_LONG = 3,RIGHT_LEY_SHORT = 4,RIGHT_KEY_LONG = 5,UP_KEY_SHORT = 6,UP_KEY_LONG = 7,DOWN_KEY_SHORT_LONG = 7,DOWN_KEY = RETHORTONG 9,POWER_KEY_SHORT = 10,POWER_KEY_LONG = 11,} EVENT_CODE; / *菜单操作结构* / typedef struct Menu {/ *当前正在执行的页面* / uint8_t Current_Page; / *当前触发的事件* / int KeyEvent;}菜单; / *菜单初始化* / void menu_init(struct Menu * handle,uint8_t Page,int EVENT_CODE); / *获取当前菜单* / uint8_t Get_Menu(struct Menu * handle) ; / *菜单跳转* / void Set_Menu(结构菜单*句柄,uint8_t页面); / *获取当前事件的值* / int Get_Event_Code(结构菜单*句柄); / *设置当前事件的值* /无效的Set_Event_Code(结构菜单*句柄,int Event_Code);让我们再次看一下它。

.c文件的相关功能的实现:/ *菜单初始化* / void menu_init(结构菜单*句柄,uint8_t页面,int EVENT_CODE){memset(句柄,0,sizeof (结构菜单)); handle-& gt; Current_Page = Page; handle-& gt; KeyEvent = EVENT_CODE;} / * Menu Jump * / void Set_Menu(struct Menu * handle,uint8_t Page){handle-& gt; Current_Page = Page;} / *获取当前菜单* / uint8_t Get_Menu (struct Menu * handle){return handle-> Current_Page;} / *设置当前事件值* / void Set_Event_Code(struct Menu * handle,int Event_Code){handle-> KeyEvent = Event_Code;} / * Get当前事件值* / int Get_Event_Code(结构菜单* handle){return handle-& gt; KeyEvent;}很简单,菜单的操作被添加到MutilButton的两个文件中,接下来让我们看看如何使用它。

1.常规MultiButton的用法:按钮; / *读取按钮状态* / uint8_t read_button_pin_status(void){返回HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin); ;)初始化多按钮并注册按钮事件button_init(& amp; button,read_button_pin_status,0); button_attach(& amp; button,SINGLE_CLICK,button_callback); button_attach(& amp; button,LONG_RRESS_START,button_callback); button_start(& amp; ; amp; button);我当前注册的按钮的回调函数是相同的函数,并且是相同的函数执行的不同处理:void button_callback(void * event){uint8_t button_event = get_button_event(& button); switch(button_event){case SINGLE_CLICK:/ *单击按钮时,注册为ENTER_KEY_SHORT * / Set_Event_Code(& ampu,ENTER_KEY_SHORT);休息;案例LONG_RRESS_STAR



以上内容来自于网络,不代表本公司本网站同意其观点及内容。

欢迎您的咨询

  • 基于Stm32F101和Atmega8的投影机的电梯控制设计。
  • 日本电信4A卫星参数表
  • Facebook首席运营官:特朗普的帖子如果违反标准将被删除
  • 一些公司考虑制造可以接种疫苗的机器人
  • AMD锐龙5000系列移动处理器首次加入45W + HX系列
  • 今年人工智能市场收入将达到1560亿美元
  • 多点触控技术超越消费电子应用前景
  • 医学影像中时钟分配系统的设计
  • 基于GTiBee协议的无线云传感器网络通信系统
  • 高通公司计划将Nuvia技术应用于下一代旗舰智能手机和其他芯片设计领域
  • 火星探索的旅程很长,而INVT是“天堂问题”的守护者
  • ABB机器人DeviceNet通讯总线的两种选择
  • 哪些蓝牙耳机适合听音乐和看电影?具有良好兼容性的蓝牙耳机
  • SpaceX Starlink卫星或干扰天文学研究
  • CPU 317-2PNDP组态PROFINET接口
  • 高清裸眼3D单片机的最佳解决方案
  • JMGO的手机业务被取消。官方回应:售后和系统维护将继续
  • 单片机状态机框架
  • 联想ThinkPad T14s Ryzen Edition笔记本电脑,配备Ryzen 7 PRO 4750U处理器
  • 最好的时间多久更换一次汽车电池?