📄 main.c
字号:
/*============================================
Main Program (Sample)
============================================*/
#include "560.h" /* for the reference of I/O */
/*******************全局变量区域****************************/
unsigned char *Buffer;
unsigned char *Ds12887; //Ds12887[13],time buffer
unsigned char *serialdata;
unsigned char *SAM_RACK;
unsigned char *SAM_CLA;
unsigned char *SAM_INS;
unsigned char *SAM_P1;
unsigned char *SAM_P2;
unsigned char *SAM_P3;
unsigned char *SAM_DATA;
unsigned char *EF_FILENAME;
unsigned char *rxd;
unsigned char *txd;
unsigned char *Lcd_dis;
unsigned char *Debug_code;
unsigned char con;
unsigned char comm_timeout;
unsigned char Flag_Online;
unsigned char no_invoice_flag; /*有无发票标志*/
unsigned char system_lock; //系统锁机标志,当其不为"0"时,整机功能锁定
unsigned char command; //系统命令字,该字节由串口命令解析函数提供
/*******************全局函数区域*************************/
extern void _init_rtc(void);
extern void _get_time(void);
extern void _set_time(void);
extern void _seri_send_c(void);
extern void _seri_rec_c(void);
extern void _seri_ok(void);
extern void _seri_er(void);
extern void _delay(void);
//extern void _show(void);
extern void _SAM_RESET(void);
extern void _USER_RESET(void);
extern void _card_release(void);
extern void _SELECT_EF01(void);
extern void _SELECT_FILE02(void);
extern void _GET_CHALLENGE(void);
extern void _EXTERNAL_AUTHENTICATION(void);
extern void _INTERNAL_ATUHNTICATION(void);
extern unsigned char READ_RECORD(unsigned char ,unsigned char ,unsigned char ,unsigned char *);
extern unsigned char READ_BINARY(unsigned char ,unsigned char ,unsigned char ,unsigned char *);
extern unsigned char Invoice_Distribute(void);
extern void W29c040wrsd(unsigned long ,unsigned char *,unsigned int );
extern void W29c040wrsd_serialdata(unsigned long ,unsigned int );
extern void I2cwr(unsigned long ,unsigned char);
extern unsigned char I2crd(unsigned long ,unsigned int );
extern unsigned char Tax_Format(void);
extern char *strcpy(char *,const char *);
/*********************only for test**********************/
//extern void LCD_display(unsigned char row);
extern void _lcd_show(void);
extern void _init_lcd(void);
extern void _clr_lcd(void);
/*******************************************************/
/*系统延时函数*/
void Delayms(unsigned int m)
{
while(m != 0x00)
{
_delay();
m--;
}
}
/*蜂鸣器鸣叫函数*/
void Beep(unsigned char m)
{
IOP3 |= 0x08;
while(m != 0x00)
{
_delay();
m--;
}
IOP3 &= 0xF7;
}
void Show_string(unsigned char datanum,unsigned char *show_data)
{
unsigned char i;
for (i = 0; i < datanum; i++)
{
if ((show_data[i]&0xF0)<0xA0)
Lcd_dis[2*i+1] = (show_data[i]>>4)+0x30;
else
Lcd_dis[2*i+1] = (show_data[i]>>4)+0x37;
if ((show_data[i]&0x0F)<0x0A)
Lcd_dis[2*i+2] = (show_data[i]&0x0F)+0x30;
else
Lcd_dis[2*i+2] = (show_data[i]&0x0F)+0x37;
}
Lcd_dis[2*datanum+1] = 0x00;
Lcd_dis[0] = third;
_lcd_show();
}
void Show_code(unsigned char first_data,unsigned char second_data)
{
unsigned char i;
Lcd_dis[0] = 0x9E;
// for ( i = 1; i < 13; i++)
// Lcd_dis[i] = 0x20;
if ((first_data&0xF0)<0xA0)
Lcd_dis[1] = (first_data>>4)+0x30;
else
Lcd_dis[1] = (first_data>>4)+0x37;
if ((first_data&0x0F)<0x0A)
Lcd_dis[2] = (first_data&0x0F)+0x30;
else
Lcd_dis[2] = (first_data&0x0F)+0x37;
if ((second_data&0xF0)<0xA0)
Lcd_dis[3] = (second_data>>4)+0x30;
else
Lcd_dis[3] = (second_data>>4)+0x37;
if ((second_data&0x0F)<0x0A)
Lcd_dis[4] = (second_data&0x0F)+0x30;
else
Lcd_dis[4] = (second_data&0x0F)+0x37;
Lcd_dis[5] = 0x00;
_lcd_show();
Delayms(500);
}
/*数组比较函数*/
unsigned char Data_cmp(unsigned char len,unsigned char *p1,unsigned char *p2)
{//比较两个数组是否相等,0 相等 1 p1>p2 2 p1<p2
unsigned char i;
for (i = 0; i < len; i++)
{
if (p1[i] > p2[i])
return D_GREAT;//p1>p2
if (p1[i] < p2[i])
return D_LESS;//p1<p2
}
return D_EQUAL;
}
/* Flash的读操作流程 */
void Flashrd(unsigned long adr, unsigned char *dat, unsigned int size)
{
unsigned int Liv_i; /*循环变量*/
unsigned char *p; /*指针变量*/
p = (unsigned char *)adr;
for (Liv_i = 0; Liv_i < size; Liv_i++)
{
dat[Liv_i] = *(p + Liv_i);
}
}
/* Flash的写,包括第一片写其他片和第二片写第一片 */
/* 由于在写入的过程中不允许产生任何的中断,所以我 */
/* 们在这个函数进入后使用了_DI(); */
void Flashwr(unsigned long adr, unsigned char *dat, unsigned int size)
{
unsigned int Liv_i, Liv_j;
unsigned int low_addr;
unsigned long high_addr;
unsigned char write_data[256];
unsigned char *p; /*指针变量*/
unsigned long Llv_counter; /*检测写入完整否的计数变量*/
__DI();
if (adr < 0x80000)
{/*向第一片写数据则调用第二片的程序*/
W29c040wrsd(adr,dat,size);
}
else
{
low_addr = (unsigned int)(adr&0x0000FF);
high_addr = adr & 0xFFFF00;
Liv_i = size + low_addr;
if (Liv_i > 256)
{/*跨页面写*/
Liv_i = Liv_i - 256;
/*第二步,余下字节写入第二页面*/
Llv_counter = high_addr + 256;
Flashrd(Llv_counter,write_data,256);
for (Liv_j = 0; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = dat[256 - low_addr + Liv_j];
/*解除数据保护*/
p = (unsigned char *)(Llv_counter & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)Llv_counter;
for (Liv_j = 0; Liv_j < 256; Liv_j++)
*(p + Liv_j ) = write_data[Liv_j];
/*数据校验*/
p = (unsigned char *)(Llv_counter & 0xFF0000); /*Llv_counter借用为地址*/
Llv_counter = 0;
write_data[0] = *p;
write_data[0] &= 0x40;
while (Llv_counter < 0x7FFFF)
{
write_data[1] = *p;
write_data[1] &= 0x40;
if (write_data[0] == write_data[1])
break;
write_data[0] = write_data[1];
Llv_counter++;
}
Liv_i = 256;
}/*end of if (Liv_i > 256)*/
/*同一页面写*/
Flashrd(high_addr,write_data,256);
for (Liv_j = low_addr; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = dat[Liv_j - low_addr];
/*解除数据保护*/
p = (unsigned char *)(high_addr & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)high_addr;
for (Liv_j = 0; Liv_j < 256; Liv_j++)
*(p + Liv_j ) = write_data[Liv_j];
/*数据校验*/
p = (unsigned char *)(high_addr & 0xFF0000);
Llv_counter = 0;
write_data[0] = *p;
write_data[0] &= 0x40;
while (Llv_counter < 0x7FFFF)
{
write_data[1] = *p;
write_data[1] &= 0x40;
if (write_data[0] == write_data[1])
break;
write_data[0] = write_data[1];
Llv_counter++;
}
}/*end of if (adr < 0x80000) */
__EI();
}
/*Flash的写入。数据缓冲区在serialdata中*/
void Flashwr_serialdata(unsigned long adr,unsigned int size)
{
unsigned int Liv_i, Liv_j;
unsigned int low_addr;
unsigned long high_addr;
unsigned char write_data[256];
unsigned char *p; /*指针变量*/
unsigned long Llv_counter; /*检测写入完整否的计数变量*/
__DI();
if (adr < 0x80000)
{/*向第一片写数据则调用第二片的程序*/
W29c040wrsd_serialdata(adr,size);
}
else
{
low_addr = (unsigned int)(adr & 0x0000FF);
high_addr = adr & 0xFFFF00;
Liv_i = size + low_addr;
if (Liv_i > 256)
{/*跨页面写*/
/*第一步,补齐第一页面剩余字节*/
Liv_i = Liv_i - 256;
/*第二步,余下字节写入第二页面*/
Llv_counter = high_addr + 256;
Flashrd(Llv_counter,write_data,256);
for (Liv_j = 0; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = serialdata[256 - low_addr + Liv_j];
/*解除数据保护*/
p = (unsigned char *)(Llv_counter & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)Llv_counter;
for (Liv_i = 0; Liv_i < 256; Liv_i++)
*(p + Liv_i ) = write_data[Liv_i];
/*数据校验*/
p = (unsigned char *)(Llv_counter & 0xFF0000);/*Llv_counter是暂时借用的*/
Llv_counter = 0;
write_data[0] = *p;
write_data[0] &= 0x40;
while (Llv_counter < 0x7FFFF)
{
write_data[1] = *p;
write_data[1] &= 0x40;
if (write_data[0] == write_data[1])
break;
write_data[0] = write_data[1];
Llv_counter++;
}
Liv_i = 256;
}
/*同一页面写*/
Flashrd(high_addr,write_data,256);
for (Liv_j = low_addr; Liv_j < Liv_i; Liv_j++)
write_data[Liv_j] = serialdata[Liv_j - low_addr];
/*解除数据保护*/
p = (unsigned char *)(high_addr & 0xFF8000);
*(p + 0x5555) = 0xAA;
*(p + 0x2AAA) = 0x55;
*(p + 0x5555) = 0xA0;
/*写入数据*/
p = (unsigned char *)high_addr;
for (Liv_i = 0; Liv_i < 256; Liv_i++)
*(p + Liv_i ) = write_data[Liv_i];
/*数据校验*/
p = (unsigned char *)(high_addr & 0xFF0000);
Llv_counter = 0;
write_data[0] = *p;
write_data[0] &= 0x40;
while (Llv_counter < 0x7FFFF)
{
write_data[1] = *p;
write_data[1] &= 0x40;
if (write_data[0] == write_data[1])
break;
write_data[0] = write_data[1];
Llv_counter++;
}
}/*end of if (adr < 0x80000) */
__EI();
}
void Icmanage(void)
{
// unsigned char i;
//
// _clr_lcd();
// strcpy((char *)&Lcd_dis[1],"处理中, 请稍候 ");
// LCD_display(2);
//
// Dis[1] = char_C;
// Dis[2] = char_A;
// Dis[3] = char_R;
// Dis[4] = char_d;
// Dis[5] = char_JH;
// Dis[6] = char_I;
// Dis[7] = char_N;
// Dis[8] = char_not_display;
// Dis[9] = char_not_display;
// Dis[10] = char_not_display;
// _show();
//
// /*CPU卡操作流程*/
// i = Sammange();
// if(i != RESETERROR)
// return;
//
// /*普通卡操作流程*/
// IOP3 &= 0xFB;/*卡片上电*/
// Delayms(600);
// Ssf1101rd(0,ictype,10); /*按照1101卡来读写操作*/
//// for (i = 0; i < 8; i++)
//// {
//// Show_code(serialdata[2*i],serialdata[2*i+1]);
//// }
// if (serialdata[1] == 0xAA)
// {
// switch (serialdata[0])
// {
// case 0x11 : /*机器号出厂初始化*/
// Flashwr(machno,&serialdata[2],8);
// serialdata[5] = 0x01;
// break;
// case 0x33 : /*商品管理*/
// Icguanlinew();
//// Sam_Modify_Time();
// serialdata[5] = 0x1B;
// break;
// case 0x44 : /*使用IC卡更新程序*/
// _clr_lcd();
// i = Admimainput();
// if (i == ERROR)
// serialdata[5] = 0x20;
// else
// serialdata[5] = 0x01;
// serialdata[6] = i;
// serialdata[7] = 0x00;
// aduit_wr(); /*为了区分密码失败事件*/
// if (i == ERROR)
// return;
// Updatemain();
// break;
// case 0x55: /*初始化管理员密码*/
// SetCipher;
// Dis[1] = char_P;
// Dis[2] = char_S;
// strcpy((char *)&Lcd_dis[1],"管理密码 ");
// LCD_Intinput(3,8,8);
// ClrCipher;
// if (Key[0] == K_TC)
// return;
//// if(JudgeFQuit)
//// return;
// if (Key[11] < 6)
// {
// strcpy((char *)&Lcd_dis[1],"管理密码错误! ");
// LCD_display(2);
// Show_code(0x00,0xB1);
// return;
// }
// Dot[0] = (Key[0]<<4) + Key[1];
// Dot[1] = (Key[2]<<4) + Key[3];
// Dot[2] = (Key[4]<<4) + Key[5];
// Dot[3] = (Key[6]<<4) + Key[7];
//
// i = Dot[0];
// Dot[0] = Dot[1];
// Dot[1] = i;
// i = Dot[2];
// Dot[2] = Dot[3];
// Dot[3] = i; /*Dot是临时借用*/
//
// if(Data_cmp(4,Dot,&serialdata[2]) != D_EQUAL)
// {
// strcpy((char *)&Lcd_dis[1],"管理密码错误! ");
// LCD_display(2);
// Show_code(0x00,0xB1);
// return;
// }
//
// for (i = 0; i < 4; i++)
// serialdata[i] = 0x11;
// Flashwr_serialdata(admin,4);
// break;
// case 0x66:
// UpdatePrintStyle();
// serialdata[5] = 0x1B;
// break;
//// case 0xAA : /*发票明细的导出*/
//// Collect_InvoiceData();
//// serialdata[5] = 0x15;
//// break;
// default :
// Beep(20);
// break;
// }/*end of ssf1101 switch*/
// /*审计信息*/
// serialdata[6] = 0x01;
// serialdata[7] = 0x00;
// aduit_wr();
//
// }/*end of ssf1101 if*/
// else
// {/*卡型不正确,显示00,蜂鸣器叫6秒*/
// /*审计信息*/
// serialdata[5] = 0x16;
// serialdata[6] = 0x00;
// Flashrd(Declare_Star,Dis,1);
// if (Dis[0] != 0xFF)
// serialdata[7] = 0x01;
// else
// serialdata[7] = 0x04;
// aduit_wr();
//
// Beep(20);
// _clr_lcd();
// strcpy((char *)&Lcd_dis[1],"卡的类型不正确 ");
// LCD_display(2);
// strcpy((char *)&Lcd_dis[1]," 请取出IC卡 ");
// LCD_display(3);
//
// for(i = 5; i < 9; i++)
// Dis[i] = char_not_display;
// Dis[1] = char_C;
// Dis[2] = char_O;
// Dis[3] = char_d;
// Dis[4] = char_E;
// Dis[9] = char_0;
// Dis[10] = char_4;
// _show();
// while (IOP8&0x10){}
// }/*end of ssf1101 if-else*/
//
// IOP3 |= 0x04; /*卡片下电*/
}
/*CRC计算函数*/
void Callcrc(unsigned char *ptr, unsigned char len, unsigned char *dtr)
{//CRC余式表是按
unsigned int crc;
unsigned char da;
unsigned int crcdat[16];
crc = 0;
// CRC余式表
crcdat[0] = 0x0000;
crcdat[1] = 0x8005;
crcdat[2] = 0x800F;
crcdat[3] = 0x000A;
crcdat[4] = 0x801B;
crcdat[5] = 0x001E;
crcdat[6] = 0x0014;
crcdat[7] = 0x8011;
crcdat[8] = 0x8033;
crcdat[9] = 0x0036;
crcdat[10] = 0x003C;
crcdat[11] = 0x8039;
crcdat[12] = 0x0028;
crcdat[13] = 0x802D;
crcdat[14] = 0x8027;
crcdat[15] = 0x0022;
while(len-- != 0)
{
da = ((unsigned char)(crc/256))/16; // 暂存CRC的高四位
crc <<= 4; // CRC右移4位,相当于取CRC的低12位
crc ^= crcdat[da^(*ptr/16)];
// CRC的高4位和本字节的前半字节相加后查表计算CRC,然后加上上一次CRC的余数
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -