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

📄 menu.c

📁 用CS5532做的无线吊钩称的接收称重显示器程序
💻 C
字号:
#include <reg52.h>

#define TRUE  1
#define FALSE 0


  signed char xdata min;
  signed char xdata max;
extern unsigned char xdata TmpData[7];

typedef struct	cmd_entry	/* define the struct 'cmd_entry'  */
{
	unsigned char divisionprecision;	// 0
	unsigned char auto_zero;		// 1
	unsigned char capacity;			// 2
	unsigned char bk;				// 3
	unsigned char inp;			// 4
	unsigned char unit;			// 5
	unsigned char poweroff;			// 6
	unsigned char prt;			// 7
	unsigned char change;			// 8
}x;

union exam
{
	struct cmd_entry mode;
	unsigned char cmode[9];
}xdata para;

unsigned char code factory_para[] = {1,1,0,0,0,0,1,1,1};

/**************************************************
与秤重有关的变量
**************************************************/
extern  signed long int xdata capacity;
extern  signed long int xdata capacity_n;			//kg状态下的量程
extern  signed long int xdata adzero;
extern  signed long int xdata adf;
extern  signed long int xdata adz0;
extern  signed long int xdata adz;
extern  signed long int xdata w_gross;
extern  signed long int xdata w_net;
extern  signed long int xdata w_tare;
extern  float           xdata f_z;
extern  float           xdata f_w;
extern unsigned long int xdata ad_out;					//读出的内码
/**************************************************************************
调用LCD中的子程序
**************************************************************************/
extern void DispUnit(unsigned char);
extern void DispStr(unsigned char code  *ptr_code);
extern void DispDigital(signed long li,signed char pos);
extern void ClearFlag(void);
extern void tran(void);
extern void wrlcd(void);

extern bdata unsigned char cont_1;
extern bdata unsigned char cont_2;
extern bdata unsigned char cont_3;
extern xdata unsigned char rice1_1;
extern xdata unsigned char rice1_2;
extern xdata unsigned char rice2_1;
extern xdata unsigned char rice2_2;
extern xdata unsigned char rice3_1;
extern xdata unsigned char rice3_2;
extern unsigned char xdata dispbuff[6];
extern unsigned char  data bankbuff[16];

extern unsigned char xdata unit;


/***********************************************************************
EEPROM 中存数据的地址
***********************************************************************/
#define e_para      0x10
#define e_adzero    0x20
#define e_adf       0x24

//调用IIC中的子程序
extern WriteEeprom(unsigned char t_addr, unsigned char num, unsigned char xdata *ptr);
extern ReadEeprom(unsigned char s_addr, unsigned char num, unsigned char xdata *ptr);

/************************************************************************
//键盘的调用
************************************************************************/
//extern void KeyPro(void);
extern data unsigned char kbuf;
extern bit keyp;		//产生有效键的标志
#define KEYQUIT   0x08
#define KEYCLEAR  0x10
#define KEYRIGHT  0x04
#define KEYINC    0x01
#define KEYENTER  0x02

/************************************************************************
来源于主程序
************************************************************************/
extern void inp(void);
extern void InitSendAS(void);
extern void DisposeUart(void);
extern void getcap(signed char num);
extern bit stab_lcd,stab;
extern unsigned int xdata wink;
extern void DelayInter(unsigned int num);

unsigned char code unload[] = {0x1d,0x16,0x15,0x17,0x0a,0x0d};		//unload
unsigned char code load[]   = {0x20,0x20,0x15,0x17,0x0a,0x0d};		//  load

unsigned char code d_f0[]   = {0x0f,0x00,0x20,0x0d,0x12,0x2f};		//F0 div
unsigned char code f1[]     = {0x0f,0x01,0x20,0x0a,0x02,0x00};		//F1 A20
unsigned char code f2[]     = {0x0f,0x02,0x20,0x0c,0x0a,0x18};		//F2 CAP
unsigned char code f3[]     = {0x0f,0x03,0x20,0x20,0x0b,0x2e};		//F3  BK
unsigned char code f4[]     = {0x0f,0x04,0x20,0x01,0x16,0x18};		//F4 1NP

unsigned char code f5[]     = {0x0f,0x05,0x20,0x1d,0x16,0x1c};		//F5 Unt
unsigned char code f6[]     = {0x0f,0x06,0x20,0x17,0x0f,0x0f};		//F6 oFF
unsigned char code f7[]     = {0x0f,0x07,0x20,0x18,0x1a,0x1c};		//F7 Prt

unsigned char code f8[]     = {0x0f,0x08,0x20,0x0c,0x0a,0x15};		//F8 CAL

//unsigned char code f5[]     = {0x0f,0x05,0x20,0x1a,0x0e,0x0f};		//F5 rEF

unsigned char code d_low[]  = {0x20,0x20,0x20,0x15,0x17,0x32};		//   LoW
unsigned char code d_high[] = {0x20,0x20,0x11,0x12,0x10,0x11};		//  HiGH

unsigned char code d_bkau[] = {0x0b,0x2e,0x20,0x20,0x0a,0x1d};		//BK  AU
unsigned char code d_bkon[] = {0x0b,0x2e,0x20,0x20,0x17,0x16};		//BK  on
unsigned char code d_bkoff[]= {0x0b,0x2e,0x20,0x17,0x0f,0x0f};		//BK oFF

unsigned char code d_off0[] = {0x17,0x0f,0x0f,0x20,0x20,0x00};		//oFF  0
unsigned char code d_off5[] = {0x17,0x0f,0x0f,0x20,0x20,0x05};		//oFF  5
unsigned char code d_off10[]= {0x17,0x0f,0x0f,0x20,0x01,0x00};		//oFF 10
unsigned char code d_off15[]= {0x17,0x0f,0x0f,0x20,0x01,0x05};		//oFF 15
unsigned char code d_off30[]= {0x17,0x0f,0x0f,0x20,0x03,0x00};		//oFF 30

unsigned char code d_prt0[] = {0x18,0x1a,0x1c,0x20,0x20,0x00};		//Prt  0
unsigned char code d_prt1[] = {0x18,0x1a,0x1c,0x20,0x20,0x01};		//Prt  1
unsigned char code d_prt2[] = {0x18,0x1a,0x1c,0x20,0x20,0x02};		//Prt  2
unsigned char code d_prt3[] = {0x18,0x1a,0x1c,0x20,0x20,0x03};		//Prt  3
unsigned char code d_prt4[] = {0x18,0x1a,0x1c,0x20,0x20,0x04};		//Prt  4
unsigned char code d_prt5[] = {0x18,0x1a,0x1c,0x20,0x20,0x05};		//Prt  5

unsigned char code d_on[]   = {0x20,0x20,0x20,0x20,0x17,0x16};			//   on
unsigned char code d_off[]  = {0x20,0x20,0x20,0x17,0x0f,0x0f};			//  oFF
//unsigned char code d_auto[] = {0x20,0x0a,0x1d,0x1c,0x00};			// AUt0

unsigned char code d_az05d[]= {0x0a,0x02,0x20,0x22,0x05,0x0d};		// 0.5d
unsigned char code d_az1d[] = {0x0a,0x02,0x20,0x20,0x01,0x0d};		//   1d
unsigned char code d_az2d[] = {0x0a,0x02,0x20,0x20,0x02,0x0d};		//   2d
unsigned char code d_az4d[] = {0x0a,0x02,0x20,0x20,0x04,0x0d};		//   4d

unsigned char code d_1000[] = {0x20,0x20,0x01,0x00,0x00,0x00};		//  1000kg
unsigned char code d_2000[] = {0x20,0x20,0x02,0x00,0x00,0x00};		//  2000kg
unsigned char code d_3000[] = {0x20,0x20,0x03,0x00,0x00,0x00};		//  3000kg
unsigned char code d_5000[] = {0x20,0x20,0x05,0x00,0x00,0x00};		//  5000kg
unsigned char code d_7500[] = {0x20,0x20,0x07,0x05,0x00,0x00};		// 75000kg
unsigned char code d_10000[]= {0x20,0x01,0x00,0x00,0x00,0x00};		// 10000kg

unsigned  int code ptr_off_on[] = {(unsigned int)&d_off,(unsigned int)&d_on};

unsigned  int code ptr_f[]  = {9,(unsigned int)&d_f0,(unsigned int)&f1,(unsigned int)&f2,  
					   (unsigned int)&f3,  (unsigned int)&f4,(unsigned int)&f5,  
					   (unsigned int)&f6,  (unsigned int)&f7,(unsigned int)&f8};
unsigned  int code ptr_f0[] = {2,(unsigned int)&d_low,  (unsigned int)&d_high};
unsigned  int code ptr_f1[] = {4,(unsigned int)&d_az05d,(unsigned int)&d_az1d,
					   (unsigned int)&d_az2d, (unsigned int)&d_az4d};
unsigned  int code ptr_f2[] = {6,(unsigned int)&d_1000, (unsigned int)&d_2000, (unsigned int)&d_3000,
					   (unsigned int)&d_5000, (unsigned int)&d_7500, 
					   (unsigned int)&d_10000};
unsigned  int code ptr_f3[] = {3,(unsigned int)&d_bkau, (unsigned int)&d_bkon,(unsigned int)&d_bkoff};

unsigned  int code ptr_f6[] = {5,(unsigned int)&d_off0, (unsigned int)&d_off5, (unsigned int)&d_off10,
					   (unsigned int)&d_off15,(unsigned int)&d_off30};
unsigned  int code ptr_f7[] = {6,(unsigned int)&d_prt0, (unsigned int)&d_prt1, (unsigned int)&d_prt2,
					   (unsigned int)&d_prt3, (unsigned int)&d_prt4, (unsigned int)&d_prt5};

unsigned  int code ptr_ptr_f[] = {(unsigned int)&ptr_f0,(unsigned int)&ptr_f1,(unsigned int)&ptr_f2,
					    (unsigned int)&ptr_f3,                    0,                    0,
					    (unsigned int)&ptr_f6,(unsigned int)&ptr_f7,                    0};



unsigned char code n_auto0[] = {0,2,5,10,20};
unsigned char code n_rang0[] = {2,4,10,20,50,100};

/*unsigned  int code ptr_p2[] = {5,(unsigned int)&d_deci,(unsigned int)&d_inc,(unsigned int)&d_cap,
					   (unsigned int)&d_cal,(unsigned int)&d_count};*/


unsigned char code n_division[] = {1,2,5,10,20,50,100,200};


unsigned char code allbit[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

unsigned int code exp_m[] = {1,10,100,1000,10000};

bit Menu(void);
signed long int get_li(signed long int li,signed char num);

unsigned char code txpin[] = {0x18,0x16,0x20,0x20,0x20,0x20,		//Pn    
					0x18,0x16,0x20,0x1f,0x20,0x20,		//Pn -
					0x18,0x16,0x20,0x1f,0x1f,0x20,		//Pn --
					0x18,0x16,0x20,0x1f,0x1f,0x1f,		//Pn ---
					0x18,0x16,0x1f,0x1f,0x1f,0x1f,		//Pn    
				     };

unsigned char xdata pinbuff[4];
void getpin()
{
	unsigned char loop;

	for(loop=0;loop<3;loop++)
	{
		do
		{
		} while(keyp == 0);
		keyp = 0;
		DispStr(txpin+loop*6+6);
		pinbuff[loop] = kbuf;
	}
}


void EnterMenu(void)
{
	unsigned char loop=0;
Emenu_start:
	bankbuff[1] = bankbuff[2]=bankbuff[3]=bankbuff[4]=bankbuff[5]=bankbuff[6]=0;
	cont_1 = cont_2 = cont_3 = 0;
	DispStr(txpin);
	getpin();
	for ( ; ; )
	{
		for ( ; !keyp; ) ;
		keyp = FALSE;
		if (kbuf == KEYENTER) break;
		if (kbuf == KEYQUIT) return;
	}
	if ( (pinbuff[0] ==0x04) && (pinbuff[1] ==0x08) && (pinbuff[2] ==0x02) )	//密码正确
	{
		Menu();
	}
	else
	{
		loop++;
		if (loop>=3) return;
		goto Emenu_start;
	}
	
}

/*
按了ESC键盘,返回-1,按确认键返回选择项
*/
signed char sub_disp(unsigned int code *ptr_i,signed char loop2)
{

	max = (unsigned char) (* ptr_i);
	min = 1;
	if ( (loop2<min) || (loop2 > max) ) loop2 = min;
	for ( ; ; )
	{
		if (keyp)
		{
			keyp = 0;
			if (kbuf == KEYINC) loop2++;
			if (loop2 > max) loop2 = min;
			if (kbuf == KEYENTER) return(loop2);
			if (kbuf == KEYQUIT) return(-loop2);
		}
		DispStr((unsigned char code*) * (ptr_i+loop2));
	}
}
unsigned int code MenuCapacity[] = {1000,2000,3000,5000,7500,10000};

bit Menu(void)
{
	signed char loop,loop1,loop2;

	ClearFlag();
	min = 1;
	loop = min;
	for ( ; ; )
	{
		max = ptr_f[0];
		DispStr( (unsigned char code *)ptr_f[loop]);
		for ( ; ; )
		{
			if (keyp)
			{
				keyp = 0;
				if (kbuf == KEYINC)
				{
					loop++;
					if (loop > max) loop = min;
				}
				if (kbuf == KEYENTER) break;
				if (kbuf == KEYQUIT) return(FALSE);
				DispStr( (unsigned char code *)ptr_f[loop]);
			}
		}
		switch (loop)
		{
			case 6:				//F5 选择单位
				max = 1;
				for (loop2 = 0; loop2 < 4; loop2++)
				{
					loop1 = para.mode.unit & allbit[loop2];
					loop1 = loop1 >> loop2;
					ClearFlag();

					unit = loop2;
					for ( ; ; )
					{
						if (keyp)
						{
							keyp = 0;
							if (kbuf == KEYINC) loop1++;
							if (loop1 > max) loop1 = 0;
							if (kbuf == KEYENTER)
							{
								loop1 = loop1 << loop2;
								para.mode.unit = (para.mode.unit&(~allbit[loop2])) + loop1;
								break;
							}
							if (kbuf == KEYQUIT) break;
						}
						DispStr((unsigned char code*)ptr_off_on[loop1]);
					}
				}
				ClearFlag();
				unit = 0xff;		//不显示单位
				WriteEeprom(e_para+loop-1,1,(unsigned char xdata*)&para.cmode[loop-1]);
				break;
			case 1:			//F0 div
			case 2:			//F1 A20
			case 3:			//F2 CAP
			case 4:			//F3  BK
			case 7:			//F6 oFF
			case 8:			//F7 Prt
				if (loop ==3) unit = 0;			//显示kg
				loop1 = sub_disp((unsigned int code *)ptr_ptr_f[loop-1],para.cmode[loop-1]+1);
				para.cmode[loop-1] = loop1-1;
				ClearFlag();
				unit = 0xff;
				if (loop1 > 0)
				{
					WriteEeprom(e_para+loop-1,1,(unsigned char xdata*)&para.cmode[loop-1]);
				}
				break;
			case 5:			//F4 inP
				inp();
				ClearFlag();
				break;
			case 9:			//F8 CAL
				InitSendAS();
				capacity = (signed long int)MenuCapacity[para.mode.capacity];
//				getcap(0);
				DispStr(unload);
				for ( ; ; )
				{
					DisposeUart();
					stab_lcd = FALSE;
					if (stab) stab_lcd = TRUE;
					DispStr(unload);
					if (keyp)
					{
						keyp = 0;
						if (kbuf == KEYENTER) break;
					}
				}
				adzero = ad_out;
				w_net = 0;
				for ( ; ; )
				{
					for ( ; ; )
					{
						w_net = get_li(w_net,0);		//借用w_net变量
						if (w_net > 0) break;
					}
					if  ((w_net <= capacity) && (w_net >0) ) break;
				}
				for ( ; ; )
				{
					DisposeUart();
					stab_lcd = FALSE;
					if (stab) stab_lcd = TRUE;
					DispStr(load);
					if (keyp)
					{
						keyp = 0;
						if (kbuf == KEYENTER) break;
					}
				}
				adz = adz0 = adzero;
				f_z = (float)(ad_out - adzero);
				f_z = ((float)capacity) * f_z;
				f_z = f_z / ((float)w_net);
				adf = (signed long int)f_z;

				WriteEeprom(e_adzero,4,(unsigned char xdata*)&adzero);
				WriteEeprom(e_adf,4,(unsigned char xdata*)&adf);
//				temp_li = adzero;
//				wr_2402(e_adzero,4);
//				temp_li = adf;
//				wr_2402(e_adf,4);
				return(TRUE);

		}
	}
	return(FALSE);
}

/*
按了ESC键盘,返回-1,按确认键返回数值
*/
signed long int get_li(signed long int li,signed char num)
{
	signed char loop2,loop3;
	if (num < 0)
	{
		li = li * exp_m[-num];
		num = 0;
	}
	wink = 0;
	for (loop2=0; loop2<6;loop2++)
	{
		TmpData[5-loop2] = li % 10;
		li = li / 10;
	}
	loop3 = 5;
	loop2 = TmpData[loop3];

	for ( ; ; )
	{
		if (keyp)
		{
			keyp = 0;
			switch (kbuf)
			{
				case KEYQUIT:
					return(-1);
				case KEYCLEAR:
					TmpData[0]=TmpData[1]=TmpData[2]=TmpData[3]=TmpData[4]=TmpData[5]=0;
					break;
/*				case key3:
					loop3--;
					if(loop3<0) loop3 = 4;
					loop2 = TmpData[loop3];
					break;*/
				case KEYRIGHT:
					loop3++;
					if(loop3>5) loop3 = 0;
					loop2 = TmpData[loop3];
					break;
				case KEYINC:
					loop2++;
					if (loop2 > 9) loop2 = 0;
					TmpData[loop3] = loop2;
					break;
				case KEYENTER:
					li = 0;
					for (loop2=0; loop2 < 6; loop2++)
					{
						li=li*10+(signed long)TmpData[loop2];
					}
					return(li);
			}
		}

		dispbuff[0] = TmpData[0];
		dispbuff[1] = TmpData[1];
		dispbuff[2] = TmpData[2];
		dispbuff[3] = TmpData[3];
		dispbuff[4] = TmpData[4];
		dispbuff[5] = TmpData[5];
		if (num > 0)
		{
			dispbuff[5-num] = TmpData[5-num] + 0x22;
		}
		if (wink > 50) dispbuff[loop3]=0x20;
		if (wink > 100) wink = 0;
		tran();
		wrlcd();
	}
}

⌨️ 快捷键说明

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