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

📄 cxlcdnew.c

📁 多级菜单实现
💻 C
📖 第 1 页 / 共 2 页
字号:
//Last Modify Time:03/11/07 01:22
//ReadMe
//屏宽:112
//屏高:64
#include <reg51.h>
#include <intrins.h>
#include <absacc.h>
//
typedef struct
	{
	unsigned int KeyTab_MenuIndex;		//当前状态索引号
	unsigned int KeyTab_MaxItems;		//本级菜单最大条目数
    unsigned int KeyTab_PressOk;    	//按下"回车"键时转向的状态索引号
    unsigned int KeyTab_PressEsc;		//按下"返回"键时转向的状态索引号
    unsigned int KeyTab_PressDown;    	//按下"向下"键时转向的状态索引号
    unsigned int KeyTab_PressUp;    	//按下"向上"键时转向的状态索引号
	void    (*CurrentOperate)();    	//当前状态应该执行的功能操作
	}KeyTabStruct;
void    (*KeyFuncPtr)();    //按键功能指针
		
//
#define KEY_OK	0x11
#define KEY_UP	0x12
#define KEY_ESC	0x13
//
#define KEY_LEFT	0x21
#define KEY_DOWN	0x22
#define KEY_RIGHT	0x23
//
#define KEY_1		0x31
#define KEY_2		0x32
#define KEY_3		0x33
//
#define KEY_4		0x41
#define KEY_5		0x42
#define KEY_6		0x43
//
#define KEY_7		0x51
#define KEY_8		0x52
#define KEY_9		0x53
//
#define KEY_XING	0x61
#define KEY_0		0x62
#define KEY_JING	0x63
//
#define KEY_POWER	0x71
#define KEY_NULL	0x00
//
//
#define MAX_KEYTABSTRUCT_NUM						19
#define MENU_FACE									0
#define MENU_ROOT									1
#define 	MENU_VIEW								2//索引号
#define			MENU_VIEW_ABOUTRECORDE				3
#define			MENU_VIEW_HANDSETCLOCK				4
#define		MENU_OPERATION							5
#define			MENU_OPERATION_SETPOSITION			6
#define			MENU_OPERATION_READZJTOFLASH		7
#define			MENU_OPERATION_RDZJTORAM			8
#define			MENU_OPERATION_DELGIVENZL			9
#define			MENU_OPERATION_DELALLZJ				10
#define		MENU_TEST								11
#define			MENU_TEST_RAMTEST					12
#define			MENU_TEST_FLASHTEST					13
#define		MENU_SYSTEMSET							14
#define			MENU_SYSTEMSET_DEBUG				15
#define				MENU_SYSTEMSET_DEBUG_PASSWORD	16
#define				MENU_SYSTEMSET_DEBUG_SEEPICTURE	17
#define			MENU_SYSTEMSET_SETHANDCLK			18
//
#define Addr_Key 			0xc000 //1100,0000,0000,0000
#define Addr_XRamBegin1 	0x0000 //0000,0000,0000,0000//共32K
#define Addr_XRamEnd1   	0x3fff //0011,1111,1111,1111
#define Addr_XRamBegin2 	0x4000 //0100,0000,0000,0000
#define Addr_XRamEnd2   	0x7fff //0111,1111,1111,1111
#define Addr_XFlashBegin	0x9000//1000,0000,0000,0000	16K/每自然扇区
#define Addr_XFlashEnd		0xbfff//1011,1111,1111,1111
#define Addr_XFlashSector	0xc001//1100,0000,0000,0001 4个自然扇区(把FLASH的地址线移到这个口内容的低位)
	//菜单专用
	unsigned char xdata cMenuTemp1		_at_ 0x2020;
	unsigned char xdata cMenuTemp2		_at_ 0x2021;
	unsigned char xdata cMenuTemp3		_at_ 0x2022;
	//
	unsigned int  xdata	iMenuID			_at_ 0x2023;
	unsigned int  xdata iMenuNextID		_at_ 0x2025;
	//中断0用
	unsigned char xdata cTemp_ex0		_at_ 0x204c;
	//通讯中断用
	unsigned int  xdata i_uart			_at_ 0x204d;
	//读时间用
	unsigned char xdata i_RdTime			_at_ 0x2059;
	//键处理程序专用
    unsigned char xdata cKeyTemp1	_at_ 0x2065;
	//定时器0专用
	unsigned int  xdata iT0_1S			_at_ 0x2066;
	unsigned char xdata cClock_Year		_at_ 0x2068;
	unsigned char xdata cClock_Month	_at_ 0x2069;
	unsigned char xdata cClock_Day		_at_ 0x206a;
	unsigned char xdata cClock_Hour		_at_ 0x206b;
	unsigned char xdata cClock_Minute	_at_ 0x206c;
	unsigned char xdata cClock_Second	_at_ 0x206d;
sbit KEYROW1=P1^5;
sbit KEYROW2=P1^6;
sbit KEYROW3=P1^7;
//
unsigned char bdata BitByte0;
	sbit bOldOnline=BitByte0^7;
	sbit b_ReceiveOver=BitByte0^6;
	sbit b_KeyInt=BitByte0^5;
	sbit b_Arrive1S=BitByte0^4;
unsigned char bdata BitByte1;
unsigned char bdata BitByte2;
unsigned char bdata BitValue;
	sbit bOnline=BitValue^7;
	sbit bPowerOff=BitValue^6;
unsigned char bdata BitValue1;
	sbit bBit7=BitValue1^7;
	sbit bBit6=BitValue1^6;
	sbit bBit5=BitValue1^5;
	sbit bBit4=BitValue1^4;
	sbit bBit3=BitValue1^3;
	sbit bBit2=BitValue1^2;
	sbit bBit1=BitValue1^1;
	sbit bBit0=BitValue1^0;

unsigned char code *Menu_Root[4]=
	{
	" View         ",
	" Operation    ",
	" Test         ",
	" System Set   "
	};
unsigned int code Menu_RootID[4]=
	{
	MENU_VIEW,
	MENU_OPERATION,
	MENU_TEST,
	MENU_SYSTEMSET
	};
//
unsigned char code *Menu_View[2]=
	{
	" About ZL     ",
	" HandSet CLK  "
	};
unsigned int code Menu_ViewID[2]=
	{
	MENU_VIEW_ABOUTRECORDE,
	MENU_VIEW_HANDSETCLOCK
	};
//
unsigned char code *Menu_Operation[5]=
	{
	" Set Position ",
	" Rd Zj To ROM ",
	" Rd ZL To Ram ",
	" Del Given ZL ",
	" Del All ZL   "
	};
unsigned int code Menu_OperationID[5]=
	{
	MENU_OPERATION_SETPOSITION,
	MENU_OPERATION_READZJTOFLASH,
	MENU_OPERATION_RDZJTORAM,
	MENU_OPERATION_DELGIVENZL,
	MENU_OPERATION_DELALLZJ
	};
//
unsigned char code *Menu_Test[2]=
	{
	" Ram Test     ",
	" Flash Test   "
	};
unsigned int code Menu_TestID[2]=
	{
	MENU_TEST_RAMTEST,
	MENU_TEST_FLASHTEST
	};
//
unsigned char code *Menu_SystemSet[2]=
	{
	" Debug        ",
	" Set Hand Clk "
	};
unsigned int code Menu_SystemSetID[2]=
	{
	MENU_SYSTEMSET_DEBUG,
	MENU_SYSTEMSET_SETHANDCLK
	};
//
unsigned char code *Menu_Debug[2]=
	{
	" PassWord     ",
	" See Picture  "
	};
unsigned int code Menu_DebugID[2]=
	{
	MENU_SYSTEMSET_DEBUG_PASSWORD,
	MENU_SYSTEMSET_DEBUG_SEEPICTURE
	};
main()
{
	MyInit();
	bOldOnline=(~bOnline);
	b_KeyInt=0;
	b_ReceiveOver=0;
	b_Arrive1S=0;
	DispFaceBmp();
	iMenuID=MENU_FACE;//赋初值在这里==0
	while(1)
	{
	ReadyForKey();//开始键盘扫描的一部分
	//
	BitValue=XBYTE[Addr_Key];
	if(bOldOnline!=bOnline)
		{
		bOldOnline=bOnline;
		if(!bOldOnline)
			{//Line=1
			}
		else
			{//Line=0;
			}
		}
	if(b_KeyInt)
		{
		switch(NowKey)
			{
			case	KEY_OK://KEY_OK,		KEY_UP,		KEY_ESC,
					if(KeyTab[iMenuID].KeyTab_PressOk!=999)
						{
						iMenuID=KeyTab[iMenuID].KeyTab_PressOk;//用以指示当前界面,这时主键值已经修改
						iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
						JudgeHLight();
						}
					KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
    				(*KeyFuncPtr)();    //执行当前按键的操作
					break;
			case	KEY_UP:
					if((KeyTab[iMenuID].KeyTab_PressUp!=999)&&(iMenuNextID!=999))
						{
						KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressUp;
						iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressUp;
						JudgeHLight();
						}
					break;
			case	KEY_ESC:
					//
					if(KeyTab[iMenuID].KeyTab_PressEsc!=999)
						{
						iMenuID=KeyTab[iMenuID].KeyTab_PressEsc;
						iMenuNextID=KeyTab[iMenuID].KeyTab_PressOk;
						JudgeHLight();
						KeyFuncPtr=KeyTab[iMenuID].CurrentOperate;
	    				(*KeyFuncPtr)();    //执行当前按键的操作
						}
					break;
			case	KEY_DOWN:
					if((KeyTab[iMenuID].KeyTab_PressDown!=999)&&(iMenuNextID!=999))
						{
						KeyTab[iMenuID].KeyTab_PressOk=KeyTab[iMenuNextID].KeyTab_PressDown;
						iMenuNextID=KeyTab[iMenuNextID].KeyTab_PressDown;
						JudgeHLight();
						}
					break;
			default:
					break;
			}
		b_KeyInt=0;
		}
	if((b_Arrive1S==1)&&(iMenuID==MENU_FACE))
		{
		ReadTime();
		ShowDesktopTime();
		b_Arrive1S=0;
		}
	}
}
void isr_ex0(void)  interrupt 0 using 1
{
	b_KeyInt=1;
	//
	cTemp_ex0=0xff;
	//
	DelayMs(20);
	ReadyForKey();
	cTemp_ex0=XBYTE[Addr_Key];
	//
    cTemp_ex0=cTemp_ex0&0x3f;
    switch(cTemp_ex0)
	    {
	    case        0x3e://第一行
	        NowKey=0x10;
	        break;
	    case        0x3d://第二行
	        NowKey=0x20;
	        break;
	    case        0x3b://第三行
	        NowKey=0x30;
	        break;
	    case        0x37://第四行
	        NowKey=0x40;
	        break;
	    case        0x2f://第五行
	        NowKey=0x50;
	        break;
	    case        0x1f://第六行
	        NowKey=0x60;
	        break;
	    default:
			NowKey=0x00;
	        break;
	    }
	//
	KEYROW1=0;
	KEYROW2=1;
	KEYROW3=1;
	cTemp_ex0=XBYTE[Addr_Key];
    //
	cTemp_ex0&=0x3f;
	if(cTemp_ex0!=0x3f)
		{
		NowKey=NowKey|0x01;
		}
	else
		{
		KEYROW1=1;
		KEYROW2=0;
		KEYROW3=1;
		cTemp_ex0=XBYTE[Addr_Key];
	    //
			cTemp_ex0&=0x3f;
			if(cTemp_ex0!=0x3f)
				{
				NowKey=NowKey|0x02;
				}
			else
				{
				KEYROW1=1;
				KEYROW2=1;
				KEYROW3=0;
				cTemp_ex0=XBYTE[Addr_Key];
	    		cTemp_ex0&=0x3f;
				if(cTemp_ex0!=0x3f)
					{
					NowKey=NowKey|0x03;
					}
				else
					{
					BitValue=XBYTE[Addr_Key];
					if(!bPowerOff)
						{
						NowKey=0x71;
						}
					else
						{
						NowKey=0x00;
						}
					}
				}
		}
	//
	do
        {
		DelayMs(100);
        }while(!KEYINT);
	//
		IE0=0;//清外中断0请求
}
//
void isr_t0(void)   interrupt 1 using 2
{
	TL0=TL0data;
	TH0=TH0data;
	iT0_1S+=20;//因为定时器的定时为20Ms一次
	if(iT0_1S>=1000)
		{
		iT0_1S=0;
		b_Arrive1S=1;
		}
}
unsigned char ReadTime()
{
	for(i_RdTime=0;i_RdTime<9;i_RdTime++)
		clock[i_RdTime]=0;
	I2Cstart();
	I2Csend(0xA2);
	if(I2Csuback()==0)return 0;
	I2Csend(0x02);
	if(I2Csuback()==0)return 0;
	I2Cstart();
	I2Csend(0xA3);
	if(I2Csuback()==0)return 0;
	clock[0]=I2Cread()&0x7f;//seconds
	I2Cmastack();
	clock[1]=I2Cread()&0x7f;//min
	I2Cmastack();
	clock[2]=I2Cread()&0x3f;//hours
	I2Cmastack();
	clock[3]=I2Cread()&0x3f;//day
	I2Cmastack();
	clock[7]=I2Cread()&0x07;//week
	I2Cmastack();
	clock[4]=I2Cread()&0x1f;//mouth
	I2Cmastack();
	clock[5]=I2Cread()&0x7f;//year
	I2Cnoack();
	I2Cstop();
	clock[6]=0x20;
	cClock_Year=clock[5];
	cClock_Month=clock[4];
	cClock_Day=clock[3];
	cClock_Hour=clock[2];
	cClock_Minute=clock[1];
	cClock_Second=clock[0];
	return 1;
   //

}
unsigned char set_time(void)
{
   I2Cstart();
   for(i_RdTime=0;i_RdTime<11;i_RdTime++){
      I2Csend(clock[i_RdTime]);
      if(I2Csuback()==0)return 0;
   }
   I2Cstop();
   return 1;
}

void DispMenu_Root()
{
for(cMenuTemp1=0;cMenuTemp1<7;cMenuTemp1++)
	{
	if(cMenuTemp1<4)
		{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -