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

📄 disp.c

📁 液晶静态显示程序,有使用都可提供原理图
💻 C
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////
//    文件名:STATIC886.C   静态886驱动
////////////////////////////////////////////////////
#include <REG51STC.H>
#include <ABSACC.H>
#include "CMD886.H"
#include <INTRINS.H>
#include "externxy.h"
/*********************************************
*功能: DISP 金额/容量    gunidid(枪号0,1)   *
**********************************************/
void  disp_lcd(ulong lcddata1,ulong lcddata2,uchar gunidid)    //;LCD1,2金额及升的显示
{  
	uchar  i;
	xdata uchar  dispmem[16];
	void  *pi;
	uchar  endhide;  //清前导零要到小数点位置
	//------------------------------
	for(i=0;i<8;i++)
	{  bbyte=(lcddata1%10);  
		lcddata1 /=10;
		dispmem[i]=bbyte;   //dispmema[0]  为金额个位
	}

	
	//-------------------------------
	for(i=0;i<8;i++)
	{  bbyte=(lcddata2%10);  
		lcddata2 /=10;
		dispmem[i+8]=bbyte;    //dispmema[0+8]  为升个位
	}
    //---------------------------------------
	
	if(gunidid==0)endhide=dota_data[6];
	else endhide=dotb_data[6];

	for(i=7;i>endhide;i--)
	{
		if(dispmem[i]==0)dispmem[i]=0x0f;   //去前导零
		else break;
	}

	if(gunidid==0)endhide=dota_data[5];
	else endhide=dotb_data[5];

	for(i=7;i>endhide;i--)
		{
			if(dispmem[i+8]==0)dispmem[i+8]=0x0f;   //去前导零
			else break;
		}
	//--------------------------------------------------------------
	pi=&dispmem;
	disp_out(gunidid,pi,8);	
}
/******************************************************************
* 功能:LCD单价、小数点  gunidid(枪号0,1)                         *
*******************************************************************/
void  disp_dot(ulong lcddata,uchar gunidid)   
{  
   uchar  i;
	void  *pi;
	xdata uchar  dispmem[16];
	uchar  endhide;  //清前导零要到小数点位置
	//------------------------------
	for(i=0;i<6;i++)
	{  bbyte=(lcddata%10);  
		lcddata /=10;
		dispmem[i]=bbyte;   //dispmema[0]  为个位
	}
   if(gunidid==0)endhide=dota_data[4];
	else endhide=dotb_data[4];

	for(i=5;i>endhide;i--)
	{
		if(dispmem[i]==0)dispmem[i]=0x0f;   //去前导零
		else break;
	}
	//-------------------------------
	//  根据小数点的5种类型,查表
	//-------------------------------
	if(gunidid==0)
	{
		dispmem[0+8]=dotmode[decimal_a];   //空位
	   dispmem[1+8]=dota_data[0];   //第四位小数点位置
		dispmem[2+8]=dota_data[1];   //单价小数点
		dispmem[3+8]=dota_data[2];   //升小数点
		dispmem[4+8]=dota_data[3];   //金额小数点
		dispmem[5+8]=dota_data[7];   //特殊标识  STOP  START
	}
	else
	{
		dispmem[0+8]=dotmode[decimal_b];   //空位
	   dispmem[1+8]=dotb_data[0];   //第四位小数点位置
		dispmem[2+8]=dotb_data[1];   //单价小数点
		dispmem[3+8]=dotb_data[2];   //升小数点
		dispmem[4+8]=dotb_data[3];   //金额小数点
		dispmem[5+8]=dotb_data[7];   //特殊标识  STOP  START
	}
	//-------------------------------	 
	pi=&dispmem;
	disp_out(gunidid,pi,6);  
}
/**************************************************
*   功能:显示键盘小屏
**************************************************/
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;
	ulong lcddata;
	void  *pi;
	xdata uchar  dispmem[16];   //dispmema[0]及dispmema[8]为个位
	
	disp_ration_ending();
	
	if(ration_mode_a)
	{
		keya_num[4]=0x04;  //定升
      
		for(i=0;i<8;i++)
		{
			dispmem[i]=0x0f;
		}
		#if DISPMODE==886
      		dispmem[7]=0x0a;  //L
		#else
			dispmem[5]=0x0a;  //L
		#endif
		lcddata=ration_num_a;
		for(i=0;i<8;i++)
		{  bbyte=(lcddata%10);  
			lcddata /=10;
			dispmem[i+8]=bbyte;   //dispmema[8]  为个位
		}
		for(i=7;i>dota_data[5];i--)
		{
			if(dispmem[i+8]==0)dispmem[i+8]=0x0f;   //去前导零
			else break;
		}
		
	}
	else
	{
		keya_num[4]=0x08;  //定元
		
		for(i=0;i<8;i++)
		{
			dispmem[i+8]=0x0f;
		}
		#if DISPMODE==886
      		dispmem[7+8]=0x0c;  //P
		#else
			dispmem[5+8]=0x0c;  //P
		#endif
		lcddata=ration_num_a;
		for(i=0;i<8;i++)
		{  bbyte=(lcddata%10);  
			lcddata /=10;
			dispmem[i]=bbyte;   //dispmema[8]  为个位
		} 
		for(i=7;i>dota_data[6];i--)
		{
			if(dispmem[i]==0)dispmem[i]=0x0f;   //去前导零
			else break;
		}
	}
	pi=&dispmem;
	disp_out(0,pi,8);
	//----------------------------------------------
	lcddata=price_a;
	for(i=0;i<8;i++)
	{  bbyte=(lcddata%10);  
		lcddata /=10;
		dispmem[i]=bbyte;   //dispmema[8]  为个位
	} 
	for(i=5;i>dota_data[4];i--)
	{
		if(dispmem[i]==0)dispmem[i]=0x0f;   //去前导零
		else break;
	}
	if(ration_mode_a)
	{     //定升
		bbyte=0;  
		if(dota_data[5]==3)a1=1;  //升小数点	
		else a5=1; 

		if(dota_data[4]==3)a2=1;  //单价小数点	
		else if(dota_data[4]==2)a6=1; 
		dispmem[0+8]=dotmem[bbyte/16]*16+dotmem[bbyte%16];

	   dispmem[1+8]=dota_data[0];   //第四位小数点位置
		dispmem[2+8]=dota_data[1];   //单价小数点
		dispmem[3+8]=dota_data[2];   //升小数点
		dispmem[4+8]=0x0f;   //金额小数点
		dispmem[5+8]=dota_data[7];   //特殊标识  STOP  START
	}
	else
	{
	    bbyte=0;  
		 if(dota_data[6]==2)a4=1;  //金额小数点	
		 else if(dota_data[6]==1)a0=1;
 
		 if(dota_data[4]==3)a2=1;  //单价小数点	
		 else if(dota_data[4]==2)a6=1; 
		 dispmem[0+8]=dotmem[bbyte/16]*16+dotmem[bbyte%16];

	    dispmem[1+8]=dota_data[0];   //第四位小数点位置
		 dispmem[2+8]=dota_data[1];   //单价小数点
		dispmem[3+8]=0x0f;   //升小数点
		dispmem[4+8]=dota_data[3];   //金额小数点
		dispmem[5+8]=dota_data[7];   //特殊标识  STOP  START
	}
	pi=&dispmem;
	disp_out(0,pi,6);
}
/***********************************************************
*  功能:计算、显示定量加油结局a
***********************************************************/
void  disp_ration_ending(void)
{  
    xdata uchar tt[8];
	ulong  ma;
	uint aa,bb;
	uchar i;	
	uchar  strdot;   //小数点位置
	

	if(ration_mode_a)	
	{   //升
		bbyte=dota_data[5];
		if(bbyte==2){ma=ration_num_a*120/100; strdot=2;}
		else if(bbyte==3){ma=ration_num_a*120/1000;strdot=3;}
		else  {ma=ration_num_a*120;strdot=0;}
	}
	else
	{	bbyte=dota_data[4];
		if(bbyte==2)aa=100;  //单价小数点
		else if(bbyte==3)aa=1000;
		else aa=1;

		bbyte=dota_data[6];
		if(bbyte==2){bb=100;strdot=2;}  //金额小数点
		else if(bbyte==1){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[7]=ma%10;ma/=10;
	tt[6]=ma%10;ma/=10;
	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<7;i++)
	{  
		if(i==(7-strdot))break;
		if(tt[i]==0x00)  tt[i]=28;  //去前导零
		else  break;
	}
	if(ration_num_a==0)
	{
		keya_num[0]=keynumdata[0];
		keya_num[1]=keynumdata[28];
		keya_num[2]=keynumdata[28];
		keya_num[3]=keynumdata[28];
	}
	else
	{
		if(i<4)
		{
			keya_num[0]=keynumdata[tt[i+3]];   //keya_num[0]为个位位置
			keya_num[1]=keynumdata[tt[i+2]];
			if(strdot==2 && i==3)keya_num[1]+=0x80;
			keya_num[2]=keynumdata[tt[i+1]];
			if(strdot==3 && i==2)keya_num[2]+=0x80;
			keya_num[3]=keynumdata[tt[i]];
			
		}
		else
		{
			keya_num[0]=keynumdata[tt[7]];
			keya_num[1]=keynumdata[tt[6]];
			keya_num[2]=keynumdata[tt[5]];
			keya_num[3]=keynumdata[tt[4]];
			if(strdot==1)keya_num[1]+=0x80;
			else if(strdot==2)keya_num[2]+=0x80;
			else if(strdot==3)keya_num[3]+=0x80;
	   }
		
   }
}
/*****************************************
*   功能:键盘小屏清屏a
*******************************************/
void disp_key_clear_a(void)
{  
	if(k1key)
	{
	   /*if(printermode_a==0) keya_num[3]=keynumdata[0x0a];  //自动
		else keya_num[3]=keynumdata[17];  //手动
		keya_num[0]=keynumdata[pirnt_select_a+1];
		keya_num[1]=0x00;keya_num[2]=0x00;keya_num[4]=0x00;  */
		//------------------------------------------------------
      if(vip_mode_a) {keya_num[4]=0x04;}  //定升
		else  {keya_num[4]=0x08;}  //定元
		keya_num[0]=keynumdata[0];
		keya_num[1]=keynumdata[28];
		keya_num[2]=keynumdata[28];
		keya_num[3]=keynumdata[28];
		//------------------------------------------------------
	}
	else
	{  keya_num[0]=keynumdata[27];keya_num[3]=keynumdata[27];
		keya_num[1]=keynumdata[27];keya_num[2]=keynumdata[27];keya_num[4]=0x02;
	}
}
/*****************************************
*   功能:键盘小屏清屏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数据a
************************************************************************/
void disp_total_a(void)
{	uchar  i;
xdata	uchar  dispmem[16],tt[12];
	uchar dotdata;
	ulong  ma;
	uchar *ptr;
	for(i=0;i<16;i++)
	{
		dispmem[i]=0x0f;
	}	
   if((menu1==1 && state1==6) ||state1==8)
	{  
		if(!ration_mode_a)
		{	
			dotdata=dota_data[6];
#if DISPMODE==886
	dispmem[7]=0x0c;dispmem[6]=0x0c;  //PP
#else			
	dispmem[5]=0x0c;dispmem[4]=0x0c;  //PP
#endif
			if(state1!=8 || ration_num_a==0) ma=gun1.sum_sale;   //总累--锁售额  PP
			else	ma=ration_num_a;   //设置总累金额
			if(state1!=8)
			{
				keya_num[0]=0x1f;keya_num[1]=0x01;keya_num[2]=0x48;keya_num[3]=0x48;
				keya_num[4]=0x02;
			}
			else
			{
				keya_num[0]=keynumdata[27];
				keya_num[1]=keynumdata[27];
				keya_num[2]=keynumdata[23];
				keya_num[3]=keynumdata[23];  //"PP--"
				keya_num[4]=0x02;
			}
			
		}
		else  //升
		{	dotdata=dota_data[5];
#if DISPMODE==886
	dispmem[7]=0x0a;dispmem[6]=0x0a;  
#else			
	dispmem[5]=0x0a;dispmem[4]=0x0a;  
#endif  //LL
		   if(state1!=8 || ration_num_a==0) ma=gun1.sum_liter;   //总累--升  LL
			else  ma=ration_num_a;   //设置总累升
			if(state1!=8)
			{
				keya_num[0]=0x32;keya_num[1]=0x01;keya_num[2]=0x48;keya_num[3]=0x48;
				keya_num[4]=0x02;
			}
			else
			{
				keya_num[0]=keynumdata[27];
				keya_num[1]=keynumdata[27];
				keya_num[2]=keynumdata[19];
				keya_num[3]=keynumdata[19];  //"LL--"
				keya_num[4]=0x02;
			}
			
		}
	}
	else
	{
		if(!ration_mode_a)
		{	dotdata=dota_data[6];
#if DISPMODE==886
	dispmem[7]=0x0c;dispmem[6]=0x0f; 
#else			
	dispmem[5]=0x0c;dispmem[4]=0x0f;  
#endif   //P
		   ma=gun1.work_sale;   //班累--锁售额   P
			keya_num[0]=0x1f;keya_num[1]=0x01;keya_num[2]=0x3d;keya_num[3]=0x48;
			keya_num[4]=0x02;
		}
		else
		{	dotdata=dota_data[5];
#if DISPMODE==886
	dispmem[7]=0x0a;dispmem[6]=0x0f;  
#else			
	dispmem[5]=0x0a;dispmem[4]=0x0f; 
#endif  //L
		   ma=gun1.work_liter;   //班累--升  L
			keya_num[0]=0x32;keya_num[1]=0x01;keya_num[2]=0x3d;keya_num[3]=0x48;
			keya_num[4]=0x02;
		}
	} 
	//*******************************************
	//if(!ration_mode_a)dotdata=dota_data[6];  //P
	//else  dotdata=dota_data[5];//L
	for(i=0;i<12;i++)  //tt[0]为个位
	{
		tt[i]=ma%10;ma/=10;
	}
	for(i=11;i>0;i--)
	{  if(i==dotdata) break;
		if(tt[i]==0) tt[i]=0x0f;   //去前导零
		else break;
	}	
	//------------------------
#if DISPMODE==664
	if(dotdata==1)  //如果是1位小数
	{
		for(i=0;i<3;i++)
		{
			dispmem[i]=tt[i+9];
		}
		for(i=0;i<6;i++)
		{
			dispmem[i+8]=tt[i+3];
		}
		ptr=&dispmem;
		disp_out(0,ptr,8);
		//--------------------------
		for(i=0;i<16;i++)
		{
			dispmem[i]=0x0f;
		}
	
		if(dotdata==3)dispmem[0+8]=0xfc;  //3位
		else if(dotdata==0)dispmem[0+8]=0xff; //0位
		else dispmem[0+8]=0xcf;  //1,2位都只能显示第二位小数		
		
		for(i=1;i<4;i++)
		{
			dispmem[i]=tt[i-1];
		}
		//dispmem[10]=dotmem[dotdata];
	} 
	else    //不是一位小数时
	{
		for(i=0;i<2;i++)
		{
			dispmem[i]=tt[i+10];
		}
		for(i=0;i<6;i++)
		{
			dispmem[i+8]=tt[i+4];
		}
		ptr=&dispmem;
		disp_out(0,ptr,8);
		//--------------------------
		for(i=0;i<16;i++)
		{
			dispmem[i]=0x0f;
		}
	
		if(dotdata==3)dispmem[0+8]=0xfc;  //3位
		else if(dotdata==0)dispmem[0+8]=0xff; //0位
		else dispmem[0+8]=0xcf;  //1,2位都只能显示第二位小数		
		
		for(i=0;i<4;i++)
		{
			dispmem[i]=tt[i];
		}
		//dispmem[10]=dotmem[dotdata];
	}
	ptr=&dispmem;
	disp_out(0,ptr,6);
#else  //*******886***666***********
	for(i=6;i<10;i++)
	{
		dispmem[i+2]=tt[i];
	}
	
	ptr=&dispmem;
	disp_out(0,ptr,8);
	//--------------------------
	for(i=6;i<16;i++)
	{
		dispmem[i]=0x0f;
	}
	for(i=0;i<6;i++)
	{
		dispmem[i]=tt[i];
	}
	dispmem[10]=dotmem[dotdata];
	ptr=&dispmem;
	disp_out(0,ptr,6);
#endif	
}
/***********************************************************************

⌨️ 快捷键说明

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