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

📄 flash.c

📁 Flash c 程序
💻 C
字号:
/*
*Copyright(c) 2007
*All rights reserved
*filename: FLASH.c
*current edition 2.0
* 2007-6
*/
unsigned char FLASH_R_BYTE(unsigned char Page,unsigned int F_Addr)
{
	unsigned char ch;

	EA=0;

	F_ADR_2 = ( (portU09Data&0xe0) | Page );//将page送于portU09的低5位
	ch=(F_Addr>>8)&0xff;
	F_ADR_1 = ch;
	ch=F_Addr&0xff;
	F_ADR_0 = ch;

	F_DATA  = FlashCommandReadArray;

    _nop_();
    _nop_();

	ch = F_DATA;

	EA=1;
	return(ch);
}
unsigned int  FLASH_R_UNINT(unsigned char Page, unsigned int F_Addr)
{
	unsigned char ch;
	unsigned int unIntData;

	unIntData=FLASH_R_BYTE(Page,F_Addr);

	ch=FLASH_R_BYTE(Page,F_Addr+1);
	unIntData=unIntData*256+ch;

    return(unIntData);
}
/*
int FLASH_R_INT(unsigned char Page,unsigned int F_Addr)
{
	int intData;
	unsigned char *ptrUCToInt;
	
	ptrUCToInt=(unsigned char *)&intData;
	*ptrUCToInt=FLASH_R_BYTE(Page,F_Addr);
	ptrUCToInt++;
	*ptrUCToInt=FLASH_R_BYTE(Page,F_Addr+1);

	return (intData);
}

unsigned long FLASH_R_UNLOMG(unsigned char Page,unsigned int F_Addr)
{
	unsigned char i;
	unsigned char *ptrUCToUnLong;
	unsigned long unLongData;

	ptrUCToUnLong=(unsigned char *)&unLongData;
	for (i=0; i<4; i++)
	{
		*ptrUCToUnLong=FLASH_R_BYTE(Page,F_Addr+i);
		ptrUCToUnLong++;
	}

	return (unLongData);
}
*/

unsigned char FLASH_W_BYTE(unsigned char Page, unsigned int F_Addr, unsigned char Data)
{
	unsigned char statusR;
	unsigned int i;
	unsigned char ch;

	EA=0;

	F_ADR_2 = ( (portU09Data&0xe0) | Page );//将page送于portU09的低5位
	ch=(F_Addr>>8)&0xff;
	F_ADR_1 = ch;
	ch=F_Addr&0xff;
	F_ADR_0 = ch;

	F_DATA = FlashCommandWrite;
	
	_nop_();
	_nop_();

	F_DATA = Data;
	_nop_();
	_nop_();
	F_DATA = FlashCommandStatus;

	i=0;
	while(i < 60000)
	{
		//////////
		SDA_PCFCAT=0;
		SDA_PCFCAT=1;
		//////////
		i++;
		statusR=F_DATA;
		ch =statusR & 0x80;
		if( ch != 0 ) break;
	}

	//ch =statusR & 0x10;//通过 statusR 可以检测各种错误

	F_DATA = FlashCommandClear;
	
    EA=1;

    ch=statusR&0x1a;
	return(ch);

}

unsigned char FLASH_W_UNINT(unsigned char Page, unsigned int F_Addr, unsigned int unIntData)
{
	unsigned char ch;
	unsigned char uncData;

	uncData=unIntData >> 8;
	ch=FLASH_W_BYTE(Page, F_Addr,  uncData);

	uncData=unIntData & 0xff;
	ch=FLASH_W_BYTE(Page, F_Addr+1, uncData);

	return(ch);
}


/*
unsigned char FLASH_W_INT(unsigned char Page, unsigned int F_Addr, int Data)
{
	unsigned char *ptrUCToInt;
	unsigned char ch;

    ptrUCToInt=(unsigned char *)&Data;

	ch=FLASH_W_BYTE(Page,F_Addr,  *ptrUCToInt);
	//if(ch!=0) return(ch);

	ptrUCToInt++;
	ch=FLASH_W_BYTE(Page,F_Addr+1,*ptrUCToInt);
	return(ch);
}
unsigned char FLASH_W_UNLONG(unsigned char Page,unsigned int F_Addr,unsigned long Data)
{
	unsigned char i;
	unsigned char ch;
	unsigned char *ptrUCToUnLong;


    ptrUCToUnLong=(unsigned char *)&Data;
	for(i=0; i<4; i++)
	{
		ch=FLASH_W_BYTE(Page,F_Addr,  *ptrUCToUnLong);
		//if(ch!=0) {return(ch);break;}
		ptrUCToUnLong++;
	}
	return(ch);
}*/

void FLASH_CLR_LOCK(unsigned char Page)   // Clear Lock-Bit 
{
	unsigned char ch;
	unsigned int i;

	EA=0;

	F_ADR_2 = ( (portU09Data&0xe0) | Page );
	F_ADR_1 = 0;
	F_ADR_0 = 0;
	
	F_DATA = FlashBlockLock_Bits;//0x60
	_nop_();
	_nop_();
	F_DATA = FlashCommandConfirm;//0xD0
	_nop_();
	_nop_();
	F_DATA = FlashCommandStatus; //0x70

	i=0;
	while(i < 80000)
	{
		//////////
		SDA_PCFCAT=0;
		SDA_PCFCAT=1;
		//////////
		i++;
		ch = F_DATA & 0x80;
		if( ch != 0 ) 
		break;
	}
///////////////////
	DecToNo(i, 5);	
	for (i=0; i<5;i++)
	{
		Disp(1,1+i,16,8,*(number0+numberArray[i]));	
	}
///////////////////
	F_DATA = FlashCommandClear;

	EA=1;
}

void FLASH_BLK_ERASE(unsigned char Page)   // Block Erase
{
	unsigned char ch;
	unsigned int i;

	EA=0;

	FLASH_CLR_LOCK(Page);
	//FLASH_CLR_LOCK(Page);

	F_ADR_2 = ( (portU09Data&0xe0) | Page );
	F_ADR_1 = 0;
	F_ADR_0 = 0;
	
	F_DATA = FlashCommandErase;
	F_DATA = FlashCommandConfirm;
	F_DATA = FlashCommandStatus;
   
	i=0;
	while(i < 60000)
	{
		//////////
		SDA_PCFCAT=0;
		SDA_PCFCAT=1;
		//////////
		i++;
		ch = F_DATA & 0x80;
		if( ch != 0 ) break;
	}

	DecToNo(i, 5);	
	for (i=0; i<5;i++)
	{
		Disp(1,8+i,16,8,*(number0+numberArray[i]));	
	}

	F_DATA = FlashCommandClear;

	EA=1;
}

void FlashRecCurData(void)//存储当前的值
{

//	inHourTimes++;
//	hourSumDataSO2+=currentDataSO2;
//	hourSumDataNO2+=currentDataNO2;
//	hourSumDataPM10+=currentDataPM10;
	
	FLASH_W_BYTE(end_CurData_page,last_CurData_Add   ,year    );
	FLASH_W_BYTE(end_CurData_page,last_CurData_Add+1 ,newMonth);
	FLASH_W_BYTE(end_CurData_page,last_CurData_Add+2 ,day     );
	FLASH_W_BYTE(end_CurData_page,last_CurData_Add+3 ,newHour );
	FLASH_W_BYTE(end_CurData_page,last_CurData_Add+4 ,minute  );
	FLASH_W_BYTE(end_CurData_page,last_CurData_Add+5 ,second  );//时间
	FLASH_W_UNINT(end_CurData_page, last_CurData_Add+6, currentDataSO2 );
	FLASH_W_UNINT(end_CurData_page, last_CurData_Add+8, curD_mgPm3     );
//	FLASH_W_UNINT(end_CurData_page, last_CurData_Add+8, currentDataNO2 );
//	FLASH_W_UNINT(end_CurData_page, last_CurData_Add+10,currentDataPM10);

//	record_CurData++;

	if (last_CurData_Add >= 0xfff0)
	{
		last_CurData_Add=0;
		end_CurData_page++;
		if (end_CurData_page > 30) end_CurData_page=0;
		if (end_CurData_page == start_CurData_Page)
		{
			start_CurData_Page++;
			if (start_CurData_Page > 30) 
			{
				start_CurData_Page=0;
				flashFullFlg=0xaa;
				CAT1021Write(flashFullFlg_SAdd, 0xaa);
			}
//			record_CurData-=4096;
		}

		FLASH_BLK_ERASE(end_CurData_page);
	
		CAT1021Write(start_CurData_Page_SAdd, start_CurData_Page);
		CAT1021Write(end_CurData_page_SAdd,   end_CurData_page  );
	}

	else
	{
		last_CurData_Add+=16;
	}
}

/*
void FlashRecDayAvg(void)//存储日平均值 
{
	unsigned char i;
	unsigned long sumULong;

	FLASH_W_BYTE(31, last_DayAvg_Add,   catYear );//年
	FLASH_W_BYTE(31, last_DayAvg_Add+1, catMonth);//月
	FLASH_W_BYTE(31, last_DayAvg_Add+2, catDay  );//日//存储日期


	if (inDayTimes ==0)
	{
		FLASH_W_UNINT(31, last_DayAvg_Add+3, currentDataSO2);//SO2日平均值 
//		FLASH_W_UNINT(31, last_DayAvg_Add+9, currentDataNO2);//NO2日平均值
	}
	else
	{
		sumULong=0;
		for (i=0; i<24; i++)
		{
			sumULong+=CAT1021ReadUnInt(TAvg_SO2_SAdd+i*2);
		}
		FLASH_W_UNINT(31, last_DayAvg_Add+3, sumULong/inDayTimes);//SO2日平均值 
	
		sumULong=0;
		for (i=0; i<24; i++)
		{
			sumULong+=CAT1021ReadUnInt(TAvg_NO2_SAdd+i*2);
		}
		FLASH_W_UNINT(31, last_DayAvg_Add+9, sumULong/inDayTimes);//NO2日平均值
	
	    sumULong=0;
		for (i=0; i<inDayTimes; i++)
		{
			sumULong+=CAT1021ReadUnInt(TAvg_PM10_SAdd+i*2);
		}
		FLASH_W_UNINT(31, last_DayAvg_Add+15, sumULong/inDayTimes);//PM10日平均值
	

	}

	CAT1021WriteUnInt(last_DayAvg_Add_SAdd, last_DayAvg_Add+21); 
	last_DayAvg_Add +=21;                                      //日平均值的最后地址
	
	//Disp(1,7,16,8,*(number0));

	catYear=year;
	catMonth=newMonth;
	catDay=day;

	CAT1021Write(catYear_SAdd, year    );
	CAT1021Write(catMonth_SAdd,newMonth);
	CAT1021Write(catDay_SAdd,  day     );
	
	inDayTimes=0;
	CAT1021Write(inDayTimes_SAdd, 0);                        //更新CAT1021中的日期

	for (i=0; i<144; i++)
	{
		CAT1021Write(TAvg_SO2_SAdd+i, 0);
	}//清空小时均值数据区

}


void FlashRecMonAvg(void)//存储月平均值 
{
	unsigned int sAddr=0;
	unsigned char flg=0;
	unsigned char year0,month0;
	unsigned char dayTimes0=0;
	unsigned long  monthSum_SO2 =0;
//	unsigned long  monthSum_NO2 =0;
//	unsigned long  monthSum_PM10=0;

	do
	{
		year0 =FLASH_R_BYTE(31, sAddr  );
		month0=FLASH_R_BYTE(31, sAddr+1);

		if ((255==year0) || (255==month0))
		{
			break;
		}

		if ((year0==year) &&  ( month0== catMonth_MA) )
		{
			flg=1;
			
			monthSum_SO2 +=FLASH_R_UNINT(31, sAddr+3 );
//			monthSum_NO2 +=FLASH_R_UNINT(31, sAddr+9 );
//			monthSum_PM10+=FLASH_R_UNINT(31, sAddr+15);
			
			dayTimes0++;
		}

		sAddr+=21;

	}while (sAddr < 0xf7a7);

	if (1==flg)
	{
		monthSum_SO2 /=dayTimes0;
//		monthSum_NO2 /=dayTimes0;
//		monthSum_PM10/=dayTimes0;

		FLASH_W_BYTE(31, last_MonthAvg_Add,   year       );//年
		FLASH_W_BYTE(31, last_MonthAvg_Add+1, catMonth_MA);//月
		
		FLASH_W_UNINT(31,last_MonthAvg_Add+2, (unsigned int)monthSum_SO2 );//SO2月平均值 
//		FLASH_W_UNINT(31,last_MonthAvg_Add+8, (unsigned int)monthSum_NO2 );//NO2月平均值
//		FLASH_W_UNINT(31,last_MonthAvg_Add+14,(unsigned int)monthSum_PM10);//PM10月平均值
		
		CAT1021WriteUnInt(last_MonthAvg_Add_SAdd, last_MonthAvg_Add+20); 
 		CAT1021Write(catMonth_MA_SAdd,newMonth);
		last_MonthAvg_Add+=20;       
	}
}
*/

void FlashClearDataAll(void)
{
	unsigned char i;

	for (i=0; i<32; i++)
	{
		FLASH_BLK_ERASE(i);
		Delay1ms(1);
	}

//FLASH
	last_CurData_Add=0;
	//record_CurData=0;
	start_CurData_Page=0;
	end_CurData_page  =0;
	
	last_DayAvg_Add  =0     ;
	last_MonthAvg_Add=0xf7a7;

//COUNT
//	inHourTimes=0;
//	hourSumDataSO2=0;
//	hourSumDataNO2=0;
//	inDayTimes=0;

//CAT1021
	CAT1021WriteUnInt(last_DayAvg_Add_SAdd, 0); 
	CAT1021WriteUnInt(last_MonthAvg_Add_SAdd, 0xf7a7); 
	//CAT1021WriteUnInt(last_CurData_Add_SAdd, 0);
	CAT1021Write(start_CurData_Page_SAdd,0);
	CAT1021Write(  end_CurData_page_SAdd,0);
	CAT1021Write(  flashFullFlg_SAdd,    0);
//  CAT1021Write(  inDayTimes_SAdd,      0);

	GetTimeDec();

	catYear    =buffTime[0];
	catMonth   =buffTime[1];
	catDay     =buffTime[2];
 	catMonth_MA=buffTime[1];

	CAT1021Write(catMonth_MA_SAdd,buffTime[1]);
	CAT1021Write(catYear_SAdd,    buffTime[0]);
	CAT1021Write(catMonth_SAdd,   buffTime[1]);
	CAT1021Write(catDay_SAdd,     buffTime[2]);

	for (i=0; i<144; i++)
	{
		CAT1021Write(TAvg_SO2_SAdd+i, 0);
	}

}

⌨️ 快捷键说明

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