📄 menu.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*)¶.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*)¶.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 + -