📄 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[5];
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_();_nop_();_nop_();_nop_();
XBYTE[LCDAADD]=ACC; //CP-->CLK ↑
ACC&=0xfe;
_nop_();_nop_();_nop_();_nop_();
XBYTE[LCDAADD]=ACC; //CP-->CLK ↓
}
ACC=0x3c;
_nop_();_nop_();
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[5];
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_();_nop_();_nop_();_nop_();
XBYTE[LCDBADD]=ACC; //CP-->CLK ↑
ACC&=0xfe;
_nop_();_nop_();_nop_();_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; _nop_();
XBYTE[LCDAADD]=bbyte; //CLK ↑
bbyte&=0xfe;
_nop_();_nop_();_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;_nop_();
XBYTE[LCDBADD]=bbyte; //CLK ↑
bbyte&=0xfe;
_nop_();_nop_();_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_key_clear_a(void)
{
keya_num[4]=0x00;
}
/*****************************************
* 功能:键盘小屏清屏b
*******************************************/
void disp_key_clear_b(void)
{
if(k2key)
{
/*if(printermode_b==0) keyb_num[3]=keynumdata[0x0a]; //自动
else keyb_num[3]=keynumdata[17]; //手动
keyb_num[0]=keynumdata[pirnt_select_b+1];
keyb_num[1]=0x00;keyb_num[2]=0x00;keyb_num[4]=0x00;*/
//-----------------------------------------------------
if(vip_mode_b) {keyb_num[4]=0x04;} //定升
else {keyb_num[4]=0x08;} //定元
keyb_num[0]=keynumdata[0];
keyb_num[1]=keynumdata[28];
keyb_num[2]=keynumdata[28];
keyb_num[3]=keynumdata[28];
//-----------------------------------------------------
}
else
{ keyb_num[0]=keynumdata[27];keyb_num[3]=keynumdata[27];
keyb_num[1]=keynumdata[27];keyb_num[2]=keynumdata[27];keyb_num[4]=0x02;
}
}
/***********************************************************************
* 功能:显示TOTAL数据b
************************************************************************/
void disp_total_b(void)
{ uchar i;
uchar dispmem[16],tt[10];
uchar dotdata;
ulong ma;
uchar *ptr;
dispmem[4]=0x0f;dispmem[5]=0x0f;dispmem[6]=0x0f;dispmem[7]=0x0f;
if((menu2==1 && state2==6) || state2==8)
{
if(!ration_mode_b)
{ bbyte=dotmode[decimal_b];
if(a3) {dotdata=2;disp_dot2(7);} //LCD1小数点
else if(a0) {dotdata=1;disp_dot2(7);} //LCD1小数点
else {dotdata=0;disp_dot2(0x8);} //LCD1小数点
dispmem[8]=0x0c;dispmem[9]=0x0c;
if(state2!=8 || ration_num_b==0) ma=gun2.sum_sale; //总累--锁售额 PP
else ma=ration_num_b;
if(state2!=8)
{
keyb_num[0]=0x1f;keyb_num[1]=0x01;keyb_num[2]=0x48;keyb_num[3]=0x48;
keyb_num[4]=0x02;
}
else
{
keyb_num[0]=keynumdata[27];
keyb_num[1]=keynumdata[27];
keyb_num[2]=keynumdata[23];
keyb_num[3]=keynumdata[23]; //"PP--"
keyb_num[4]=0x02;
}
}
else
{ bbyte=dotmode[decimal_b];
if(a4) {dotdata=2;disp_dot2(0x7);} //LCD1小数点
else if(a1) {dotdata=3;disp_dot2(0x6);} //LCD1小数点
else {dotdata=0;disp_dot2(0x8);} //LCD1小数点
dispmem[8]=0x0a;dispmem[9]=0x0a;
if(state2!=8 || ration_num_b==0) ma=gun2.sum_liter; //总累--升 LL
else ma=ration_num_b;
if(state2!=8)
{
keyb_num[0]=0x32;keyb_num[1]=0x01;keyb_num[2]=0x48;keyb_num[3]=0x48;
keyb_num[4]=0x02;
}
else
{
keyb_num[0]=keynumdata[27];
keyb_num[1]=keynumdata[27];
keyb_num[2]=keynumdata[19];
keyb_num[3]=keynumdata[19]; //"LL--"
keyb_num[4]=0x02;
}
}
}
else
{
if(!ration_mode_b)
{ bbyte=dotmode[decimal_b];
if(a3) {dotdata=2;disp_dot2(0x7);} //LCD2小数点
else if(a0) {dotdata=1;disp_dot2(0x7);} //LCD2小数点
else {dotdata=0;disp_dot2(0x8);} //LCD2小数点
dispmem[8]=0x0f;dispmem[9]=0x0c;
ma=gun2.work_sale; //班累--锁售额 P
keyb_num[0]=0x1f;keyb_num[1]=0x01;keyb_num[2]=0x3d;keyb_num[3]=0x48;
keyb_num[4]=0x02;
}
else
{ bbyte=dotmode[decimal_b];
if(a4) {dotdata=2;disp_dot2(0x7);} //LCD2小数点
else if(a1) {dotdata=3;disp_dot2(0x6);} //LCD1小数点
else {dotdata=0;disp_dot2(0x8);} //LCD2小数点
dispmem[8]=0x0f;dispmem[9]=0x0a;
ma=gun2.work_liter; //班累--升 L
keyb_num[0]=0x32;keyb_num[1]=0x01;keyb_num[2]=0x3d;keyb_num[3]=0x48;
keyb_num[4]=0x02;
}
}
for(i=0;i<10;i++)
{
tt[i]=ma%10;ma/=10;
}
for(i=9;i>0;i--)
{ if(i==dotdata) break;
if(tt[i]==0) tt[i]=0x0f; //去前导零
else break;
}
if(dotdata!=1)
{
for(i=0;i<4;i++)
{
dispmem[i]=tt[i];
}
for(i=4;i<10;i++)
{
dispmem[i+6]=tt[i];
}
}
else //因不能显示1位小数点,全左移1位,最后一位的位置空
{
for(i=0;i<3;i++)
{
dispmem[i+1]=tt[i];
}
for(i=3;i<9;i++)
{
dispmem[i+7]=tt[i];
}
dispmem[4]=tt[9];
dispmem[0]=0x0f; //最后一位的位置空
}
ptr=&dispmem;
disp_updata_lcd(LCDBADD,ptr);
}
/**********************************************************
* 功能:查询及菜单返回的显示界面a
**********************************************************/
void disp_return_a(void)
{
disp_key_clear_a();
//disp_lcd1(0,0x04);
//disp_lcd1(0,0x0a); //公升
//disp_lcd1(price_a,0x0);
//disp_dot1(decimal_a); //LCD1小数点
//if(!cease_power)disp_lcd1(price_a,0x0);
state1=0;
updatea=1;
}
/**********************************************************
* 功能:查询及菜单返回的显示界面b
**********************************************************/
void disp_return_b(void)
{
disp_key_clear_b();
//disp_lcd2(0,0x04);
//disp_lcd2(0,0x0a); //公升
//disp_lcd2(price_b,0x0);
//disp_dot2(decimal_b); //LCD2小数点
if(!cease_power)disp_lcd2(price_b,0x0);
state2=0;
updateb=1;
}
/***********************************************************************
* 功能:显示更新显示数据LCD1/LCD2
************************************************************************/
void disp_updata_lcd(uint addab,uchar *ptr)
{ uchar i,j,temp;
bit bymem;
AUXR |=0x02;
for(i=0;i<16;i++)
{ ACC=0x38;
XBYTE[addab]=ACC; //ST
bbyte=*(ptr+i);
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[addab]=bbyte;
ACC|=0x01;
XBYTE[addab]=ACC; //CP-->CLK ↑
ACC&=0xfe;
XBYTE[addab]=ACC; //CP-->CLK ↓
}
ACC=0x3c;
XBYTE[addab]=ACC; //ST-->INH
}
AUXR &=0xfd;
}
/************************************************************
* 功能:显示枪1/2历史加油记录
*************************************************************/
void disp_eeprom_history(uchar gunid,uchar sequence)
{ void *pt;
union{
uchar c[4];
ulong x;
uint y;
}temp;
uint add;
char dypass;
pt=&temp.c[0];
if(gunid==0)
{
keya_num[0]=keynumdata[sequence];keya_num[1]=keynumdata[27];keya_num[2]=keynumdata[0];keya_num[3]=keynumdata[1];
keya_num[4]=0x02;
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -