一、代码分享

1、头文件

#ifndef __MENU_H
#define __MENU_H/***********宏定义************///页面声明
typedef enum Menu_Page_Enum
{MainMenu = 0,SubMenu1 = 1,SubMenu2 = 2,SubMenu3 = 3,SubMenu4 = 4,SubMenu5 = 5,SubMenu6 = 6
} Menu_Page_Enum;//页面位置声明
#define OLED_TOP    0
#define OLED_BUTTOM 7
#define OLED_LEFT   0
#define OLED_RIGHT  127
#define OLED_Line_MIDDLE   63  //行中间/*****************************//***********函数声明***********///刷新
void Menu_Refresh(void);
void MainMenu_Refresh(void);
void SubMenu1_Refresh(void);
void SubMenu2_Refresh(void);
void SubMenu3_Refresh(void);
void SubMenu4_Refresh(void);
void SubMenu5_Refresh(void);
void SubMenu6_Refresh(void);
void MenuPointer_Refresh(int Menu_pointer);//按键功能
void Menu_Key_Detect(void);
void Keynum2_function(void);
void Keynum10_function(void);
void Keynum5_function(void);
void Keynum7_function(void);/*****************************/#endif

2、源文件

#include "include.h"
#include "common.h"
#include "OLED.h"
#include "gpio.h"
#include "Menu.h"
#include "lptmr.h"
#include "KeySquare.h"/***********全局变量定义************/
//当前页面
int Menu_Page = MainMenu;//页面光标
int MainMenuPointer = 1;
int SubMenuPointer1 = 1;
int SubMenuPointer2 = 1;
int SubMenuPointer3 = 1;
int SubMenuPointer4 = 1;
int SubMenuPointer5 = 1;
int SubMenuPointer6 = 1;/**********************************///============================================================================
//函数名称:void Menu_Key_Detect(void)
//函数返回:无
//参数说明: 五
//功能概要:按键检测
//============================================================================
void Menu_Key_Detect(void)
{switch(keyBoard_get()){case Keynum1:  break;case Keynum2:  Keynum2_function();   break;case Keynum3:  break;case Keynum4:  break;case Keynum5:  Keynum5_function();   break;case Keynum6:  break;case Keynum7:  Keynum7_function();   break;case Keynum8:  break;case Keynum9:  break;case Keynum10: Keynum10_function();  break;case Keynum11: break;case Keynum12: break;default:  break;}}//============================================================================
//函数名称:void Keynum5_function(void)
//函数返回:无
//参数说明:无
//功能概要:按键5对应的功能
//============================================================================
void Keynum5_function(void)
{Menu_Page = MainMenu;Menu_Refresh();lptmr_delay_ms(200);
}//============================================================================
//函数名称:void Keynum7_function(void)
//函数返回:无
//参数说明:无
//功能概要:按键7对应的功能
//============================================================================
void Keynum7_function(void)
{switch(MainMenuPointer){case 1:  Menu_Page = SubMenu1; break;case 2:  Menu_Page = SubMenu2; break;case 3:  Menu_Page = SubMenu3; break;case 4:  Menu_Page = SubMenu4; break;case 5:  Menu_Page = SubMenu5; break;case 6:  Menu_Page = SubMenu6; break;default:  break;}Menu_Refresh();lptmr_delay_ms(200);
}//============================================================================
//函数名称:void Keynum10_function(void)
//函数返回:无
//参数说明:无
//功能概要:按键10对应的功能
//============================================================================
void Keynum10_function(void)
{switch(Menu_Page){case MainMenu:   {MainMenuPointer++;  if(MainMenuPointer > 6)   MainMenuPointer = 1;break;}case SubMenu1:   {SubMenuPointer1 ++;  if(SubMenuPointer1 > 3)   SubMenuPointer1 = 1;break;}case SubMenu2:  {SubMenuPointer2 ++;  if(SubMenuPointer2 > 3)   SubMenuPointer2 = 1;break;}case SubMenu3:  {SubMenuPointer3 ++;  if(SubMenuPointer3 > 3)   SubMenuPointer3 = 1;break;}case SubMenu4:   {SubMenuPointer4 ++;  if(SubMenuPointer4 > 3)   SubMenuPointer4 = 1;break;}case SubMenu5:   {SubMenuPointer5 ++;  if(SubMenuPointer5 > 3)   SubMenuPointer5 = 1;break;}case SubMenu6:   {SubMenuPointer6 ++;  if(SubMenuPointer6 > 3)   SubMenuPointer6 = 1;break;}default:     break;}Menu_Refresh();lptmr_delay_ms(200);
}//============================================================================
//函数名称:void Keynum2_function(void)
//函数返回:无
//参数说明:无
//功能概要:按键2对应的功能
//============================================================================
void Keynum2_function(void)
{switch(Menu_Page){case MainMenu:   {MainMenuPointer--;  if(MainMenuPointer < 1)   MainMenuPointer = 6;break;}case SubMenu1:   {SubMenuPointer1--;  if(SubMenuPointer1 < 1)   SubMenuPointer1 = 3;break;}case SubMenu2:  {SubMenuPointer2 --;  if(SubMenuPointer2 < 1)   SubMenuPointer2 = 3;break;}case SubMenu3:  {SubMenuPointer3 --;  if(SubMenuPointer3 < 1)   SubMenuPointer3 = 3;break;}case SubMenu4:   {SubMenuPointer4 --;  if(SubMenuPointer4 < 1)   SubMenuPointer4 = 3;break;}case SubMenu5:   {SubMenuPointer5 --;  if(SubMenuPointer5 < 1)   SubMenuPointer5 = 3;break;}case SubMenu6:   {SubMenuPointer6 --;  if(SubMenuPointer6 < 1)   SubMenuPointer6 = 3;break;}default:     break;}Menu_Refresh();lptmr_delay_ms(200);
}//============================================================================
//函数名称:void MenuPointer_Refresh(int Menu_pointer)
//函数返回:无
//参数说明:MPage  刷新对应页面
//功能概要:光标刷新函数
//============================================================================
void MenuPointer_Refresh(int Menu_pointer)
{switch(Menu_pointer){case 1:   OLED_Write_String(2,OLED_LEFT,"@");  break;case 2:   OLED_Write_String(4,OLED_LEFT,"@");  break;case 3:   OLED_Write_String(6,OLED_LEFT,"@");  break;case 4:   OLED_Write_String(2,OLED_Line_MIDDLE,"@");  break;case 5:   OLED_Write_String(4,OLED_Line_MIDDLE,"@");  break;case 6:   OLED_Write_String(6,OLED_Line_MIDDLE,"@");  break;default:  break;}
}//============================================================================
//函数名称:void Menu_Refresh(void)
//函数返回:无
//参数说明:MPage  刷新对应页面
//功能概要:页面刷新函数
//============================================================================
void Menu_Refresh(void)
{OLED_Clear();switch(Menu_Page){case MainMenu:   MainMenu_Refresh();  break;case SubMenu1:   SubMenu1_Refresh();  break;case SubMenu2:   SubMenu2_Refresh();  break;case SubMenu3:   SubMenu3_Refresh();  break;case SubMenu4:   SubMenu4_Refresh();  break;case SubMenu5:   SubMenu5_Refresh();  break;case SubMenu6:   SubMenu6_Refresh();  break;default:     break;}}//============================================================================
//函数名称:void MainMenu_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:主页面刷新函数
//============================================================================
void MainMenu_Refresh(void)
{OLED_Write_String(0,OLED_Line_MIDDLE-35,"MainMenu");OLED_Write_String(2,10,"Menu1");OLED_Write_String(4,10,"Menu2");OLED_Write_String(6,10,"Menu3");OLED_Write_String(2,OLED_Line_MIDDLE + 8,"Menu4");OLED_Write_String(4,OLED_Line_MIDDLE + 8,"Menu5");OLED_Write_String(6,OLED_Line_MIDDLE + 8,"Menu6");MenuPointer_Refresh(MainMenuPointer);}//============================================================================
//函数名称:void SubMenu1_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:子页面1刷新函数
//============================================================================
void SubMenu1_Refresh(void)
{OLED_Write_String(2,10,"Menu1");OLED_Write_String(4,10,"Menu1");OLED_Write_String(6,10,"Menu1");MenuPointer_Refresh(SubMenuPointer1);
}//============================================================================
//函数名称:void SubMenu2_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:子页面2刷新函数
//============================================================================
void SubMenu2_Refresh(void)
{OLED_Write_String(2,10,"Menu2");OLED_Write_String(4,10,"Menu2");OLED_Write_String(6,10,"Menu2");MenuPointer_Refresh(SubMenuPointer2);
}//============================================================================
//函数名称:void SubMenu3_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:子页面3刷新函数
//============================================================================
void SubMenu3_Refresh(void)
{OLED_Write_String(2,10,"Menu3");OLED_Write_String(4,10,"Menu3");OLED_Write_String(6,10,"Menu3");MenuPointer_Refresh(SubMenuPointer3);
}//============================================================================
//函数名称:void SubMenu4_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:子页面4刷新函数
//============================================================================
void SubMenu4_Refresh(void)
{OLED_Write_String(2,10,"Menu4");OLED_Write_String(4,10,"Menu4");OLED_Write_String(6,10,"Menu4");MenuPointer_Refresh(SubMenuPointer4);
}//============================================================================
//函数名称:void SubMenu5_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:子页面5刷新函数
//============================================================================
void SubMenu5_Refresh(void)
{OLED_Write_String(2,10,"Menu5");OLED_Write_String(4,10,"Menu5");OLED_Write_String(6,10,"Menu5");MenuPointer_Refresh(SubMenuPointer5);
}//============================================================================
//函数名称:void SubMenu6_Refresh(void)
//函数返回:无
//参数说明:无
//功能概要:子页面6刷新函数
//============================================================================
void SubMenu6_Refresh(void)
{OLED_Write_String(2,10,"Menu6");OLED_Write_String(4,10,"Menu6");OLED_Write_String(6,10,"Menu6");MenuPointer_Refresh(SubMenuPointer6);
}

二、使用方法:

直接调用即可。

void main()
{DISABLE_INTERRUPTS;                          //MPU上电,各模块功能初始化前需要关中断system_init();                               //各模块功能初始化ENABLE_INTERRUPTS;                           //开中断使能
OLED_Init();  Menu_Refresh();while(1){Menu_Key_Detect();}
}

转载于:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4912565.html

智能车学习(八)——菜单的实现相关推荐

  1. 智能车学习日记【一】——让小车跑正方形赛道(摄像头图像处理赛道)

    智能车学习日记[一]--让小车跑正方形赛道 目录 开篇 舵机 赛道图像处理 图像处理 代码![在这里插入图片描述](https://img-blog.csdnimg.cn/9ec0eb76bd8941 ...

  2. 智能车学习日记【四】————环岛

    智能车学习日记[四]----环岛 文章目录 智能车学习日记[四]----环岛 前言 一.环岛分状态(以左环岛为例) 二.每个状态思路 状态1和状态2: 状态3: 状态4: 状态5: 状态6: 状态7: ...

  3. 智能车学习日记【五】——————坡道和弯接坡道

    文章目录 前言 一.坡道的判别 二.直道接坡道 1.上坡 2.位于坡道上 3.下坡 三.弯接坡道 总结 前言 这里记录一下坡道的写法和思路.博主的坡道处理是纯图像处理,没有使用陀螺仪等其他硬件设备进行 ...

  4. 智能车学习日记【二】————十字和斜入十字

    智能车学习日记[二]----十字和斜入十字 文章目录 智能车学习日记[二]----十字和斜入十字 前言 一.普通十字补线 二.斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 ...

  5. 基于ROS+镭神激光雷达+amcl定位、导航的智能车学习记录

    目录 一.背景 二. 难点之避障学习 三.比赛实参 一.背景 背景 目前大火的智能车.机器人.无人驾驶技术,现基于嵌入式系统.人工智能.机器人定位与导航基础 开展了第十四届全国大学生智能汽车竞赛-室外 ...

  6. 智能车学习(十五)——K60野火2013版例程

    一.中断函数注册方法: 1.格式: 配置某个功能的中断 注册中断函数 开启中断 2.一个例子 pit_init_ms(PIT0,5);//定时中断初始化 set_vector_handler(PIT0 ...

  7. 智能车学习笔记(摄像头组)——基础扫线

    今年第一次搞智能车,刚刚上大一,一切都是摸索着来,趁着放假了就把自己学会的东西梳理一下.第一次写的比较乱,欢迎各位一起学习(我亲爱的队友要加倍努力哈,这几天嗓子疼,不能腾讯会议给你讲了,专门给你写的) ...

  8. 【智能车学习】电磁车算法优化总结

    目录 前言 电感排布方案 舵机算法修正 分段式PD算法 使用函数曲线整定PD参数 电机控制 目标速度的确定 差速控制算法 特殊元素处理 环岛处理 防坡道误判 其他辅助结构 屏幕显示 按键控制与拨码开关 ...

  9. 【智能车学习】电磁循迹中的基本控制算法

    文章目录 前言 采样信号滤波 什么是滤波 常见的软件滤波办法 限幅法 算术平均值滤波 归一化 什么是归一化 归一化的代码实现 PID控制 什么是PID控制 PID算法的代码实现 舵机控制 电机控制 目 ...

最新文章

  1. linux操作系统教学,Linux操作系统教学视频
  2. JS中 window.location.search的作用
  3. ufs2.0测试软件,【玩机组教程】让你的一加3/3T的ufs2.0闪存速度焕发新生
  4. javascript :得到上星期的这一天日期
  5. [转] 深入理解React 组件状态(State)
  6. 计算机应用管理试题,学习管理系统中计算机应用试卷试题及答案.docx
  7. 使用eclipse以及Juint进行测试
  8. C语言字符串、字符数组
  9. 正则表达式学习笔记004--连字符和范围描述符的认识与应用
  10. 电力电容器行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. 2D转换中心点transform-origin(CSS3)
  12. Layui官网文档备份, Layui文档站点,LayuiAdmin
  13. 最全Pycharm教程(5)——Python快捷键相关设置
  14. Bp算法公式推导推导-详解
  15. LintCode Copy Books
  16. 【网络架构理论系列】简述分布式的定义、分类、技术发展历史进程
  17. 51单片机60秒倒计时 数码管显示
  18. 修复XP图片和传真查看器!
  19. 精度和分辨率的区别与理解
  20. 手把手学会 VS Code 快捷任务神技,成为项目组最靓的崽!

热门文章

  1. el-tooltip位置不灵活_要提高步伐移动的灵活性,注意这5点,加以改正,步伐不再沉重...
  2. Python中*args和**kwargs的解释
  3. 破旧立新 “云”称霸
  4. eclipse使用不需要配置jdk的环境变量
  5. Apache james 2.3.2.1启动失败换成2.3.2版本就好
  6. Windows 7 / Windows 10 安装 IPX/SPX
  7. 2014 Red Hat Summit(红帽峰会)PPT合集
  8. [转] 计算机视觉领域稍微容易中的期刊
  9. Oracle性能调优
  10. 实现APP-V服务全程跟踪(二)