?? setup.c
字號:
/*-------------------------------------------------------------
模塊功能:編程功能--各類參數的設置
說明:符合國家標準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 + -