📄 cmain.c
字号:
}
for ( loop = 0; loop < 4; loop++)
{
if ( (para.mode.unit&allbit[s_unit]) != 0) break;
s_unit++;
if (s_unit > 3) s_unit = 0;
}
getcap_ret:
unit = s_unit;
return;
}
/*
1 lb = 0.45359237 kg
1台斤 = 0.6kg
1港斤 = 0.605kg
1kg = 2.20462262 lb
1kg = 1.66666667 台斤
1kg = 1.65289256 港斤
*/
float code CONVERTUNIT[] = { 1,2.20462262,1.66666667,1.65289265};
unsigned int code CAPACITYCODE[] = {
// kg lb 台斤 港斤
1000, 2200, 1700, 1700, //LoW 0
1000, 2200, 1700, 1700, //LoW 1
10000, 2200, 1700, 1700, //LoW 2 HiGH 0
10000, 22000, 17000, 17000, //HiGH 1
10000, 22000, 17000, 17000, //HiGH 2
2000, 440, 330, 330, //LoW 0
2000, 4400, 3300, 3300, //LoW 1
2000, 4400, 3300, 3300, //LoW 2 HiGH 0
20000, 4400, 3300, 3300, //HiGH 1
20000, 44000, 33000, 33000, //HiGH 2
300, 660, 500, 500, //LoW 0
3000, 660, 500, 500, //LoW 1
3000, 6600, 5000, 5000, //LoW 2 HiGH 0
3000, 6600, 5000, 5000, //HiGH 1
30000, 6600, 5000, 5000, //HiGH 2
500, 1100, 830, 830, //LoW 0
5000, 1100, 830, 830, //LoW 1
5000, 11000, 8300, 8300, //LoW 2 HiGH 0
5000, 11000, 8300, 8300, //HiGH 1
50000, 11000, 8300, 8300, //HiGH 2
750, 1700, 1200, 1200, //LoW 0
750, 1700, 1200, 1200, //LoW 1
7500, 1700, 1200, 1200, //LoW 2 HiGH 0
7500, 17000, 12000, 12000, //HiGH 1
7500, 17000, 12000, 12000, //HiGH 2
1000, 2200, 1700, 1700, //LoW 0
1000, 2200, 1700, 1700, //LoW 1
10000, 2200, 1700, 1700, //LoW 2 HiGH 0
10000, 22000, 17000, 17000, //HiGH 1
10000, 22000, 17000, 17000 //HiGH 2
};
signed char code DIVISIONCODE[] = {
// kg lb 台斤 港斤
//1000kg
2, 5, 5, 5, //LoW 0
1, 2, 2, 2, //LoW 1
5, 1, 1, 1, //LoW 2 HiGH 0
2, 5, 5, 5, //HiGH 1
1, 2, 2, 2, //HiGH 2
//2000kg
5, 1, 1, 1, //LoW 0
2, 5, 5, 5, //LoW 1
1, 2, 2, 2, //LoW 2 HiGH 0
5, 1, 1, 1, //HiGH 1
2, 5, 5, 5, //HiGH 2
//3000kg
1, 2, 2, 2, //LoW 0
5, 1, 1, 1, //LoW 1
2, 5, 5, 5, //LoW 2 HiGH 0
1, 2, 2, 2, //HiGH 1
5, 1, 1, 1, //HiGH 2
//5000kg
1, 2, 2, 2, //LoW 0
5, 1, 1, 1, //LoW 1
2, 5, 5, 5, //LoW 2 HiGH 0
1, 2, 2, 2, //HiGH 1
5, 1, 1, 1, //HiGH 2
//7500kg
2, 5, 5, 5, //LoW 0
1, 2, 2, 2, //LoW 1
5, 1, 1, 1, //LoW 2 HiGH 0
2, 5, 5, 5, //HiGH 1
1, 2, 2, 2, //HiGH 2
//10000kg
2, 5, 5, 5, //LoW 0
1, 2, 2, 2, //LoW 1
5, 1, 1, 1, //LoW 2 HiGH 0
2, 5, 5, 5, //HiGH 1
1, 2, 2, 2, //HiGH 2
};
signed char code DECIMALCODE[] = {
// kg lb 台斤 港斤
//1000kg
0, 0, 0, 0, //LoW 0
0, 0, 0, 0, //LoW 1
1, 0, 0, 0, //LoW 2 HiGH 0
1, 1, 1, 1, //HiGH 1
1, 1, 1, 1, //HiGH 2
//2000kg
0, -1, -1, -1, //LoW 0
0, 0, 0, 0, //LoW 1
0, 0, 0, 0, //LoW 2 HiGH 0
1, 0, 0, 0, //HiGH 1
1, 1, 1, 1, //HiGH 2
//3000kg
-1, -1, -1, -1, //LoW 0
0, -1, -1, -1, //LoW 1
0, 0, 0, 0, //LoW 2 HiGH 0
0, 0, 0, 0, //HiGH 1
1, 0, 0, 0, //HiGH 2
//5000kg
-1, -1, -1, -1, //LoW 0
0, -1, -1, -1, //LoW 1
0, 0, 0, 0, //LoW 2 HiGH 0
0, 0, 0, 0, //HiGH 1
1, 0, 0, 0, //HiGH 2
//7500kg
-1, -1, -1, -1, //LoW 0
-1, -1, -1, -1, //LoW 1
0, -1, -1, -1, //LoW 2 HiGH 0
0, 0, 0, 0, //HiGH 1
0, 0, 0, 0, //HiGH 2
//10000kg
-1, -1, -1, -1, //LoW 0
-1, -1, -1, -1, //LoW 1
0, -1, -1, -1, //LoW 2 HiGH 0
0, 0, 0, 0, //HiGH 1
0, 0, 0, 0, //HiGH 2
};
extern unsigned char code n_division[]; // = {1,2,5,10,20,50,100,200};
extern unsigned char code n_rang0[]; // = {2,4,10,20,50,100};
//得到量程、分度值、小数点位,均为磅的方式下
// num -- 0 kg的状态下
// num -- 1 lb
// num -- 2 台斤
// num -- 3 港斤
void getcap(signed char num)
{
signed char loop;
if (para.mode.divisionprecision > 1) para.mode.divisionprecision = 0;
if (para.mode.change > 2) para.mode.change = 0;
if (para.mode.capacity > 5) para.mode.capacity = 0;
loop = para.mode.change;
if (para.mode.divisionprecision == 1) loop += 2;
//先得到kg的量程
loop = para.mode.capacity * 20 + 4 * loop;
capacity_n = CAPACITYCODE[loop];
decimal_n = DECIMALCODE[loop];
division_n = DIVISIONCODE[loop];
if (decimal<0) division_n = division_n * exp_m[-decimal];
if (num > 3) num = 0;
loop = loop + num;
capacity = CAPACITYCODE[loop];
division = DIVISIONCODE[loop];
decimal = DECIMALCODE[loop];
if (decimal<0)
{
division = division * exp_m[-decimal];
capacity = capacity * exp_m[-decimal];
}
fd5 = adf / capacity_n;
fd5 = fd5 / 2;
}
void InitVar(void)
{
ClearFlag(); //关闭所有标志位
w_tare = 0;
init_s();
getcap(s_unit);
}
unsigned char code OFFTIME[] = {0,5,10,15,30};
////////batt auto protect/////////////
void AutoPower(void)
{
batt_lcd = 0;
if (last_min!=shut_min)
{
last_min=shut_min;
if (batt_lcd)
{
ReadEeprom(e_min_add,1,(unsigned char xdata*)&min_add);
min_add++;
WriteEeprom(e_min_add,1,(unsigned char xdata*)&min_add);
if (min_add)
{
if ((min_add % 5)==0)
{
DispStr(d_battlo);
DelayInter(200);
}
if (min_add>=30)
{
min_add = 31;
DispStr(d_battlo);
DelayInter(200);
IOPower = 0;
}
}
}
else
{
min_add=0;
WriteEeprom(e_min_add, 1, (unsigned char xdata*)&min_add);
}
if (para.mode.poweroff != 0)
{
if ( shut_min >= OFFTIME[para.mode.poweroff] )
{
// ReadEeprom(e_start, 1, (unsigned char xdata*)&test_start);
// test_start=~test_start & 0x01;
test_start = 0;
WriteEeprom(e_start, 1, (unsigned char xdata*)&test_start);
IOBeep = 0;
delay(2000);
IOBeep = 1;
IOPower = 0; //关机
}
}
}
}
///////////特殊功能寄存器初始化
void InitSfr(void)
{
EA = 0;
TMOD=0x11;
PCON=0x00;
/* if( commodel == 5 ) //在p cnt2状态下
{
SCON=0xf8; //dibal专用,2位停止位
}
else
{
SCON=0x70; //其他正常串口模式下
}
*/
SCON = 0x70;
IP=0x08;
TH0=0;
TL0=0;
TH1=0xdc; //0xee; //0xf7;
TL1=0x00;
TR0=0;
TR1=1;
IT1=1;
EX0=0;
EX1=0;
ET1=1;
ET0=0;
ES=1;
EA=1;
}
////////测试LCD好坏
bit SelfTest(void)
{
unsigned char loop,iic_char;
cont_1 = 0xef;
cont_2 = cont_3 = 0xff;
bankbuff[1] = bankbuff[2]=bankbuff[3]=bankbuff[4]=bankbuff[5]=bankbuff[6]=0xff;
unit = 0xff; //不显示单位
if( !IOK1 ) //k1为老化模式
{
DispStr(disp_full);
while(1)
{
;
}
}
else
{
DispStr(version);
}
delay(20000);
for (loop=0;loop<10;loop++)
{
for (iic_char=0;iic_char<6;iic_char++)
{
dispbuff[iic_char]=loop; //+0x22;
delay(4000);
}
tran();
wrlcd();
if (keyp)
{
keyp = FALSE;
if (kbuf == KEYT_Z) break;
if (kbuf == KEYUNIT)
{
EnterMenu(); //进入菜单设置
return(FALSE);
}
}
delay(4000);
}
ClearFlag();
DispStr(version);
return(TRUE);
}
//处理串口,得到内码
void DisposeUart(void)
{
if (!BReq)
{
SendStr(2);
BReq = TRUE;
ReqTime = 50;
}
if (RdBufData())
{
ReqTime = 50;
BReq = TRUE;
ReqNum = 0;
BRecData = FALSE;
BErrData = FALSE;
// DispDigital((signed long int)ad_out,1);
}
if (ReqNum >= 7)
{
BErrData = TRUE;
unit = 0xff;
ClearFlag();
ray_lcd = FALSE;
if (BRecData) DispStr(err_11);
else DispStr(err_10);
BRecData = FALSE;
ReqNum = 0;
}
}
void InitSendAS(void)
{
SendStr(2);
ReqTime = 100;
BReq = TRUE;
ReqNum = 0;
RecCounter =0;
RdCounter = 0;
BRecData = FALSE;
}
void inp(void) //显示内码
{
InitSendAS();
for ( ; ; )
{
AutoPower();
DisposeUart();
if (pick)
{
pick = 0;
stab_lcd = FALSE;
if (stab) stab_lcd = TRUE;
if (!BErrData) DispDigital((signed long int)ad_out,0);
}
if (keyp)
{
keyp = 0;
if (kbuf == KEYENTER) break;
}
}
}
//得到kg单位时的重量
float GetWeightKg(void)
{
float f_f;
f_f = (float)((signed long int)ad_out - adz);
f_f = f_f * capacity_n;
f_f = f_f /(float)adf;
if (decimal_n >= 0) f_f = f_f / exp_m[decimal_n];
else f_f = f_f * exp_m[-decimal_n];
return(f_f);
}
//获得各个单位的重量
signed long int GetWeightUnit(void)
{
signed long int li;
f_w = GetWeightKg();
f_w = f_w * CONVERTUNIT[s_unit];
if (decimal >= 0) f_w = f_w * exp_m[decimal];
// else f_w = f_w / exp_m[-decimal];
if (f_w >= 0) f_w = f_w + 0.5*((float)division);
else f_w = f_w - 0.5*((float)division);
li = (signed long int)f_w;
li = li / (signed long int)division;
li = li * division;
return(li);
}
//检查背光
void CheckBk(void)
{
if (!BLess20d || !BErrData)
{
IOBK=1;
bk_del=500;
bk_delb=1;
}
else if(bk_delb==0)
{
IOBK=0;
}
}
////////主程序//////////
void main(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -