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

📄 menu.c

📁 51单片机C语言菜单编程和演示
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -