📄 menu.bak
字号:
#include <reg51.h>
#include <INTRINS.h>
#define uchar unsigned char
unsigned char code table[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60, //0,1,2,3,4,5,6,7,8,9
0x08,0x5e,0x82,0x42,0x54,0x41,0x01,0x5a,0x00,0x40, //0.,1.,2.,3.,4.,5.,6.,7.,8.,9.
0xA5,0x27,0xb1,0x37,}; //t,o,F,n,
uchar KeyFuncIndex=1,index_dis=10;
uchar index_shanshou; //数值闪烁标志位
uchar n_yanshi; //延时计数
uchar index_shanshuo;//_date,index_shanshuo_time,index_shanshuo_timeon,index_shanshuo_timeoff;
uchar timecontrol[2]; //RTC8025初始化
uchar DateVal[3], //[0]date, [1]month, [2]year 当前日期
TimeVal[3], //[0]second,[1]minute,[2]hour 当前时间
DingTimeOnVal[3], //[0]second,[1]minute,[2]hour 离接通的时间
DingTimeOffVal[3], //[0]second,[1]minute,[2]hour 离关掉的时间
RunTime[3]; //[0]second,[1]minute,[2]hour 当前运行中用于比对的时间
bit en_shanshuo;
void (*KeyFuncPtr)(); //按键功能指针
typedef struct
{
uchar KeyStateIndex; //当前状态索引号
uchar KeyCrState; //按下"回车"键时转向的状态索引号
uchar KeyRgState; //按下"向右"键时转向的状态索引号
uchar KeyUpState; //按下"向上"键时转向的状态索引号
void (*CurrentOperate)(); //当前状态应该执行的功能操作
} KbdTabStruct;
void delay(void)
{_nop_();_nop_();_nop_();_nop_();}
void delayms(uchar ms)
{
uchar i;
while(ms--)
{
for(i = 0 ; i < 120 ; i++);
}
}
void IntoMenu(void)
{index_dis = 0;}
void SetDateTime(void)
{index_dis = 0;}
void DingTime(void)
{index_dis = 1;}
void SetDate(void)
{index_dis = 2;}
void SetTime(void)
{index_dis = 3;}
void DingTimeOn(void)
{index_dis = 4;}
void DingTimeOff(void)
{index_dis = 5;}
void SetDateVal(void)
{
index_dis = 6;
index_shanshuo = 0;
DateVal[0] = 10; DateVal[1] = 12; DateVal[2] = 7; //07-12-10
}
void SetTimeVal(void)
{
index_dis = 7;
index_shanshuo = 0;
TimeVal[0] = 0; TimeVal[1] = 0; TimeVal[2] = 12; //12:00:00
}
void DingshiTimeOnVal(void)
{
index_dis = 8;
index_dis = 7;
index_shanshuo = 0;
// DingTimeOnVal[0] = 0; DingTimeOnVal[1] = 0; DingTimeOnVal[2] = 0; //00:00:00
}
void DingshiTimeOffVal(void)
{
index_dis = 9;
// DingTimeOffVal[0] = 0; DingTimeOffVal[1] = 0; DingTimeOffVal[2] = 0; //00:00:00
}
void ValRight(void)
{
index_dis = 10;
index_shanshuo++;
if (index_shanshuo > 2) index_shanshuo = 0; //共6位,yy-mm-dd hh-mm-ss每两位同时闪
}
void ValUp(void)
{
switch (KeyFuncIndex)
{
case 7:{
switch (index_shanshuo)
{
case 0:{DateVal[0]++;
if (DateVal[0] > 31) DateVal[0] = 1;
break;}
case 1:{DateVal[1]++;
if (DateVal[1] > 12) DateVal[1] = 1;
break;}
case 2:{DateVal[2]++;
if (DateVal[2] > 99) DateVal[2] = 0;
break;}
}
break;}
case 8:{
switch (index_shanshuo)
{
case 0:{TimeVal[0]++;
if (TimeVal[0] > 59) TimeVal[0] = 0;
break;}
case 1:{TimeVal[1]++;
if (TimeVal[1] > 59) TimeVal[1] = 0;
break;}
case 2:{TimeVal[2]++;
if (TimeVal[2] > 23) TimeVal[2] = 0;
break;}
}
break;}
case 9:{
switch (index_shanshuo)
{
case 0:{DingTimeOnVal[0]++;
if (DingTimeOnVal[0] > 59) DingTimeOnVal[0] = 0;
break;}
case 1:{DingTimeOnVal[1]++;
if (DingTimeOnVal[1] > 59) DingTimeOnVal[1] = 0;
break;}
case 2:{DingTimeOnVal[2]++;
if (DingTimeOnVal[2] > 23) DingTimeOnVal[2] = 0;
break;}
}
break;}
case 10:{
switch (index_shanshuo)
{
case 0:{DingTimeOffVal[0]++;
if (DingTimeOffVal[0] > 59) DingTimeOffVal[0] = 0;
break;}
case 1:{DingTimeOffVal[1]++;
if (DingTimeOffVal[1] > 59) DingTimeOffVal[1] = 0;
break;}
case 2:{DingTimeOffVal[2]++;
if (DingTimeOffVal[2] > 23) DingTimeOffVal[2] = 0;
break;}
}
break;}
}
}
void SaveVal(void)
{
switch (KeyFuncIndex)
{
case 7:{//wr_tdata(DateVal,0x04,3);
n_yanshi = 0;
KeyFuncIndex = 3;
index_dis = 11; //显示“sav ok”
break;}
case 8:{//wr_tdata(TimeVal,0x00,3);
n_yanshi = 0;
KeyFuncIndex = 4;
index_dis = 11; //显示“sav ok”
break;}
case 9:{RunTime[3] = DingTimeOnVal[3];
n_yanshi = 0;
KeyFuncIndex = 5;
index_dis = 11; //显示“sav ok”
break;}
case 10:{n_yanshi = 0;
KeyFuncIndex = 6;
index_dis = 11; //显示“sav ok”
break;}
}
}
void ExitMenu(void)
{
KeyFuncIndex = 1;
index_dis = 13;
}
KbdTabStruct code KeyTab[24]=
{
{ 0, 1, 0, 0, (*IntoMenu)}, //引导层
{ 1, 3, 2, 23, (*SetDateTime)},//第一层set-datetime
{ 2, 5, 1, 23, (*DingTime)}, //第一层ding-time
{ 3, 7, 4, 1, (*SetDate)}, //第二层>>set-datetime的展开
{ 4, 8, 3, 1, (*SetTime)}, //第二层>>set-datetime的展开
{ 5, 9, 6, 2, (*DingTimeOn)}, //第二层>>ding-time的展开
{ 6,10, 5, 2, (*DingTimeOff)},//第二层>>ding-time的展开
{ 7, 19, 11, 15, (*SetDateVal)}, //第三层>>set-date的展开2007.12.05
{ 8, 20, 12, 16, (*SetTimeVal)}, //第三层>>set-time的展开12:00:00
{ 9, 21, 13, 17, (*DingshiTimeOnVal)}, //第三层>>dingtime-on的展开00:00:00
{10, 22, 14, 18, (*DingshiTimeOffVal)}, //第三层>>dingtime-off的展开00:00:00
{11, 19, 11, 15, (*ValRight)}, //第三层>调数值右移一位
{12, 20, 12, 16, (*ValRight)}, //第三层>调数值右移一位
{13, 21, 13, 17, (*ValRight)}, //第三层>调数值右移一位
{14, 22, 14, 18, (*ValRight)}, //第三层>调数值右移一位
{15, 19, 11, 15, (*ValUp)},//第三层>数值加一
{16, 20, 12, 16, (*ValUp)},//第三层>数值加一
{17, 21, 13, 17, (*ValUp)},//第三层>数值加一
{18, 22, 14, 18, (*ValUp)},//第三层>数值加一
{19, 0, 0, 0, (*SaveVal)},//第三层>确认数值>>将索引号置为3
{20, 0, 0, 0, (*SaveVal)},//第三层>确认数值>>将索引号置为4
{21, 0, 0, 0, (*SaveVal)},//第三层>确认数值>>将索引号置为5
{22, 0, 0, 0, (*SaveVal)},//第三层>确认数值>>将索引号置为6
{23, 0, 0, 0, (*ExitMenu)}//退出菜单>>将索引号置为1
};
void GetKeyInput(void)
{
uchar KeyValue;
KeyValue = P1&0x07; //去掉高5bit
if (KeyValue != 0x07)
{
delayms(10);
KeyValue = P1&0x07;
switch(KeyValue)
{
case 1: //回车键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;
break;
}
case 2: //向上键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
break;
}
case 4: //向下键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRgState;
break;
}
default: //按键错误的处理
break;
}
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
}
}
void Display(void)
{
switch(index_dis)
{
case 0: {P2=0xff; //intomenu,显示第一层第1个菜单
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
break;}
case 1: {P2=0xff; //显示第一层第2个菜单
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
break;}
case 2: {P2=0xff; //显示第二层第1个菜单
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
P2=0xff;
P0=table[20];
P2=0x7f;
delay();
break;}
case 3: { //显示第二层第2个菜单
break;}
case 4: { //显示第二层第3个菜单
break;}
case 5: { //显示第二层第4个菜单
break;}
case 6: {P2=0xff; //显示第三层第1个菜单 date
P0=table[20];
if (index_shanshuo == 0) //选闪烁位
{
if (en_shanshuo == 0) P2=0x7f; //闪烁控制
en_shanshuo= ~en_shanshuo;
}
else P2=0x7f;
delay();
P2=0xff;
P0=table[20];
if (index_shanshuo == 0)
{
if (en_shanshuo == 0) P2=0x7f;
en_shanshuo= ~en_shanshuo;
}
else P2=0x7f;
delay();
P2=0xff;
P0=table[20];
if (index_shanshuo == 1)
{
if (en_shanshuo == 0) P2=0x7f;
en_shanshuo= ~en_shanshuo;
}
else P2=0x7f;
delay();
P2=0xff;
P0=table[20];
if (index_shanshuo == 1)
{
if (en_shanshuo == 0) P2=0x7f;
en_shanshuo= ~en_shanshuo;
}
else P2=0x7f;
delay();
P2=0xff;
P0=table[20];
if (index_shanshuo == 2)
{
if (en_shanshuo == 0) P2=0x7f;
en_shanshuo= ~en_shanshuo;
}
else P2=0x7f;
delay();
P2=0xff;
P0=table[20];
if (index_shanshuo == 2)
{
if (en_shanshuo == 0) P2=0x7f;
en_shanshuo= ~en_shanshuo;
}
else P2=0x7f;
delay();
break;}
case 7: { //显示第三层第2个菜单 time值
break;}
case 8: { //显示第三层第3个菜单 timeON
break;}
case 9: { //显示第三层第4个菜单 timeOFF
break;}
case 10:{if (n_yanshi < 100)
{ //延时显示“sav ok”过2秒后跳到显示第二层菜单
n_yanshi++;
P2=0xff;
P0=table[20]; // k
P2=0x7f;
delayms(5);
P2=0xff;
P0=table[20]; // o
P2=0x7f;
delayms(5);
P2=0xff;
P0=table[20]; // v
P2=0x7f;
delayms(5);
P2=0xff;
P0=table[20]; // a
P2=0x7f;
delayms(5);
P2=0xff;
P0=table[20]; // s
P2=0x7f;
delayms(5);
}else
{
switch (KeyFuncIndex)
{
case 7:{index_dis = 2; //显示第二层第1个菜单
break;}
case 8:{index_dis = 3; //显示第二层第2个菜单
break;}
case 9:{index_dis = 4; //显示第二层第3个菜单
break;}
case 10:{index_dis = 5; //显示第二层第4个菜单
break;}
}
}
break;}
case 11:{ //正常显示运行值
break;}
}
}
void main(void)
{
timecontrol[0]=0x20;
timecontrol[1]=0x00;
// wr_tdata(timecontrol,0x0e,2); //初始化RTC8025,写控制字
while(1)
{
GetKeyInput();
Display();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -