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

📄 driver.c.bak

📁 用keil开发的.单片机税控器程序.单片机用的是AT公司的.upsd3245
💻 BAK
📖 第 1 页 / 共 4 页
字号:
}

/*-----------------------------------------------------------------------------------
    调用方式: bulk_erase(uchar chip);
    说    明: chip:  选择芯片
//bulk erase instuction
------------------------------------------------------------------------------------*/
uchar SerialFlashBulkErase(uchar chip)
{
	FlashWriteEnable(chip);//wriet enable insturction
	Selectchip(chip,1);
	SpiSendChar(FlashBE);//FlashBE
	Selectchip(chip,0);
	if(ReadFlashStatus(chip,FlashBE)) return SpiOK;
	else 
	{
		ErrorHint("Flash整块擦除出错!",0x8300|chip);
		return SpiErr;
	}
}
/*
//M45P80页擦除函数
uchar M45P80PageErase(uchar chip,uint page)
{
	gyt4 addr;
	addr.dat=page*256;
	FlashWriteEnable(chip);//wriet enable insturction
	Selectchip(chip,1);
	SpiSendChar(FlashPE);//FlashPE
	SpiSendChar(addr.str[1]);
	SpiSendChar(addr.str[2]);
	SpiSendChar(addr.str[3]);
	Selectchip(chip,0);
	if(ReadFlashStatus(chip,FlashPE))return SpiOK;
	else return SpiErr;
}
*/

///////////////////////////////////////////
//      FlashRD serial flash electronic sign
//      Device Electronic Signature
//        M25P05-A         05h
//        M25P10-A         10h
//        M25P20           11h
//        M25P40           12h
//        M25P80           13h
//        M25P16           14h
//
//  test result: did not know why M25P80 have same ES 0x13h with M45PE80???? yongjibin
///////////////////////////////////////////
/*
uchar ReadFlashSign(uchar chip)
{
	uchar value=0;
	Selectchip(chip,1);
	SpiSendChar(0xAB);//FlashRDP
	SpiSendChar(0x55);
	SpiSendChar(0xAA);
	SpiSendChar(0x55);
	value=SpiReceiveChar();
	Selectchip(chip,0);
	return value;
}
*/
//---------------------------Flash End----------------------------------------------------

//---------------------------Vfd Begin--------------------------------------------------

void VfdDelay(uchar x)
{
   uchar i,j;
   for(i=0;i<x;i++)
     {
        for(j=0;j<0xff;j++);
     }
}

void VFD_Send(uchar dt)
{
  uchar i;
  for(i=0;i<8;i++)
    {
      VFDCLK=0;
      VFDSDA=(bit)(dt&0x01);
      VFDCLK=1;
      dt>>=1;
    }
  for(i=0;i<0xf;i++);
}

void VfdDisplay(uchar DisBuff[],uint Cursor,uint Dot)
{
   	uchar const number[]={
		0xdc,0x01,  0x90,0x00,  0xac,0x01,   0xb4,0x01, //0 1 2 3
        0xf0,0x00,  0x74,0x01,  0x7c,0x01,   0x90,0x01, //4 5 6 7
        0xfc,0x01,  0xf4,0x01,  0xf8,0x01,   0x7c,0x00, //8 9 A b
        0x4c,0x01,  0xbc,0x00,  0x6c,0x01,   0x68,0x01, //c d e f
        0x20,0x00,  0x24,0x00,  0x04,0x01,   0x00,0x00, //一 二 三
        }; //0x13为不显
   	uchar i,adr;
   	uint CurValue,DotValue,TempValue;
   	
   	CurValue=Cursor;
   	DotValue=Dot;
   	
   	VFD_Enable;
   	VFD_Send(0xc0);  //Address setting  command.
   	
   	for(i=0;i<22;i++)
   	{
   	   VFD_Send(0);
   	}
   	
   	for(i=0;i<10;i++)//Display data < =  22Byte.
   	{
   	    adr=DisBuff[i]*2;
   	    TempValue=number[adr]|((CurValue & 0x8000)>>14)|((DotValue&0x8000)>>15);  //显示光标 第二位
   	    VFD_Send(TempValue);
   	    VFD_Send(number[adr+1]);
   	    CurValue=CurValue<<1;
   	    DotValue=DotValue<<1;
   	}
   	VFD_Forbid;  //1
   	VfdDelay(2);   //小
}

//亮度控制
//Quantity=低三位为0~7级亮度调节 0为最暗  7为最亮 如果第四位为0关显示;为1开显示
void VfdBright(uchar Quantity)
{
   VFD_Enable;
   VFD_Send(0x06);  //Display mode setting command.
   VFD_Forbid;  //1
   VfdDelay(2);
   VFD_Enable;  //0
   VFD_Send(0x40);  //Data setting  command.
   VFD_Forbid;  //1
   VfdDelay(2);
   VFD_Enable;  //0
   VFD_Send(0x80|(Quantity&0x0f));  //Display  control command.
   VFD_Forbid;  //1
   VfdDelay(2);
}

void VfdDisStr(uchar *str)
{  uchar i,buff[10];
   for(i=0;i<10;i++)
    {
       if(str[i]<='9' && str[i]>='0')   buff[i] = str[i] - '0';
         else if(str[i]<='F' && str[i]>='A') buff[i] = (str[i] - 'A')+10;
                else if(str[i]<='f' && str[i]>='a') buff[i] = (str[i] - 'a')+10;
                        else buff[i] = 0x13;
    }

   VfdDisplay(buff,0,0);
}

//显示16进制数据
//location (0 - 9)  显示数据开始位置
//bcd 要显示的16进制数据
//void VFD_DisHEX(uchar location, uchar bcd)
//{  uchar i, buff[10];
//
//   for(i=0;i<10;i++)
//     {  if(i==location)
//           {  buff[i++] = bcd>>4;
//              buff[i] = bcd & 0x0f;
//           }
//         else  buff[i] = 0x13;
//     }
//   VfdDisplay(buff,0,0);
//}

void VfdClear()
{  
	uchar i,Buff[13];
   for(i=0;i<10;i++)  Buff[i]=0x13;   //清显示
   VfdDisplay(Buff,0,0);            //显示
}

//---------------------------Vfd End----------------------------------------------------

//---------------------------Printer Begin--------------------------------------------------

void PrintHome()
{
	uchar cmd[2];
	cmd[0]=0x1b;cmd[1]=0x3c;
	UartTxdPrinter(2,cmd);
}
   
void UartTxdPrinter(uchar len,uchar *str)
{
	TxdNum=0;
	TxdLen=len;
	while(TxdNum<TxdLen)
	{
		SBUF2 = str[TxdNum];
		while((SCON2 & 0x02)==0);
		SCON2 &= 0xFC;
		TxdNum++;		
	}
}



//PSD_REGS PSD_REG _at_ PSD_REG_ADDR;
/*---------------------------------------------------
					uchar 转换为ASCII
----------------------------------------------------*/
//void Uchar_ASCII(uchar dat,uchar *Ascii)
//{//可以用NumToStr代替
//	uchar i=0,x=0,temp[3];
//	temp[0]=dat/100;
//	x=dat%100;
//	temp[1]=x/10;
//	temp[2]=x%10;
//	for(i=0;i<3;i++)Ascii[i]=temp[i]+0x30;
//	return;
//}

void FiscalCodeConvert(uchar *Hex,uchar *Ascii)
{//税控码专用转换函数,必须将最高位的“0”保留
	uchar i,temp[22];
	ulong x=1000000000,dat=0;
	dat=Hex[0];
	for(i=0;i<3;i++)
		{
			dat<<=8;
			dat|=Hex[i+1];
		}
	for(i=0;i<10;i++)
		{
			temp[i]=(dat/x)+0x30;
			dat%=x;
			x/=10;
		}
	x=1000000000;
	dat=Hex[4];
	for(i=4;i<7;i++)
		{
			dat<<=8;
			dat|=Hex[i+1];
		}

	for(i=0;i<10;i++)
		{
			temp[i+10]=(dat/x)+0x30;
			dat%=x;
			x/=10;
		}
	for(i=0;i<20;i++)Ascii[i]=temp[i];
	return;
}
/////////////////////////////////////////////////////////////////////////////
//Function: print string -> start time to end timer
//Parameter:time begin to end
//Compile:  yongjibing
//Time:     2004-11-12 10:56
/////////////////////////////////////////////////////////////////////////////
void PrintStartToEnd(uchar *time)
{
	uchar cmd[4],str[42]={"开票时间:0000年00月00日 至 0000年00月00日"};
	
	PrinterIni();
	
	str[9]+=(time[0]>>4);
	str[10]+=(time[0]&0x0F);
	str[11]+=(time[1]>>4);
	str[12]+=(time[1]&0x0F);
	str[15]+=(time[2]>>4);
	str[16]+=(time[2]&0x0F);
	str[19]+=(time[3]>>4);
	str[20]+=(time[3]&0x0F);
	
	str[27]+=(time[4]>>4);
	str[28]+=(time[4]&0x0F);
	str[29]+=(time[5]>>4);
	str[30]+=(time[5]&0x0F);
	str[33]+=(time[6]>>4);
	str[34]+=(time[6]&0x0F);
	str[37]+=(time[7]>>4);
	str[38]+=(time[7]&0x0F);
	str[41]=0;
	
	cmd[0]=0x1c,cmd[1]=0x26;
  	UartTxdPrinter(2,cmd);
  	UartTxdPrinter(42,str);
  	cmd[0]=0x1b,cmd[1]=0x64,cmd[2]=0x1;//打印并走纸一字符行
  	UartTxdPrinter(3,cmd);
}
/*---------------------------------------------------------------
					打印字符串
----------------------------------------------------------------*/
void PrintStr(uchar *str)
{
	uchar i=0,len=0,cmd[4];
	PrinterIni();
	while(str[len]!=0)len++;
  	cmd[0]=0x1c,cmd[1]=0x26;
  	UartTxdPrinter(2,cmd);
  	UartTxdPrinter(len,str);
  	cmd[0]=0x1b,cmd[1]=0x64,cmd[2]=0x1;//打印并走纸一字符行
 	UartTxdPrinter(3,cmd);
}
/*-----------------------------------------------------------
					打印项目
------------------------------------------------------------*/
void  PrintItem(uchar *str,ulong price,ulong num)
{
	uchar i,tp[51];
	ulong money;
	
	memset(tp,0,sizeof(tp));	
	strcpy(tp,str);
	NumToStr(price,&tp[17],0x85);
	NumToStr(num,&tp[25],0x85);
	money=(num*price)/100;//总金额=数量*单价
	NumToStr(money,&tp[32],0x85);
	for(i=0;i<40;i++)
		if(tp[i]==0)tp[i]=' ';
	tp[40]=0;
	PrintStr(tp);
}

/*----------------------------------------------------------------------------
					打印字符串后面给一个数据
					flag=1   有小数点   flag=0 无小数点
-----------------------------------------------------------------------------*/
void PrintStrNum(uchar *str,ulong dat,uchar mode)
{
	uchar i,buf[51];
	
	i=strlen(str);
	strcpy(buf,str);
	NumToStr(dat,&buf[i],mode);
	PrintStr(buf);
}
/*------------------------------------------------------------------
						打印时间及收款员
------------------------------------------------------------------*/
void PrintTimeNo(uchar no)
{
	uchar str[]={"开票日期:2000年00月00日00时00分00秒 收款员:00"};
	
	ReadDate();
	str[11]+=(InvoDate[1]>>4);
	str[12]+=(InvoDate[1]&0x0F);
	       
	str[15]+=(InvoDate[2]>>4);
	str[16]+=(InvoDate[2]&0x0F);
	       
	str[19]+=(InvoDate[3]>>4);
	str[20]+=(InvoDate[3]&0x0F);
	       
	str[23]+=(InvoDate[5]>>4);
	str[24]+=(InvoDate[5]&0x0F);
	       
	str[27]+=(InvoDate[6]>>4);
	str[28]+=(InvoDate[6]&0x0F);
	       
	str[31]+=(InvoDate[7]>>4);
	str[32]+=(InvoDate[7]&0x0F);
	       
	str[43]+=(no>>8);
	str[44]+=(no&0x0F);
	
	PrintStr(str);
}
/*------------------------------------------------------------------
						走纸与退纸控制函数
-------------------------------------------------------------------*/
void PaperControl(bit direction,uchar num)
{
	uchar i=0,cmd[4],str[10]=" ";

	PrinterIni();
	UartTxdPrinter(10,str);
	cmd[0]=0x1b;cmd[2]=num;
	if(direction==1)
		cmd[1]=0x4A;
	else
		cmd[1]=0x4B;
	UartTxdPrinter(3,cmd);
}

/*--------------------------------------------------------------------------------
				税控码与发票代码功能函数
				str:打印字符串   Invoice_CN:打印数据
				flag=1打印发票代码(BCD格式)	flag=0打印税控码(HEX格式)
				n  长度(BCD格式有效)
---------------------------------------------------------------------------------*/
void PrintCodeNum(uchar *str,bit flag,uchar *Invoice_CN,uchar n)
{
	uchar i=0,len=0,xd=0,temp[20],cmd[4],printBuf[51];
	
	PrinterIni();
	memset(printBuf,0,sizeof(printBuf));
	while(str[len]!=0)len++;
	for(i=0;i<len;i++)printBuf[i]=str[i];
	xd=i;
	if(flag)
		{
			BcdToStr(n,Invoice_CN,temp,0);			
			for(i=0;i<2*n;i++)printBuf[xd+i]=temp[i];
		}
	else
		{
			FiscalCodeConvert(Invoice_CN,temp);
			for(i=0;i<20;i++)printBuf[xd+i]=temp[i];
		}
	len=xd+i;
	for(i=0;i<(50-len);i++)printBuf[len+i]=0x20;//剩下的加上空格
	cmd[0]=0x1c;cmd[1]=0x26;
	UartTxdPrinter(2,cmd);
	UartTxdPrinter(len,printBuf);
	cmd[0]=0x1b,cmd[1]=0x64,cmd[2]=1;
	UartTxdPrinter(3,cmd);
}

/*----------------------------------------------------------------------
							撕纸偏移量
-----------------------------------------------------------------------*/
/*
void CutPaperOffset()
{
  uchar cmd[10];
  cmd[0]=0x1d,cmd[1]=0x28,cmd[2]=0x46,cmd[3]=0x04,cmd[4]=0,cmd[5]=1,cmd[6]=0,cmd[7]=0,cmd[8]=0;
  UartTxdPrinter(9,cmd);
}
*/
/*----------------------------------------------------------------------
							打印机初始化
-----------------------------------------------------------------------*/
void PrinterIni()
{
	uchar  cmd[10];
	
	COM1CS;
	UARTD;
	UART1_Mod1_Timer1_9600;	
	cmd[0]=0x1B;cmd[1]=0x40;
	UartTxdPrinter(2,cmd);
	cmd[0]=0x1B;cmd[1]=0x55;cmd[2]=0x01;
	UartTxdPrinter(3,cmd);
}
//-------------------------------------------------------------------
//		  			设置打印起始位置
//-------------------------------------------------------------------
//void DYS()
//{
//  uchar cmd[]={0x1d,0x28,0x46,0x34,0x30,0x31,0x31,0x30,0x30};
//  UartTxdPrinter(9,cmd);
//}

//--------------------------------------------------------------------
//					送黑标至打印起始位置
//--------------------------------------------------------------------
void BlackOrientation()
{
  uchar cmd[]={0x1d,0x0c};
  UartTxdPrinter(2,cmd);
}
/*----------------------------------------------------------------------
						黑标设置
----------------------------------------------------------------------*/
void BlackSetup()
{
	uchar  cmd[]={0x1b,0x4e,0x07,0x31};
	
	PrinterIni();
	UartTxdPrinter(4,cmd);
}

/*-----------------------------------------------------------------------
//					选择切纸方式
//-----------------------------------------------------------------------*/
//void GS_V_M()
//{
//  uchar cmd[]={0x1d,0x56,0x30};
//  UartTxdPrinter(3,cmd);
//  ES=0;
//}

//---------------------------Printer End----------------------------------------------------

#if FlashDatM25P80
void Modify(uchar cs,ulong WrDatStAdd,uint len,uchar *dat)
{
  	uchar M25P80_Sector,yu,flag4,Tx[256],Rx[256];
  	uint j,Start,num;
  	ulong M25P80_ad,Write_len,Wr_25P,M3;
  	bit flag1=1,flag2=1,flag3=1;
  	
  	M25P80_Sector=0,yu=0,flag4=0;
  	M25P80_ad=0,Wr_25P=0,M3=0xf0000;
  	Write_len=256;
  	Wr_25P=M25P80_ad=(WrDatStAdd/0x10000)*0x10000;
  	M25P80_Sector=WrDatStAdd/0x10000;
  	
//	  UartTxd(len,dat);
  	
  	LcdDisplay(16,0,"正在修改中......",3);
  	LcdDisplay(32,0,"请稍候,最多30秒!",0);
  	SerialFlashSectorErase(Flashziku,15);//擦除字库最后一个扇区
  	for(num=0;num<Write_len;num++)//向Flash写数据
  	{
  	  SerialFlashRead(cs,M25P80_ad,Write_len,Rx);
  	  if(flag4)
  	  {
  	    flag4=0;
  	    for(j=0;j<yu;j++)
  	    TxdBuf[j]=dat[len-yu+j];
  	    SerialFlashRead(cs,M25P80_ad+yu,Write_len-yu,&Tx[yu]);
  	    for(j=0;j<Write_len;j++)Rx[j]=Tx[j];
  	  }
  	  if(flag2)
  	    {
  	      if(WrDatStAdd-M25P80_ad<Write_len)
  	        {
  	          flag2=0;
  	          Start=WrDatStAdd-M25P80_ad;
  	          if(Write_len-Start > len)
  	          {
  	            for(j=0;j<len;j++)Rx[Start+j]=dat[j];
  	            flag4=0;
  	          }
  	          else
  	          {
  	            yu=Write_len-Start;
  	            for(j=0;j<yu;j++)Rx[Start+j]=dat[j];
  	            yu=len-(Write_len-Start);
  	            flag4=1;
  	          }
  	        }
  	    }
  	  SerialFlashWrite(Flashziku,M3,Write_len,Rx);
  	  M3+=Write_len;
  	  M25P80_ad+=Write_len;
  	}
  	SerialFlashSectorErase(cs,M25P80_Sector);
  	M3=0xf0000;
  	for(num=0;num<Write_len;num++)//向M25P80写数据
  	{
  	  SerialFlashRead(Flashziku,M3,Write_len,Rx);
  	  SerialFlashWrite(cs,Wr_25P,Write_len,Rx);
  	  M3+=Write_len;
  	  Wr_25P+=Write_len;
  	}
  	Hint(48,0,"修改成功!",0);
}
#endif_25P+=Write_len;
  	}
  	Hint(48,0,"修改成功!",0);
}
#endif

⌨️ 快捷键说明

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