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

📄 disp.c

📁 用于测试步进电机
💻 C
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////
#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 + -