📄 disp.c
字号:
/////////////////////////////////////////////////////
#include <REG51STC.H>
#include <ABSACC.H>
#include "CMD16887.H"
#include <INTRINS.H>
#include "externxy.h"
/*********************************************
* 功能: DISP1 金额/容量/单价 *
**********************************************/
void disp_lcd1(ulong lcddata,uchar lcdadd) //;LCD1三个窗的显示
{
uchar i;
uchar temp;
uchar dispmem[6];
uchar j;
uchar b;
uchar endhide; //清前导零要到小数点位置
bit hide=0;
bit bymem;
bbyte=dotmode[decimal_a];
switch (lcdadd)
{
case 0: //单价窗时
if (a2)
{a5=0;endhide=4;}
else if(a5)
{endhide=3;}
else
{endhide=0;}
break;
case 4: //金额窗时
if (a0)
{a3=0;endhide=2;} //saledot=1;
else if(a3)
{endhide=3;} //saledot=0;
else
{endhide=0;}
break;
case 10: //体积窗时
if (a1)
{a4=0;endhide=4;}
else if(a4)
{endhide=3;}
else
{endhide=0;}
break;
default:
endhide=0;
goto lcd1_break;
break;
}
if (lcdadd==0)
{ b=4; } //单价栏仅4数字
else
{b=6; }
for(i=0;i<b;i++)
{ bbyte=(lcddata%10);
lcddata /=10;
dispmem[i]=bbyte;
}
//-------------------------------
switch(lcdadd) //更新通讯表格
{
case 0: //单价窗时
table_buf[2]=dispmem[1]*16+dispmem[0];
table_buf[3]=dispmem[3]*16+dispmem[2];
break;
case 4: //金额窗时
table_buf[40]=dispmem[1]*16+dispmem[0];
table_buf[41]=dispmem[3]*16+dispmem[2];
table_buf[42]=dispmem[5]*16+dispmem[4];
break;
case 10: //体积窗时
table_buf[46]=dispmem[1]*16+dispmem[0];
table_buf[47]=dispmem[3]*16+dispmem[2];
table_buf[48]=dispmem[5]*16+dispmem[4];
break;
}
//-------------------------------
AUXR |=0x02;
for(i=b;i>0;i--)
{ ACC=0x38;
XBYTE[LCDAADD]=ACC; //ST
bbyte=dispmem[i-1];
if(i==endhide) hide=1; //小数点以后不去前导零
if(i!=1)
{
if(bbyte==0 && !hide)
{
bbyte=0x0f; //去前导零
}
else
{ hide=1; }
}
temp=bbyte*16+i+lcdadd-1;
for(j=8;j>0;j--)
{ bbyte=temp;
bymem=(bit)(bbyte&0x80);
temp<<=1;
bbyte=0x38;
a1= bymem; //DS-->DATA
XBYTE[LCDAADD]=bbyte;
ACC|=0x01;
_nop_();
XBYTE[LCDAADD]=ACC; //CP-->CLK ↑
ACC&=0xfe;
_nop_();
XBYTE[LCDAADD]=ACC; //CP-->CLK ↓
}
ACC=0x3c;
XBYTE[LCDAADD]=ACC; //ST-->INH
}
lcd1_break:
AUXR &=0xfd;
}
/*********************************************
* 功能: DISP2 金额/容量/单价 *
**********************************************/
void disp_lcd2(ulong lcddata,uchar lcdadd) //;LCD1三个窗的显示
{
uchar i;
uchar temp;
uchar dispmem[6];
uchar j;
uchar b;
uchar endhide; //清前导零要到小数点位置
bit hide=0;
bit bymem;
bbyte=dotmode[decimal_b];
switch (lcdadd)
{
case 0: //单价窗时
if (a2)
{endhide=4;}
else if(a5)
{endhide=3;}
else
{endhide=0;}
break;
case 4: //金额窗时
if (a0)
{endhide=2;}
else if(a3)
{endhide=3;}
else
{endhide=0;}
break;
case 10: //体积窗时
if (a1)
{endhide=4;}
else if(a4)
{endhide=3;}
else
{endhide=0;}
break;
default:
endhide=0;
goto lcd2_break;
break;
}
if (lcdadd==0)
{ b=4; } //单价栏仅4数字
else
{b=6; }
for(i=0;i<b;i++)
{ bbyte=(lcddata%10);
lcddata /=10;
dispmem[i]=bbyte;
}
//-------------------------------
switch(lcdadd) //更新通讯表格
{
case 0: //单价窗时
table_buf[2+53]=dispmem[1]*16+dispmem[0];
table_buf[3+53]=dispmem[3]*16+dispmem[2];
break;
case 4: //金额窗时
table_buf[40+53]=dispmem[1]*16+dispmem[0];
table_buf[41+53]=dispmem[3]*16+dispmem[2];
table_buf[42+53]=dispmem[5]*16+dispmem[4];
break;
case 10: //体积窗时
table_buf[46+53]=dispmem[1]*16+dispmem[0];
table_buf[47+53]=dispmem[3]*16+dispmem[2];
table_buf[48+53]=dispmem[5]*16+dispmem[4];
break;
}
//-------------------------------
AUXR |=0x02;
for(i=b;i>0;i--)
{ ACC=0x38;
XBYTE[LCDBADD]=ACC; //ST
bbyte=dispmem[i-1];
if(i==endhide) hide=1; //小数点以后不去前导零
if(i!=1)
{
if(bbyte==0 && !hide)
{
bbyte=0x0f; //去前导零
}
else
{ hide=1; }
}
temp=bbyte*16+i+lcdadd-1;
for(j=8;j>0;j--)
{ bbyte=temp;
bymem=(bit)(bbyte&0x80);
temp<<=1;
bbyte=0x38;
a1= bymem; //DS-->DATA
XBYTE[LCDBADD]=bbyte;
ACC|=0x01;
_nop_();
XBYTE[LCDBADD]=ACC; //CP-->CLK ↑
ACC&=0xfe;
_nop_();
XBYTE[LCDBADD]=ACC; //CP-->CLK ↓
}
ACC=0x3c;
XBYTE[LCDBADD]=ACC; //ST-->INH
}
lcd2_break:
AUXR &=0xfd;
}
/***********************************************************************
* 功能:LCD1小数点
***********************************************************************/
void disp_dot1(uchar dotdata)
{
uchar temp;
uchar j;
bit bymem;
AUXR |=0x02;
//ACC=0x38;
//XBYTE[LCDAADD]=ACC; //ST
if(state1==2) bbyte=dotdata;
else bbyte=dotmode[dotdata];
bbyte &= 0x07; //1,3,5
bbyte=dotmem[bbyte];
temp=bbyte;
if(state1==2) bbyte=dotdata;
else bbyte=dotmode[dotdata];
bbyte &= 0x38; //2,4,6
bbyte>>=3;
bbyte=dotmem[bbyte];
bbyte<<=4;
temp |=bbyte;
for(j=12;j>0;j--)
{ bbyte=temp;
bymem=(bit)(bbyte&0x80);
temp<<=1;
bbyte=0x38;
a1= bymem;
XBYTE[LCDAADD]=bbyte;
bbyte|=0x01;
XBYTE[LCDAADD]=bbyte; //CLK ↑
bbyte&=0xfe;
_nop_();
XBYTE[LCDAADD]=bbyte; //;CLK ↓
if (j==5)
{
ACC=0xb8;
XBYTE[LCDAADD]=ACC; //ST
}
}
ACC=0x78;
XBYTE[LCDAADD]=ACC; //ST
AUXR &=0xfd;
}
/***********************************************************************
* 功能:LCD2小数点
***********************************************************************/
void disp_dot2(uchar dotdata)
{ uchar temp;
uchar j;
bit bymem;
AUXR |=0x02;
//ACC=0x38;
//XBYTE[LCDBADD]=ACC; //ST
if(state2==2) bbyte=dotdata;
else bbyte=dotmode[dotdata];
bbyte &= 0x07; //1,3,5
bbyte=dotmem[bbyte];
temp=bbyte;
if(state2==2) bbyte=dotdata;
else bbyte=dotmode[dotdata];
bbyte &= 0x38; //2,4,6
bbyte>>=3;
bbyte=dotmem[bbyte];
bbyte<<=4;
temp |=bbyte;
for(j=12;j>0;j--)
{ bbyte=temp;
bymem=(bit)(bbyte&0x80);
temp<<=1;
bbyte=0x38;
a1= bymem;
XBYTE[LCDBADD]=bbyte;
bbyte|=0x01;
XBYTE[LCDBADD]=bbyte; //CLK ↑
bbyte&=0xfe;
_nop_();
XBYTE[LCDBADD]=bbyte; //;CLK ↓
if (j==5)
{
ACC=0xb8;
XBYTE[LCDBADD]=ACC; //ST
}
}
ACC=0x78;
XBYTE[LCDBADD]=ACC; //ST
AUXR &=0xfd;
}
/**************************************************
* 功能:显示键盘小屏
**************************************************/
void disp_key(void)
{ uchar data mem_inn,mem_str; //做堆栈用
uchar data i,j,ma,mb;
mem_inn=AUXR; //做堆栈用
mem_str=bbyte;
AUXR |=0x02;
XBYTE[KEY_DISPADD]=0x24; //0x24--LE->H 0x00--LE->L
for(i=0;i<5;i++)
{
ma=keya_num[i];
mb=keyb_num[i];
for(j=0;j<8;j++)
{ bbyte=0x24;
a0=(bit)(ma & 0x80);ma<<=1;
a3=(bit)(mb & 0x80);mb<<=1;
XBYTE[KEY_DISPADD]=bbyte;
bbyte |=0x12;
XBYTE[KEY_DISPADD]=bbyte; //CLK ↑
bbyte &=0xed;
XBYTE[KEY_DISPADD]=bbyte;//CLK ↓
}
}
XBYTE[KEY_DISPADD]=0x00;
bbyte=mem_str;
AUXR=mem_inn; //做堆栈用
}
/**************************************************
* 功能: ; 显示定量加油数据a
***************************************************/
void disp_vip_a(void)
{ uchar i,j,temp;
uchar dispmem[6];
uchar lcdadd,dotdata;
bit bymem;
disp_ration_ending();
if(ration_mode_a)
{
keya_num[4]=0x04; //定升
dispmem[5]=0x0a; //L
lcdadd=0x04;
disp_lcd1(ration_num_a,0x0a); //公升
dotdata=dotmode[decimal_a];
dotdata &=0x36;
}
else
{
keya_num[4]=0x08; //定元
dispmem[5]=0x0c; //L
lcdadd=0x0a;
disp_lcd1(ration_num_a,0x04);
dotdata=dotmode[decimal_a];
dotdata &=0x2d;
}
disp_dot1(dotdata); //LCD1小数点
dispmem[4]=0x0f;dispmem[3]=0x0f;dispmem[2]=0x0f;dispmem[1]=0x0f;dispmem[0]=0x0f;
AUXR |=0x02;
for(i=6;i>0;i--)
{ ACC=0x38;
XBYTE[LCDAADD]=ACC; //ST
bbyte=dispmem[i-1];
temp=bbyte*16+i+lcdadd-1;
for(j=8;j>0;j--)
{ bbyte=temp;
bymem=(bit)(bbyte&0x80);
temp<<=1;
bbyte=0x38;
a1= bymem; //DS-->DATA
XBYTE[LCDAADD]=bbyte;
ACC|=0x01;
XBYTE[LCDAADD]=ACC; //CP-->CLK ↑
ACC&=0xfe;
XBYTE[LCDAADD]=ACC; //CP-->CLK ↓
}
ACC=0x3c;
XBYTE[LCDAADD]=ACC; //ST-->INH
}
AUXR &=0xfd;
}
/***********************************************************
* 功能:计算、显示定量加油结局a
***********************************************************/
void disp_ration_ending(void)
{
xdata uchar tt[6];
ulong ma;
uint aa,bb;
uchar i;
uchar strdot; //小数点位置
bbyte=dotmode[decimal_a]; //小数点
if(ration_mode_a)
{ //升
if(a4){ma=ration_num_a*120/100; strdot=2;}
else if(a1){ma=ration_num_a*120/1000;strdot=3;}
else {ma=ration_num_a*120;strdot=0;}
}
else
{
if(a5)aa=100; //单价小数点
else if(a2)aa=1000;
else aa=1;
if(a3){bb=100;strdot=2;} //金额小数点
else if(a0){bb=10;strdot=1;}
else {bb=1;strdot=0;}
ma=ration_num_a*120*aa/bb/price_a;
}
//ma=nn;
//ration_pulse_a=ma; //定量脉冲
calculate_ration(0);
ma=ration_num_a;
tt[5]=ma%10;ma/=10;
tt[4]=ma%10;ma/=10;
tt[3]=ma%10;ma/=10;
tt[2]=ma%10;ma/=10;
tt[1]=ma%10;ma/=10;
tt[0]=ma%10;ma/=10;
for(i=0;i<5;i++)
{ if(i==(5-strdot))break;
if(tt[i]==0x00) tt[i]=28;
else break;
}
if(multiple_a==1000)
{ switch(strdot)
{ case 3:
keya_num[0]=keynumdata[tt[2]];
keya_num[1]=keynumdata[tt[1]];
keya_num[2]=keynumdata[tt[0]];
keya_num[3]=keynumdata[28];break;
default:
break;
}
}
else if(multiple_a==100)
{
switch(strdot)
{
case 2:
keya_num[0]=keynumdata[tt[3]];
keya_num[1]=keynumdata[tt[2]];
keya_num[2]=keynumdata[tt[1]];
keya_num[3]=keynumdata[tt[0]];break;
case 3:
keya_num[0]=keynumdata[tt[3]];
keya_num[1]=keynumdata[tt[2]]+0x80;
keya_num[2]=keynumdata[tt[1]];
keya_num[3]=keynumdata[tt[0]];break;
default:
break;
}
}
else if(multiple_a==10)
{
switch(strdot)
{
case 1:
keya_num[0]=keynumdata[tt[4]];
keya_num[1]=keynumdata[tt[3]];
keya_num[2]=keynumdata[tt[2]];
keya_num[3]=keynumdata[tt[1]];break;
case 3:
keya_num[0]=keynumdata[tt[5]];
keya_num[1]=keynumdata[tt[4]];
keya_num[2]=keynumdata[tt[3]];
keya_num[3]=keynumdata[tt[2]]+0x80;break;
default:
break;
}
}
else if(multiple_a==1)
{
switch(strdot)
{ case 0:
keya_num[0]=keynumdata[tt[5]];
keya_num[1]=keynumdata[tt[4]];
keya_num[2]=keynumdata[tt[3]];
keya_num[3]=keynumdata[tt[2]];break;
case 2:
keya_num[0]=keynumdata[tt[4]];
keya_num[1]=keynumdata[tt[3]]+0x80;
keya_num[2]=keynumdata[tt[2]];
keya_num[3]=keynumdata[tt[1]];break;
case 3:
keya_num[0]=keynumdata[tt[4]];
keya_num[1]=keynumdata[tt[3]];
keya_num[2]=keynumdata[tt[2]]+0x80;
keya_num[3]=keynumdata[tt[1]];break;
}
}
else // if(multiple_a==0)
{
switch(strdot)
{ case 0:
keya_num[0]=keynumdata[tt[5]];
keya_num[1]=keynumdata[tt[4]];
keya_num[2]=keynumdata[tt[3]];
keya_num[3]=keynumdata[tt[2]];break;
case 1:
keya_num[0]=keynumdata[tt[5]];
keya_num[1]=keynumdata[tt[4]]+0x80;
keya_num[2]=keynumdata[tt[3]];
keya_num[3]=keynumdata[tt[2]];break;
case 2:
keya_num[0]=keynumdata[tt[5]];
keya_num[1]=keynumdata[tt[4]];
keya_num[2]=keynumdata[tt[3]]+0x80;
keya_num[3]=keynumdata[tt[2]];break;
case 3:
keya_num[0]=keynumdata[tt[5]];
keya_num[1]=keynumdata[tt[4]];
keya_num[2]=keynumdata[tt[3]];
keya_num[3]=keynumdata[tt[2]]+0x80;break;
}
}
}
/*****************************************
* 功能:键盘小屏清屏a
*******************************************/
void disp_key_clear_a(void)
{
if(k1key)
{
/*if(printermode_a==0) keya_num[3]=keynumdata[0x0a]; //自动
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -