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

📄 dataflash.c

📁 门禁控制器源代码
💻 C
字号:
#include "Global.h"

// 全局变量定义
extern struct  Para
{
	uchar Wiegand_format;			// 1、韦根通信1 个字节,3 种选择,1~4
	uchar Machine_addr;				// 2、终端编号1 个字节,1~254
	uchar Area_addr;				// 3、终端区域编号1 个字节,1~240
	uchar Secu_class;				// 4、安全等级1 个字节,1~10
	uchar Match_mode;				// 5、匹配模式1 个字节,1~2
	uchar Lock_para;				// 6、锁控参数1 个字节,1~3
	uchar Baudrate;					// 7、串口速率1 个字节,1~6
};

extern union Para_u
{
	uchar para_dat[7];
	struct Para Actual_para;
}Para_ee;							// 控制器参数


///////////////////////////////////////////////////////////////////////////////
// 开启DATAFLASH
///////////////////////////////////////////////////////////////////////////////
void ISP_IAP_enable(void)
{
	EA	=	0;	/* 关中断 */
	ISP_CONTR	=	ISP_CONTR & 0x18;       /* 0001,1000 */
	ISP_CONTR	=	ISP_CONTR | WAIT_TIME;
	ISP_CONTR	=	ISP_CONTR | 0x80;       /* 1000,0000 */
}

///////////////////////////////////////////////////////////////////////////////
// 关闭DATAFLASH
///////////////////////////////////////////////////////////////////////////////
void ISP_IAP_disable(void)
{
	ISP_CONTR	=	ISP_CONTR & 0x7f;	/* 0111,1111 */
	ISP_TRIG	=	0x00;
	EA			=   1;                	/* 开中断 */
}

///////////////////////////////////////////////////////////////////////////////
// 从DATAFLASH读一个字节
///////////////////////////////////////////////////////////////////////////////
uchar byte_read(uint byte_addr)
{
	ISP_ADDRH=(uchar)(byte_addr>>8);		// 地址高字节
	ISP_ADDRL=(uchar)(byte_addr&0x00ff);	// 地址低字节

	ISP_CMD=ISP_CMD&0xf8;					// 1111,1000
	ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;	// 0000,0001

	ISP_IAP_enable();		// 允许ISP

	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;
	_nop_();

	ISP_IAP_disable();		// 不允许ISP

	return (ISP_DATA);
}

///////////////////////////////////////////////////////////////////////////////
// 擦除DATAFLASH的一个扇区
///////////////////////////////////////////////////////////////////////////////
uchar sector_erase(uint sector_addr)
{
	uint get_sector_addr=0;

	get_sector_addr=(sector_addr&0xfe00);	// 1111,1110,0000,0000; 取扇区地址
	ISP_ADDRH=(uchar)(get_sector_addr>>8);
	ISP_ADDRL=0x00;

	ISP_CMD=ISP_CMD&0xf8;			// 1111,1000
	ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command;	// 0000,0011

	ISP_IAP_enable();

	ISP_TRIG=0x46;			// 触发ISP_IAP命令
	ISP_TRIG=0xb9;			// 触发ISP_IAP命令
	 _nop_();

	ISP_IAP_disable();

	return OK;
}

///////////////////////////////////////////////////////////////////////////////
// 向DATAFLASH写一个字节
///////////////////////////////////////////////////////////////////////////////
uchar byte_write(uint byte_addr, uchar original_data)
{
	ISP_ADDRH=(uchar)(byte_addr>>8);		// 地址高字节
	ISP_ADDRL=(uchar)(byte_addr&0x00ff);	// 地址低字节

	ISP_CMD=ISP_CMD&0xf8;					// 1111,1000
	ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command;	// 0000,0010
	ISP_DATA=original_data;

	ISP_IAP_enable();

	ISP_TRIG=0x46;
	ISP_TRIG=0xb9;
	_nop_();

	ISP_DATA=0x00;					// 读出来校验

	ISP_CMD=ISP_CMD&0xf8;					// 1111,1000
	ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command;	// 0000,0001

	ISP_TRIG=0x46;			// 触发ISP_IAP命令
	ISP_TRIG=0xb9;			// 触发ISP_IAP命令
	_nop_();

	ISP_IAP_disable();

	if(ISP_DATA==original_data)
		return	OK;
	else
		return	ERROR;
}

///////////////////////////////////////////////////////////////////////////////
// 读取系统参数
///////////////////////////////////////////////////////////////////////////////
void Read_Para()
{
	idata uchar i;

	for(i=0;i<7;i++)
		Para_ee.para_dat[i]=byte_read(0x8000+i);	// 逐个读
}

///////////////////////////////////////////////////////////////////////////////
// 保存系统参数
///////////////////////////////////////////////////////////////////////////////
void Write_Para()
{	
	idata uchar i;

	sector_erase(0x8000);	// 擦除扇区

	for(i=0;i<7;i++)
		byte_write(0x8000+i, Para_ee.para_dat[i]);	// 逐个写
}

⌨️ 快捷键说明

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