#include<reg52.h>
typedef unsigned int uint8;
#define PAGE_DISP_NUM 2
#define M_MENU_NUM 8
// 按键值定义
#define KV_NO (0x00) // 无
#define KV_UP (0x01) // 上
#define KV_DN (0x02) // 下
#define KV_MD (0x04) // 中
#define KV_LF (0x08) // 左
#define KV_RT (0x10) // 右
unsigned char Trg;
unsigned char Cont;
void LCMDisplayStr(unsigned char x,unsigned char y,unsigned char *str);
void KeyRead();
uint8 iff=0;
typedef struct _sysPrmt
{
unsigned char KeyValue;
}_SysPrmt;
_SysPrmt SysPrmt;
typedef struct _MENU_PRMT
{
uint8 Cursor; //当前光标位置
uint8 PageNo; //显示开始项
uint8 Index;//当前菜单项
uint8 DispNum;//最大显示项
uint8 MaxPage;//最大页数
}MENU_PRMT;
MENU_PRMT MenuPrmt;
typedef struct _MEUN_TABLE
{
uint8 *MenuItem;//菜单名称
void (*ItemHook)(void);//要执行的菜单函数
}MENU_TABLE;
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
#define Dater P0
void delay(unsigned int i)
{while(i--);}
void ReadBusy()
{
Dater=0x00;
RS=0;
RW=1;
EN=1;
while(Dater&0x01);
EN=0;
}
void WriteLcdCommand(unsigned char value)
{
ReadBusy();
RS=0;
RW=0;
Dater=value;
delay(100);
EN=1;
delay(100);
EN=0;
}
void WriteLcdData(unsigned char value)
{
ReadBusy();
RS=1;
RW=0;
Dater=value;
delay(100);
EN=1;
delay(100);
EN=0;
}
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)
{
unsigned char address;
if(y==1)
address=0x80+x;
else
address=0xc0+x;
WriteLcdCommand(address);
WriteLcdData(dat);
}
void LCMDisplayStr(unsigned char x,unsigned char y,unsigned char *str)
{
unsigned char address;
address=0x80+x+0x40*y;
WriteLcdCommand(address);
while(*str!='\0')
{
WriteLcdData(*str);
str++;
}
}
void LCMDisplayStrRvs(unsigned char x,unsigned char y,unsigned char *str)
{
unsigned char address;
address=0x80+x+0x40*y;
WriteLcdCommand(address);
while(*str!='\0')
{
WriteLcdData(*str);
str++;
}
WriteLcdData(0x3c);
}
void InitLcd()
{
WriteLcdCommand(0x38);
WriteLcdCommand(0x0c);//开显示,不显示光标
WriteLcdCommand(0x06);//每次写入数据后地址加1
WriteLcdCommand(0x01);//清屏
}
void App_SetClock()
{
while(1)
{KeyRead();
LCMDisplayStr(0,0,"efw");
if(0!=Trg)break;
}
}
void App_SetSysPrmt()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
void App_SetTeachPrmt()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
void App_DownloadPrmt()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
void App_ClearStorage()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
void App_ProofSpeed()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
void App_ExitMenu()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
void App_Other()
{ while(Trg!=0)
{
LCMDisplayStr(0,0,"efw");
}}
MENU_TABLE MMenu[M_MENU_NUM] =
{
{"1.time ", App_SetClock}, // 时钟设置
{"2.App_SetSysPrmt ", App_SetSysPrmt}, // 参数设置
{"3.App_SetTeachPrmt ", App_SetTeachPrmt}, // 教学参数
{"4.App_DownloadPrmt ", App_DownloadPrmt}, // 下载参数
{"5.App_ClearStorage ", App_ClearStorage}, // 清除存储
{"6.App_ProofSpeed ", App_ProofSpeed}, // 速度校对
{"7.App_ExitMenu ", App_ExitMenu}, // 退出管理
{"8.App_Other ", App_Other}, // 其他设置
};
/***************
按键程序
***************/
void KeyRead( void )
{
unsigned char ReadData = P3^0xff; // 1
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
void KeyProc(void)
{
SysPrmt.KeyValue=Trg;
// if (Cont & P3) // 如果“加”按键被按着不放
// {
// if (cnt_plus > 100) // 20ms*100 = 2S 如果时间到
// {
// Func(); // 你需要的执行的程序
// }
// }
}
/**************************************************************************************
* FunctionName : AppMenuPrmtInit()
* Description : 初始化菜单参数
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void AppMenuPrmtinit(void)
{
MenuPrmt.Cursor=0;
MenuPrmt.PageNo=0;
MenuPrmt.Index=0;
}
/**************************************************************************************
* FunctionName : App_MenuSet()
* Description : 设置菜单显示
* EntryParameter : num - 页菜单显示项,page - 最多页数
* ReturnValue : None
**************************************************************************************/
void App_MenuSet(uint8 num,uint8 page)
{
MenuPrmt.DispNum=num;
MenuPrmt.MaxPage=page;
}
/**************************************************************************************
* FunctionName : App_MenuDisplay()
* Description : 显示菜单
* EntryParameter : page - 显示页,dispNum - 每一页的显示项,cursor - 光标位置
* ReturnValue : None
**************************************************************************************/
void App_MenuDisplay(MENU_TABLE *menu,uint8 page,uint8 dispNum,uint8 cursor)
{
uint8 i=cursor;
LCMDisplayStrRvs(0, 1, menu[page+i].MenuItem); // 反白显示菜单项
// LCMDisplayStr(0, 1, menu[page+i].MenuItem); // 显示菜单项
}
/**************************************************************************************
* FunctionName : App_MenuMove()
* Description : 菜单移动
* EntryParameter : None
* ReturnValue : 有确认返回0,否则返回1
**************************************************************************************/
//uint8 App_MenuMove(uint8 key)
//{
// uint8 rValue = 1;
//
// switch (key)
// {
// case KV_UP: // 向上
// {
// if (MenuPrmt.Cursor != 0) // 光标不在顶端
// {
// MenuPrmt.Cursor--; // 光标上移
// }
// else // 光标在顶端
// {
// if (MenuPrmt.PageNo != 0) // 页面没有到最小
// {
// MenuPrmt.PageNo--; // 向上翻
// }
// else
// {
// MenuPrmt.Cursor = MenuPrmt.DispNum-1; // 光标到底
// MenuPrmt.PageNo = MenuPrmt.MaxPage-1;