基于OLED菜单显示

菜单一般需要四个按键,上下移动光标,进入菜单,退出菜单

1.按键部分

按键头文件

#ifndef __KEYdriver_H
#define __KEYdriver_H
#include "sys.h"
#include "stdbool.h"
/*用户定义的宏开始*/
#define 	CursorUp   PCin(14)
#define 	CursorDown PCin(15)
#define 	Confirm    PAin(0)
#define 	Quit       PAin(1)
#define 	LEDOut     PCout(13)#define MAX_MenuNum  6/*用户定义的宏结束*/
/*用户定义变量开始*/
struct KEY_TASK
{char key; bool in_Or_start;bool ReturnOneLevelUp;
};/*用户定义变量结束*/void KeyDriverInit(void);
void KEY_Control(struct KEY_TASK* strKey);
void StrKeyInit(struct KEY_TASK* strKey);#endif

按键c文件

#include "KeyDriver.h"void KeyDriverInit(void)
{	GPIO_InitTypeDef   GPIO_InitStruct;GPIO_InitTypeDef   GPIO_InitStruct1;GPIO_InitTypeDef   GPIO_InitStruct2;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能B端口时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 //使能B端口时钟GPIO_InitStruct.GPIO_Pin= GPIO_Pin_0|GPIO_Pin_1;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 //使能B端口时钟GPIO_InitStruct1.GPIO_Pin= GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStruct1.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStruct1.GPIO_Speed =GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct1);GPIO_InitStruct2.GPIO_Pin= GPIO_Pin_13;GPIO_InitStruct2.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct2.GPIO_Speed =GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct2);
}void KEY_Control(struct KEY_TASK* strKey)
{if(CursorUp ==0 ){delay_ms(10);if(CursorUp ==0)strKey->key++;while(CursorUp == 0);			delay_ms(10);}else if(CursorDown ==0 ){delay_ms(10);if(CursorDown == 0)strKey->key--;while(CursorDown == 0);	delay_ms(10);}else if(Confirm == 0){delay_ms(10);if(Confirm == 0)strKey->in_Or_start = 1 ;while(Confirm == 0);	delay_ms(10);		}else if(Quit == 0){delay_ms(10);if(Quit == 0)strKey->ReturnOneLevelUp = 1 ;while(Quit == 0);	delay_ms(10);		}if(strKey->key<=0)strKey->key = 0;if(strKey->key > MAX_MenuNum)strKey->key = 0;return ;
}void StrKeyInit(struct KEY_TASK* strKey)
{strKey->in_Or_start =0;strKey->key = 0;strKey->ReturnOneLevelUp = 0;
}

2.菜单显示部分

菜单头文件

#ifndef __MENU_H
#define __MENU_H
#include "sys.h"void OneMenu(void);#endif

菜单C文件

#include "menu.h" void OneMenu(void)
{struct KEY_TASK StrOneMenuKey;StrKeyInit(&StrOneMenuKey);while(1)		{KEY_Control(&StrOneMenuKey);StrOneMenuKey.ReturnOneLevelUp = 0;//防止误按,第一级界面无法返回上一界面if(StrOneMenuKey.key<=6)//判断按键向下移动的次数方便容纳更多的菜单{switch(StrOneMenuKey.key){case 0:OLED_ShowString(1,0,"correction    <",8);//显示并不清空OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空OLED_ShowString(1,3,"Task three     ",8);//显示并不清空OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空if(StrOneMenuKey.in_Or_start ==1)//可以进入二级菜单,也可以执行任务我这里就执行任务了。{OLED_Clear();while(1){KEY_Control(&StrOneMenuKey);//当需要循环执行的任务完成后可以返回一个值利用这个返回值判断是否结束while//非循环任务直接在此处调用函数即可无需whileLEDOut =0;if(StrOneMenuKey.ReturnOneLevelUp == 1){StrOneMenuKey.in_Or_start = 0;StrOneMenuKey.ReturnOneLevelUp = 0;LEDOut = 1;	break;}}}break;case 1:OLED_ShowString(1,0,"correction     ",8);OLED_ShowString(1,1,"Task   one    <",8);OLED_ShowString(1,2,"Task   two     ",8);OLED_ShowString(1,3,"Task three     ",8);OLED_ShowString(1,4,"Task  four     ",8);OLED_ShowString(1,5,"Task  five     ",8);OLED_ShowString(1,6,"Task   six     ",8);if(StrOneMenuKey.in_Or_start ==1)//可以进入二级菜单,也可以执行任务我这里就执行任务了。{OLED_Clear();while(1){KEY_Control(&StrOneMenuKey);//当需要循环执行的任务完成后可以返回一个值利用这个返回值判断是否结束while//非循环任务直接在此处调用函数即可无需while//printf("hello world\r\n");OLED_ShowNumber(1,1,USART_RX_BUF[2],3,8);if(StrOneMenuKey.ReturnOneLevelUp == 1){StrOneMenuKey.in_Or_start = 0;StrOneMenuKey.ReturnOneLevelUp = 0;break;	}}}break;case 2:OLED_ShowString(1,0,"correction     ",8);//显示并不清空OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空OLED_ShowString(1,2,"Task   two    <",8);//显示并不清空OLED_ShowString(1,3,"Task three     ",8);//显示并不清空OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空	break;case 3:OLED_ShowString(1,0,"correction",8);//显示并不清空OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空OLED_ShowString(1,3,"Task three    <",8);//显示并不清空OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空	break;case 4:OLED_ShowString(1,0,"correction     ",8);//显示并不清空OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空OLED_ShowString(1,3,"Task three     ",8);//显示并不清空OLED_ShowString(1,4,"Task  four    <",8);//显示并不清空OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空	break;case 5:OLED_ShowString(1,0,"correction     ",8);//显示并不清空OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空OLED_ShowString(1,3,"Task three     ",8);//显示并不清空OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空OLED_ShowString(1,5,"Task  five    <",8);//显示并不清空OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空break;case 6:OLED_ShowString(1,0,"correction    ",8);//显示并不清空OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空OLED_ShowString(1,3,"Task three     ",8);//显示并不清空OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空OLED_ShowString(1,6,"Task   six    <",8);//显示并不清空	break;}}
//		if(StrOneMenuKey.key>6)
//		{
//			switch(StrOneMenuKey.key)
//			{
//				case 7:
//							 OLED_ShowString(1,0,"correction    <",8);//显示并不清空
//							 OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空
//							 OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空
//							 OLED_ShowString(1,3,"Task three     ",8);//显示并不清空
//							 OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空
//							 OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空
//							 OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空
//							 break;
//				case 8:OLED_Clear();
//							 OLED_ShowString(1,0,"correction     ",8);//显示并不清空
//							 OLED_ShowString(1,1,"Task   one    <",8);//显示并不清空
//							 OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空
//							 OLED_ShowString(1,3,"Task three     ",8);//显示并不清空
//							 OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空
//							 OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空
//							 OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空
//								 break;
//				case 9:
//							 OLED_ShowString(1,0,"correction     ",8);//显示并不清空
//							 OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空
//							 OLED_ShowString(1,2,"Task   two    <",8);//显示并不清空
//							 OLED_ShowString(1,3,"Task three     ",8);//显示并不清空
//							 OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空
//							 OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空
//							 OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空	
//							  break;
//				case 10:
//							 OLED_ShowString(1,0,"correction",8);//显示并不清空
//							 OLED_ShowString(1,1,"Task   one     ",8);//显示并不清空
//							 OLED_ShowString(1,2,"Task   two     ",8);//显示并不清空
//							 OLED_ShowString(1,3,"Task three    <",8);//显示并不清空
//							 OLED_ShowString(1,4,"Task  four     ",8);//显示并不清空
//							 OLED_ShowString(1,5,"Task  five     ",8);//显示并不清空
//							 OLED_ShowString(1,6,"Task   six     ",8);//显示并不清空	
//							  break;
//		}
//	}}//while
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/21359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算、云计算、雾计算在物联网中的作用

边缘计算和雾计算不像云那样广为人知&#xff0c;但可以为企业和物联网公司提供很多帮助。这些网络解决了物联网云计算服务无法解决的许多问题&#xff0c;并使分散的数据存储适应特定的需求。让我们分别研究一下边缘计算、雾计算和云计算的优势。 雾计算的好处 低延迟。雾网络…

【工具】探索 ARPU:平均每用户收入

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 ARP…

UE5.1_常用快捷键

UE5.1_常用快捷键 shift1&#xff0c;&#xff0c;模式选择 shift2&#xff0c;&#xff0c;模式选择 shift3&#xff0c;&#xff0c;模式选择 shift4&#xff0c;&#xff0c;模式选择 shift5&#xff0c;&#xff0c;模式选择 shift6&#xff0c;&#xff0c;模式选择 …

2.3Docker部署java工程

2.3Docker部署java工程 1.导入jar包 2.在Docker部署jdk&#xff08;容器名为myjdk17&#xff09; 3.修改jar包名 mv 原包名 新包名4. 配置启动脚本 Dockerfile是一个文本文件&#xff0c;其中包含了构建 Docker 镜像所需的一系列步骤和指令。通过编写 Dockerfile 文件&…

C#中的值类型与引用类型

值类型&#xff1a; 在C#中&#xff0c;值类型是一种数据类型&#xff0c;它们直接包含它们的数据&#xff0c;并存储在栈上或内联在其他对象中。与引用类型不同&#xff0c;值类型的实例直接包含其数据的副本&#xff0c;而不是引用到实际数据的地址。 C#中的一些常见值类型…

Adversarial Nibbler挑战:与多元社区持续开展开放红队测试

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

C++STL---vector常见用法

C STL中的vector vector是C标准模板库&#xff08;STL&#xff09;中最常用的序列容器之一&#xff0c;它是一个动态数组&#xff0c;能够存储任意类型的对象&#xff08;如整数、字符串等&#xff09;。vector的主要优点是提供了快速的随机访问&#xff0c;同时还能够动态地调…

RPG Maker MV角色战斗动画记录

角色战斗动画记录 角色战斗状态判断的语句赋值 战斗管理战斗精灵创建精灵进行角色的更新 角色战斗状态 角色的战斗状态是由 Game_Battler 类中的 _actionState 属性的字符串决定的&#xff0c;它有哪些值呢&#xff1f; undecided 未确定或者说是操作状态inputting 输入waiti…

QA 未能打开位于 D:/Computer999/Computer999.vbox 的虚拟电脑

前言 未能打开位于 xxx/Computer999.vbox 的虚拟电脑&#xff0c;并提示E_INVALIDARG (0X80070057)&#xff0c;是最常见的一个错误&#xff0c;下面是解决办法。 内容 1、提示下面的错误&#xff0c;注册Computer999失败&#xff1a; 未能打开位于 D:/Computer999/Compute…

什么是封装?为什么是要封装?

封装是面向对象编程中的一种核心概念&#xff0c;它是将数据和操作数据的方法结合起来&#xff0c;形成一个整体&#xff0c;对外只暴露必要的接口&#xff0c;隐藏内部的具体实现细节。 封装的目的是为了实现信息隐藏和代码的模块化&#xff0c;具体原因如下&#xff1a; 1.…

K210视觉识别模块学习笔记1:第一个串口程序_程序烧录与开机启动

今日开始学习K210视觉识别模块:简单的认识与串口程序 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 既然K210作为一个视觉识别外设模块来使用&#xff0c;我认为第一个程序 就没必要学点灯之类的了&#xff0c;直接学习串口如何配置开始为妥&…

5分钟懂一个前端知识点系列之this关键字

前言 本人在学习this和原型&#xff08;特别是this指向&#xff09;的时候遇到了些许困惑&#xff0c;今天跟大家详细解释一下我在学习路上对this和原型的了解。难点先来攻克&#xff0c;今天先来讲讲this。这里统一声明不讨论严格模式下面的使用&#xff0c;因为我也不了解不…

ctfshow-web入门-爆破(web21-web24)

目录 1、web21 2、web22 3、web23 4、web24 1、web21 爆破什么的&#xff0c;都是基操 需要认证才能访问 随便输一个用户名和密码抓包看看&#xff1a; 多出来一个认证的头 Authorization: Basic YWRtaW46MTIzNDU2 base64 解码看看&#xff1a; 就是我们刚才输入的用于测…

C语言 | Leetcode C语言题解之第127题单词接龙

题目&#xff1a; 题解&#xff1a; struct Trie {int ch[27];int val; } trie[50001];int size, nodeNum;void insert(char* s, int num) {int sSize strlen(s), add 0;for (int i 0; i < sSize; i) {int x s[i] - ;if (trie[add].ch[x] 0) {trie[add].ch[x] size;m…

计算机系统结构之FORK和JOIN

程序语言中用FORK语句派生并行任务&#xff0c;用JOIN语句对多个并发任务汇合。 FORK语句的形式为FORK m&#xff0c;其中m为新领程开始的标号。 JOIN语句的形式为JOIN n&#xff0c;其中n为并发进程的个数。 例1&#xff1a;给定算术表达式ZEA*B*C/DF经并行编译得到如下程序…

刘强东的简历很拉风!

正式宣布&#xff1a;GPT 4o 在国内直接使用 ~ 来看一下江湖人称“东哥”刘强东的简历&#xff0c;大佬确实很拉风&#xff1a; 刘强东&#xff0c;京东的创始人&#xff0c;是中国互联网行业的传奇人物。他的故事充满了奋斗和创新&#xff0c;以下是我对他简历的一些看法&…

spring中处理跨域的3种方案

前言 跨域是指一个域下的文件想要和另一个域下的资源发生HTTP通信时,浏览器出于安全限制所引发的问题。如果协议、子域名、主域名、端口有任何一个不同,都会出现跨域问题。 举个例子,如果一个网页来自https://www.example.com,那么它只能访问同域下的资源,如https://www.exam…

元组的常用操作小结

元组的常用操作小结 元组&#xff08;Tuple&#xff09;是一种不可变的容器&#xff0c;可以存储多个值。下面是元组的常用操作和示例&#xff1a; 创建元组 # 创建一个简单的元组 my_tuple (apple, banana, cherry)print(my_tuple) # 输出&#xff1a;(apple, banana, ch…

GPG简介

简介 The GNU Privacy Guard GnuPG 是 RFC4880 定义的 OpenPGP 标准&#xff08;也称为 PGP&#xff09;的完整且免费的实现。GnuPG 允许您加密和签署您的数据和通信;它具有多功能的密钥管理系统&#xff0c;以及用于各种公钥目录的访问模块。GnuPG&#xff0c;也称为 GPG&…

Vitis HLS 学习笔记--HLS流水线类型

目录 1. 简介 2. 优缺点对比 2.1 Stalled Pipeline 2.2 Free-Running/Flushable Pipeline 2.3 Flushable Pipeline 3. 设置方法 4. FRP的特殊优势 5. 总结 1. 简介 Vitis HLS 会自动选择正确的流水线样式&#xff0c;用于流水打拍函数或循环。 停滞的流水线&#xff…