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

📄 disp.c

📁 HT1621液晶控制测试
💻 C
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////
#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 + -