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

📄 flash.c

📁 51单片机驱动320*234彩显的源代码
💻 C
字号:
//name:flash.c
//author:Liweihua
//date:2004.11.30
#include "upsd3200.h"			// special function register declarations for UPSD
#include "flash.h"          // include the definition of your system memory map
#include "upsd_hardware.h"
#include "lcd.h"
FLASHCB xdata flashcb;
MSG_ENTRY xdata msg_entry[1024];
extern LCDCB xdata lcdcb;
extern PSD_REGS PSD8xx_reg; 

static char code msg_type_dot[6][8]=
{
	{0xB5,0xF7,0xB6,0xC8,0xD0,0xC5,0xCf,0xA2},//调度信息
	{0xB5,0xF7,0xB7,0xE5,0xD0,0xBA,0xC1,0xF7},//调峰泻流
	{0xCC,0xEC,0xC6,0xF8,0xD4,0xA4,0xB1,0xA8},//天气预报
	{0xCB,0xAE,0xCE,0xC4,0xB2,0xA5,0xB1,0xA8},//水文播报
	{0xBD,0xC9,0xB7,0xD1,0xCD,0xA8,0xD6,0xAA},//缴费通知
	{0xD5,0xFE,0xB2,0xDF,0xCD,0xA8,0xB8,0xE6} //政策通告
};

void flash_init(void)
{
	get_entry_wr_msg();
	flashcb.event_notice=FLASH_EV_NULL;
	
	//always read newest recode first
	if(flashcb.ptr_wr_msg==MAIN_FLASH_ADDR_START)
	{
		if(flashcb.pagenum_wr_msg==0)
			flashcb.pagenum_rd_msg=0x06;
		else
			flashcb.pagenum_rd_msg=flashcb.pagenum_wr_msg-1;
		flashcb.ptr_rd_msg=0xFF00;
	}
	else
	{
		flashcb.pagenum_rd_msg=flashcb.pagenum_wr_msg;
		flashcb.ptr_rd_msg=flashcb.ptr_wr_msg-HISORY_MSG_MAXLEN;
	}
	
	flashcb.len_wr_msg=0;
	flashcb.len_rd_msg=0;
	return;
}

void flash_reset(void)	// reset flash, read array mode

{

	//  Note:  the following constants (FLASH_COMMON_XXXX)
	//     are declared type volatile in the header file 
	//	   so they are not optimized away by the compiler

	*(FLASH_COMMON_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
	*(FLASH_COMMON_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
	*(FLASH_COMMON_X555) = 0xF0;		// write 0xF0 command to reset 
						// Flash memory to Read Array Mode
                      // now delay 3 msec per dat sheet
       return;
}

unsigned char flash_write_with_poll(unsigned char xdata* addr, unsigned char dat)
{
	 unsigned char done;
	 unsigned char error;
	 unsigned char err;
	 unsigned char poll;
	done = FALSE;
	err = FALSE;
	*(FLASH_COMMON_X555) = 0xAA;   
	*(FLASH_COMMON_XAAA) = 0x55;   
	*(FLASH_COMMON_X555) = 0xA0;              
	*(addr) = dat;                           
	 dat = dat & NVM_DATA_POLL;               
	do                      
	{
		poll = *(addr);                
		error = poll & NVM_ERROR;              
		poll = poll & NVM_DATA_POLL;         
		if (dat == poll)                        
			done = TRUE;                          
		else if (error ==  NVM_ERROR )          
			err = TRUE;                           
	}
	while((done == FALSE) && (err == FALSE));
	if (err == TRUE)                                               
	{
		poll = *(addr);                          
		poll = poll & NVM_DATA_POLL;         
		if (dat == poll)                        
			done = TRUE;               
		*(FLASH_COMMON_X555) = 0xF0;                                          
	}
	return(done);     
}

unsigned char flash_erase_sector(unsigned char xdata* flash_bulk_erase_address)
{
	unsigned char done;
	unsigned char poll;
	unsigned char error;
	unsigned char err;

	done = FALSE;
	err = FALSE;
	*(FLASH_COMMON_X555) = 0xAA;  
	*(FLASH_COMMON_XAAA) = 0x55;  
	*(FLASH_COMMON_X555) = 0x80;       
	*(FLASH_COMMON_X555) = 0xAA;            
	*(FLASH_COMMON_XAAA) = 0x55;             
	*(flash_bulk_erase_address) = 0x30;     
	do                    
	{
		poll = *(flash_bulk_erase_address);                                           
		error = poll & NVM_ERROR;             
		poll = poll & NVM_DATA_POLL;            
		if (poll == NVM_DATA_POLL)             
		done = TRUE;           
		else if (error == NVM_ERROR)           
			err = TRUE;                          
	}
	while((done == FALSE) && (err == FALSE));
	if (err == TRUE)                                                           
	{
		poll = *(flash_bulk_erase_address);      
		poll = poll & NVM_DATA_POLL;         
		if (poll == NVM_DATA_POLL)              
			done = TRUE;                                     
		*(FLASH_COMMON_X555) = 0xF0;                                        
	}
	
	return(done);     
}

void flash_write_one_recode(void)
{
	unsigned char xdata i;
	unsigned char xdata* paddr;
	watchdog_reset();
	
	paddr=flashcb.ptr_wr_msg;
	PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg;
	
	for(i=0;i<flashcb.len_wr_msg;i++)
		flash_write_with_poll(paddr++,flashcb.buf_wr[i]);

	flashcb.ptr_wr_msg+=HISORY_MSG_MAXLEN;
	
	if(flashcb.ptr_wr_msg>MAIN_FLASH_ADDR_END)
	{
		flashcb.pagenum_wr_msg++;
		flashcb.ptr_wr_msg=MAIN_FLASH_ADDR_START;
		if(flashcb.pagenum_wr_msg==0x07)
			flashcb.pagenum_wr_msg=0x00;
	}
	return;
}

void flash_read_one_recode(void)
{
	unsigned char xdata i;
	unsigned char xdata * paddr;//Be sure not to define this value to type of unsigned char xdata*!!!
	watchdog_reset();
	PSD8xx_reg.PAGE=msg_entry[lcdcb.msg_num].page;
	paddr=msg_entry[lcdcb.msg_num].addr;
	flashcb.len_rd_msg=0;
	
	flash_reset();
	
	for(i=0;i<HISORY_MSG_MAXLEN;i++)
	{
		if(*paddr!=0xFF)
		{
			flashcb.buf_rd[i]=*paddr++;
			flashcb.len_rd_msg++;
		}
		else 
			break;
	}
	return;
}
/*
unsigned char get_all_recode_entry(void)
{
	unsigned char xdata *addr;
	unsigned short i=0;
	PSD8xx_reg.PAGE=0x00;
	addr =MAIN_FLASH_ADDR_START;
	flash_reset();
	
	while(*addr != 0xFF)
	{
		if(addr==0xFF00)
		{
			addr = MAIN_FLASH_ADDR_START;
			PSD8xx_reg.PAGE+=1;
			if(PSD8xx_reg.PAGE==0x08)
			{
				PSD8xx_reg.PAGE=0x07;
				addr=0xFF00;
				msg_entry[i].msg_type=*addr;
				msg_entry[i].page=PSD8xx_reg.PAGE;
				msg_entry[i].addr=addr;
				i++;
				break;
			}
		}	
		else 
		{
			msg_entry[i].msg_type=*addr;
			msg_entry[i].page=PSD8xx_reg.PAGE;
			msg_entry[i].addr=addr;
			addr+=HISORY_MSG_MAXLEN;
			i++;
		}	
	}
	return(i);
}
*/

unsigned char  get_all_recode_entry(void)
{
	unsigned char xdata *addr;
	unsigned short i=0;
	watchdog_reset();
	
	if(flashcb.ptr_wr_msg==MAIN_FLASH_ADDR_START)
	{
		if(flashcb.pagenum_wr_msg==0)
			PSD8xx_reg.PAGE=0x06;
		else
			PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg-1;
		addr=0xFF00;
	}
	
	else
	{
		PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg;
		addr=flashcb.ptr_wr_msg-HISORY_MSG_MAXLEN;
	}
	
	flash_reset();
	
	while(*addr != 0xFF)
	{
		if(addr==MAIN_FLASH_ADDR_START)
		{
			msg_entry[i].msg_type=*addr;
			msg_entry[i].page=PSD8xx_reg.PAGE;
			msg_entry[i].addr=addr;
			i++;
				
			if(PSD8xx_reg.PAGE==0x00)
				break;
			else
			{
				addr=0xFF00;
				PSD8xx_reg.PAGE-=1;
			}
		}	
		
		else 
		{
			msg_entry[i].msg_type=*addr;
			msg_entry[i].page=PSD8xx_reg.PAGE;
			msg_entry[i].addr=addr;
			addr-=HISORY_MSG_MAXLEN;
			i++;
		}	
	}
	return(i);
}

void get_entry_wr_msg(void)
{
	unsigned char xdata *addr;
	watchdog_reset();
	
	PSD8xx_reg.PAGE=0x00;
	addr =MAIN_FLASH_ADDR_START;
	flash_reset();
	while((*addr) != 0xFF)
	{
		if(addr==0xFF00)
		{
			addr = MAIN_FLASH_ADDR_START;
			PSD8xx_reg.PAGE+=1;
			if(PSD8xx_reg.PAGE==0x07)
			{
				PSD8xx_reg.PAGE=0x00;
				break;
			}
		}	
		else 
			addr+=HISORY_MSG_MAXLEN;
	}

	if(addr == MAIN_FLASH_ADDR_START)
		flash_erase_sector(MAIN_FLASH_ADDR_START);

	flashcb.ptr_wr_msg = addr;	
	flashcb.pagenum_wr_msg=PSD8xx_reg.PAGE;
	return;
}

void fill_lcdbuf(void)
{
	unsigned short i,j=0;
	unsigned char*p;
	watchdog_reset();
	
	for(i=0;i<8;i++)
		lcdcb.msg_buf[i]=msg_type_dot[flashcb.buf_rd[0]][i];

	lcdcb.msg_buf[i++]=',';
	lcdcb.msg_buf[i++]=flashcb.buf_rd[1]/10+0x30;
	lcdcb.msg_buf[i++]=flashcb.buf_rd[1]%10+0x30;
	lcdcb.msg_buf[i++]=':';
	lcdcb.msg_buf[i++]=flashcb.buf_rd[2]/10+0x30;
	lcdcb.msg_buf[i++]=flashcb.buf_rd[2]%10+0x30;
	lcdcb.msg_buf[i++]=':';
	lcdcb.msg_buf[i++]=flashcb.buf_rd[3]/10+0x30;
	lcdcb.msg_buf[i++]=flashcb.buf_rd[3]%10+0x30;
	lcdcb.msg_buf[i++]=',';

	p=&flashcb.buf_rd[4];

	while(j<flashcb.len_rd_msg-4)
	{
		if( ( *p>=0xA1) && (i%2 == 0) )
		{//汉字,从偶地址开始
			lcdcb.msg_buf[i] = *p++;
			i++;
			lcdcb.msg_buf[i] = *p++;
			i++;
			j += 2;
		}
		else if(*p<0xA1)
		{//半宽字符
			lcdcb.msg_buf[i]= *p++;
			i++;
			j++;
		}
		else
		{//汉字从奇地址开始
			lcdcb.msg_buf[i] = 0x20;
			i++;
		}		
	}
	lcdcb.msg_len=i;
	
	return;
}

void flash_set_syspara(void)
{
	unsigned char i;
	watchdog_reset();
	
	PSD8xx_reg.PAGE=0x07;
	
	if(flashcb.ptr_wr_syspara==MAIN_FLASH_ADDR_START)
		flash_erase_sector(MAIN_FLASH_ADDR_START);
	
	for(i=0;i<DATACENTER_IP_LEN;i++)
		flash_write_with_poll(flashcb.ptr_wr_syspara++, flashcb.datacenter_ip[i]);
	
	for(i=0;i<DATACENTER_PORT_LEN;i++)
		flash_write_with_poll(flashcb.ptr_wr_syspara++, flashcb.datacenter_port[i]);
	return;
}
		
void flash_get_syspara(void)
{
	unsigned char xdata *addr;
	unsigned char i;
	watchdog_reset();
	PSD8xx_reg.PAGE=0x07;
	addr =MAIN_FLASH_ADDR_START;
	flash_reset();
	while((*addr) != 0xFF)
	{
		if(addr==0xFFEF)
		{
			addr=MAIN_FLASH_ADDR_START;
			break;
		}
		addr+=SYSPARA_LEN;
	}
	
	flashcb.ptr_wr_syspara=addr;
	
	if(addr==MAIN_FLASH_ADDR_START)
		addr=0xFFEF;
	else 
		addr-=SYSPARA_LEN;
		
	for(i=0;i<DATACENTER_IP_LEN;i++)
		flashcb.datacenter_ip[i]=*addr++;
	for(i=0;i<DATACENTER_PORT_LEN;i++)
		flashcb.datacenter_port[i]=*addr++;
	return;
}

void flash_poll(void)
{
	watchdog_reset();
	switch(flashcb.event_notice)
	{
		case FLASH_EV_NULL:
		break;
		
		case FLASH_EV_WRITE_ONE_RECODE:
			flash_write_one_recode();
			flashcb.event_notice=FLASH_EV_NULL;
		break;
			
		case FLASH_EV_READ_ONE_RECODE:
			flash_read_one_recode();
			fill_lcdbuf();
			lcdcb.event_notice=SCR_EVENT_HISTORY_MSG;
			flashcb.event_notice=FLASH_EV_NULL;
		break;

		case FLASH_EV_GET_ALL_RECODE_ENTRY:
			flashcb.msg_sum=get_all_recode_entry();
			if(flashcb.msg_sum==0)
				lcdcb.event_notice=SCR_EVENT_NO_RECODE;
			else
				lcdcb.event_notice=SCR_EVENT_NEXT_PAGE;
			flashcb.event_notice=FLASH_EV_NULL;
		break;

		default:
		break;
	}
	return;
}

/*****************For xiaogui PSD,but something wrong,no answer!!!**************
void flash_write_with_poll(volatile unsigned char *addr, unsigned char dat)
{
	EA = 0;
	PSD8xx_reg.PAGE = PSD8xx_reg.PAGE | 0x80;
	
	*(FLASH_COMMON_X555) = 0xAA;
	*(FLASH_COMMON_XAAA) = 0x55;
	*(FLASH_COMMON_X555) = 0xA0;

	*(addr) = dat;

	PSD8xx_reg.PAGE = PSD8xx_reg.PAGE & 0x7F;
	EA = 1;
	//延时3ms左右
	delayms();
}

void flash_erase_sector(volatile unsigned char *sector_erase_address)
{
	EA = 0;
	PSD8xx_reg.PAGE = PSD8xx_reg.PAGE | 0x80;
	
	*(FLASH_COMMON_X555) = 0xAA;
	*(FLASH_COMMON_XAAA) = 0x55;
	*(FLASH_COMMON_X555) = 0x80;
	*(FLASH_COMMON_X555) = 0xAA;
	*(FLASH_COMMON_XAAA) = 0x55;
	*(sector_erase_address) = 0x30;
	
	PSD8xx_reg.PAGE = PSD8xx_reg.PAGE & 0x7F;
	EA = 1;
}

void flash_regs_init(void)
{
	PSD8xx_reg.VM=0x92;
	
	PSD8xx_reg.MAINPROTECT=0x00;
}

unsigned char flash_write_one_recode(void)
{
	unsigned char i;
	unsigned char xdata*idata paddr;
	unsigned char n=0;
	//unsigned char *bufp;
	unsigned char page_tmp;
	
	page_tmp=PSD8xx_reg.PAGE;

	PSD8xx_reg.PAGE=flashcb.pagenum_wr_msg;
	paddr=flashcb.ptr_wr_msg;
	for(i=0;i<flashcb.len_wr_msg;i++)
	{
		if(flash_write_with_poll(paddr++,flashcb.buf_wr[i])==1)
			continue;
		else 	
			break;	
	}
	
	PSD8xx_reg.PAGE=page_tmp;
	
	if(i==flashcb.len_wr_msg)	
	{
		flashcb.ptr_wr_msg+=HISORY_MSG_MAXLEN;
		if(flashcb.ptr_wr_msg>MAIN_FLASH_ADDR_END)
		{
			flashcb.pagenum_wr_msg++;
			flashcb.ptr_wr_msg=MAIN_FLASH_ADDR_START;
			if(flashcb.pagenum_wr_msg==0x88)
				flashcb.pagenum_wr_msg=0x80;
		}
		return(1);
	}
	else
		return(0);	
}

void flash_reset(void)
{
	EA = 0;
	PSD8xx_reg.PAGE = PSD8xx_reg.PAGE | 0x80;
	*(FLASH_COMMON_X555) = 0xAA;
	*(FLASH_COMMON_XAAA) = 0x55;
	*(FLASH_COMMON_X555) = 0xF0;
	PSD8xx_reg.PAGE = PSD8xx_reg.PAGE & 0x7F;
	EA = 1;
        delayms();
}
**************************************************************************/

⌨️ 快捷键说明

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