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

📄 function.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
字号:
#include  "include.h"


//波特率=fosc/(32×[65536-(RC2H,RC2L)])的公式
uchar code BaudRate[7][2]={                  //foc=11.0592 M
                   			 {0xfe,0xe0},	//1200bps
							 {0xff,0x70},	//2400bps
							 {0xff,0xb8},	//4800bps
							 {0xff,0xdc},	//9600bps
							 {0xff,0xee},   //19200
							 {0xff,0xf4},	//38400bps
							 {0xff,0xfa},	//57600bps
						   };


#define    yisectorqu               7282  //一扇区能写审计记录的条数

//sbit check_papermask=P3^3;
sbit beep_on=P1^1;   //
//uchar xdata Leddata=0x0f;
//==============================================================================
/*void initial_PSD_port(void)
{
   //PSD8xx_reg.PAGE|=0x80;
  // PSD8xx_reg.DIRECTION_C|=8;
   //PSD8xx_reg.DATAOUT_C|=8;    //SRAM不片选
   PSD8xx_reg.DIRECTION_C|=0x10;
   PSD8xx_reg.DATAOUT_C|=0x10;//FLASH不片选
  // PSD8xx_reg.PAGE&=0x7f;
}
*/

void initial_system(void)
{
//	uchar buf[2]; 
	WDKEY = 0x55;
	buzz_off();
	InitSoftTimer();
	Init_VFD();
	InitialLCD();

	modify_rate(3);
	//initial_PSD_port();
	//read_eeprom(TIME_MODE,2,buf);
	//time_mode_buf=buf[0];
	//Writ_cpld(Sim_rst,1);

	//if((time_mode_buf!=0)||(time_mode_buf!=0x20))
}


//=========================================================================
//==========================================================================
#if 0
void feed_on_dot(uchar n)
{
	n=0;
}
//===========================================================================
void feed_on_line(uchar n)
{
	n=0;
}
#endif
//===========================================================================
/*
uchar fpaper(uchar n)
{
	
	uchar pp,pp1;
	PSD8xx_reg.DIRECTION_D&=0xfb;
	Turn_On_Printer();
	while(n--)
	{
		pp=1;
		while(pp--)
		{
			counter=0x20;
			while(1)
			{
				if((PSD8xx_reg.DATAIN_D&0x04))
				{
					pp1=25;
					do {} while(--pp1);
					if((PSD8xx_reg.DATAIN_D&0x04)) break;
					}

					if(counter==0) {Turn_Off_Printer(); return 1;}
				}

			counter=0x20;
			while(1)
			{
				if(!(PSD8xx_reg.DATAIN_D&0x04))
				{
					pp1=25;
					do {} while(--pp1);
					if(!(PSD8xx_reg.DATAIN_D&0x04)) break;
					}

				if(counter==0) {Turn_Off_Printer(); return 1;}
			}
		}
	}
	Turn_Off_Printer();
	return 0;
	
}
*/

//============================================================================
void clear_rece_buffer2(void)
{
	;
}
//=============================================================================
uchar modify_rate2(uchar rate)
{
	modify_rate(rate);
	return 0;
}
//===========================================================================
void send_str2(uint length,uchar  *buffer)
{
	while(length>0)
	{
		SBUF2=*buffer++;
		length--;
		do{;}while((SCON2&0x02)==0);
		SCON2&=0xfd;
	}
}
//==============================================================================
void send_char2(uchar ch)
{
	uint i=10000;
	SBUF2=ch;
	do{i--;}while(((SCON2&0x02)==0)&&(i>0));
	SCON2&=0xfd;
}
//============================================================================
uchar rece2(uint length,uchar  *buffer)
{
	uint i;
	while(length>0)
	{
		i=5000;
		do{i--;}while((SCON2&0x01)==0&&(i>0));
		if(i==0)return 1;
		*buffer=SBUF2;
		buffer++;
		SCON2&=0xfe;
		length--;
	}
	return 0;
}
//=============================================================================
void send_str(uint length, uchar *buffer)
{
	while(length>0)
	{
		SBUF=*buffer++;
		length--;
		do{;}while(TI==0);
		TI=0;
	}
}
//==============================================================================
void modify_rate(uchar rate)
{
    uchar i;
	i=rate;
	//i--;
	EA=0;
	T2CON=0x30;     // Usart 1
    PCON|=12;       //Usart 2
	TH2=BaudRate[i][0];//0xff;
	TL2=BaudRate[i][1];//0xdc;
	RCAP2H=BaudRate[i][0];// 0xff;
	RCAP2L=BaudRate[i][1];// 0xdc;
	SCON=0x50;		//mode 1: 8bit 1stop 1start
	SCON2=0x50;
	TR2=1;
	EA=1;
}
/*
 波特率=fosc/(32×[65536-(RC2H,RC2L)])的公式
 */
//===============================================================================
void clear_rece_buffer(void)
{
	;
}
//=============================================================================
uchar rece(uint length,uchar  *buffer)
{
	uint i;
	while(length>0)
	{
		i=5000;
		do{i--;}while((RI==0)&&(i>0));
		if(i==0)return 1;
		*buffer=SBUF;
		buffer++;
		RI=0;
		length--;
	}
	return 0;
}
//==============================================================================
void send_char(uchar ch)
{
	uint i=5000;
	SBUF=ch;
	do{i--;}while((TI==0)&&(i>0));
	TI=0;
}
//===============================================================================
void select_com(uchar com)
{
	com=0;
}

//==================================================================================
void shut_bat(uchar shut) reentrant
{
	static uchar lastflg;
	//if(low_pwr){Writ_cpld(Backlight,0);lighton=0;}//1?±31a//send_char(0xaa);
	if(lastflg!=shut)
	{
		if(shut==1)SetupPortD(Bat_cnt,0);
		else       SetupPortD(Bat_cnt,1);
		lastflg=shut;
	}
}
//===================================================================================
void beep(uchar time)
{
	//22.1184M 晶体定时中断为25ms
	if(time>25)beepcounter=time/25;
	else beepcounter=1;
	
	beepflg=1;
	buzz_on();
	/*if(time>25)counter=time/25;
	else counter=1; 
	{buzz_on();while(counter>0);}
	buzz_off();
	*/
}
//===================================================================================
/*void bighx1_a(uchar *buf,uchar *p)
{
;
}
*/
//==================================================================================
void buzz_on(void)
{
	beep_on=0; //BUZZER_ON 
}
//====================================================================================
void buzz_off(void)
{
	beep_on=1;//BUZZER_OFF

}


/***********************************************
	延时时间=4[t2(t1+1)+1]*机器周期
	机器周期=1.08us 11.0592Mhz
	最大延时282Ms
***********************************************/

void delayms(uint t1)
{
	uchar t2=10;
    uint t;
	do
	{
		t=t1;
		while(--t);
		t=t1;
		while(--t);
	}while(--t2);
}
//==============================================
void delay_ms(uchar ms)
{
   while(ms--)
      delayms(250);
}

//====================================================================
//卡的接收定时用
void delay_etu(void)
{
	uchar i;
	_nop_();
	i=31;
	while(--i);
}
//=================================================================
void delay_half_etu(void)
{
	uchar i;
	i=15;   //APDU 2005.10.09
	while(--i);
}
//====================================================================
//4-7扇区
//结构:年 月 日 时 分 事件类型 事件结果 用户身份 LRC校验 共9个字节
uchar Write_FAU_data(uchar type,uchar result)//,uchar mode)
{
	uchar  i,k;
	i = type;
	k = result;
	return 0;

#if 0
	uchar buf[10];
	uint tempuint;
	uchar buf1[2];
	ulong addtemp;
	//uchar *tempbuf,i,j;//uchar tempbuf[1024],i,j;
	uchar i,find=0;
	uint  temp=0;
	//if(Mach_initialed)return 0;       //机器未初始化
	if(read_eeprom(RECEIVER_NO,2,buf1))return(READ_EEPROM_FAIL);
	if(read_rtc(buf)) return(READ_CLOCK_FAIL);//读时钟错误
	buf[5]=type;
	buf[6]=result;
	buf[7]=buf1[0];
	buf[8]=lrcdata(8,1,buf);
	if(read_eeprom(FAU_Quantity,2,&tempuint))return(READ_EEPROM_FAIL);
	if((tempuint==0xffff)||(g_tax_pin_pass==0))     return 0;       //机器未初始化
	//if(mode)tempuint--; //记录数要倒退
	//send_str(2,&tempuint);
	if(tempuint<MAX_FAU_QU)
	{
		addtemp=FAU_DATA_START_ADD+(ulong)9*tempuint;
		for(i=0;i<3;i++)
		{
			temp+=yisectorqu;
			if(temp==tempuint)
			{
				find=1;
				break;
			}
		}
		
		if((find==1)&&(tempuint!=0))
		{
			addtemp+=7;
			if (flash_sector_erase(23+i))
			return(ERASE_FLASH_FAIL);
		}//删除下一扇区 //每一扇区后7个字节不用
		
		if(write_flash(addtemp,9,buf)){return 0;}//return(WRITE_FLASH_FAIL);
		tempuint++;
		if(write_eeprom(FAU_Quantity,2,&tempuint))return(WRITE_EEPROM_FAIL);
		return 0;
	}
	else
	{
		/*if (flash_sector_erase(4))return(ERASE_FLASH_FAIL);//删除最早的一扇区
		for(j=5;j<8;j++)
		{
			for(i=0;i<64;i++)
			{
				addtemp=(ulong)(0x10000*j)+(uint)(i*1024);
				if(read_flash(addtemp,1024,tempbuf)) return READ_FLASH_FAIL;
				if (write_flash(addtemp-0x10000,1024,tempbuf))	return(WRITE_FLASH_FAIL);
			}
			if (flash_sector_erase(j))return(ERASE_FLASH_FAIL);
		}
		if(flash_sector_erase(7))return(ERASE_FLASH_FAIL);

		addtemp=0x70000;
		if (write_flash(addtemp,9,buf))return(WRITE_FLASH_FAIL);
		tempuint=yisectorqu*3-1;//第7扇区开始21845;
		*/
		addtemp=FAU_DATA_START_ADD;
		if (flash_sector_erase(28))return(ERASE_FLASH_FAIL);//删除最早的一扇区
		if (write_flash(addtemp,9,buf))return 0;//return(WRITE_FLASH_FAIL);
		tempuint=1;
		if(write_eeprom(FAU_Quantity,2,&tempuint))return(WRITE_EEPROM_FAIL);
		return 0;
	}
	#endif
}
//==========================================================================
void openbacklight(void)
{
	static uchar lastsecond;
	uchar rtc[7];
	if(!low_pwr)
	{
		if(backlightcnt>0)
		{
			if(!lighton){Writ_cpld(Backlight,1);lighton=1;}
			if((!read_rtc(rtc))&&(rtc[4]!=lastsecond)){lastsecond=rtc[4];backlightcnt--;}
		}
		else if(lighton) {Writ_cpld(Backlight,0);lighton=0;}
	}
}

//=================================================================
/*
例:2003年9月16日23点59分
03*1048576+09*65536+16*2048+23*64+59=3769851,转换为"HEX":003985FB
2099年12月31日23点59分表示为063CFDFB
数据还原算法如下:
存储数据以A表示
A mod 1048576=B
B mod 65536=C
C mod 2048=D
年=A/1048576,取整数
月=B/65536,取整数
日=C/2048,取整数
时=D/64,取整数
分=D mod 64
*/
void uzip_date(uchar *oldtime,uchar *newtime)
{
	uchar buf[5];
	uchar x;
	ulong timecode;
	uchar i;
	memcpy((uchar*)&timecode,oldtime,4);
 
	buf[0]=timecode/1048576;
	buf[1]=(timecode%1048576)/65536;
	buf[2]=((timecode%1048576)%65536)/2048;
	buf[3]=(((timecode%1048576)%65536)%2048)/64;
	buf[4]=(((timecode%1048576)%65536)%2048)%64;
	for(i=0;i<5;i++)
	{
		x=buf[i];
		buf[i]=((x/10)<<4)|(x%10);
	}
	memcpy(newtime,buf,5);
}
//=================================================================
void zip_date(uchar *oldtime,uchar *newtime)
{
//	uchar buf[5];
	ulong timecode;
	uchar x;

	x=(oldtime[0]>>4)*10+(oldtime[0]&0x0f);
	timecode=(ulong)x*1048576;
	x=(oldtime[1]>>4)*10+(oldtime[1]&0x0f);
	timecode+=(ulong)x*65536;
	x=(oldtime[2]>>4)*10+(oldtime[2]&0x0f);
	timecode+=(ulong)x*2048;
	x=(oldtime[3]>>4)*10+(oldtime[3]&0x0f);
	timecode+=(ulong)x*64;
	x=(oldtime[4]>>4)*10+(oldtime[4]&0x0f);
	timecode+=x;
	memcpy(newtime,(uchar*)&timecode,4);
}

//==============================================================

⌨️ 快捷键说明

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