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

📄 setup.c

📁 税控收款机源码:拼音输入法,LCD,VFD驱动,IC卡驱动,税控国标
💻 C
📖 第 1 页 / 共 5 页
字号:
/*-------------------------------------------------------------
模块功能:编程功能--各类参数的设置
说明:符合国家标准GB18240.1-2003和GB18240.2-2003的税控机软件
日期:2003年6月12日
 
---------------------------------------------------------------*/
#include "include.h"

uchar code clear_card_ID[8]={0x52,0x49,0x53,0x45,0x20,0x03,0x11,0x18};

void ( *restart)();

void RestartToBoot(void)  //*****进入Boot升级程序
{
	//EA=0;
//	PSD8xx_reg.PAGE = 0x00;
//	restart=0x0000;
//	restart();
	//while(1);
	buzz_off();
	EA=0; 
	restart=0xff80;
	restart();
	while(1);
}

//从EEPROM中检查是否有空位置来分发票
uchar get_V_invoice(uchar *index_no)
{
	uchar i,j;
	struct distribute_invoice_struct* distribute_invoice;
	uchar buf[5];
	j=0;
	for (i=0;i<MAX_DISTRIBUTE_NUM;i++)//0-50卷
	{    //13901开始
		if(read_eeprom(DISTRIBUTE_INVOICE_ADDR+(i+1)*(uint)sizeof(*distribute_invoice)-5,5,buf)) 
		return(READ_EEPROM_FAIL);
		//send_str((uint)sizeof(*distribute_invoice),distribute_invoice);
		if((!strlen(buf))&&(buf[4]==0)){*index_no++=i;j++;}
		if(low_pwr) return(POWER_OFF);
	}
    *index_no=j;
	return(j);//从EEPROM中没有未录入税控卡的暂存发票卷
}
//===================================================================
/*uchar update_record(uchar which_card, uchar short_Fid,uchar rec_sn, uchar len, uchar *data_in)
                 
{
  
	uchar xdata buf[300]; 
	uchar xdata i;

  
  buf[0]=0x60;
  buf[1]=len+6;
  buf[2]=0;
  buf[3]=0x00;
  buf[4]=0xDC;
  buf[5]=rec_sn;
  buf[6]=((short_Fid<<3)&0xF8)^0x04;
  buf[7]=len;
  //send_char(buf[6]);
  memcpy(&buf[8], data_in, len);
  
  if(which_card==0)
    i=sam_iso(buf);
  else
    i=id_iso(buf);
  

  
	if(i)
		switch(which_card)
		{
		case SAM_CARD:
			return(SAM_COMM_FAIL);
		case USER_CARD:
			return(USR_COMM_FAIL);
		case CHK_CARD:
			return(CHK_COMM_FAIL);
		}
	if(((which_card==USER_CARD)||(which_card==CHK_CARD))&&((buf[3]==0x6a)&&(buf[4]==0x83))) 
   
    return FILE_OVER;
   
	else if((buf[3]!=0x90)||(buf[4]!=0x00))
	{
      
		switch(which_card)
		{
		case SAM_CARD:
			return(SAM_WRITE_FAIL);
		case USER_CARD:
			return(USR_WRITE_FAIL);
		case CHK_CARD:
			return(CHK_WRITE_FAIL);
		}
  }
    
  return 0;
}
//=====================================================================
/*uchar ReadRec1( uchar short_Fid,uchar rec_sn, uchar Lc, uchar *data_in)
                 
{
  
  uchar i;
  uchar buf[100];

  	buf[0]=0x60;
	buf[1]=6+Lc;
	buf[2]=0;
	buf[3]=0x00;	 // CLA  
	buf[4]=0xb2;     // INS 
	buf[5]=rec_sn;   // P1 
  	buf[6]=((short_Fid<<3)&0xF8)^0x04; 
	buf[7]=Lc;
	for(i=0;i<Lc;i++){buf[8+i]=*data_in++;}
	//send_str2(7+Lc,buf);
    i=id_iso(buf);
	if(i!=0)return (i);
    return 0;
}
*/
//=============================================================
uchar get_roll_no(uchar *roll_no)
{
    uchar buf[50];
	uchar tempbuf[50];
	uchar i,j;
	uchar result;
    strcpy(buf,"请输入原发票的发票卷号:");//输入BCD码
    lcd_disp(2,0,buf);
    memset(tempbuf,0,50);
    result=get_num(tempbuf);
    if(result) return result;
    memset(&tempbuf[20],0,30);
    j=strlen(tempbuf);
    if(j%2) //转成BCD码
	{
		for(i=0;i<j-1;i++)
		{
			if(i%2)tempbuf[30-j/2+i/2]|=(tempbuf[i+1]&0x0f);
			else  { tempbuf[30-j/2+i/2]=(tempbuf[i+1]&0x0f);tempbuf[30-j/2+i/2]<<=4;}
		}
		tempbuf[30-(j+1)/2]|=(tempbuf[0]&0x0f);
	}
	else
	{
		for(i=0;i<j;i++)
		{
			if(i%2)tempbuf[30-j/2+i/2]|=(tempbuf[i]&0x0f);
			else  { tempbuf[30-j/2+i/2]=(tempbuf[i]&0x0f);tempbuf[30-j/2+i/2]<<=4;}
		}
	}
	memcpy(roll_no,&tempbuf[20],10);
	clear_lcd(3,1);
	return 0;
}
//=========================================================
uchar update_Clear_card(uchar mach_num)
{
	uchar error;
	uchar cur_date[8];
	uchar buf[32];

	buf[0]=mach_num;

	read_rtc(&cur_date[1]);
	cur_date[0] = 0x20;
	memcpy(&buf[1],cur_date,6);
	memcpy(&buf[7],&g_manufacturer_info.machinery_no[0],8);
	if(SelFile_id(CHK_CARD,0xEF03))
		return (CHK_COMM_FAIL);
  
	error=WriteRec(CHK_CARD,mach_num, 15, buf);//update_record(CHK_CARD,3,mach_num, 15, buf); // WriteRec(USER_CARD,mach_num, 15, buf);
	if(error)return error;

	return 0;
}
//=====================================================================
void StrToHex(uchar len,uchar *buf)
{
	uchar tempbuf[10];
	uchar i,j;
	j=0;
	for(i=0;i<(len/2);i++){tempbuf[i]=((buf[j]&0x0f)<<4)|(buf[j+1]&0x0f);j+=2;}
	for(i=0;i<(len/2);i++)buf[i]=tempbuf[i];

}
//======================================================================
uchar  check_clear_card(uchar setmode,uchar *mach_num)
{
	uchar xdata buf[50];
	uchar xdata RetVal;
	uchar pin_no[9];
	uchar limit_num;
	uchar error;
	uchar i;
    clear_lcd(0,4);
	strcpy(buf,"正在检测设置卡..."); //校验清机卡的PIN码
	lcd_disp(1,0,buf);
    error=enter_application_direct(USER_CARD);
          if(error) return error;  
	if(SelFile_id(CHK_CARD,0xEF02))
		return (CHK_COMM_FAIL);
			  
	if(RW_bin(CHK_CARD, 0, 0, 20, buf))  
		return (CHK_COMM_FAIL);

	if(buf[0]!=0x5a)
		return (CARD_ERROR);  //非清机卡
	limit_num=buf[1];       //限定的次数

	if(read_rtc(&pin_no[1])!=0)
    {
     	return(READ_CLOCK_FAIL);//读时钟错误
    }
	pin_no[0] = 0x20;
	if(setmode==0)
	{
		if((memcmp(pin_no, &buf[10], 4)<0) ||(memcmp(pin_no, &buf[14], 4)>0))//清机卡已过期
		{
			return(CARD_DATE_INVALID);
		}
	}
	*mach_num=limit_num;
  
	if(SelFile_id(CHK_CARD,0xEF03))
		return (CHK_COMM_FAIL);
	for(i=0; i<limit_num; i++)//计算清机的次数
    {
		error = ReadRec(CHK_CARD,1,i+1,15, buf);
		if(error)return(error);
		//send_str(15,buf);
		if(buf[0]==0&&buf[1]==0)
		{
			*mach_num = i+1;
			break;        
		}
	}
   
	if(*mach_num>=limit_num) return (CARD_ERROR); 
 
	clear_lcd(0,4);
	strcpy(buf,"请输入清机卡的密码:"); //校验清机卡的PIN码
	lcd_disp(1,0,buf);
	set_value0(pin_no,(uint)sizeof(pin_no));
	RetVal =input_card_pin(16,pin_no);
	if(!RetVal)
	{
		RetVal = verify_pin(pin_no[0],&pin_no[1]);
		if(RetVal!=0) return RetVal;
	}
	else return RetVal;
	if(SelFile_id(2,0xEF01))
		return (CHK_COMM_FAIL); 
	if(RW_bin(CHK_CARD, 0, 0, 10, buf))
		return (CHK_COMM_FAIL);
	//send_char(*mach_num);
	if(memcmp(clear_card_ID,buf,8)==0)return 0;
	else
		return (CLEAR_CARD_IDFAIL);
}
 
/*==================================================================
函数功能:编程功能--各类参数的设置
入口参数:mach_initialed--机器是否已初始化
出口参数:
返回值:   ==POWER_OFF,则表示断电,返回
	   =0,
全局变量:
编制人:     日期:2003-06-18
==================================================================*/
uchar setup(uchar mach_initial)
{
	////////////////////////1、变量说明区///////////////////////////////
	//======================1.1 菜单级变量==============================//
  	
	uchar xdata switch_mode,layer;//方式锁位置,菜单级别
	uchar xdata last_line,cur_line;//上一级菜单项所在行,当前菜单项所在行(都从1开始)
	uchar xdata menu_num;//某一级中一个子菜单项数
	uchar xdata key;//键值
	ulong xdata num;
	//ulong xdata start_no;
	uchar xdata temp_rec_no;   //收款员号码
	uchar xdata temp_authority; //收款员权限  0:收款员  1:管理员
	uchar rtc[7];
	uchar xdata index_no; //发票卷的序号
	uchar over_mode;//某项菜单选择操作结束方式
	#define  NO_CHOOSED	0x0	//未选定任何菜单
	#define  IS_CHOOSED	0x1	//选定某项菜单
	#define  EXIT_CHOOSE	0xfe	//返回上一级菜单
	struct distribute_invoice_struct xdata distribute_invoice; //lyj 8.7
	uchar xdata menu_L1_ST[]={SET_UP,0};
	uchar  i,j,k,end_index;
	#ifdef allowsetjiqi                      //允许设置出厂参数
	uint crctemp;
	
    uchar xdata menu_L2_ST[]={FISCAL_MNGMNT, TRADE_PARA, GOODS_MNGMNT, COMMUNICATION,SET_MANUFACTURE,0};
    
    #define ITEM_NUM_L2	sizeof(menu_L2_ST)//第2级菜单项数
     uchar xdata menu_Lmax_ST[ITEM_NUM_L2-1][13]=
     {
		//税务管理
		{GET_INVOICE_NO, SET_INVOICE_ROLL, UPDATE_CONTROL_MSG, 
        /*SET_BRANCH_INDEX, SET_PLU_INDEX,*/ PRINT_FISCAL_MSG, 
        PRINT_INV_ROLL, PRINT_INV_DATA,/*DISP_PRODUCER,*/ 0},

		//交易参数
		#ifdef NEED_BIT    //需要辅币功能
		{SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
		PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE, SET_BIT_RATE, 0},
		#else
		{SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
		PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE,PLU_INMODE,SET_BIT_RATE,SET_PRT_MODE,SELE_PRINTER ,0},//SET_TIME_MODE ,
		#endif 
  	   
		//商品管理
		//    {BRANCH_NAME, SET_MAX_PLU, PLU_NAME, PLU_PRICE, /*BAR_CODE,*/ 
		//       PLU_BRANCH, SET_STOCKS, 0},
		{BRANCH_MANAGEMENT, SET_MAX_PLU, PLU_MANAGEMENT,UPDATA_INFO_PAYER , 0},
		//通讯传送
		{READ_PLU_HEAD, SEND_PLU_HEAD, READ_PLU_ALL, SEND_PLU_ALL, READ_BRANCH_NAME,SEND_BRANCH_NAME,FLASHCARD_PLU,OTHER_COMM, 0},
		//
		{SET_JIQIHAO, SET_ZHIDATE,CLEAR_PINCODE, SET_TIME, FORMAT_FILE,UPDATE_PROGRAM,0}
	};
 
	#else                                     //不允许设置出厂参数
		uchar xdata menu_L2_ST[]=
		{FISCAL_MNGMNT, TRADE_PARA, GOODS_MNGMNT, COMMUNICATION,0};
	#define ITEM_NUM_L2	sizeof(menu_L2_ST)//第2级菜单项数
	uchar xdata menu_Lmax_ST[ITEM_NUM_L2-1][10]=
	{
	//税务管理
    {GET_INVOICE_NO, SET_INVOICE_ROLL, UPDATE_CONTROL_MSG, 
	/*SET_BRANCH_INDEX, SET_PLU_INDEX,*/ PRINT_FISCAL_MSG, 
	PRINT_INV_ROLL, 
	/*DISP_PRODUCER,*/ 0},

    //交易参数
    #ifdef NEED_BIT    //需要辅币功能
    {SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
	PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE, SET_BIT_RATE, 0},
    #else
    {SET_RECEIVER_PASSWORD, INVOICE_LOCATE, BRANCH_PLU_SWITCH, PDA_SWITCH,
	PRINT_ITEM_SELECT,AUTHORITY_SETUP,FIXED_DISCOUNT, FIXED_SERVICE,  0}, //SET_TIME_MODE,
    #endif
    //商品管理
	//    {BRANCH_NAME, SET_MAX_PLU, PLU_NAME, PLU_PRICE, /*BAR_CODE,
	//       PLU_BRANCH, SET_STOCKS, 0},
	{BRANCH_MANAGEMENT, SET_MAX_PLU, PLU_MANAGEMENT,UPDATA_INFO_PAYER , 0},
	//通讯传送
	{READ_PLU_HEAD, SEND_PLU_HEAD, READ_PLU_ALL, SEND_PLU_ALL, READ_BRANCH_NAME,SEND_BRANCH_NAME,FLASHCARD_PLU, 0}
	//
	};
	#endif

	//===================1.2 功能级变量==================================//
	uchar xdata function_no;//功能号
	uchar xdata result;//操作结果
	uchar xdata buf[50];//临时缓冲区
	uchar tempbuf[51];
	uchar no[10];
	//uchar i;//临时循环计数变量
	//uchar chk_type;//税控管理卡类别  
	struct invoice_roll_info_struct xdata inv_roll_info;
	struct invoice_roll_struct xdata inv_roll;
	struct record_struct xdata record;
	//struct invoice_roll_addr_struct inv_roll_addr;
	//uint temp;
	uchar is_first_enter;//是否第一次进入当前功能菜单
  
  //////////////2、代码执行区///////////////////////////////
  //============2.1 操作菜单,选择某个设置功能=================//
  //------------2.1.1 初始化----------//
  switch_mode=SETUP;//编程档
  layer=SND_LAYER_MENU;//初始为第二级菜单
  cur_line=1;//初始为第一行
  last_line=1;
  //display_menu_page(switch_mode,layer,menu_L1_ST,cur_line);
  menu_num=strlen(menu_L1_ST);
  is_first_enter=1;
  //result=read_eeprom(RECEIVER_NO,2,buf);//先登录
  //if(result) return READ_EEPROM_FAIL;
  //i=buf[0];
  //if(!i) return POWER_FAIL_1;
  //------------2.1.2 等待按键,选择菜单功能----------//
  while(1)
  {
    if(low_pwr) return POWER_OFF;//如果断电了,则exit 
	openbacklight();
    key = get_key();
    if(!key) //未按下任何键
    {
      if(layer==FST_LAYER_MENU) return 0;//此时若在第1级菜单,则返回主程序,可切换方式锁位置
      if(!is_first_enter) continue;//等待按键
      else is_first_enter=0;
    }
    //else beep(50);
    if(key==PAPER1) //若按下[走纸]键,则走纸1行
    {
		#ifdef C6_VER
		result=fpaper(6);
		if(result) return LINE_FEED_FAIL;

⌨️ 快捷键说明

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