/*********************************下面是功能函数的代码***************************************************/
#include"fun.h"
#include"lcd5110.h"
/************全局变量定义***********************/
void (*fun)() = NULL; //定义一个功能函数指针,用于外部调用函数
unsigned char key_value = 0; //按键值变量
extern code unsigned char gImage_1[]; //声明图像数据
/****************功能函数***********************/
/***************************************************************
-函数功能:显示主页面
-参数说明:无
-返回说明:无
-备注:无
****************************************************************/
void HomePage(void)
{
if(key_value==KEY_OK) //判断键值
fun = MenuDisplay; //显示菜单
else //没有键按下则显示
{
LCD_Clear();
LCD_WriteChinese(4,2,"多级菜单测试",0);
}
}
/***************************************************************
-函数功能:图片显示
-参数说明:无
-返回说明:无
-备注:无
****************************************************************/
void PictureDisplay(void)
{
if(key_value==KEY_OK) //判断键值
fun = HomePage; //返回主页面
else
{ //没有键按下则显示
LCD_Clear();
LCD_DrawPicture(0,0,gImage_1,52,48); //输出图片
}
}
/***************************************************************
-函数功能:输出声音
-参数说明:无
-返回说明:无
-备注:无
****************************************************************/
void Buzzing(void)
{
TR0 = ~TR0;
fun = HomePage; //返回主页面
}
/***************************************************************
-函数功能:开启背光
-参数说明:无
-返回说明:无
-备注:无
****************************************************************/
void LightON(void)
{
LCD_BL = 1;
fun = HomePage; //返回主页面
}
/***************************************************************
-函数功能:关闭背光
-参数说明:无
-返回说明:无
-备注:无
****************************************************************/
void LightOFF(void)
{
LCD_BL = 0;
fun = HomePage; //返回主页面
}
/******************************************************************
-函数功能:扫描按键
-参数说明:无
-返回说明:无
-备注:扫描时间由T1溢出标志位控制
******************************************************************/
void KeyScan(void)
{
static unsigned char cont=0;
unsigned char read = ~P1;
key_value = read&(read^cont);
cont = read;
}
/******************************************************************
-函数功能:菜单显示
-参数说明:无
-返回说明:无
-备注:
******************************************************************/
void MenuDisplay(void)
{
#define MENU_ST struct menu_st code
MENU_ST sys_set={2,{"开启背光","关闭背光","返回主页"},{NULL,NULL,NULL},\
{LightON,LightOFF,HomePage}};
MENU_ST home={3,{"图片显示","输出声音","系统设置","返回主页"},{NULL,NULL,&sys_set,NULL},\
{PictureDisplay,Buzzing,NULL,HomePage}};
#undef MENU_ST
static struct menu_st *p = &home; //结构体指针用于指向下一个任务
static unsigned char opt; //选中的条目
unsigned char opt_max = p->opt_max; //最大菜单条目数
unsigned char pg,i; //显示页面条目控制变量
switch (key_value) //按键值处理
{
case KEY_UP:if(opt)opt--;break;
case KEY_DOWN:if(opt!=opt_max)opt++;break;
case KEY_OK:if(p->pnext[opt]!=NULL)p=p->pnext[opt]; //指向下一级菜单
else {fun=p->fp[opt];p = &home;}
opt=0; //选择条目清零
break;
}
LCD_Clear();
for(pg=opt/3,i=0;i<3&&pg*3+i<=opt_max;i++) //每页显示三条,选中的反相
{
LCD_WriteChar(0,i*2,pg*3+i+'1');
LCD_WriteChinese(6,i*2,p->str[pg*3+i],pg*3+i==opt);
}
}
|