📄 main.c
字号:
da = ((unsigned char)(crc/256))/16; // 暂存CRC的高4位
crc <<= 4; // CRC右移4位, 相当于CRC的低12位
crc ^= crcdat[da^(*ptr&0x0f)];
// CRC的高4位和本字节的后半字节相加后查表计算CRC,然后再加上上一次CRC的余数
ptr++;
}
dtr[1] = (unsigned char)crc;
dtr[0] = (unsigned char)(crc>>8);
}
/*串口通讯发送ER函数*/
void seri_er(unsigned char error_code)
{
unsigned char crc[2];
txd[0] = 0x45;
txd[1] = 0x52;
txd[2] = 0x00;
txd[3] = 0x05;
txd[4] = error_code;
Callcrc(txd,5,crc);
txd[5] = crc[0];
txd[6] = crc[1];
_seri_send_c();
comm_timeout = 0;
}
/*设置系统时间*/
void Set_Systime(void)
{
unsigned char i;
unsigned char data[10];
unsigned char Ds_time[8];
// _USER_RESET();
// if (SAM_RACK[0] == 0x00)
// {/*复位正确*/
// _SELECT_FILE02(); /*USER EF02 datacmd 0x01*/
// if (SAM_P1[0] != C_RIGHT)
// {/*选择文件错误*/
// seri_er(0x09);
// return;
// }
//
// i = READ_BINARY(0,0,1,data);
// if (i == ERROR)
// {/*读文件错误*/
// seri_er(0x09);
// return;
// }
//
// if (data[0] == 0x02)
// {/*而且是时间稽查卡*/
// i = READ_BINARY(0,10,8,data);
// if (i == ERROR)
// {/*读文件错误*/
// seri_er(0x09);
// return;
// }
// _get_time();
// for (i = 0; i < 5; i++)
// Ds_time[i] = Ds12887[i];
// /*判断应用启用期未到*/
// if (Data_cmp(3,Ds_time,data) == D_LESS)
// {
// seri_er(0x30);
// return;
// }
// /*判断应用有效期到*/
// if (Data_cmp(3,Ds_time,&data[4]) == D_GREAT)
// {
// seri_er(0x31);
// return;
// }
//
// /*读核查控制文件(EF01)*/
// _SELECT_EF01();
// if (SAM_P1[0] != C_RIGHT)
// {/*选择文件错误*/
// seri_er(0x09);
// return;
// }
//
// i = READ_BINARY(0,0,0x0A,data);
// if (i == ERROR)
// {/*读文件错误*/
// seri_er(0x09);
// return;
// }
// /*比较被稽查纳税人编码*/
// Flashrd(uuserno,serialdata,8);
// if (Data_cmp(8,serialdata,data) != D_EQUAL)
// {
// seri_er(0x15);
// return;
// }
// _GET_CHALLENGE(); /*取随机数*/
// if (SAM_P1[0] == C_RIGHT)
// {
// for (i = 0;i < 8; i++)
// serialdata[i] = SAM_DATA[i];
// }
// else
// {
// seri_er(0x34);
// return;
// }
//
// _SAM_RESET(); /*税控卡复位*/
// if(SAM_RACK[0] != 0x00)
// {/*卡片复位错误*/
// seri_er(0x01);
// return;
// }
//
// _SELECT_FILE02();
// if (SAM_P1[0] != C_RIGHT)
// {/*选择文件错误*/
// seri_er(0x07);
// return;
// }
// SAM_P2[0] = data[9]; /*data[9]为稽查级别*/
// for (i = 0; i < 8; i++)
// SAM_DATA[i] = serialdata[i];
// _INTERNAL_ATUHNTICATION(); /*内部认证*/
// if (SAM_P1[0] != C_RIGHT)
// {
// seri_er(0x31);
// return ;
// }
//
// SAM_RACK[1] |= 0x80; /*选择稽查卡*/
// SAM_P2[0] = data[9];
// _EXTERNAL_AUTHENTICATION(); /*外部认证*/
// if (SAM_P1[0] != 0x90)
// {
// seri_er(0x32);
// return;
// }
// goto set_time;
// }
// }
/*判断是否初始化*/
_SAM_RESET(); //PSAM卡复位
if(SAM_RACK[0] != 0x00)
{
seri_er(0x01);
return;
}
_SELECT_FILE02();
if (SAM_P1[0] != C_RIGHT)
{
seri_er(0x07);
return;
}
i = READ_BINARY(0, 1, 1, data);
if (i == ERROR)
{
seri_er(0x07);
return;
}
if (data[0] == 0x00)
{
seri_er(0x1E);
return;
}
//set_time:
Ds12887[6] = rxd[12]; /*weekday */
Ds12887[5] = rxd[11]; /*second*/
Ds12887[4] = rxd[10]; /*minute*/
Ds12887[3] = rxd[9]; /*hour*/
Ds12887[2] = rxd[8]; /*day*/
Ds12887[1] = rxd[7]; /*month*/
Ds12887[0] = rxd[6]; /*year*/
_set_time();
_seri_ok();
}
void Get_Systime(void)
{
unsigned char crc[2];
_get_time();
rxd[0] = 0x4F;
rxd[1] = 0x4B;
rxd[2] = 0x00;
rxd[3] = 0x0A;
rxd[4] = 0x20;
rxd[5] = Ds12887[0];
rxd[6] = Ds12887[1];
rxd[7] = Ds12887[2];
rxd[8] = Ds12887[3];
rxd[9] = Ds12887[4];
Callcrc(rxd,10,crc);
rxd[9] = crc[0];
rxd[10] = crc[1];
_seri_send_c();
}
void Com0_Manage(void)
{
unsigned char i;
unsigned char crc[2];
union gyt4 pp; /*only for test*/
comm_timeout = 0;
/*判断联机标志*/
// if (Flag_Online != 0x01)
// {
// Buffer[0] = 0x1B;
// Buffer[1] = 0x10;
// Buffer[2] = 0x01;
// Buffer[3] = 0x00;
// Buffer[4] = 0x05;
// Buffer[5] = 0xC4;
// Buffer[6] = 0xC7;
// _seri_rec_c(); /*接收联机命令*/
//
// if ((Debug_code[0] == 0xF5) && (Data_cmp(7,Buffer,rxd) == D_EQUAL))
// {
// Flag_Online = 0x01;
// _seri_ok();
// }
// else
// {
// seri_er(0xE1);
// Beep(30);
// }
// return;
// }
/*接收并分析数据*/
_seri_rec_c();
if(Debug_code[0] != 0xF5)
{
seri_er(0x1F);
Beep(30);
return;
}
i = rxd[4];
Callcrc(rxd,i,crc);
if((rxd[i] != crc[0])||(rxd[i+1] != crc[1]))
{
seri_er(0x35);
return;
}
INTET54 = 0x50; /*开定时器4中断级*/
TRUN |= 0x10; /*开定时器使能*/
switch(rxd[2])
{
case 0x10: /*获取初始化数据*/
break;
case 0x30: /*税控器初始化*/
// strcpy((char *)&Lcd_dis[1]," 初始化 ");
// Lcd_dis[0] = first; //row代表显示行
// _lcd_show();
_USER_RESET(); //user卡复位
if(SAM_RACK[0] != 0x00)
{
// strcpy((char *)&Lcd_dis[1],"USER卡复位错误 ");
// Lcd_dis[0] = second; //row代表显示行
// _lcd_show();
seri_er(0x02); /*USER卡上电错误*/
break;
}
_SELECT_FILE02(); /*USER EF02 datacmd 0x01*/
if (SAM_P1[0] != C_RIGHT)
{
_card_release();
seri_er(0x08); /*读USER卡错误*/
break;
}
_SAM_RESET(); //PSAM卡复位
if(SAM_RACK[0] != 0x00)
{
// strcpy((char *)&Lcd_dis[1],"ASM 卡复位错误 ");
// Lcd_dis[0] = second; //row代表显示行
// _lcd_show();
seri_er(0x01); /*SAM卡上电错误*/
break;
}
_SELECT_FILE02(); /*USER EF02 datacmd 0x01*/
if (SAM_P1[0] != C_RIGHT)
{
_card_release();
seri_er(0x07); /*读SAM卡错误*/
break;
}
i = Tax_Format(); /*初始化流程*/
_card_release(); /*卡片释放*/
if (i == RIGHT)
{
_seri_ok();
// strcpy((char *)&Lcd_dis[1],"初始化完毕, 取卡");
// Lcd_dis[0] = second;
// _lcd_show();
Beep(20);
}
break;
case 0x31: /*发票分发*/
i = Invoice_Distribute();
_card_release(); /*卡片释放*/
if (i == RIGHT)
{
// strcpy((char *)&Lcd_dis[1]," 分发完毕, 取卡");
// Lcd_dis[0] = second;
// _lcd_show();
Beep(20);
}
break;
case 0x32: /*已分发的发票号上传*/
break;
case 0x3A: /*已分发的发票号上传*/
Get_Systime();
break;
case 0x3B: /*设置时钟*/
Set_Systime();
break;
case 0x3C:
break;
case 0x3D:
break;
default :
Beep(100);
break;
}
INTET54 = 0x00; /*关定时器4中断级*/
TRUN &= 0xEF; /*关定时器使能*/
}
/****************only for test***************/
//void Show_time(unsigned char DisplayFlag)
//{
// unsigned char a,b,c;
//
// a=0;
// b=0;
// c=0;
//
// _get_time();
// if (DisplayFlag == VFD_Clock)
// {/*VFD 时钟*/
// a = Ds12887[3];//时
// b = Ds12887[4];//分
// c = Ds12887[5];//秒
// Dis[1] = char_not_display;
// Dis[2] = char_not_display;
// }
//
// if (DisplayFlag == VFD_Date)
// {/*VFD 日期*/
// a = Ds12887[0];
// b = Ds12887[1];
// c = Ds12887[2];
// Dis[1] = char_2;
// Dis[2] = char_0;
// }
//
// if (DisplayFlag != VFD_NoDisplay)
// {
// Dis[3] = a>>4;
// Dis[4] = a&0x0F;
//
// Dis[5] = char_JH;
//
// Dis[6] = b>>4;
// Dis[7] = b&0x0F;
//
// Dis[8] = char_JH;
//
// Dis[9] = c>>4;
// Dis[10] = c&0x0F;
//
// _show();
// }
//}
/*******************************************/
void main(void)
{
unsigned char i;
Buffer = (unsigned char *)0x100;
Lcd_dis = (unsigned char *)0x10B;
Ds12887 = &Buffer[1];
Debug_code = (unsigned char *)0x144;
serialdata =(unsigned char *)0x145;
rxd = (unsigned char *)0x350;
txd = (unsigned char *)0x350;
SAM_RACK =(unsigned char *)0x230;
SAM_CLA = (unsigned char *)0x253;
SAM_INS = (unsigned char *)0x254;
SAM_P1 = (unsigned char *)0x255;
SAM_P2 = (unsigned char *)0x256;
SAM_P3 = (unsigned char *)0x257;
SAM_DATA = (unsigned char *)0x258;
EF_FILENAME = (unsigned char *)0x259;
con = 1;
system_lock = 1; //上电初始化,直接锁机
command = 0; //清除命令字
_init_lcd(); /*初始化液晶*/
_init_rtc(); /*初始化时钟*/
INTES1 = 0x04; /*开串口1中断*/
// INTE0AD = 0x04; /*开卡片中断*/
while(system_lock)
{
;
}
while(con)
{
strcpy((char *)&Lcd_dis[1]," 欢迎使用 ");
Lcd_dis[0] = first; //row代表显示行
_lcd_show();
while(command==0x00)
{
;
}
switch(command)
{
case 0x10: /*获取初始化数据*/
break;
case 0x30: /*税控器初始化*/
// strcpy((char *)&Lcd_dis[1]," 初始化 ");
// Lcd_dis[0] = first; //row代表显示行
// _lcd_show();
_USER_RESET(); //user卡复位
if(SAM_RACK[0] != 0x00)
{
// strcpy((char *)&Lcd_dis[1],"USER卡复位错误 ");
// Lcd_dis[0] = second; //row代表显示行
// _lcd_show();
seri_er(0x02); /*USER卡上电错误*/
break;
}
_SELECT_FILE02(); /*USER EF02 datacmd 0x01*/
if (SAM_P1[0] != C_RIGHT)
{
_card_release();
seri_er(0x08); /*读USER卡错误*/
break;
}
_SAM_RESET(); //PSAM卡复位
if(SAM_RACK[0] != 0x00)
{
// strcpy((char *)&Lcd_dis[1],"ASM 卡复位错误 ");
// Lcd_dis[0] = second; //row代表显示行
// _lcd_show();
seri_er(0x01); /*SAM卡上电错误*/
break;
}
_SELECT_FILE02(); /*USER EF02 datacmd 0x01*/
if (SAM_P1[0] != C_RIGHT)
{
_card_release();
seri_er(0x07); /*读SAM卡错误*/
break;
}
i = Tax_Format(); /*初始化流程*/
_card_release(); /*卡片释放*/
if (i == RIGHT)
{
_seri_ok();
// strcpy((char *)&Lcd_dis[1],"初始化完毕, 取卡");
// Lcd_dis[0] = second;
// _lcd_show();
Beep(20);
}
break;
case 0x31: /*发票分发*/
i = Invoice_Distribute();
_card_release(); /*卡片释放*/
if (i == RIGHT)
{
// strcpy((char *)&Lcd_dis[1]," 分发完毕, 取卡");
// Lcd_dis[0] = second;
// _lcd_show();
Beep(20);
}
break;
case 0x32: /*已分发的发票号上传*/
break;
case 0x3A: /*已分发的发票号上传*/
Get_Systime();
break;
case 0x3B: /*设置时钟*/
Set_Systime();
break;
case 0x3C:
break;
case 0x3D:
break;
default :
break;
}
command=0x00;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -