亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? flash.c

?? 稅控收款機(jī)源碼:拼音輸入法,LCD,VFD驅(qū)動(dòng),IC卡驅(qū)動(dòng),稅控國(guó)標(biāo)
?? C
字號(hào):
#include  "include.h"

uint  data flash_r_addr;
uint  data flash_w_addr;
uchar data flash_r_data;
uchar data flash_w_data;
bit A15;
sbit   A20=P3^5;
sbit   AB15=P4^3;
//注意:對(duì)于XBYTE[]的操作的偏移地址是仿真器的需要,實(shí)際CUP不需要
//	檢查指定扇區(qū)是否空,扇區(qū)空返回0
//=======================================================================
//===========SRAM讀寫驅(qū)動(dòng)====================================//
/*************************************************************
*函數(shù)名稱: select_sector(uchar sector)
*輸入?yún)?shù): uchar sector --- 24位地址線的高8位
*輸出參數(shù): void
*函數(shù)功能: 根據(jù)輸入地址線的數(shù)據(jù)對(duì)相應(yīng)地址線置位,本函數(shù)對(duì)
*           SRAM、FLASH的地址操作有效
*************************************************************/
void select_sector(uchar sector)
{
	uchar x;
	
	if(sector >15)
	{
		if(sector>31)		//置位 A21
			SetupPortA(A21,1);
		else
			SetupPortA(A21,0);
		A20=1;				//置位 A20
	}
	else
	{
		SetupPortA(A21,0);
		A20=0;
	}
	x=sector&0x0f;			//x 低四位對(duì)應(yīng) a16 a17 a18 a19

	P4&=0x07;				//保留P4的低三位
	x<<=4;
	x&=0xf0;
	P4|=x;
	if(A15)P4|=0x08;
}


/*************************************************************
*函數(shù)名稱: read_sramb(ulong addr,uint leng,void *buf)
*輸入?yún)?shù): ulong addr --- 24位地址
*           uint leng  --- 讀數(shù)據(jù)的長(zhǎng)度
*           void *buf  --- 指針,把讀出的數(shù)據(jù)存放在此空間
*返回值  : uchar  1   --- 讀SRAM失敗(地址有誤)
                   0   --- 讀SRAM成功
*函數(shù)功能: 讀出leng長(zhǎng)度的,以addr為首地址的,存放在SRAM的數(shù)據(jù),
*           并存放在 *buf 指向的空間
*************************************************************/
uchar read_sramb(ulong addr,uint leng,void *buf)
{
	uchar  sector;                  			
	uint  rd_addr;//addr0;
	uchar EAStatus;

	sector=*((uchar *)(&addr)+1);    // 取頁(yè)面地址 

	rd_addr=(uint)addr;					// 取地址指針 
 
	if(sector >8)    return(1); 
	if((addr + leng -1) > 0x80000) return(1);
	
	EAStatus = EA;
	EA = 0;
	
	if(rd_addr & 0x8000)  A15 = 1;
	else A15 = 0;
	rd_addr = rd_addr & 0x7fff;

	select_sector(sector); 
	flash_r_addr =  rd_addr;

	do
	{
		if(flash_r_addr & 0x8000)
		{
			flash_r_addr=0;
			A15=~A15;
			if(!A15) sector++;
			select_sector(sector); 
		}
		PSD8xx_reg.PAGE&=0x7f;
		flash_r_data = XBYTE[flash_r_addr];
		_nop_ ( );
		_nop_ ( );

		*((uchar*)buf) = flash_r_data;
		((uchar*)buf)++;
		flash_r_addr++;

	}while(--leng);
	PSD8xx_reg.PAGE|=0x80;
	
	EA = EAStatus;
	return(0);
}
/*************************************************************
*函數(shù)名稱: write_sramb(ulong addr,uint leng,void *buf)
*輸入?yún)?shù): ulong addr --- 24位地址
*           uint leng  --- 讀數(shù)據(jù)的長(zhǎng)度
*           void *buf  --- 指針,要寫入的數(shù)據(jù)存放在此空間
*返回值  : uchar    0   --- 寫SRAM成功
*                    1   --- 寫SRAM失敗(地址有誤)
*                    2   --- 寫SRAM失敗(校驗(yàn)有誤)
*函數(shù)功能: 把存放在指向 *buf 的空間的、leng長(zhǎng)度的數(shù)據(jù),
*           寫入以addr為首地址的SRAM中
*************************************************************/
uchar write_sramb(ulong addr,uint leng,void *buf)
{
	uchar  sector;
	uint  rd_addr;
	uchar EAStatus;
	sector=*((uchar *)(&addr)+1);	// 取頁(yè)面地址 

	rd_addr=(uint)addr;				// 取地址指針 
	//send_char(sector);
	if(sector >7)                  return(1);
	if((addr + leng -1) > 0x80000) return(1);
	
	EAStatus = EA;
	EA = 0;
	if(rd_addr & 0x8000)  A15 = 1;
	else A15 = 0;
	rd_addr = rd_addr & 0x7fff;

	select_sector(sector); 
	
	flash_r_addr =  rd_addr;
	do
	{
		if(flash_r_addr & 0x8000)
		{
			flash_r_addr=0;
			A15=~A15;
			if(!A15) sector++;
			select_sector(sector); 
		}
		PSD8xx_reg.PAGE&=0x7f;
		XBYTE[flash_r_addr]=*((uchar*)buf);
		delayms(1) ;
		PSD8xx_reg.PAGE&=0x7f;
		flash_r_data = XBYTE[flash_r_addr];
		if(flash_r_data != *((uchar*)buf)) {PSD8xx_reg.PAGE&=0x7f; return(2); }// Write_FAU_data(6,WRITE_SRAM_FAIL);
	
		((uchar*)buf)++;
		flash_r_addr++;
    
	}while(--leng);
	PSD8xx_reg.PAGE|=0x80;

	EA = EAStatus;
	return(0);
}


//===================FLASH驅(qū)動(dòng)程序===================================//
//        本部分為HY29LV320驅(qū)動(dòng)
//        此芯片為4M BYTE 并行 FLASH

uchar sector_blank_check(ulong _sector_addr)
{
	uchar sector;
	uint  addr;
	uchar EAStatus;

	sector=*((uchar *)(&_sector_addr)+1);       // 取頁(yè)面地址 
	addr=(uint)_sector_addr;					// 取地址指針 

	EAStatus = EA;
	EA = 0;	
	if(addr & 0x8000)  A15 = 1;
	else A15 = 0;

	addr = addr & 0x7fff;

	if(_sector_addr<0x010000)	//第 0---7 個(gè)扇區(qū),每扇區(qū)8K BYTE
	{
		select_sector(sector);
		addr = addr&0xe000;
		for(flash_r_addr=0;flash_r_addr<0x2000;flash_r_addr++)
		{
			_nop_ ( );
			PSD8xx_reg.PAGE|=0x80;
			flash_r_data = XBYTE[flash_r_addr+addr];
			PSD8xx_reg.PAGE&=0x7f;
			_nop_ ( );
			_nop_ ( );
			if(flash_r_data!=0xff)
			{
				EA = EAStatus;
				return (1);
			}
		}
	}
	else						//其他扇區(qū),每扇區(qū)64K BYTE
	{
		A15=0;
		do
		{
			select_sector(sector);

			for(flash_r_addr=0;flash_r_addr<0x8000;flash_r_addr++)
			{
				_nop_ ( );
				PSD8xx_reg.PAGE|=0x80;
	            flash_r_data = XBYTE[flash_r_addr];
				PSD8xx_reg.PAGE&=0x7f;
	            _nop_ ( );
	            _nop_ ( );

				if(flash_r_data!=0xff)
				{
					EA = EAStatus;
					return (1);
				}
			}
			A15=~A15;
		}while(A15);
	}
	
	EA = EAStatus;
	return(0);
}

/************************************************************************/
/* PROCEDURE:   Erase_One_Block                                         */
/*                                                                      */
/* This procedure can be used to erase a total of 64K words.            */
/*                                                                      */
/* Input:                                                               */
/*      Dst     DESTINATION address where the erase operation starts    */
/*                                                                      */
/* Output:                                                              */
/*      NONE                                                            */
/************************************************************************/

uchar flash_sector_erase(uchar erase_sector_num)
{
	
	ulong erase_addr;
	uchar  sector;
	uint  addr;
	uchar EAStatus;
	
	if(erase_sector_num<23) //字庫(kù)及預(yù)留區(qū),不允許操作,前28個(gè)扇區(qū)
		return(1);
	
	erase_addr = 0x100000 + (ulong)(erase_sector_num - 23)*0x10000;
	
	sector=*((uchar *)(&erase_addr)+1);       // 取頁(yè)面地址 
	addr=(uint)erase_addr;					// 取地址指針 

	EAStatus = EA;
	EA = 0;
	
	if(addr & 0x8000)  A15 = 1;
	else A15 = 0;

	addr = addr&0x7fff;

	select_sector(sector);

	_nop_ ( );
	_nop_ ( );

	PSD8xx_reg.PAGE|=0x80;

	XBYTE[0xaaa] = 0xaa;

	XBYTE[0x555] = 0x55;

	XBYTE[0xaaa] = 0x80;

	XBYTE[0xaaa] = 0xaa;

	XBYTE[0x555] = 0x55;

	XBYTE[addr] = 0x30;
  
	PSD8xx_reg.PAGE&=0x7f;

	delay_ms(50) ;

	if( sector_blank_check(erase_addr) ){ return (1);}//Write_FAU_data(6,ERASE_FLASH_FAIL);
	
	EA = EAStatus;
	return(0);
}

/************************************************************************/
/* PROCEDURE:   Erase_Entire_Chip                                       */
/*                                                                      */
/* This procedure can be used to erase the entire chip.                 */
/*                                                                      */
/* Input:                                                               */
/*      NONE                                                            */
/*                                                                      */
/* Output:                                                              */
/*      NONE                                                            */
/************************************************************************/

/*uchar flash_chip_erase(void)
{
	uchar i;
	reset_addr();
	_nop_ ( );
	_nop_ ( );
	P4_1 = 0;
	PSD8xx_reg.PAGE|=0x80;
	XBYTE[0xaaa+PSD_REG_ADDR+0x100] = 0xaa;
	XBYTE[0x555+PSD_REG_ADDR+0x100] = 0x55;
	XBYTE[0xaaa+PSD_REG_ADDR+0x100] = 0x80;
	XBYTE[0xaaa+PSD_REG_ADDR+0x100] = 0xaa;
	XBYTE[0x555+PSD_REG_ADDR+0x100] = 0x55;
	XBYTE[0xaaa+PSD_REG_ADDR+0x100] = 0x10;
	P4_1 = 1;
	PSD8xx_reg.PAGE&=0x7f;
	_nop_ ( );
	_nop_ ( );
	for(i=0; i<10; i++)
	{
		delay_ms(4) ;
	}              

	//if( check_toggle_bit(0x8000) ) return (1);

	for(i=0x00;i<0x20;i++)
	if( sector_blank_check(i) ) return (1);

	return(0);
}

*/

//================================================================================
uchar write_flash_abyte(uint addr,uchar abyte)
{
	uchar k,i,j,cnt;

	k=2;
	while(k)    //不成功寫幾遍
	{
		flash_w_data = abyte;
		flash_w_addr = addr;
  
		PSD8xx_reg.PAGE|=0x80;
  		XBYTE[0xaaa] = 0xaa;
		XBYTE[0x555] = 0x55;
		XBYTE[0xaaa] = 0xa0;
		XBYTE[flash_w_addr] =flash_w_data;
		PSD8xx_reg.PAGE&=0x7f;
//=============================================
		PSD8xx_reg.PAGE|=0x80;
		cnt = 50;
		while(cnt)
		{
			cnt--;
			i = XBYTE[flash_w_addr];
			j = XBYTE[flash_w_addr];
			
			if((i&0x40) != (j&0x40))		//D6 == D6
				continue;
				
			i = XBYTE[flash_w_addr];
			if((i&0x80)==(flash_w_data&0x80))
				break;					//D7 == D7
		}
		PSD8xx_reg.PAGE&=0x7f;
//=============================================
		PSD8xx_reg.PAGE|=0x80;
		flash_r_data =XBYTE[flash_w_addr];
		PSD8xx_reg.PAGE&=0x7f;

		if(flash_r_data == flash_w_data){  return (0);}// check_write_flash
		else {k--;}
	}
	return (1);
}

//========================================================================

//將SRAM中l(wèi)eng長(zhǎng)度的數(shù)據(jù)寫到FLASH指定單元,寫入正確返回0,否則返回1
//注意:如果被寫的地址的數(shù)據(jù)不是0XFF可能會(huì)造成FLASH一直忙,會(huì)造成讀出錯(cuò)
uchar write_flash(ulong wr_addr,uint wr_length,void *wr_buf)
{
	uchar  sector;
	uint  addr;
	uchar EAStatus;

	sector=*((uchar *)(&wr_addr)+1);       // 取頁(yè)面地址 
	addr=(uint)wr_addr;					// 取地址指針 
  
//	if((sector >34)||(sector<4))    return(1);//0-3 為字庫(kù)需要保護(hù)4-7 為安全審計(jì)記錄
//	if((wr_addr + wr_length - 1) > 0x1fffff) return(1);

	if(wr_addr<0x100000)			//字庫(kù)及預(yù)留區(qū),不允許操作,前23個(gè)扇區(qū)
		return(1);
		
	EAStatus = EA;
	EA = 0;
	if(addr & 0x8000)  A15 = 1;
	else A15 = 0;
	//write_data_flg=1;   //掉電時(shí)給出的標(biāo)志 掉電有用   	
	addr = addr & 0x7fff;

	select_sector(sector);

	do
	{
		if(addr&0x8000)
		{
			addr=0X00;
			A15=~A15;
			if(!A15) sector++;
			select_sector(sector);
		}
		if( write_flash_abyte(addr,*((uchar*)wr_buf)))
		{
			EA = EAStatus;
			return (2);
		}
		else
		{
			if(low_pwr==1) {shut_bat(0);}//low_pwr=2;
			((uchar*)wr_buf)++;
			addr++;
		}
	}while(--wr_length);
	
	EA = EAStatus;
	return(0);
}
//==========================================================================
//	將FLASH中l(wèi)eng長(zhǎng)度的數(shù)據(jù)寫到SRAM指定單元,寫入正確返回0,否則返回1

uchar read_flash(ulong rd_addr, uint rd_length, void *rd_buf)
{
	uchar  sector;
	uint  addr;
	uchar EAStatus;
	
	sector=*((uchar *)(&rd_addr)+1);    // 取頁(yè)面地址
 
	addr=(uint)rd_addr;					// 取地址指針 

//	if(sector > 34)
//		return(1);
		
	if((rd_addr + rd_length -1) > 0x3fffff)
		return(1);
		
	EAStatus = EA;
	EA = 0;
	
	if(addr & 0x8000)
		A15 = 1;
	else
		A15 = 0;
	addr = addr & 0x7fff;
 
	select_sector(sector); 
	flash_r_addr =  addr;
	

	do
	{
		if(flash_r_addr & 0x8000)
		{
			flash_r_addr=0;
			A15=~A15;
			if(!A15) sector++;
			select_sector(sector); 
		}
		
		_nop_ ( );
		_nop_ ( );
		_nop_ ( );

		PSD8xx_reg.PAGE|=0x80;
 
		flash_r_data = XBYTE[flash_r_addr];

		PSD8xx_reg.PAGE&=0x7f;
		_nop_ ( );  _nop_ ( );

		*((uchar*)rd_buf) =flash_r_data;

		((uchar*)rd_buf)++;
		flash_r_addr++;
  
	}while(--rd_length);
	
	EA = EAStatus;
	return(0);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品蜜桃视频网站| 成人avav在线| 丝袜亚洲精品中文字幕一区| 综合激情网...| 亚洲国产精品传媒在线观看| 久久久99精品免费观看| 国产亚洲精品福利| 欧美激情一区二区三区不卡| 久久先锋影音av| 欧美激情一区在线观看| 国产日本一区二区| 中文字幕一区三区| 一区二区三区四区不卡视频| 亚洲电影第三页| 日韩av一区二区在线影视| 免费观看成人鲁鲁鲁鲁鲁视频| 久久成人久久爱| 国产麻豆日韩欧美久久| 成人美女视频在线观看18| av在线综合网| 欧美日韩免费电影| 91精品福利在线一区二区三区 | 成人高清在线视频| 成人午夜精品一区二区三区| voyeur盗摄精品| 日本韩国精品一区二区在线观看| 在线看不卡av| 欧美一区二区三区免费观看视频| 精品国产免费一区二区三区四区 | 国产在线一区二区| 成人自拍视频在线观看| 91国产视频在线观看| 欧美一区二区三区系列电影| 久久日韩粉嫩一区二区三区| 中文字幕亚洲欧美在线不卡| 亚洲国产精品久久久久婷婷884| 日韩高清在线电影| 国产盗摄一区二区| 在线看日本不卡| 26uuu另类欧美亚洲曰本| 国产精品三级电影| 视频在线观看一区二区三区| 国产麻豆精品一区二区| 欧美亚洲国产一区二区三区va| 日韩欧美专区在线| 成人免费视频视频在线观看免费| 国产精品久久久久三级| 一区二区三区欧美在线观看| 蜜桃视频在线观看一区| 成人精品视频.| 69av一区二区三区| 中文字幕国产一区| 日韩精品欧美精品| eeuss鲁一区二区三区| 日韩一区二区在线观看| 亚洲视频一区在线观看| 老司机精品视频一区二区三区| 色综合久久中文综合久久97| 精品国产一区二区三区不卡 | 亚洲欧美日韩国产成人精品影院 | 555www色欧美视频| 日韩一区在线播放| 激情五月激情综合网| 欧美在线免费播放| 亚洲国产精品高清| 精品一二线国产| 欧美色图12p| 中文字幕一区二区三区四区 | 18涩涩午夜精品.www| 日本在线不卡一区| 色综合中文字幕国产 | 精品理论电影在线| 香蕉久久夜色精品国产使用方法 | 欧美在线播放高清精品| 国产欧美综合色| 精一区二区三区| 欧美精品在线一区二区| 专区另类欧美日韩| 国产成人免费视频网站| 精品女同一区二区| 日本午夜一本久久久综合| 91黄色免费看| 亚洲日本va午夜在线电影| 国产成人av一区二区三区在线观看| 91精品国产91热久久久做人人| 亚洲午夜三级在线| 一本久久a久久精品亚洲| 国产精品美日韩| 国产精品一级在线| 精品久久久久久久一区二区蜜臀| 视频一区二区中文字幕| 欧美午夜免费电影| 亚洲一区二区三区视频在线| 一本色道久久综合亚洲aⅴ蜜桃| 国产精品理论片在线观看| 国产成人在线免费观看| 久久影院视频免费| 国产一区二区不卡| 26uuu精品一区二区| 久久超碰97人人做人人爱| 日韩欧美精品三级| 久久www免费人成看片高清| 精品久久久久av影院| 久久精品国产久精国产| 日韩欧美色综合| 国产一区999| 国产欧美日韩综合| 高清成人在线观看| 国产精品国模大尺度视频| eeuss鲁片一区二区三区在线观看| 国产精品欧美精品| gogo大胆日本视频一区| 一区二区三区日韩在线观看| 在线观看日韩av先锋影音电影院| 亚洲综合在线五月| 欧美精品一二三四| 久久激情五月婷婷| 国产亚洲欧洲一区高清在线观看| 国产91色综合久久免费分享| 国产精品久久99| 色成年激情久久综合| 天天影视涩香欲综合网| 欧美成人国产一区二区| 国产精品一区一区三区| 中文字幕亚洲欧美在线不卡| 欧美吞精做爰啪啪高潮| 日本午夜一本久久久综合| 久久久久国色av免费看影院| 不卡视频一二三四| 亚洲一区二区三区四区在线免费观看| 欧美日韩成人综合| 精品一区二区三区免费观看| 国产精品午夜电影| 在线观看亚洲精品| 麻豆成人久久精品二区三区红| 久久久精品2019中文字幕之3| 成人免费高清视频在线观看| 亚洲影视资源网| 精品国产a毛片| 99久久伊人久久99| 午夜精品一区在线观看| 国产人妖乱国产精品人妖| 在线观看av一区二区| 久久99国产精品久久| 综合久久给合久久狠狠狠97色| 欧美精品高清视频| 国产suv精品一区二区883| 一区二区日韩av| 精品国产成人在线影院| 在线观看成人免费视频| 国产一区二区精品久久| 亚洲123区在线观看| 国产日产精品一区| 欧美老肥妇做.爰bbww| 成人综合日日夜夜| 人人精品人人爱| 亚洲欧美日韩电影| 2022国产精品视频| 欧美色倩网站大全免费| 国产成人免费视频网站 | 日本韩国精品一区二区在线观看| 久久国产精品第一页| 亚洲一区二区三区影院| 亚洲国产高清在线观看视频| 欧美区一区二区三区| av激情成人网| 精品一区二区三区欧美| 亚洲成人一区在线| 亚洲人123区| 欧美激情在线观看视频免费| 欧美一激情一区二区三区| 色丁香久综合在线久综合在线观看| 国产精一品亚洲二区在线视频| 亚洲123区在线观看| 亚洲女人****多毛耸耸8| 国产亚洲一区二区三区在线观看 | 亚洲福利一区二区| 国产精品久久久久永久免费观看 | 99精品国产热久久91蜜凸| 精品亚洲免费视频| 视频一区中文字幕国产| 亚洲最新视频在线观看| 亚洲欧洲日产国产综合网| 久久久久成人黄色影片| 日韩午夜激情电影| 制服丝袜亚洲色图| 欧美日韩1区2区| 91福利在线导航| 91免费看视频| 99国产精品久久久久| 成人aaaa免费全部观看| 国产精品99久久久久久久女警| 美女精品一区二区| 日韩成人免费电影| 亚洲v日本v欧美v久久精品| 亚洲一区二区三区不卡国产欧美 | 激情都市一区二区| 麻豆精品国产传媒mv男同| 日本va欧美va瓶| 麻豆精品在线看|