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

📄 const.c

📁 本程序为某企业的税控机固件程序.基于东芝TMP93CS41 16位单片机编写,符合国家标准.该程序已经经过多次长期调试.
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "560.h"

extern void main(void);
extern void Icmanage(void);
extern void Com0_Manage(void);

extern void _TIM5_INTER(void);

extern void _seri_send_c(void);
extern void _seri_rec_c(void);
extern void _seri_ok(void);
extern void seri_er(unsigned char);

extern void _get_time(void);
extern void _set_time(void);

extern void _USER_RESET(void);

extern void _SELECT_FILE02(void);

extern void _SELECT_EF01(void);
extern void _SELECT_EF03(void);
extern void _SELECT_EF05(void);
extern void _SELECT_EF07(void);
extern void _SELECT_EF08(void);
extern void _DISTRIBUTE_INVOICE_NB(void);
extern void _FISCAL_REGISTER(void);
extern void _card_release(void);

extern void Show_code(unsigned char ,unsigned char );
extern void Beep(unsigned char );
extern void Delayms(unsigned int );

extern void Flashrd(unsigned long , unsigned char *, unsigned int );
extern void Flashwr(unsigned long , unsigned char *, unsigned int );
extern void Flashwr_serialdata(unsigned long ,unsigned int );

extern void Callcrc(unsigned char *, unsigned char , unsigned char *);
extern unsigned char Data_cmp(unsigned char,unsigned char *,unsigned char *);
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);
extern void Show_string(unsigned char ,unsigned char *);
/*******************************************************/

//======================================================================//
void    _Initial(void)
{

/*===[ Interrupt enable ]==========================================*/
    	__EI();
/*===[ Call main function ]========================================*/
     	main();
    	__DI();

/*===[ Dummy Loop ]================================================*/
  	for(;;);                                      /*SAMPLE */
}

void login (void)
{
	Buffer[0] = 0x1B;
	Buffer[1] = 0x10;
	Buffer[2] = 0x01;
	Buffer[3] = 0x00;
	Buffer[4] = 0x05;
	Buffer[5] = 0xC4;
	Buffer[6] = 0xC7;
	if ((Debug_code[0] == 0xF5) && (Data_cmp(7,Buffer,rxd) == D_EQUAL))
	{
		system_lock = 0;
		_seri_ok();
	}
	else
	{
		seri_er(0xE1);
		Beep(30);
	}
}

/*===================================================================*/
/* [ Sample of interrupt function ]                                  */
/*   Make interrupt routine to fit your program.                     */
/*===================================================================*/

void __interrupt _INT0()
{//IC卡中断
	Delayms(50);
	INTE0AD = 0x00;
	Icmanage();
	serialdata[0] = 0x55;	/*中断标志的作用*/
	Beep(150);
	INTE0AD = 0x04;
}
void __interrupt _INT4()
{
//    _counter();
}

void __interrupt _INT5()
{

}

void __interrupt _INT6()
{
}

void __interrupt _INT7()
{


}

void __interrupt _INTT0()
{


}

void __interrupt _INTT1()
{
//	_TIME1_INTER();
}

void __interrupt _INTT2()
{


}

void __interrupt _INTT3()
{


}

void __interrupt _INTTR4()
{

}

void __interrupt _INTTR5()
{
	comm_timeout++;
	if (comm_timeout > 50)
	{
		txd[0]=0x57;		//"W"
		txd[1]=0x54;		//"T"
		txd[2]=0x00;
		txd[3]=0x04;
		txd[4]=0x28;
		txd[5]=0x10;
		_seri_send_c();
		comm_timeout = 0;
	}
}
void __interrupt _INTTR6()
{


}
void __interrupt _INTTR7()
{
	_TIM5_INTER();
}

void __interrupt _INTRX0()
{//串口0接收中断

}

void __interrupt _INTTX0()
{//串口0发送中断

}

void __interrupt _INTRX1()
{//串口1接收中断
	INTES0 = 0x00;
	_seri_rec_c();
	if(system_lock)
		login();
//	Com0_Manage();
//	serialdata[0] = 0x55;	/*中断标志的作用*/
	INTES0 = 0x04;		/*注意---在这里以后,串口中断是关闭的,在需要使用的时候,要自己打开*/
	Beep(10);
	command=rxd[2];
}
void __interrupt _INTTX1()
{//串口1发送中断


}


/*===[ Sample for interrupt :                               ]========*/
/*===[       This function has only one instruction 'RETI'  ]========*/
void    __interrupt    _Int_dummy(void)
{

}

/*===================================================================*/
/* [ Define interrupt table ]                                        */
/*   Rewrite the base address of interrupt table to fit your target  */
/*   MCU. Write interrupt functions name you made, as initializer    */
/*   of table.                                                       */
/*===================================================================*/
#define  _SecInt_Name  inttbl     /* Section name of interrupt table */
#define  _BaseIntTbl   0x8000       /* Interrupt table base address */
#define  _SecInt_Attr  const /* Section attribute of interrupt table */
void     _startup(void);    /* Prototype definition for reset vector */
                      /* This function is defined in a 'stc93ml.mac' */

#pragma  section  _SecInt_Attr  _SecInt_Name  _BaseIntTbl
void * const _IntTbl[] = {
          _startup           	/* Reset/SWI 0    */
         ,_Int_dummy         	/* SWI 1          */
         ,_Int_dummy         	/* INTUNDEF/SWI 2 */
         ,_Int_dummy         	/* SWI 3          */
         ,_Int_dummy         	/* SWI 4          */
         ,_Int_dummy         	/* SWI 5          */
         ,_Int_dummy         	/* SWI 6          */
         ,_Int_dummy         	/* SWI 7          */
         ,_Int_dummy         	/* NMI            */
         ,_Int_dummy         	/* INTWD          */
         ,_INT0		        /* INT0           */
         ,_INT4		        /* INT4           */
         ,_INT5		        /* INT5           */
         ,_INT6		        /* INT6           */
         ,_INT7		        /* INT7           */
         ,_Int_dummy         	/* Reserved1      */
         ,_INTT0	        /* INTT0          */
         ,_INTT1        	/* INTT1          */
         ,_INTT2      		/* INTT2          */
         ,_INTT3  	        /* INTT3          */
         ,_INTTR4       	/* INTTR4         */
         ,_INTTR5       	/* INTTR5         */
         ,_INTTR6     		/* INTTR6         */
         ,_INTTR7      		/* INTTR7         */
         ,_INTRX0	 	/* INTRX0         */
         ,_INTTX0       	/* INTTX0         */
         ,_INTRX1   	      	/* INTRX1         */
         ,_INTTX1       	/* INTTX1         */
         ,_Int_dummy       	/* INTAD          */
    };
#pragma  section  _SecInt_Attr

/************************************************************/
//extern void _show(void);

extern void _VERIFY(void);
extern void _READ_RECORD(void);
extern void _READ_BINARY(void);
extern void _UPDATE_RECORD(void);
extern void _VERIFY_FISCAL_PIN(void);
extern void _DAILY_COLLECT_SIGN(void);

extern void _i2cee_byte_rd(void);
extern void _i2cee_seri_rd(void);
extern void _i2cee_byte_wr(void);
extern void _i2cee_seri_wr(void);

extern void Flashrd(unsigned long , unsigned char *, unsigned int );
/************************************************************/

/*	I2c的读操作流程	*/
void I2crd(unsigned long nAdd, unsigned int nSize)
{//I2C的读
	union gyt2 I2cadd_union2;

	/*操作的地址转化和赋值*/
	if( nAdd > 0xFFFF)
	{
		Buffer[0] = 0xA4;
		I2cadd_union2.pr = (unsigned int)(nAdd - 0xFFFF);
	}
	else
	{/*根据地址判断操作的是哪一片E2PROM*/
		if (nAdd < 0x8000)
		{
			Buffer[0] = 0xA0;
			I2cadd_union2.pr = (unsigned int)nAdd;
		}
		else
		{
			Buffer[0] = 0xA2;
			I2cadd_union2.pr = (unsigned int)(nAdd - 0x7FFF);
		}
	}

	Buffer[2] = I2cadd_union2.str[0];	/*操作地址的低位*/
	Buffer[1] = I2cadd_union2.str[1];	/*操作地址的高位*/

	/*操作的数据长度赋值*/
	I2cadd_union2.pr = nSize;
	Buffer[4] = I2cadd_union2.str[0];	/*操作长度的低位*/
	Buffer[3] = I2cadd_union2.str[1];	/*操作长度的高位*/

	if (nSize == 1)
		_i2cee_byte_rd();	/*单字节的读*/
	else
		_i2cee_seri_rd();	/*多字节连续读*/
}

/*	I2c的写操作流程,一次最多写入64字节nSize<=64(0x40)	*/
/*	0x100:选择操作的E2PROM,第一片或第二片		*/
/*	0x101:数据操作地址的高位,同时借用作为数据的偏移量	*/
/*	0x102:数据操作地址的低位				*/
/*	0x103:数据操作长度的高位				*/
/*	0x104:数据操作长度的低位				*/
/*	0x144:操作I2c的error debug码			*/
/*	0x145:数据起始地址				*/
void I2cwr(unsigned long nAdd,unsigned char nSize )
{
	unsigned char error_counter;	/*校验时用来作为错误计数器 */
	unsigned char Lcv_i;		/*循环变量、临时变量	*/
	unsigned char size_num;		/*要写入数据的长度	*/
	unsigned char check_data[64];	/*备份数据,用来校验用	*/
	union gyt2 I2cadd_union2;	/*I2c地址公用体		*/

	/*初始化变量、保存要求写入的数据为校验做准备*/
	error_counter = 3;
	size_num=nSize;
	for (Lcv_i = 0; Lcv_i < nSize; Lcv_i++)
		check_data[Lcv_i] = serialdata[Lcv_i];

	/*根据地址判断操作的是哪一片E2PROM*/
	if ( nAdd > 0xFFFF)
		Buffer[0] = 0xA4;
	else
	{
		if (nAdd < 0x8000)
			Buffer[0] = 0xA0;
		else
			Buffer[0] = 0xA2;
	}

	while (con)
    	{
    		/*操作的地址转化和赋值*/
    		if ( nAdd > 0xFFFF)
			I2cadd_union2.pr = (unsigned int)(nAdd - 0xFFFF);
		else
    		{
    			if (nAdd < 0X8000)
    				I2cadd_union2.pr = (unsigned int)nAdd;
			else
				I2cadd_union2.pr = (unsigned int)(nAdd - 0X7FFF);
		}

		Buffer[2] = I2cadd_union2.str[0];	/*地址低地址*/
		Buffer[1] = I2cadd_union2.str[1];	/*地址高地址*/

		/*操作的数据长度赋值和变量偏移*/
    	    	Buffer[3] = 0;		/*变量偏移*/
    	    	Buffer[4] = nSize;	/*nSize	 */

		if (nSize == 1)
			_i2cee_byte_wr();	/*单字节的写入*/
		else
		{/*多字节的连续写*/
			Lcv_i = (unsigned char)(I2cadd_union2.pr % 0x40);
			Lcv_i = 0x40 - Lcv_i;	/*一页64字节中还剩于没有写的字节数*/

			if (size_num <= Lcv_i)
				_i2cee_seri_wr();/*同一页内的写*/
			else
			{/*跨页的写*/
				Buffer[4] = Lcv_i;
				_i2cee_seri_wr();

				/*检查写完没有?*/
				while(con)
				{
					_i2cee_byte_rd();
					if(Debug_code[0]==0x04)
						break;
				}

				size_num = size_num - Lcv_i;/*Lcv_i为已经写了的个数*/

				Buffer[4] = size_num;	/*大小*/
				Buffer[3] = Lcv_i;		/*变量偏移*/
				I2cadd_union2.pr = I2cadd_union2.pr + Lcv_i;/*地址偏移*/
				Buffer[2] = I2cadd_union2.str[0];
				Buffer[1] = I2cadd_union2.str[1];
				_i2cee_seri_wr();
			}
		}/*end of if(nSize==1)*/
		/*检查写完没有?*/
		while(con)
		{
			_i2cee_byte_rd();
			if(Debug_code[0]==0x04)
				break;
		}
//		Delayms(50);	/*EEPROM写入周期延时*/
		/***以下是校验的过程***/
    	    	I2crd(nAdd, nSize);
    	    	Lcv_i = 0;
    	    	error_counter--;
    	    	while ((check_data[Lcv_i] == serialdata[Lcv_i]) && (Lcv_i < nSize))
    	        	Lcv_i++;

		if (Lcv_i == nSize)
    	    	    return;
    	    	else
    	    	{
    	    	    if (error_counter <= 0)
    	    	    {/*错误次数超过了三次退出*/
//    	    	    	Show_code(0xA4,0);
    	    	        Beep(255);
    	    	        return ;
    	    	    }
    	    	}

    	    	for (Lcv_i = 0; Lcv_i < nSize; Lcv_i++)
    	    		serialdata[Lcv_i] = check_data[Lcv_i];
    	}/*end of while(con)*/
}


unsigned char UPDATE_RECORD(unsigned char CLA,unsigned char P1,unsigned char P2,unsigned char lc,unsigned char *data)
{//修改记录
	unsigned char i;

	SAM_P1[0]=P1;
	SAM_P3[0]=lc;
	for(i=0;i<lc;i++) SAM_DATA[i]=data[i];
	_UPDATE_RECORD();
	if (SAM_P1[0] == 0x90)
		return RIGHT;
	if ((SAM_P1[0] == 0x6A)&&(SAM_P2[0] == 0x84))
		return HUANKA;
	Show_code(SAM_P1[0],SAM_P2[0]);
	return ERROR;
}

unsigned char READ_RECORD(unsigned char P1,unsigned char P2,unsigned char leng,unsigned char *rcmd)
{//读记录
	unsigned char i;

	SAM_P1[0]=P1;
	SAM_P2[0]=P2;
	SAM_P3[0]=leng;

	_READ_RECORD();

	if(SAM_P1[0] == 0x90)
	{
		for (i = 0; i < leng; i++)
			rcmd[i] = SAM_DATA[i];
        	return RIGHT;
	}
	Show_code(SAM_P1[0],SAM_P2[0]);
	return ERROR;
}

unsigned char READ_BINARY(unsigned char P1,unsigned char P2,unsigned char leng,unsigned char *rcmd)
{//读2进制文件
	unsigned char i;

	SAM_P1[0] = P1;
	SAM_P2[0] = P2;
	SAM_P3[0] = leng;

	_READ_BINARY();
	if(SAM_P1[0] == C_RIGHT)
	{
		for (i = 0; i < leng; i++)
			rcmd[i] = SAM_DATA[i];
		return RIGHT;
	}
	Show_code(SAM_P1[0],SAM_P2[0]);
	return ERROR;
}

⌨️ 快捷键说明

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