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

📄 fm.c

📁 一款收款机C源代码!因为是几年前的代码了
💻 C
字号:
/***********************************************************************************
* 									 
*
* Copyright (c) 2003,深圳xx有限公司税控产品事业部
* All rights reserved.
*
* 文件名称:	
* 文件标识:
* 摘要:		符合新国标的税控收款机程序
*
* 当前版本: 1.00
* 作者: 	
* 开始日期: 2003.8
*			
***********************************************************************************/
#include "ecrsys.h"
#include "ftype.h"
#include "data.h"

#if	SW_VER == SW_NE2
// public function declare
byte Fm_ReadByte(dword readAddr);
byte Fm_WriteByte(dword destAddr, byte srcByte);
byte Fm_WriteStr(dword ptr, const void *str, int len);
void Fm_ReadStr(void *str, dword addr, int len);
byte Fm_Exist(void);
void Fm_SetPwr(byte open);
void Fm_SetVpp(byte open);
void Fm_SetVdd(byte open);
void Fm_Init(void);
bool Fm_CheckReadAndWrite(void);
bool Fm_CheckFree(void);

// private function declare
void Fm_WriteData(dword addr, byte sendData);
void Fm_DisInt(void);
void Fm_EnInt(void);


#define	FM_POWER				p14_1
#define	FM_CE					p14_2
#define	FM_OE					p14_3
#define 	FM_SW					p14_0
#define	FM_A16				p14_4
#define	FM_A17				p14_5
#define	FM_A18				p14_6
#define 	FM_VPOE				p9_3
#define	FM_VCCP				p9_4
        	
#define	FM_POWER_DIR		pd14_1
#define	FM_CE_DIR			pd14_2
#define	FM_OE_DIR			pd14_3
#define 	FM_SW_DIR			pd14_0
#define	FM_A16_DIR			pd14_4
#define	FM_A17_DIR			pd14_5
#define	FM_A18_DIR			pd14_6
#define 	FM_VPOE_DIR			pd9_3
#define	FM_VCCP_DIR			pd9_4
        	
#define 	FM_ADDR_LOW			0xc00002
#define 	FM_ADDR_MID			0xc00003
#define 	FM_DATA				p12
#define 	FM_DATA_DIR			pd12
#define 	FM_DATA_PULL		pur3

#define	FM_PWR_CLOSE		0
#define	FM_PWR_OPEN			1
#define	FM_CE_ENABLE		0
#define	FM_CE_DISABLE		1
#define	FM_OE_ENABLE		0
#define	FM_OE_DISABLE		1

/********************************************************************************
* 函数说明:	FM访问时,关闭部分相关中断.
* 输入参数:	void
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_DisInt(void)
{
//	Prn_WaitFree(); 
//	asm("ldipl #5"); 
//	asm("nop"); 
//	asm("nop");
}

/********************************************************************************
* 函数说明:	FM访问后,恢复部分相关中断.
* 输入参数:	void
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_EnInt(void)
{
//	Prn_WaitFree(); 
//	asm("ldipl #0"); 
//	asm("nop"); 
//	asm("nop");
}

/********************************************************************************
* 函数说明:	打开或关闭FM部分电路的电源.
* 输入参数:	open -- TRUE(开)/FALSE(闭)
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_SetPwr(byte open)
{
	if (open == TRUE)
	{
		FM_POWER = FM_PWR_OPEN;
	}
	else
	{
		FM_POWER = FM_PWR_CLOSE;
	}
}

/********************************************************************************
* 函数说明:	打开或关闭FM的Vpp电源.
* 输入参数:	open -- TRUE(开)/FALSE(闭)
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_SetVpp(byte open)
{
	if (open == TRUE)
	{
		FM_VCCP = FM_PWR_OPEN;
	}
	else
	{
		FM_VCCP = FM_PWR_CLOSE;
	}
}

/********************************************************************************
* 函数说明:	打开或关闭FM的Vdd电源.
* 输入参数:	open -- TRUE(开)/FALSE(闭)
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_SetVdd(byte open)
{
	if (open == TRUE)
	{
		FM_VPOE = FM_PWR_OPEN;
	}
	else
	{
		FM_VPOE = FM_PWR_CLOSE;
	}
}

/********************************************************************************
* 函数说明:	读取指定地址的数据.
* 输入参数:	readAddr --- 地址
* 输出参数:	void
* 返回值:	result.
********************************************************************************/
byte Fm_ReadByte(dword readAddr)
{
	byte tByte = 0;
	byte i;

	Fm_SetPwr(TRUE);
	FM_CE = FM_CE_DISABLE;
	FM_OE = FM_OE_DISABLE;
	//FM_PGM;									//屏蔽写允许信号. (now tie to GND)
	Fm_SetVdd(FALSE);							//屏蔽写电压.
	Fm_SetVpp(FALSE);

	Fm_DisInt();

	FM_A16 = !(!(readAddr & 0x10000));			// output high address
	FM_A17 = !(!(readAddr & 0x20000));
	FM_A18 = !(!(readAddr & 0x40000));

	// 1: Address Latch
	tByte = (byte)(readAddr >> 8);				// get in middle address
	Fm_WriteData(FM_ADDR_MID, tByte);
	tByte = (byte)readAddr;						// get in low address
	Fm_WriteData(FM_ADDR_LOW, tByte);

	// 2: enable CE, OE
	FM_CE = FM_CE_ENABLE;
	FM_OE = FM_OE_ENABLE;

	// 3: read in data from port
	FM_DATA_DIR = 0;							// input
	for (i=0; i<10; i++);
	tByte = FM_DATA;  
	Fm_EnInt();  
   
	// 4: disable CE  
	FM_CE = FM_CE_DISABLE;
	FM_OE = FM_OE_DISABLE;

	Fm_SetPwr(FALSE);
	return (tByte);
}

/********************************************************************************
* 函数说明:	将数据写入指定地址.
* 输入参数:	destAddr --- 地址,  srcByte --- 数据,
* 输出参数:	void
* 返回值:	OK/NG.
********************************************************************************/
byte Fm_WriteByte(dword destAddr, byte srcByte)
{
	byte i;
	word j;
	byte tByte;

	Fm_SetPwr(TRUE);

	FM_CE = FM_CE_DISABLE;								// 屏蔽允许信号.
	FM_OE = FM_OE_DISABLE;
	//FM_PGM;									//屏蔽写允许信号. (now tie to GND)
	Fm_SetVdd(FALSE);
	Fm_SetVpp(FALSE);

	for (i=0; i<25; i++)						// Try 25 times
	{
		Fm_DisInt(); 
	
		FM_A16 = !(!(destAddr & 0x10000));		// output high address
		FM_A17 = !(!(destAddr & 0x20000));
		FM_A18 = !(!(destAddr & 0x40000));
	
		tByte = (byte)(destAddr >> 8);			// get in middle address
		Fm_WriteData(FM_ADDR_MID, tByte);
		tByte = (byte)destAddr;					// get in low address
		Fm_WriteData(FM_ADDR_LOW, tByte);

		FM_DATA_DIR = 0xff;						// output
		FM_DATA = srcByte;						// 3: latch data
		Fm_SetVdd(TRUE);						// 3.5: enable VCC and VPP
		Fm_SetVpp(TRUE);

		FM_OE = FM_OE_DISABLE;
		for (j=0; j<30; j++);
		FM_CE = FM_OE_ENABLE;				// 4: enable CE, disable OE
		// Enable FMPRG (indirect tie to GND)
		for (j=0; j<500; j++);					// 5: delay 1 millsecond
		// Disable FMPRG
		FM_CE = FM_OE_DISABLE;				// 6: disable CE
		Fm_SetVdd(FALSE);						// 6.5: disble VCC and VPP
		Fm_SetVpp(FALSE);
		Fm_EnInt();
		tByte = Fm_ReadByte(destAddr);
		if (tByte == srcByte)
		{
			break;
		}
	}
	Fm_SetPwr(FALSE);
	return (i >= 25 ? 0xff : 0);
}

/********************************************************************************
* 函数说明:	将数组写入指定地址.
* 输入参数:	destAddr --- 地址,  *str --- 数组,  len -- 长度
* 输出参数:	void
* 返回值:	OK/NG.
********************************************************************************/
byte Fm_WriteStr(dword ptr, const void *str, int len)
{
	byte  result = 0;
	int i;
	byte * byteptr;

	byteptr = str;

	for (i=0; i<len; i++)
	{
		result = Fm_WriteByte(ptr + i, *byteptr);
		byteptr++;
		if (result == NG)
		{
			break;
		}
	}
	return result;
}

/********************************************************************************
* 函数说明:	从指定地址读取指定长度的数组.
* 输入参数:	*str --- 数组, ptr --- 地址,  len -- 长度
* 输出参数:	void
* 返回值:	OK/NG.
********************************************************************************/
void Fm_ReadStr(void *str, dword addr, int len)
{
	int i;
	byte * byteptr;

	byteptr = str;
	for (i=0; i<len; i++)
	{
		*byteptr = Fm_ReadByte(addr + i);
		byteptr++;
	}
}

/********************************************************************************
* 函数说明:	初始化fm相关引脚工作状态.
* 输入参数:	void
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_Init(void)
{
	FM_CE		= FM_CE_DISABLE;
	FM_OE		= FM_OE_DISABLE;
	FM_A16	= 0;
	FM_A17	= 0;
	FM_A18	= 0;
	Fm_SetVdd(FALSE);
	Fm_SetVpp(FALSE);
	Fm_SetPwr(FALSE);
	
	FM_CE_DIR	= 1;
	FM_OE_DIR	= 1;
	FM_SW_DIR	= 0;
	FM_A16_DIR	= 1;
	FM_A17_DIR	= 1;
	FM_A18_DIR	= 1;
	prc2 = 1;
	FM_VPOE_DIR	= 1;
	prc2 = 1;
	FM_VCCP_DIR	= 1;
	FM_POWER_DIR = 1;							// FM Power control output

	FM_DATA_DIR = 0;
	FM_DATA_PULL = 0xff;
}

/********************************************************************************
* 函数说明:	检查FM是否存在.
* 输入参数:	void
* 输出参数:	void
* 返回值:	true / false
********************************************************************************/
byte Fm_Exist(void)
{
	if (FM_SW)
	{
		return false;
	}
	else
	{
		return true;
	}
}

/********************************************************************************
* 函数说明:	向FM数据总线送指定数据,并锁存至指定端口.
* 输入参数:	addr -- 地址, sendData -- 数据,
* 输出参数:	void
* 返回值:	void
********************************************************************************/
void Fm_WriteData(dword addr, byte sendData)
{
	*(byte *)addr = sendData;
}

/******************************************************************************
Description: check fm all free (not include first and last byte)
******************************************************************************/
bool Fm_CheckFree(void)
{
	dword addr;
	
	if (Fm_Exist() != true)
	{
		return false;
	}
	for (addr = 1; addr < FM_SIZE - 1; addr++)
	{
		if (Fm_ReadByte(addr) != 0xff)
		{
			return false;
		}
	}
	return true;
}

/******************************************************************************
Description: check fm write & read OK (only write first and last byte)
				 first address byte -- 0x55;		last address byte -- 0xaa;
******************************************************************************/
bool Fm_CheckReadAndWrite(void)
{
	if (Fm_Exist() == true)
	{
		if ((Fm_ReadByte(FM_HEAD_ADDR) == 0xff) && 
			 (Fm_ReadByte(FM_TAIL_ADDR) == 0xff))
		{
			if ((Fm_WriteByte(FM_HEAD_ADDR, FM_HEAD_INFO) == OK) && 
				 (Fm_WriteByte(FM_TAIL_ADDR, FM_TAIL_INFO) == OK))
			{
				return true;
			}
		}
	}
	return false;
}
#endif

⌨️ 快捷键说明

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