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

📄 iccard.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
📖 第 1 页 / 共 3 页
字号:
	}
//	enint();
	Flash_CS = 1;
}


/********************************************************************************
* 函数说明:	Read the data from the AT45DB041 (attention: len <= 264)
* 输入参数:	len and source address
* 输出参数:	dest string pointer,
* 返回值:	0 is OK.
* 说明: 
********************************************************************************/
byte IC_ReadString(byte *dest, dword srcAddr, WORD len)
{
	WORD bankNo, startAdd;

	bankNo = srcAddr / ROW_SIZE_IC;
	startAdd = srcAddr % ROW_SIZE_IC;
	if (startAdd + len <= ROW_SIZE_IC)
	{
		FlashPageRead(bankNo, startAdd, len, dest);
	}
	else
	{
		FlashPageRead(bankNo, startAdd, ROW_SIZE_IC-startAdd, dest);
		bankNo++;
		dest += ROW_SIZE_IC - startAdd;
		FlashPageRead(bankNo, 0, len-(ROW_SIZE_IC-startAdd), dest);
	}
	return 0;
}

/***************************************************************
* 函数说明: 将一个字符串写入IC Card
* 输入参数: 待写入的字符串, 字符串长度, 字符串存储的起始地址
* 输出参数: 无
* 返回结果: ERROR----- error occur                  
*			OK   ----- read successfully 
* 说明: 解析起始地址为页地址和页内地址,
***************************************************************/
char IC_WriteString(char *src, int len, dword destAddr)
//byte WriteArray(dword destAddr, byte *src, WORD len)
{
	WORD bankNo, startAddr, tmpCtrl, i;
	byte tmpReadBuff[ROW_SIZE_IC];
	byte tmpChkBuff[ROW_SIZE_IC];
	dword tmpSectorAddr;
	WORD j;

	bankNo = destAddr / ROW_SIZE_IC;//here the destAddr is treated as a continuate space, it can't be treated as the address which the IC Card could process directly.
	startAddr = destAddr % ROW_SIZE_IC;
	tmpSectorAddr = (dword)bankNo * ROW_SIZE_IC;//record the start address pointed address

	if ((startAddr+len) <= ROW_SIZE_IC)						//Only in one Bank area.
	{
		FlashPageRead(bankNo, 0, ROW_SIZE_IC, tmpReadBuff);	//Read the contents need update.
		for (i=0; i<len; i++, startAddr++)
		{
			tmpReadBuff[startAddr] = *src++;
		}
		FlashPageWrite(bankNo, 0, ROW_SIZE_IC, tmpReadBuff);//成页写入

		// check 如果新读入的数据与刚才要写入的数据一致,继续.否则,返回IC卡已坏的信息.
		ReadIccard(tmpChkBuff, tmpSectorAddr, ROW_SIZE_IC);
		if (memcmp(tmpChkBuff, tmpReadBuff, ROW_SIZE_IC) != 0)
		{
			return IC_BAD;
		}
		for (i=0; i<ROW_SIZE_IC; i++)
		{
			if (tmpChkBuff[i] != tmpReadBuff[i])
			{
				return (IC_BAD);
			}
		}
	}
	else												//In two Bank area.
	{
		FlashPageRead(bankNo, 0, ROW_SIZE_IC, tmpReadBuff);	//Read the contents need update.
		for (i=0; startAddr < ROW_SIZE_IC; i++, startAddr++)
		{
			tmpReadBuff[startAddr] = *src++;
		}
		tmpCtrl = i;

		FlashPageWrite(bankNo, 0, ROW_SIZE_IC, tmpReadBuff);
		// check sector #1
		ReadIccard(tmpChkBuff, tmpSectorAddr, ROW_SIZE_IC);
		for (i=0; i<ROW_SIZE_IC; i++)
		{
			if (tmpChkBuff[i] != tmpReadBuff[i])
			{
				return (IC_BAD);
			}
		}

		bankNo++;
		tmpSectorAddr += ROW_SIZE_IC;
		FlashPageRead(bankNo, 0, ROW_SIZE_IC, tmpReadBuff);	//Read the contents need update.

		for (i=0; tmpCtrl<len; tmpCtrl++, i++)
		{
			tmpReadBuff[i] = *src++;
		}
		FlashPageWrite(bankNo, 0, ROW_SIZE_IC, tmpReadBuff);
		// check sector #2
		ReadIccard(tmpChkBuff, tmpSectorAddr, ROW_SIZE_IC);
		for (i=0; i<ROW_SIZE_IC; i++)
		{
			if (tmpChkBuff[i] != tmpReadBuff[i])
			{
				return (IC_BAD);
			}
		}
	}
	return 0;
}


/*if the recode of PLU is completed, clear the flag*/
byte IC_Write_End(byte type)
{
	dword ICaddress;
	byte tmpstr[10];

	memset(tmpstr, 0xAA, 5);
	switch(type)
	{
		case 0:
			ICaddress = IC_PLUSINDEX_ADDR;
			break;
		case 1:
			ICaddress = IC_DEPT_ADDR;
			break;
		default:
			ICaddress = IC_SYSFLAG_ADDR;
			break;
	}
	if(IC_WriteString(tmpstr, 5, ICaddress) != OK)
		return IC_BAD;
	return OK;
}


byte IC_Write_Sindex(void)
{
	DWORD ICAddress;
	WORD i;
	byte tmpstr[10];
	byte maxcnt = ROW_SIZE_IC/(sizeof(WORD));

	if(IC_CardInsert() != OK)
		{errorType(ERR_IC_NO_CARD); return NG;}
	//write head
	memset(tmpstr, 0, 10);
	ICAddress = IC_PLUSINDEX_ADDR;
	memset(tmpstr,0x55, 5);
	Long2Bcd(tmpstr+8, Max_Plu_No, 2);
	if(IC_WriteString(tmpstr, 10, ICAddress) != OK)
		{errorType(ERR_IC_BAD); return NG;}

	ICAddress += ROW_SIZE_IC;
		
	for(i = 0; i <  Max_Plu_No ; i += maxcnt)
	{
		if(i+maxcnt > Max_Plu_No)
			maxcnt = Max_Plu_No - i;
		
		if(ICAddress >= IC_PLU_ADDR)//no used , just for protect the PLU paramate
			{errorType(ERR_IC_ADDR_OVER); return NG;}
			
		if(IC_WriteString((byte *)&Sindex [i], maxcnt*(sizeof(WORD)), ICAddress) !=OK)
			{errorType(ERR_IC_BAD); return NG;}
		ICAddress +=  maxcnt*(sizeof(WORD));
	}
	return OK;
}


byte IC_Write_PLU(WORD StartIdx, WORD Numcnt )
{
	dword ICaddress;
	WORD i;
	byte maxcnt = ROW_SIZE_IC/(sizeof(PLU_STRU));//recode the max numcnt of PLU per page.
	PLU_STRU plu_stru[20];

	if(IC_CardInsert() != OK)
		{errorType(ERR_IC_NO_CARD); return NG;}
	
	if(StartIdx + Numcnt > Max_Plu_No)
		{errorType(ERR_DIGIT_ILLEGAL); return NG;}
	
	ICaddress = IC_PLU_ADDR + (dword)(StartIdx*(sizeof(PLU_STRU)));
	for(i = 0; i< Numcnt; i +=maxcnt)
	{
		byte j;
		
		if(ICaddress >= IC_MAX_ADDR)
			{errorType(ERR_IC_ADDR_OVER); return NG;}

		if(i+maxcnt > Numcnt)
			maxcnt = Numcnt-i;
			
		for(j = 0; j<maxcnt; j++)
		{
			WORD tmp = StartIdx + i +j;
			
			memset(&plu_stru[j], 0, sizeof(PLU_STRU));
			
			if(tmp < Max_Plu_No)
			{
			#ifdef SCANNER 		/* Support the scanner function */
				memcpy(plu_stru[j].Bar_Code,plu[tmp].barcode,BAR_BUFF_LEN);
			#endif
				plu_stru[j].Dept_link= plu[tmp].plink;
            #ifdef REST_PLU_FUNC
				plu_stru[j].Attribute = plu[tmp].attr;
            #endif
				Long2Bcd(plu_stru[j].Pre_Price, plu[tmp].price, 3);
				memcpy(plu_stru[j].Desc, plu[tmp].desc, MAX_DESC_LEN_EX+1);
			}
		}
		if(IC_WriteString((byte *)plu_stru, maxcnt*sizeof(PLU_STRU),  ICaddress) != OK)
			{errorType(ERR_IC_BAD); return NG;}
			
		ICaddress += maxcnt*sizeof(PLU_STRU);
			
		Insert_Period((i/100)%10);
		if(i != 0)
			Cancel_Period((i/100 -1)%10);
	}
	
	if(IC_Write_End(0)  != OK)
		{errorType(ERR_IC_BAD); return NG;}
		
	return OK;
}

byte IC_Write_Dept(void)
{
	dword ICaddress;
	byte i;
	byte tmpstr[10];
	DEPT_STRU dept_stru[20];
	byte maxcnt = ROW_SIZE_IC/(sizeof(DEPT_STRU));

	if(IC_CardInsert() != OK)
		{errorType(ERR_IC_NO_CARD); return NG;}

	memset(tmpstr, 0, 10);
	ICaddress = IC_DEPT_ADDR;
	memset(tmpstr,0x55, 5);
	tmpstr[9] = Max_Dept_No;
	if(IC_WriteString(tmpstr, 10, ICaddress) !=OK)
		{errorType(ERR_IC_BAD); return NG;}
		
	ICaddress += ROW_SIZE_IC;

	for(i = 0; i< Max_Dept_No; i += maxcnt)
	{
		byte j;
		
		if(ICaddress >= IC_PLUSINDEX_ADDR)
			{errorType(ERR_IC_ADDR_OVER); return NG;}
			
		if(i+maxcnt >Max_Dept_No)
			maxcnt = Max_Dept_No - i;
		for(j = 0; j < maxcnt; j++)
		{
			byte tmp = i +j ;
			memset(&(dept_stru[j]), 0, sizeof(DEPT_STRU));
			if(tmp < Max_Dept_No)
			{
				Long2Bcd(dept_stru[j].Pre_Price, dept[tmp].price, 4);
				#ifdef AUTO_PER		/* Support the department auto percent function */
				Long2Bcd(dept_stru[j].Auto_Per_Rate, dept[tmp].per_rate, 3);
				#else
				memset(dept_stru[j].Auto_Per_Rate, 0, 3);
				#endif /* End AUTO_PER */
				dept_stru[j].Attribute[0] = dept[tmp].pflag;
				dept_stru[j].Attribute[1] = dept[tmp].group;
				dept_stru[j].Attribute[1] |= (dept[tmp].Hdlo)<<4;
				#ifdef AUTO_PER		/* Support the department auto percent function */
				dept_stru[j].Attribute[2] = dept[tmp].per_flag;
				#else
				dept_stru[j].Attribute[2] = 0;
				#endif /* End AUTO_PER */
				#ifdef VER_RSNT		/* Support the restaurant function */
				dept_stru[j].Attribute[2] |= (dept[tmp].send_kp_flag)<<4;
				#endif /* End VER_RSNT */
				memcpy(dept_stru[j].Desc, dept[tmp].desc, MAX_DESC_LEN_EX+1);
			}
		}
		if(IC_WriteString((char *)dept_stru, maxcnt *sizeof(DEPT_STRU), ICaddress) !=OK)
			{errorType(ERR_IC_BAD); return NG;}

		ICaddress += maxcnt *sizeof(DEPT_STRU);
	}

	if(IC_Write_End(1)  != OK)
		{errorType(ERR_IC_BAD); return NG;}
	
	return OK;
}



/*---------------------------------------------------------------*
	the system paramate needed to be recoded:
	1. sysflag
	2. 	
	
*---------------------------------------------------------------*/
byte IC_Write_Sysflag(void)
{
	dword ICaddress;
	byte tmpstr[10];
	byte tmppage[ROW_SIZE_IC];
	SYSFLAGDEF Sys_Flag;
	
	if(IC_CardInsert() != OK)
		{errorType(ERR_IC_NO_CARD); return NG;}
//head	
	ICaddress = IC_SYSFLAG_ADDR; 
	memset(tmpstr, 0x55, 5);
	if(IC_WriteString(tmpstr, 10, ICaddress) != OK)
		{errorType(ERR_IC_BAD); return NG;}
		
		//major	
	ICaddress += ROW_SIZE_IC;
	memset(tmppage, 0, ROW_SIZE_IC);
	
	Sys_Flag.SF1.datefmt 				= 		sysflag->datefmt;
	Sys_Flag.SF1.sysdots 				= 		sysflag->sysdots;
	Sys_Flag.SF1.xCount_round 		= 		sysflag->xCount_round;
	Sys_Flag.SF1.tax_round 			= 		sysflag->tax_round;
	tmppage[0] = Sys_Flag.SF;
	
	Sys_Flag.SF2.clerk_mode			=		sysflag->clerk_mode;
	Sys_Flag.SF2.zero_skip			= 		sysflag->zero_skip;
	Sys_Flag.SF2.prn_table_detail		=		sysflag->prn_table_detail;
	Sys_Flag.SF2.z_reset_rcpt_no		=		sysflag->z_reset_rcpt_no;
	Sys_Flag.SF2.Tax_System		=		sysflag->Tax_System;
	Sys_Flag.SF2.tax_shift_mode		=		sysflag->tax_shift_mode;
	Sys_Flag.SF2.Prn_Bar_Flag		=		sysflag->Prn_Bar_Flag;
	Sys_Flag.SF2.check_clerk			=		sysflag->check_clerk;
	tmppage[1] = Sys_Flag.SF;
	
	Sys_Flag.SF3.Subt_PressPrn			= 		sysflag->Subt_PressPrn;
#ifdef STOCK		/* Support the PLU stock function */
	Sys_Flag.SF3.PLU_Stock_Flag		=		sysflag->PLU_Stock_Flag;
#endif /* End STOCK */
	Sys_Flag.SF3.BackLight			=		sysflag->BackLight;
	Sys_Flag.SF3.NS_switch			=		sysflag->NS_switch;
	Sys_Flag.SF3.RPLDP_flag			=		sysflag->RPLDP_flag;
	Sys_Flag.SF3.dept_shift			=		sysflag->dept_shift;
	Sys_Flag.SF3.Rcpt_prn			=		sysflag->Rcpt_prn;
	Sys_Flag.SF3.fl_wmotor			=		sysflag->fl_wmotor;
	tmppage[2] = Sys_Flag.SF;
	
	Sys_Flag.SF4.Btm_Msg_Flag		=		sysflag->Btm_Msg_Flag;
#ifdef SCANNER 	/* Support the scanner function */
	Sys_Flag.SF4.Input_Bar_Mode	=		sysflag->Input_Bar_Mode;
#endif /* End SCANNER */
	Sys_Flag.SF4.soft_lock_flag		=		sysflag->soft_lock_flag;
#ifdef AUTO_PER	/* Support the auto percent function */
	Sys_Flag.SF4.Auto_Per_Use_Flag	=		sysflag->Auto_Per_Use_Flag;
	Sys_Flag.SF4.Auto_Per_Prn_Flag	=		sysflag->Auto_Per_Prn_Flag;
#else
	Sys_Flag.SF4.Auto_Per_Use_Flag	=	0;
	Sys_Flag.SF4.Auto_Per_Prn_Flag	=	0;

⌨️ 快捷键说明

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