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

📄 icc.c

📁 税控收款机软件。包括底层驱动和上层的应用一起。是一个完整的税控收款机软件方案
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "upsd.h"
#include "zhd.h"
#include "dis1_1.h"
#include "ssxandicc.h"
#include "string.h"
#include "stdio.h"

extern void  DisHzLinYm(uchar *p_hzline,uchar col);
extern void cls(void);
extern uchar GetKey();
extern void InvoiceFullIn();
extern uchar xdata icctempp[32];

extern INVOICE_PRN_INFO xdata inv_prn_cur_old_info;
extern INVOICE_DAY xdata inv_cur_day;
extern INVOICE_VOL xdata inv_cur_vol;
//extern  xdata inv_prn_cur_info;
extern xdata INVOICE_CUR_INFO inv_cur_info;
extern DECLARE_DATA xdata declare_data ;
extern void DL();
extern uchar xdata Hz_Record[40];
extern uchar xdata databuf[10];
extern void DisAsc(uchar *p_dm,uchar col,uchar row);
extern uchar data keyc,g_temp;
extern void HexToStr(uchar *src, uchar *dest, uchar len);
extern TIME xdata sys_time;
extern uchar * Readtime1();
extern void Writetime1();
extern uchar xdata flash_temp[256];
extern void rd_buf(ulong addr);
void init_shui(void);
extern USER xdata user;
extern TAX  xdata tax[6];
extern SPAN xdata span;
extern INVOICE_INPUT xdata invoice_input;
extern INVOICE_DAY xdata inv_cur_day;
extern INVOICE_DAY xdata inv_tmp_day;
INVOICE_VOL xdata inv_tmp_vol1;
extern INVOICE_PRN_INFO xdata inv_prn_cur_info;
extern INVOICE_PRN_INFO xdata inv_prn_tmp_info;
extern FISCAL_CK xdata fiscal_ck_dat;
extern FISCAL_CK_INDEX xdata fiscal_ck_index;
extern FISCAL_DATA_INDEX  xdata fiscal_data_index;
extern DECLARE_DATA xdata declare_data;
uchar xdata  sw1,sw2,stat,length;
extern uchar xdata icc_buff[250];
uchar xdata fiscal_code[8];  
uchar tb_sam_reset(uchar *s);
void tb_sam_init();
void tb_sam_off();
uchar tb_sam_in_ins(uchar *s);
uchar tb_sam_out_ins(uchar *s);
uchar ExeIcc(uchar *src,bit mode);
uchar tb_reset(uchar *s);

void tb_off();
uchar tb_in_ins(uchar *s);
uchar tb_out_ins(uchar *s);
uchar xdata icctemp[16];
uchar xdata icctemp1[4];
uchar xdata pin_data[8] _at_ 0x7000;
uchar xdata fiscal_id1 _at_ 0xddd;
void icc_reset();
void icc_reset_sam();
void icc_off();
void icc_off_sam();
void icc_init() ;
void icc_init_sam();
void icc_in(); 
void icc_out();
uchar input_invoice(void);
uchar update_control(void);
uchar fiscal_check(void);
void issue_invoice(void);
void distribute_invoice();
uchar daily_collect_sign(void);
uchar declare_fiscal(void);
extern uchar long_to_bcd (uchar *bcd_buf, uchar lgBcd, ulong *ptSrc);
extern void StrToHex1(uchar *src, uchar *dest, uchar len);
extern uchar getstr(uchar keynum,uchar * keybuff,uchar col);
extern DECLARE_DATA xdata declare_tmp_data ;
extern uchar xdata declare_temp[4];
extern ulong bcd_to_long (uchar *bcd_buf, uchar lgBcd);
extern uchar compute_lrc(uchar *pdatain,uchar len);
extern void rs232_ss(void);
extern xdata COMMDATA chCommData ;
extern xdata uchar Mac_Code[8];
extern uchar xdata Temp_All[8];
uchar fiscal_check_auth(void);
uchar update_user();
uchar get_volume_info(uchar* str);
extern void rs232_send_byte (uchar da);

void icc_reset() 
{
	length=tb_reset(icc_buff);
	if(length>=3)
	{
		sw1=icc_buff[length-3];
		sw2=icc_buff[length-2];
	}
	stat=icc_buff[length-1];

	return ;
}

void icc_in() 
{
	length=tb_in_ins(icc_buff);
	if(length>=3)
	{
		sw1=icc_buff[length-3];
		sw2=icc_buff[length-2];
	}
	stat=icc_buff[length-1]; 
	return ;
}

void icc_out()
{
    uint i;
	length=tb_out_ins(icc_buff);
	if(length>=3)
	{
		sw1=icc_buff[length-3];
		sw2=icc_buff[length-2];
	}
	stat=icc_buff[length-1]; 
    for(i=0;i<1000;i++);
	return ;
}//SAM卡基本函数


void icc_reset_sam()
{
	length=tb_sam_reset(icc_buff);
	if(length>=3)
	{
		sw1=icc_buff[length-3];
		sw2=icc_buff[length-2];
	}
	stat=icc_buff[length-1];
	return ;
}

void icc_sam_in()
{
   
	length=tb_sam_in_ins(icc_buff);
	if(length>=3)
	{
		sw1=icc_buff[length-3];
		sw2=icc_buff[length-2];
	}
	stat=icc_buff[length-1];
    
	return ;
}

void icc_sam_out()
{
    uint i;
	length=tb_sam_out_ins(icc_buff);
	if(length>=3)
	{
		sw1=icc_buff[length-3];
		sw2=icc_buff[length-2];
	}
	stat=icc_buff[length-1];
    for(i=0;i<1000;i++);
	return ;
}
/*StrToHex(uchar *src, uchar *dest)
{
	uchar i, c, d;
    i=0;
	while(*src)
	{          
		d=src[i];
		if (d >='0' && d<='9')
			c = d - '0';
		else if( d >='A' && d<='F' )
			c = d -'A'+ 10;
		else if (d >='a' && d<='f')
			c = d -'a'+ 10;
		else 
			c = 0x0F;                     //将其他数转换为F	
        if (i & 0x01)                   //如果是偶数位,则作为HEX低4bit
    	   dest[i/2]=c | dest[i/2];
        //================================================================
        else                        //如果是奇数位,则转换后再左移4bit
    		dest[i/2]=c << 4;
        i++;
	}
}*/

/*uchar ExeIcc(uchar *src,bit mode)
{ 
    uchar status;
    StrToHex(src,icc_buff);
    
    if(mode==1)icc_in();
    else icc_out();
    if((sw1==0x90)&&(sw2==0x00)) status=0;
    else if((sw1==0x90)&&(sw2==0x00)) status=1;
    else if((sw1==0x65)&&(sw2==0x81)) status=2;
    else if((sw1==0x67)&&(sw2==0x00)) status=3;
    else if((sw1==0x69)&&(sw2==0x01)) status=4;
    else if((sw1==0x69)&&(sw2==0x81)) status=5;
    else if((sw1==0x69)&&(sw2==0x82)) status=6;
    else if((sw1==0x69)&&(sw2==0x83)) status=7;
    else if((sw1==0x69)&&(sw2==0x84)) status=8;
    else if((sw1==0x69)&&(sw2==0x85)) status=9;
    else if((sw1==0x69)&&(sw2==0x88)) status=10;
    else if((sw1==0x6a)&&(sw2==0x80)) status=11;
    else if((sw1==0x6a)&&(sw2==0x81)) status=12;
    else if((sw1==0x6a)&&(sw2==0x82)) status=13;
    else if((sw1==0x6a)&&(sw2==0x83)) status=14;
    else if((sw1==0x6a)&&(sw2==0x84)) status=15;
    else if((sw1==0x6a)&&(sw2==0x86)) status=16;
    else if((sw1==0x6a)&&(sw2==0x88)) status=17;
    else if((sw1==0x6b)&&(sw2==0x00)) status=18;
    else if((sw1==0x6d)&&(sw2==0x00)) status=19;
    else if((sw1==0x6e)&&(sw2==0x00)) status=20;
    else if((sw1==0x6f)&&(sw2==0x00)) status=21;
    else if((sw1==0x93)&&(sw2==0x02)) status=22;
    else if((sw1==0x93)&&(sw2==0x02)) status=23;
    else if((sw1==0x93)&&(sw2==0x03)) status=24;
    else if((sw1==0x94)&&(sw2==0x01)) status=25;
    else if((sw1==0x94)&&(sw2==0x03)) status=26;
    else if((sw1==0x94)&&(sw2==0x06)) status=27;
    else if(sw1==0x61) status=0;
    return status;
}
*/

void init_shui(void)
{
	uchar i;
    icc_reset_sam();
	DL();
	icc_reset_sam();
	icc_buff[0]=0x00;
	icc_buff[1]=0xa4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=2;
	icc_buff[5]=0x2f;
	icc_buff[6]=0x02 ;

	icc_sam_in();
	if(stat!=0){stat=4;return;}
    //	if(!(sw1==0x61 && sw2==0x0c)){stat=1;return;}

	icc_buff[0]=0x00;//读税控机注册号
	icc_buff[1]=0xb0;//READ EF02
	icc_buff[2]=0x82;
	icc_buff[3]=0x0a;
	icc_buff[4]=8;

	icc_sam_out();
	if(stat!=0){stat=2;return;}
	for(i=0;i<8;i++)rs232_send_byte(icc_buff[i]);
    if(memcmp(icc_buff,Mac_Code,8)!=0) {stat=1;return;}
    //	if(!(sw1==0x90 && sw2==0x00)){stat=2;return;}
	icc_buff[0]=0x00;
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x12;
	icc_buff[4]=8;

	icc_sam_out();
	//if(stat!=0){stat=3;return;}
	memcpy(Temp_All,icc_buff,0x08);

    //取TSAM卡注册编号GET_REGSTGER_NB,并取返回值_TEMP

	icc_buff[0]=0xc0;
	icc_buff[1]=0xf0;
	icc_buff[2]=0x00;
	icc_buff[3]=0x00;
	icc_buff[4]=0x10;

	icc_sam_out();
	//if(stat!=0){stat=4;return;}
    //	if(!(sw1==0x90 && sw2==0x00)){stat=3;return;}
	memcpy(icctemp,icc_buff,0x10);
    //******操作上卡座TID卡
    icc_reset() ;

	icc_buff[0]=0x00;//选择税控应用
	icc_buff[1]=0xa4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=2;
	icc_buff[5]=0x2f;
	icc_buff[6]=0x02 ;

	icc_in();
	//if(stat!=0){stat=5;return;}
	icc_buff[0]=0x00;
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x02;
	icc_buff[4]=8;

	icc_out();
	//if(stat!=0){stat=6;return;}
	if(memcmp(icc_buff,Temp_All,8)!=0) {stat=2;return;}
    //	if(!(sw1==0x61 && sw2==0x0c)){stat=4;return;}

    //REGISTER_SIGN (注册签字)取返回值_TEMP1
	icc_buff[0]=0xc0;
	icc_buff[1]=0xe4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x10;
	memcpy(&icc_buff[5],icctemp,16);

	icc_in();
	//if(stat!=0){stat=7;return;}
    //	if(!(sw1==0x61 && sw2==0x04)){stat=5;return;}

	icc_buff[0]=0x00;
	icc_buff[1]=0xc0;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x04;

	icc_out();
	//if(stat!=0){stat=8;return;}
    //	if(!(sw1==0x90 && sw2==0x00))
    //     {stat=6;return;}
	memcpy(icctemp1,icc_buff,4);
    //操作下卡座TSAM卡
    //税控卡注册
    //Terminal_Register
	icc_buff[0]=0xc0;
	icc_buff[1]=0xf1;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x04;
	memcpy(&icc_buff[5],icctemp1,4);

	icc_sam_in();
	//if(stat!=0){stat=9;return;}
	if(!(sw1==0x61 && sw2==0x08)){stat=3;return;}
	icc_buff[0]=0x00;
	icc_buff[1]=0xc0;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x08;


	icc_sam_out();
	//if(stat!=0){stat=10;return;}
	if(!(sw1==0x90 && sw2==0x00)){stat=4;return;}
	memcpy(pin_data,icc_buff,8);
    //读基本信息文件,9000 表示税控卡已注册成功
	icc_buff[0]=0x00;//READ EF02
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x00;
	icc_buff[4]=2;

	icc_sam_out();
	//if(stat!=0){stat=11;return;}
    //	if(!(sw1==0x90 && sw2==0x00)){stat=7;return;}
    if(!(icc_buff[0]==0&&icc_buff[1]==0)){stat=5;return;}
    stat=0;
    return;
}

void distribute_invoice()
{
    icc_reset() ;
//选择税控应用

	icc_buff[0]=0x00;
	icc_buff[1]=0xa4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=2;
	icc_buff[5]=0x2f;
	icc_buff[6]=0x02 ;

	icc_in();
	icc_buff[0]=0x00;
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x02;
	icc_buff[4]=8;

	icc_out();

	memcpy(Temp_All,icc_buff,0x08);
//	if(!(sw1==0x61 && sw2==0x0c))
//     {stat=1;return 1;}
    icc_reset_sam();
	icc_buff[0]=0x00;
	icc_buff[1]=0xa4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=2;
	icc_buff[5]=0x2f;
	icc_buff[6]=0x02 ;

	icc_sam_in();


    icc_buff[0]=0x00;
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x12;
	icc_buff[4]=8;

	icc_sam_out();

    if(memcmp(icc_buff,Temp_All,8)!=0) {stat=1;return;}
//	if(!(sw1==0x61 && sw2==0x0c))
//     {stat=1;return 2;}
	icc_buff[0]=0xc0;
	icc_buff[1]=0xe9;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x16;
	icc_out();
//	ES=0;
//	for(i=0;i<length;i++)
//	rs232_send_byte (icc_buff[i]);
//	ES=1;
	if((sw1==0x94)&&(sw2=0x01)) {stat=2;return;}

/*    icc_buff[0]=0x00;
	icc_buff[1]=0xc0;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x16;
	icc_out();
	ES=0;
	for(i=0;i<length;i++)
	rs232_send_byte (icc_buff[i]);
	ES=1;
	if(!(sw1==0x90 && sw2==0x00))
     {stat=3;return ;}*/

	stat=0;
} 
	/*
	ES=0;
	for(i=0;i<length;i++)
	rs232_send_byte (icc_buff[i]);
	ES=1;
	*/
	/*
void distribute_invoice()
{
	uchar i;
    icc_reset() ;

	icc_buff[0]=0x00;//选择税控应用
	icc_buff[1]=0xa4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=2;
	icc_buff[5]=0x2f;
	icc_buff[6]=0x02 ;

	icc_in();
	if(stat!=0){stat=1;return;}
	icc_buff[0]=0x00;
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x02;
	icc_buff[4]=8;

	icc_out();
	if(stat!=0){stat=2;return;}
	memcpy(Temp_All,icc_buff,0x08);
    //	if(!(sw1==0x61 && sw2==0x0c)){stat=1;return 1;}
    icc_reset_sam();
	icc_buff[0]=0x00;
	icc_buff[1]=0xa4;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=2;
	icc_buff[5]=0x2f;
	icc_buff[6]=0x02 ;

	icc_sam_in();
	if(stat!=0){stat=3;return;}

    icc_buff[0]=0x00;
	icc_buff[1]=0xb0;
	icc_buff[2]=0x82;
	icc_buff[3]=0x12;
	icc_buff[4]=8;

	icc_sam_out();
	if(stat!=0){stat=4;return;}
    if(memcmp(icc_buff,Temp_All,8)!=0) {stat=1;return;}
    //	if(!(sw1==0x61 && sw2==0x0c)){stat=1;return 2;}
	icc_buff[0]=0xc0;
	icc_buff[1]=0xe9;
	icc_buff[2]=0;
	icc_buff[3]=0;
	icc_buff[4]=0x16;
	icc_out();
	ES=0;
	for(i=0;i<length;i++)
	rs232_send_byte (icc_buff[i]);
	if(stat!=0){stat=5;return;}
    if((icc_buff[10]==0)&&(icc_buff[11]==0x36)&&(icc_buff[12]==0x49)&&(icc_buff[13]==0xf4)){{stat=3;return;}}
	if((sw1==0x94)&&(sw2=0x01)) {stat=2;return;}
	//etu:true:97uS;100.9uS//同向保护时间:>=12etu,231uS OK,标准202uS
    //9000后发另一个命令>16etu,1.26~1.495mS(测量值),标准值16*100.9mS(1.61644mS);
	//OSC clock=3.6697MHz//101.37uS
	if(!(sw1==0x90 && sw2==0x00)){stat=3;return ;}

	stat=0;
}*/
 
uchar input_invoice()
{
    icc_reset_sam();

⌨️ 快捷键说明

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