//*********************************************************************** 
//Copyright (c) 2024   HuaXin Micro-electronics Co.,Ltd 

//HS16F1211
//EEPROM
//configuration introduction

//designer:LvBuWei
//updata：20240612


//EE_TEST:
//EE全擦读出来数据为FF；
//验证方法：对地址写相反的数据；
		//0x00 写 0xff（地址与数据互补）
		//0x01 写 0xfe（地址与数据互补）
		//读出来的数据写到RAM上面：0x20~0x6F；验证正确；
		
//*********************************************************************** 
//Files include 
#include 	"hs16f1211.h" 
#include 	"main.h"		

 
//****interrupt function****//
void interrupt myIsr(void)    
{ 
	if(FT0IF) 
	{ 
		FT0IF = 0; 
	} 
} 

unsigned char EE_Temp_ADR;
unsigned char EE_Temp_DAT;
unsigned char EE_Read_DAT;

//****main function****//
void main(void) 
{ 
	GPIO_Init(); 
	CLR_BANK0_RAM();
	CLR_BANK1_RAM();
	
	EE_Temp_ADR = 0x00;
	EE_Temp_DAT--;
	
	EEPROM_CLR_ALL(EE_Temp_ADR);
	
	while(1) 
	{ 
		CLRWDT 
		PORTA = PORTA^0xff;	
		
		EEPROM_Write_1Byte(EE_Temp_ADR,EE_Temp_DAT);		
		EE_Read_DAT = EEPROM_Read_1Byte(EE_Temp_ADR);
		
		if(EE_Temp_DAT == EE_Read_DAT)	
		{
			SendDataRF(EE_Temp_DAT);//PB0
			SendDataRF(EE_Read_DAT);
			#asm
				MOVIA	020H & 07FH
				ADDAR	_EE_Temp_ADR,W
				MOVAR	_FSR
				MOVR	_EE_Read_DAT,W
				MOVAR	_INDF				
			#endasm
			EE_Temp_ADR++;
			EE_Temp_DAT--;
		}
		//else	SendDataRF(0xff);
		
		DelayUs(100);
		DelayUs(100);		
	} 
} 
 


//****RollingData Send For Test**** 
#define	SendPin		FPB0 
#define	TimePart	10	 
void SendDataRF(unsigned char sendData) 
{ 
	unsigned char Cnt; 
	CLRWDT
	SendPin=0; 
	for(Cnt = 0;Cnt < 8;Cnt++) 
	{ 
		if(sendData & 0x80) 
		{ 
			SendPin = 1; 
			DelayUs(TimePart*3); 
			SendPin = 0; 
			DelayUs(TimePart);			 
		} 
		else 
		{ 
			SendPin = 1; 
			DelayUs(TimePart); 
			SendPin = 0; 
			DelayUs(TimePart*3);	 
		} 
		sendData = sendData<<1; 
	} 
} 
/********EEPROM-Write********** 
entrance parameter：	EEPROM_Addr：EE-write Addr 
******************************/ 
void EEPROM_CLR_ALL(unsigned char EEPROM_Addr)
{
	EECON1 = 0x00;	//--00 0000;//EE control reg clr；
					//;Bit5：TIMEE0:EEPROM 操作时长选择位。
					//;Bit4：ERSX16：16Byte 擦操作使能。
					//;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
					//;Bit2：ERASEEE：ERASE（位擦）操作使能。
					//;Bit1：PROGEE：PROG 操作使能。
					//;Bit0：READEE：READ 操作使能
					
	EEADRL = EEPROM_Addr;	//EE-write Addr 
	NOP 
	FERSALLEE = 1;			//Bit-ERALL Enable：1=EN；0=DIS 
	FERASEEE = 1;			//Bit-ERASE Enable：1=EN；0=DIS 
	NOP
	while(FERASEEE);		//Bit-ERASE over flag 
}

/********EEPROM-Write********** 
entrance parameter：	EEPROM_Addr：EE-write Addr 
		 				EEPROM_Data：EE-write Data 
******************************/ 
void EEPROM_Write_1Byte(unsigned char EEPROM_Addr,unsigned char EEPROM_Data) 
{	 
	EECON1 = 0x00;	//--00 0000;//EE control reg clr；
					//;Bit5：TIMEE0:EEPROM 操作时长选择位。
					//;Bit4：ERSX16：16Byte 擦操作使能。
					//;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
					//;Bit2：ERASEEE：ERASE（位擦）操作使能。
					//;Bit1：PROGEE：PROG 操作使能。
					//;Bit0：READEE：READ 操作使能
	 
	FTIMEE0	 = 0;			//ERASE-Time *2 
	EEADRL = EEPROM_Addr;	//EE-write Addr 
	 
	NOP 
	FERASEEE = 1;			//Bit-ERASE Enable：1=EN；0=DIS 
	NOP	 
	while(FERASEEE);		//Bit-ERASE over flag 
	
	EEDATL = EEPROM_Data;	//EE-write Data 
	FPROGEE = 1;			//PROGEE：1=EN；0=DIS 
	while(FPROGEE);	 	 
} 
 
/********EEPROM-Read******** 
entrance parameter：	EEPROM_Addr：EE-write Addr 
exit parameter:			EEPROM_Data：EE-read Data 
******************************/ 
unsigned char EEPROM_Read_1Byte(unsigned char EEPROM_Addr) 
{  
	unsigned char ReadEeprom_Data;	 
	 
	EECON1 = 0x00;	//--00 0000;//EE control reg clr；
					//;Bit5：TIMEE0:EEPROM 操作时长选择位。
					//;Bit4：ERSX16：16Byte 擦操作使能。
					//;Bit3：ERSALLEE：ERSALL（全擦）操作使能。
					//;Bit2：ERASEEE：ERASE（位擦）操作使能。
					//;Bit1：PROGEE：PROG 操作使能。
					//;Bit0：READEE：READ 操作使能
	 
	EEADRL = EEPROM_Addr;	//EE-Read Addr 
	 
	FREADEE = 1;			//Read-bit：1=EN；0=DIS 
	NOP 
	ReadEeprom_Data = EEDATL;//Read-Data 
	 
	return ReadEeprom_Data;	//Return data 
} 

//****GPIO configuration****//
void GPIO_Init(void) 
{
	OPTION= 0b000000000;//0000 0000	
			//;Bit7：INT1EDG：外部中断1触发方式选择位（PB1）;0-falling edge, 1-rising edge
			//;Bit6：INTEDG：外部中断触发方式选择位（PB0）	;0-falling edge, 1-rising edge
			//;Bit5：T0CS：TMR0时钟源选择位					;0-fcpu, 1-ExitClock
			//;Bit4：T0SE：TMR0时钟源边沿选择位				;0-falling edge, 1-rising edge
			//;Bit3：PSA：预分频分配位						;0-TMR0, 1-WDT
			//;Bit2~Bit0：PS2:PS0：预分频比率选择位

	PCON  = 0b00100000;	//101- ----		
			//;Bit7：WDTE: WDT（看门狗定时器）使能位	;0-DIS, 1-EN
			//;Bit6：EIS: IOB0/INT引脚定义位			;0-DIS, 1-EN
			//;Bit5：LVREN: 低电压复位使能位			;0-DIS, 1-EN
					
//PORTA //----------------------------------------------------------------------
	PORTA = 0b00000000;	
	TRISA = 0b00000000;	//(0-OUT;1-IN) 		
	PAHCON= 0b11111111;	//--11 1111 :1-DIS;0-EN 
	PADCON= 0b11111111;	//--11 ---- :1-DIS;0-EN 	
	PAIC0 = 0b00000000;	//--00 0000 :1-EN;0-DIS
	
	PDCON = 0b11111111;	//0000 0000 :1-DIS;0-EN[pdb3/pdb2/pdb1/pdb0/ /pda3/pda2/pda1/pda0]
	PDCON2= 0b11111111;	//--00 0000 :1-DIS;0-EN[-/-/pda5/pda4/ /pdb7/pdb6/pdb5/pdb4]
//PORTB //----------------------------------------------------------------------
	PORTB = 0b00000000;	
	TRISB = 0b00000000;	//(0-OUT;1-IN) 		
	PBIC0 = 0b00000000;	//1111 1111 :1-EN;0-DIS	
	WUCON = 0b00000000;	//0000 0000	:1-EN;0=DIS 
	ODCON = 0b00000000;	//1111 -111 :1-EN;0-DIS 	
	PHCON = 0b11111111;	//1111 1111 :1-DIS;0-EN 
	//----------------------------------------------------------------------
}


//****************************************************  
//CLR_BANK0_RAM: 
//C中嵌入ASM，指令操作特殊寄存器前面需要加下划线“_”;
//****************************************************    
void CLR_BANK0_RAM(void)
{
#asm  
	MOVLW	0X5F
	MOVWF	020H
	MOVLW	0X7F
	MOVWF	_FSR
	
BANK0_RAM_CLR_LOOP:	
	CLRF	_INDF
	DECF	_FSR,F
	DECFSZ	020H,F
	GOTO	BANK0_RAM_CLR_LOOP		
#endasm	   
}


//****************************************************  
//CLR_BANK1_RAM: 
//C中嵌入ASM，指令操作特殊寄存器前面需要加下划线“_”;
//****************************************************    
void CLR_BANK1_RAM(void)
{
#asm  	
	MOVLW	(0x80 | 03FH)
	MOVWF	_FSR
	MOVLW	020H	//;32*reg-bank1
	MOVWF	020H
	
BANK1_RAM_CLR_LOOP:	
	CLRF	_INDF
	DECF	_FSR,F
	DECFSZ	020H,F
	GOTO	BANK1_RAM_CLR_LOOP	
	RETURN	
#endasm	   
}


//****delay function****// 
//;Fcpu=1MHz;DelayUs = 11+7x     
void DelayUs(unsigned char delayUs)     
{      
	while(delayUs--);    
} 
