一、代码分享

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(); }
}

智能车学习(八)——菜单的实现的更多相关文章

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

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

  2. 智能车学习(十八)——电机学习

    一.C车电机选择 1.摘要:      因为C车模在四轮车的优势是有两个电机,可以进行主动差速,劣势是电机太弱了....所以如何选择电机,就是个钱的问题了,电机多一点,就比较好选,但是C车电机跑多了就 ...

  3. 智能车学习(二十三)——浅谈心得体会

          因为毕竟是竞赛,跟学校挂钩,没办法开源代码和算法完成思路,所以不能详细写太多,如果可以等价交换的话,应该还是可以向领导申请一下的.       在厦大信科通信系,参加这个比赛,大家都觉得性 ...

  4. 智能车学习(六)——OLED屏幕使用

    一.代码展示 1.头文件: #ifndef OLED_H_ #define OLED_H_ extern unsigned char Draw[]; extern const unsigned cha ...

  5. 智能车学习(二十二)——浅谈速度控制

    一.经典PID控制       使用遇限反向PID会比较适合有加减速的车子,使用变速积分适合跑匀速的车子.然后这种方法的条件下,一定要尽可能缩短控制周期..   二.PID加棒棒控制       针对 ...

  6. 智能车学习(二十)——浅谈C车硬连接与软连接

    一.为何要追求软连接?       车子进行软连接之后,可以达到一种效果,就是在高速过程中,车子如果快要发生侧翻的时候,只会跳一个后轮,且只是轻微,而前轮如果进行的内倾,就可以让前轮最大面积接触,增大 ...

  7. 智能车学习(十七)——舵机学习

    一.舵机的结构      舵机简单的说就是集成了直流电机.电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元.能够利用简单的输入信号比较精确的转动给定角度的电机系统.舵机安装了一个电位器(或 ...

  8. 智能车学习(十一)——陀螺仪学习

    一.学习说明 感觉就是配置I2C通信,然后直接移植51代码... 二.代码分享: 1.头文件: #ifndef I2C_GYRO_H_ #define I2C_GYRO_H_ /*********** ...

  9. 智能车学习(二)—— GPIO学习

    一.概述 使用的是蓝宇的底层,主要有初始化管脚,设置管脚状态,反转管脚状态等. 二.代码重述: 1.头文件gpio.h #ifndef GPIO_H //防止重复定义(gpio_H 开头) #defi ...

随机推荐

  1. zju3545

    AC自动机+状态压缩DP 注意:相同的串可能出现多次,如果匹配成功则将各次权值加和. #include <cstdio> #include <queue> #include & ...

  2. zpf 路由功能

    2015-4-11 20:51:06 又搞了一天, 解决了一堆bug, 重新规划了类文件夹, 改善自动加载功能 最新的特性就是支持子域名路由了 因为整个框架还在完善当中, 而且里边有好多接口有我自己申 ...

  3. percona-toolkit 之 【pt-deadlock-logger】说明

    摘要: 死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象:当产生死锁的时候,MySQL会回滚一个小事务的SQL,确保另一个完成.上面是死锁的概念,而在M ...

  4. windows编程注意点(持续更新)

    1.windows编程中,所有的操作都放到窗口过程中进行,main函数只用于描述窗口基本信息. 2.用于获取设备环境句柄时,用BeginPaint/EndPaint,消耗cpu小,但占内存大;用Get ...

  5. RecyclerView的万能分割线

    效果图: 使用方法: 添加默认分割线:高度为2px,颜色为灰色 mRecyclerView.addItemDecoration(new RecyclerViewDivider(mContext, Li ...

  6. iOS 系统消息

    转载自:http://momirror.blog.163.com/blog/static/48418184201361541235481/ 一.键盘 1.UIKeyboardWillShowNotif ...

  7. osg::NodeVisitor中计算一个节点对应的世界变换矩阵、法向量、顶点坐标

    class MyNodeVisitor:public osg::NodeVisitor { pulic: MyNodeVisitor():osg::NodeVisitor(osg::NodeVisit ...

  8. 用Mysqlbinlog备份BinLog文件

    默认情况下, mysqlbinlog读取二进制文件[BinLog]并以文本的方式呈现[text format].mysqlbinlog可以直接地从本地读取Log,也可以读取远程的Log[--read- ...

  9. Mysql之INFORMATION_SCHEMA解析1

    INFORMATION_SCHEMA库是Mysql提供的一个系统库,保存了数据库的原数据,方便用户监控与管理Msyql. 现在单说与INNODB相关的库:INNODB_SYS_TABLES,INNOD ...

  10. No space left on device you must specify the filesystem type--Linux重启挂在失败

    在Linux中拷贝了一个文件比较大5G,直接提示:No SPace Left On Device,很明显是磁盘空间不够了,我因为是在虚拟机上面建的,直接右击虚拟机==>编辑设置 如图片1所示, ...