📄 menu.c
字号:
#include <reg51.h>
#include <INTRINS.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code table[20]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60, //0,1,2,3,4,5,6,7,8,9
//上述与0xDF相与就加上小数点
0xA5,0x26,0x30,0xA1,0x27,0x38,0xB1,0xF7,0xA4,0x2F}; //t,d,A,E,o,N,F,-,k,v
uchar KeyFuncIndex=0,index_dis=11;
uchar index_shanshou; //数值闪烁标志位
uchar n_shanshuo; //闪烁延时计数
uchar n_yanshi; //延时计数
//uchar n_keyauto; //上述两个为实现按键按下时连续累加选定值
//bit enable_keyauto=1; //允许数值累加
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; //允许闪烁
bit enable_key=1; //允许检测按键
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_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 (index_dis)
{
case 6:{
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 7:{
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 8:{
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 9:{
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 (index_dis)
{
case 6:{//wr_tdata(DateVal,0x04,3);
n_yanshi = 0;
KeyFuncIndex = 3;
index_dis = 10; //显示“sav ok”
break;}
case 7:{//wr_tdata(TimeVal,0x00,3);
n_yanshi = 0;
KeyFuncIndex = 4;
index_dis = 10; //显示“sav ok”
break;}
case 8:{RunTime[3] = DingTimeOnVal[3];
n_yanshi = 0;
KeyFuncIndex = 5;
index_dis = 10; //显示“sav ok”
break;}
case 9:{n_yanshi = 0;
KeyFuncIndex = 6;
index_dis = 10; //显示“sav ok”
break;}
}
}
void ExitMenu(void)
{
KeyFuncIndex = 0;
index_dis = 11;
}
KbdTabStruct code KeyTab[24]=
{
{ 0, 1, 0, 0, (*IntoMenu)}, //引导层
{ 1, 3, 2, 23, (*SetDateTime)},//第一层set-datetime(s-ti)
{ 2, 5, 1, 23, (*DingTime)}, //第一层ding-time(d-ti)
{ 3, 7, 4, 1, (*SetDate)}, //第二层>>set-datetime的展开(date)
{ 4, 8, 3, 1, (*SetTime)}, //第二层>>set-datetime的展开(time)
{ 5, 9, 6, 2, (*DingTimeOn)}, //第二层>>ding-time的展开(on)
{ 6,10, 5, 2, (*DingTimeOff)},//第二层>>ding-time的展开(off)
{ 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 = P3&0x07; //去掉高5bit
if (KeyValue != 0x07)
{
delayms(10);
KeyValue = P3&0x07;
enable_key = 0;
switch(KeyValue)
{
case 6: //回车键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyCrState;
break;
}
case 5: //向右键,找出新的菜单状态编号
{
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyRgState;
break;
}
case 3: //向上键,找出新的菜单状态编号
{
// n_keyauto++;
// if (n_keyauto > 50)
// {
// enable_keyauto = 1;
// n_keyauto = 0;
// }
// if (enable_keyauto)
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
break;
}
default: //按键错误的处理
break;
}
KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
}
}
void Display(void)
{
n_shanshuo++;
if (n_shanshuo > 30)
{
en_shanshuo= ~en_shanshuo;
n_shanshuo = 0;
}
switch(index_dis)
{
case 0: {P2=0xff; //intomenu,显示第一层第1个菜单 S-tI
P0=table[1];
P2=0x7f;
delayms(2);
P2=0xff;
P0=table[10];
P2=0xbf;
delayms(2);
P2=0xff;
P0=table[17];
P2=0xdf;
delayms(2);
P2=0xff;
P0=table[5];
P2=0xef;
delayms(2);
break;}
case 1: {P2=0xff; //显示第一层第2个菜单 d-tI
P0=table[1];
P2=0x7f;
delayms(2);
P2=0xff;
P0=table[10];
P2=0xbf;
delayms(2);
P2=0xff;
P0=table[17];
P2=0xdf;
delayms(2);
P2=0xff;
P0=table[11];
P2=0xef;
delayms(2);
break;}
case 2: {P2=0xff; //显示第二层第1个菜单 dAtA
P0=table[12];
P2=0x7f;
delayms(2);
P2=0xff;
P0=table[10];
P2=0xbf;
delayms(2);
P2=0xff;
P0=table[12];
P2=0xdf;
delayms(2);
P2=0xff;
P0=table[11];
P2=0xef;
delayms(2);
break;}
case 3: {P2=0xff; //显示第二层第2个菜单 tInE
P0=table[13];
P2=0x7f;
delayms(2);
P2=0xff;
P0=table[15];
P2=0xbf;
delayms(2);
P2=0xff;
P0=table[1];
P2=0xdf;
delayms(2);
P2=0xff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -