//*****************************************************   
//Copyright (c) 2021, 苏州华芯微电子股份有限公司
//All rights reserved                                 
//
//文件名称: HS16F3211_EEPROM
//摘    要: HS16F3211-EEPROM功能演示
//			在E2固定地址写一个数据，在读出来对比，对比成功 DemoPortOut/PB0反转一次
//
//当前版本: 1.0                                      
//作    者: 华芯微MCU组
//完成日期: 2021.09.01
//*****************************************************   
#include 	<hs16f3211.h> 
//***********************宏定义*****************************
#define  unchar     unsigned char 
#define  unint      unsigned int
#define  unlong     unsigned long
#define  DemoPortOut	FPB0
#define	 NOP()		asm("NOP")   
#define	CLRWDT()	asm("clrwdt")   
/*-------------------------------------------------
 *  函数名：GPIO_Init
 *	功能：  GPIO设置
 *  输入：  无
 *  输出：  无
 --------------------------------------------------*/	
void GPIO_Init(void) 
{ 
	OPTION= 0b00000000; //Bit7 INT1EDG, 外部中断1触发方式 0 INT1引脚下降沿触发
                        //Bit6 INTEDG, 外部中断 触发方式 0 INT引脚下降沿触发
                        //Bit5 T0CS, TMR0时钟源选择位 0 内部指令时钟
                        //Bit4 T0SE, TMR0时钟源边沿选择位 0 T0CKI引脚下降沿触发计数
                        //Bit1 PSA, 预分频分配位 0 预分频器分配给TMR0
                        //Bit2:0 PS[2:0], 预分频配置 010 '8分频
    
    PORTA = 0b00000000;	
    IOSTA = 0b00000000;	//PA输入输出 0-输出 1-输入
                        //PA口->全输出
    PORTB = 0b00000000;	
    IOSTB = 0b00000000;	//PB输入输出 0-输出 1-输入
                        //PB口->全输出
}

/*-------------------------------------------------
 *  函数名：delay_ms
 *	功能：  写入参数 x,可以延时xMS
 *  输入参数：  x
 --------------------------------------------------*/	
void delay_ms(unint x)
{
	unint m,n;
	for(m=0;m<x;m++)
	{	
		for(n=0;n<140;n++)
		CLRWDT();
	}
}

/*-------------------------------------------------
 *  函数名：EEPROM_Write_1Byte
 *	功能：  EE指定地址，写入一个字节数据
 *  指定地址：  EEPROM_Addr
 *  写入数据：  EEPROM_Data
 --------------------------------------------------*/	
void EEPROM_Write_1Byte(unsigned char EEPROM_Addr,unsigned char EEPROM_Data)
{	
	EECON = 0x00;	        //-0-- 0000;//EE控制寄存器 初始化 清0；
    						//Bit7 : - 空
    						//Bit6 : TIMEEE ;操作时长默认写1
                        	//Bit5 : - 空
                        	//Bit4 : - 空
                        	//Bit3 : ERSALLEE,全擦使能  1=EN；0=DIS
                        	//Bit2 : ERASEEE,位擦使能   1=EN；0=DIS
                        	//Bit1 : PROGEE,写操作使能  1=EN；0=DIS
                        	//Bit0 : READEE,读操作使能  1=EN；0=DIS
                        	
	FTIMEEE	 = 1;			//擦出时间 *2    ;操作时长默认写1
	EEADR = EEPROM_Addr;	//写入地址
	NOP();
	FERASEEE = 1;			//位擦使能：1=EN；0=DIS
	NOP();	
	while(FERASEEE);		//等待位擦结束？,写入数据之前，需要先擦除数据
	EEDATL = EEPROM_Data;	//写入数据
	FPROGEE = 1;			//编程使能：1=EN；0=DIS
	while(FPROGEE);	 	    //等待写数据结束
	delay_ms(5);
	
}

/*-------------------------------------------------
 *  函数名：EEPROM_Read_1Byte
 *	功能：  EE指定地址，读取一个字节数据
 *  指定地址：  EEPROM_Addr
 *  返回数据：  ReadEeprom_Data
 --------------------------------------------------*/	
unsigned char EEPROM_Read_1Byte(unsigned char EEPROM_Addr)
{ 
	unsigned char ReadEeprom_Data=0x00;	
	EECON = 0x00;	    	//-0-- 0000;//EE控制寄存器 初始化 清0；
    						//Bit7 : - 空
    						//Bit6 : TIMEEE ;操作时长默认写1
                        	//Bit5 : - 空
                        	//Bit4 : - 空
                        	//Bit3 : ERSALLEE,全擦使能  1=EN；0=DIS
                        	//Bit2 : ERASEEE,位擦使能   1=EN；0=DIS
                        	//Bit1 : PROGEE,写操作使能  1=EN；0=DIS
                        	//Bit0 : READEE,读操作使能  1=EN；0=DIS
	EEADR = EEPROM_Addr;	//所读数据的地址
	FREADEE = 1;			//读使能：1=EN；0=DIS
	NOP();
	ReadEeprom_Data = EEDATL;//读出数据
	return ReadEeprom_Data;	//返回数据
}

//****主函数****//
void main(void) 
{
	CLRWDT();  //清看门狗
    GPIO_Init();
    EEPROM_Write_1Byte(0X10,0X5A);       //在0X10地址,写入0X5A   
    while(1)
    {	
    	CLRWDT();
      	if(EEPROM_Read_1Byte(0X10)==0X5A)//在0X10地址读取数据，判断是否是0X5A  
      	{
      		DemoPortOut=~DemoPortOut;
      	}
      	 delay_ms(100);
    }
}






