📄 driver.c.bak
字号:
}
/*-----------------------------------------------------------------------------------
调用方式: 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 + -