📄 menu.c
字号:
#include <stdio.h> /* standard I/O .h-file */
#include <reg51f.h>
#include <absacc.h>
#include <main.h>
#include <time.h>
#include "lcd.h"
#include "x5045.h"
unsigned char xdata LEDState, //LED灯、液晶背光状态变量
ArrayLine, //显示屏变量
ScrLine, //反白显示行变量
JD_ticker, //接地计时变量(10毫秒)
Ticker, //按键等用的计时变量;
ESCTicker, //背光计数器清零
F_back; //需不需要返回上一级的标志,
//0xAA----需要返回
//0x55----不需要返回
unsigned char code P_first[][16]= //一级菜单
{
" 1、一级菜单1 ",
" 2、一级菜单2 ",
" 3、一级菜单3 ",
" 4、一级菜单4 ",
" 5、一级菜单5 ",
" 6、一级菜单6 "
};
//*********************************************************
//时子程序
//********************************************************
void Delay1(time)
unsigned int time;
{
while(time--);
}
//***********************************************
//键盘识别子程序
//***********************************************
unsigned char GetKey(time)
unsigned char time;
{
unsigned char xdata keyvalue;
keyvalue = KEY_ADDR; //判键 #define KEY_ADDR XBYTE[0X4000] 读取按键值
if(keyvalue!=0xff)
{
if(Ticker > time) //time按键以后的延时时间
{
LEDState=LEDState|0x80; //有按键点亮背光
LED=LEDState;
Ticker = 0; //按键延时计数器清零
ESCTicker=0; //背光关闭计时器清零
return(keyvalue);
}
else
{
keyvalue = 0xff;
return(keyvalue);
}
}
else
{
Ticker = 0;
return(0xff);
}
}
//*********************************************************
//一级菜单显示
//*********************************************************
void d_first(void) //一级菜单显示
{ unsigned char key_value;
ArrayLine=0;
ScrLine=0;
while(1)
{
ReverseLine(ScrLine);
PrintStr(0,0,P_first[ArrayLine]);
PrintStr(1,0,P_first[ArrayLine+1]);
PrintStr(2,0,P_first[ArrayLine+2]);
PrintStr(3,0,P_first[ArrayLine+3]);
while(1)
{
key_value=GetKey(12);
if(key_value!=0xff) //按键松开之后
break;
}
switch(key_value)
{
/* 当按向上键和加号键时向上移动*/
case UP:
case PLUS:
if (ArrayLine==0) //当数组指针在第一行时,只有此时才考虑到最后一行
{//ArrayLine 显示屏变量
if (ScrLine<=0) //如果屏幕指针在第一行则到最后一行
{
ScrLine = 3; //ScrLine 反白显示行变量
ArrayLine = ARRAYLINE; //#define ARRAYLINE 2 一级菜单长度减4
}
else //如果屏幕指针没有在最后一行则向上移动
ScrLine--;
}
else //如果数组指针不在第一行
{
if (ScrLine<=0) //如果屏幕指针在第一行,则要向上滚屏
ArrayLine--;
else
ScrLine--; //如果屏幕指针不在第一行,则向上移动
}
break;
case DOWN: //向下的逻辑与向上的逻辑相反
case SUB:
if (ArrayLine>=ARRAYLINE) //#define ARRAYLINE 2
{
if (ScrLine>=3)
{
ScrLine = 0;
ArrayLine = 0;
}
else
ScrLine++;
}
else
{
if (ScrLine>=3)
ArrayLine++;
else
ScrLine++;
}
break;
case ENTER:
d_second(ArrayLine+ScrLine); //进入菜单项对应的二级菜单
break;
case ESC:
InitLcd();
return;
}
}
}
//************************************************************
//二级菜单
//************************************************************
void d_second(second_num)
unsigned char second_num;
{
switch(second_num)
{ case 0:
//d_realdata();
break;
case 1:
//d_save();
break;
case 2:
//d_sysset();
break;
case 3:
//d_sprint();
break;
case 4:
//d_sysdebug();
break;
case 5:
//d_revsion();
break;
}
}
//*****************************************************************
//主屏显示
//*****************************************************************
void welcome(void)
{ unsigned char xdata key_value,secb,seca,temp[9];//;,bb
struct DATE d_date;
struct TIME t_time;
while(1)
{
F_back = 0x55; //在主屏,不需要返回. F_baCK=0X55标识需要返回标志
key_value=GetKey(12);
LED=LED&0xf3;
if(key_value==ENTER) //按确认键进入主菜单
{
F_back = 0xaa; //标识需要返回标志
LED=LED&0xfc;
d_first();
}
secb=SECOND; //每秒刷新一次时间
watchdog();
if(seca!=secb)
{
seca=secb;
GetTime(&t_time);
GetDate(&d_date);
if((d_date.year>99)||(d_date.mon>12)||(d_date.day>31)||(t_time.hour>23)||(t_time.min>59)||(t_time.sec>59))
{
//repair_time();
InitLcd();
PrintStr(1,2,"时钟出错"); //时钟出错后把年月日时分秒设为默认值后进入时钟设置界面
Delay1(5000);
InitLcd();
}
PrintStr(1,0," 菜单程序调试 ");
PrintStr(2,6," ");
PrintStr(2,0," ");
PrintStr(0,0," 实验程序 ");
PrintStr(3,6," ");
PrintStr(3,0," ");
temp[0] = d_date.year/10 + 0x30;
temp[1] = d_date.year%10 + 0x30;
temp[2] = '-';
temp[3] = d_date.mon/10 + 0x30;
temp[4] = d_date.mon%10 + 0x30;
temp[5] = '-';
temp[6] = d_date.day/10 + 0x30;
temp[7] = d_date.day%10 + 0x30;
temp[8] = 0;
PrintStr(2,2,temp);
temp[0] = t_time.hour/10 + 0x30;
temp[1] = t_time.hour%10 + 0x30;
temp[2] = ':';
temp[3] = t_time.min/10 + 0x30;
temp[4] = t_time.min%10 + 0x30;
temp[5] = ':';
temp[6] = t_time.sec/10 + 0x30;
temp[7] = t_time.sec%10 + 0x30;
temp[8] = 0;
PrintStr(3,2,temp);
}
}
}
void main()
{
welcome();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -