#include "includes.h"

//结构定义在KF8_Type_Define.h中
s_Dataeeprom_Buffer Dataeeprom_Buffer;
/***********************************************************************************
 * 函数名     	：Dataeeprom_SingleData_Read
 * 函数功能	：Data eeprom 读出指定地址的单字节数据
 * 入口参数	：地址
 * 返回         ：    内容
 * Data eeprom 读出指定地址的单字节数据
 **********************************************************************************/
unsigned char Dataeeprom_SingleDate_Read(unsigned char addr)
{
#pragma save
#pragma disable_warning 59
#pragma disable_warning 85
	__asm
	;//  char 型参数位于R0中
	BANKSEL  NVMADDRL
	MOV NVMADDRL , R0				//写入地址

	//数据读入函数
	MOV R0 , #0x01
	MOV NVMCTL0 , R0
	NOP
	NOP
	MOV R0,NVMDATAL
	;// char 型结果返回内容位于R0中
	__endasm;
#pragma restore
}
/***********************************************************************************
 * 函数名     	：Dataeeprom_Data_Read
 * 函数功能	： 读出指定地址的多字节数据
 * 入口参数	：地址  字节长度【1-DATAEEPROM_BUFFER_SIZE】
 * 返回         ：    定义的缓存数组
 * Data eeprom 读出指定地址的多字节数据
 **********************************************************************************/
void Dataeeprom_Data_Read(unsigned char addr,unsigned char len)
{
#pragma save
#pragma disable_warning 59
#pragma disable_warning 85
	__asm

	;//  char 型参数位于R0中  和STK00中
	MOV R1,#_Dataeeprom_Buffer  //起始地址

	BANKSEL  NVMADDRL
	MOV NVMADDRL , R0				//写入地址
Read_Enter_Flag_Dataeeprom_Data_Read:
	//数据读入函数
	MOV R0 , #0x01
	BANKSEL  NVMCTL0
	MOV NVMCTL0 , R0
	NOP
	NOP
	// 地址++
	BANKSEL  NVMADDRL
	INC  NVMADDRL
	// 结果存贮
	BANKSEL  NVMDATAL
	MOV R0,NVMDATAL
	BANKSEL _Dataeeprom_Buffer
	ST [R1],R0
	INC R1
	// 循环控制
	BANKSEL STK00
	DECJZ STK00
	JMP Read_Enter_Flag_Dataeeprom_Data_Read
	__endasm;
#pragma restore
}

/***********************************************************************************
 * 函数名     	：Dataeeprom_SingleData_Write
 * 函数功能	：Data eeprom 写入指定地址的单字节数据
 * 入口参数	：指定地址
 * 			  指定内容
 * 返回         ：无
 * Data eeprom 写入指定地址的单字节数据
 **********************************************************************************/
void Dataeeprom_SingleData_Write(unsigned char addr,unsigned char value)
{

#pragma save
#pragma disable_warning 59
#pragma disable_warning 85

#if 0
	__asm
	;//  参数 地址：r0;参数值，自动变量STK00
	BANKSEL NVMADDRL
	MOV NVMADDRL , R0

	BANKSEL STK00
	MOV R1,STK00
	BANKSEL NVMDATAL
	MOV NVMDATAL,R1
	;// 数据写入执行
	MOV R0 , #0x04
	MOV NVMCTL0 , R0
	MOV R0 , #0x69
	MOV NVMCTL1 , R0
	MOV R0 , #0x96
	MOV NVMCTL1 , R0
	SET NVMCTL0 , 1
	NOP
	NOP
	NOP
	NOP
	;//.............................

	MOV R0 , #0x00				//关闭DATA EE的写操作，防止意外写
	MOV NVMCTL0,R0
	;//............................

	__endasm;
#else
		__asm
		;//  参数 地址：r0;参数值，自动变量STK00
		BANKSEL NVMADDRL
		MOV NVMADDRL , R0

		BANKSEL STK00
		MOV R1,STK00
		BANKSEL NVMDATAL
		MOV NVMDATAL,R1
		;// 建议的关闭中断
		CWDT
		BANKSEL INTCTL
		MOV R1,INTCTL
		CLR INTCTL,7
		JNB INTCTL,7
		JMP $-2
		;//

		;// 数据写入执行
		MOV R0 , #0x04
		MOV NVMCTL0 , R0
		MOV R0 , #0x69
		MOV NVMCTL1 , R0
		MOV R0 , #0x96
		MOV NVMCTL1 , R0
		SET NVMCTL0 , 1
		NOP
		NOP
		NOP
		NOP
		;//.............................
		JB EIF2,7
		JMP $-1				//等待写入完成（6ms)，可以考虑写控制，外部判断写完成下，屏蔽这些代码
		CLR EIF2,7

		MOV R0 , #0x00				//关闭DATA EE的写操作，防止意外写
		MOV NVMCTL0,R0
		;//............................
		;// 如果关了中断，中断还原
		AND R1,#0xC0
		BANKSEL INTCTL
		ORL INTCTL,R1
		__endasm;
#endif
#pragma restore
}
/***********************************************************************************
 * 函数名     	：Dataeeprom_data_write
 * 函数功能	：Data eeprom 写入指定地址的多个字节数据
 * 入口参数	： 待写入多个字节数据数组Dataeeprom_Buffer[]内容 ，起始地址，写长度
 *
 * 返回         ：无
 * Data eeprom 写入指定地址的多个字节数据
 **********************************************************************************/
void Dataeeprom_Data_Write(unsigned char addr,unsigned char len)
{
#pragma save
#pragma disable_warning 59
#pragma disable_warning 85
	__asm
	;//  参数  R0   参数自动变量 STK00
	BANKSEL  NVMADDRL
	MOV NVMADDRL , R0				//写入地址

	;// 建议的关闭中断
	BANKSEL INTCTL
	MOV R1,INTCTL
	CLR INTCTL,7
	JNB INTCTL,7
	JMP $-2
	;//
	MOV R6 , #_Dataeeprom_Buffer	//将数组的首地址送到R1   低位在低位 高位在高位对称
	;// 值传递 和地址更新
Write_Enter_Flag_Dataeeprom_Data_Write:
		CWDT
		BANKSEL _Dataeeprom_Buffer
		LD R0 , [ R6 ]				//向R6中写入数据
		BANKSEL NVMDATAL
		MOV NVMDATAL,R0

		// 数据写入执行
		MOV R0 , #0x04
		MOV NVMCTL0 , R0
		MOV R0 , #0x69
		MOV NVMCTL1 , R0
		MOV R0 , #0x96
		MOV NVMCTL1 , R0
		SET NVMCTL0 , 1
		NOP
		NOP
		NOP
		NOP
		;//.............................
		JB EIF2,7
		JMP $-1						//等待写入完成（6ms)，可以考虑写控制，外部判断写完成下，屏蔽这些代码
		CLR EIF2,7

		MOV R0 , #0x00				//关闭DATA EE的写操作，防止意外写
		MOV NVMCTL0,R0
		;//............................
		INC R6							//指向下一个字节
		INC NVMADDRL					//操作地址指向下一个
		;// 循环控制
		BANKSEL STK00
		DECJZ STK00
		JMP Write_Enter_Flag_Dataeeprom_Data_Write
		;//............................
		;// 如果关了中断，中断还原
		AND R1,#0xC0
		BANKSEL INTCTL
		ORL INTCTL,R1
	    __endasm;
#pragma restore
}




