⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.bak

📁 51单片机C语言菜单编程和演示
💻 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 + -