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

📄 flash.c

📁 楼宇对讲系统里用的文字信息接收。用可视对讲话机的TFT屏可看到从管理中心发过来的广播信息和本户的特发信息
💻 C
字号:
/***********************************************************/
/*							                               */
/*                CPU:AT89c55   20MHZ                      */
/*                Copyright  2004.09  Comelit              */
/*                AUTHOR:  LV_XIAO_LU                      */
/*                                                         */
/***********************************************************/

#include "reg52.h"
#include "string.h"
#include "define.h"
#include "variable.h"
#include "typedef.h"
#include "function.h"


                                          
          
//sbit LED_CTR = P1^1 ;

#define BRIGHT_ON 0     
#define BRIGHT_OFF 1

void Mes_init(void);
void Write_sector(register unsigned char xdata *des_adr,register unsigned char xdata *s_adr);
void Write_flash_hd(void);
void Code_init(void);
void Copy_var_to_mem(void);
void Copy_mes_to_mem(void);
void Copy_mem(void);
void  Store_mes(void);
void Message_hd(void);
void Write_flash_hd(void);
//unsigned char  Test_hardware(void);

/*const code unsigned char rom_verify_data_tbl[] =
      				{0x00,0x00,0x00,0x8f,0x8d,0x8c,0x67,0x65,0x66,0x6a,0x64,0x5d,
      				 0x80,0x80,0x80,0x88,0x85,0x82,0x6a,0x6a,0x6d,0x8f,0x8d,0x90,
      				 0x80,0x80,0x80,0x7e,0x7e,0x7e,0x68,0x6b,0x70,0x7b,0x7d,0x7c,
      				 0x80,0x80,0x80,0x71,0x6d,0x69,0x84,0x82,0x81,0x8d,0x8f,0x8f};
					                                                                           
const unsigned int rom_test_addr[] = 
    				{0x8000,0x9999,0xaaaa,0xd555};*/
/**************************************************/
/* dst_adr指向外部FLASH MEMORY的要写的段地址      */
/* s_adr指向SRAM里要写入FLASH MEMORY里的内容的地址*/
/**************************************************/
void Write_sector(register unsigned char xdata *dst_adr,register unsigned char xdata *s_adr)
{
   register unsigned int i;
   /*保护段数据特殊功能码:3个*/
   special_addr1 = 0xaa;
   special_addr2 = 0x55;
   special_addr1 = 0xa0; 

//   EA = 0;         // 禁止中断以防写FLASH时出错
   /*费时3.4MS*/
   for(i=0;i<256;i++)
   {
       *(dst_adr+i) = *(s_adr+i) ;
   }
//   EA = 1;

}

/***************************************************/
/*  init_code用于指示系统是否进行过系统工作初始化  */
/***************************************************/
void Code_init(void)
{
   init_code[0] = init_code_b[0];
   init_code[1] = init_code_b[1];
   init_code[2] = init_code_b[2];
}
/***************************************************/
/***************************************************/
void Mes_init(void)
{
  unsigned char i;
  Page_switch(PAGE_0); 

  Code_init();
  if((init_code[0]==0xa5)&&(init_code[1]==0x5a)&&(init_code[2]==0xaa))    //已初始化信息列表
  {
      Copy_mem();
  }
  else
  {

      Mes_tcb_init();
      init_code[0]=0xa5;
	  init_code[1]=0x5a;
	  init_code[2]=0xaa;
	 /*以下函数实现将从SRAM里0X00开始128个字节(1段)送到FLASH MEMORY 0X1000开始的128*/
	 /*个字节中去,即在FLASH MEMORY中备份重要数据*/
	  Page_switch(PAGE_0);
      Write_sector((unsigned char xdata*)(0x1000),(unsigned char xdata*)0x00);
	  Delay_10ms();
 
	 /*备份mes_control 到FLASH MEMORY中的mes_control_b*/
      for(i=0;i<8;i++)
	  {
	      Write_sector((unsigned char xdata*)(0x1100 + i*256),(unsigned char xdata*)(0x100 + i*256));
	      Delay_10ms();      //延时10MS
	  }
   }

}

/*******************************************************/
/*该函数用于将FLASH 内存块内变量COPY到SRAM中的变量区   */
/*******************************************************/
void Copy_var_to_mem(void)
{
   register unsigned char i;
   unsigned char xdata *source = (unsigned char xdata*)(0x1000);
   unsigned char xdata *dest = (unsigned char xdata*)0x00;  
   for(i=0;i<7;i++)
      *(dest+i) = *(source+i);  
}

/**********************************************************************/
/*该函数用于将FLASH 内存块内mes_control_b COPY到SRAM中的mes_control   */
/**********************************************************************/
void Copy_mes_to_mem(void)
{
    register unsigned char i;
	register unsigned int j;
    unsigned char xdata *source = (unsigned char xdata*)(0x1100);
    unsigned char xdata *dest = (unsigned char xdata*)0x100;
	if(write_F == 0)
	{
	   for(i=0;i<8;i++)
	   {
         for(j=0;j<256;j++)
		 {
		     *dest = *source;
			 dest++;
			 source++;
	
		 }
		 Delay_10ms();
		 
	   }
	}
}

/*******************************************************/
/*******************************************************/
void Copy_mem(void)
{
   Page_switch(PAGE_0);
   Copy_var_to_mem();
   Copy_mes_to_mem();
}
/**************************************************************/
/*actual_store_p:  在写数据时实际指向FLASH的地址指针          */
/*actual_fetch_p:  在写数据时实际从rx_prc_buff中读时指向的指针*/
/**************************************************************/
void  Store_mes(void)
{
     register unsigned int i=0;
     Page_switch(page_addr);        //切换到要存贮的那一块64K区域
   /*数据保护*/  
      special_addr1 = 0xaa;
      special_addr2 = 0x55;
      special_addr1 = 0xa0; 
//      EA = 0;
      while((i<256)&&(*actual_fetch_p != '\0'))

	  {
	     *actual_store_p = *actual_fetch_p ;
		  actual_store_p++;
		  actual_fetch_p++;
		  i++;
	  }
	  if(*actual_fetch_p == '\0')
	  {
         *actual_store_p = '\0' ;
		 store_prc_F = 0;             //不须要再存贮
	  }
//	  EA = 1;
      write_delay_time = TM20MS;
	  write_F = 1 ;

}

	     

/*******************************************************/
/*	struct  MES_CON_BLOCK xdata *prc_ctr_block  表示指向
/*从链表中分配到的用于存贮信息的内存块
/*******************************************************/
void Message_hd(void)
{

    if((received_mes_F == 1)&&(store_prc_F == 0)&&(write_F == 0))         
    {	
        
		prc_ctr_block = Create_tcb_block();  //得到内存块并先将其挂回disp_tcb_list中
        received_mes_F = 0  ;
		actual_store_p =(unsigned char xdata*)prc_ctr_block->mes_addr.address.address;   //得到信息放置的地址
		actual_fetch_p = mes_data;           //从何处开始取得存贮的信息
		page_addr = (unsigned char)prc_ctr_block->mes_addr.address.page_addr;
        store_prc_F = 1;
		pre_store_prc_F = 1;
//		Bank_switch(page_addr);       //存贮信息时先切换页
		Store_mes();		
	}
	else if(write_F == 0)
	{
	    if(store_prc_F == 1)          //写flash操作结束却信息没存完,继续
	         Store_mes();
	    else if(pre_store_prc_F == 1) //如果存信息刚结束
	   {
	       			 
	        pre_store_prc_F = 0;
		    Page_switch(PAGE_0);
			prc_ctr_block -> new_old_F = NEW;
       }
	}
}


/*******************************************************/
/*******************************************************/
void Write_flash_hd(void)
{
   if(write_F == 1)
   {
      if(write_delay_time != 0)
	     write_delay_time--;

	  if(write_delay_time == 0)
	      write_F = 0;
   }
}

/*******************************************************/
/* 此函数用于测试硬件线路所用,向特定的RAM和FLASH中写入*/
/* 特定的数据,然后读出,就可据此判别硬件线路是否正常  */
/*******************************************************/
/*
unsigned char  Test_hardware(void)
{
    unsigned char hard_status = 0;
    unsigned char test_step = 0;
	while(test_step<3)
	{
	    switch(test_step)
	    {
	       case 0:                     //测试RAM硬件线路
                  test_ram_adr1 = 0x00;
	              test_ram_adr2 = 0x55;
	              test_ram_adr3 = 0xaa;

	              if((test_ram_adr1 == 0x00)&&(test_ram_adr2 == 0x55)
			          &&(test_ram_adr3 == 0xaa))
	
	               test_step++;  //如果RAM硬件没问题,再测试FLASH硬件线路

	              else                      //RAM硬件有问题,
			      {
                      hard_status = 1;
				      test_step = 3;
			      }
		          break;
	        case 1:                  // 先测试FLASH的首64K的硬件线路
	               Page_switch(PAGE_0); 
				   special_addr1 = 0xaa;
                   special_addr2 = 0x55;
                   special_addr1 = 0xa0;
	               test_flash_adr1 = 0x00;
	               Delay_10ms();
				   special_addr1 = 0xaa;
                   special_addr2 = 0x55;
                   special_addr1 = 0xa0;
	               test_flash_adr2 = 0x55;
	               Delay_10ms();
				      special_addr1 = 0xaa;
                   special_addr2 = 0x55;
                   special_addr1 = 0xa0;
	               test_flash_adr3 = 0xaa;
	               Delay_10ms();

	               if((test_flash_adr1 == 0x00)&&(test_flash_adr2 == 0x55)
			          &&(test_flash_adr3 == 0xaa))   //FLASH 硬件没问题
                      test_step++;
			       else
			       {
				     hard_status = 2;
	                 test_step = 3;
				   }
			       break;
		    case 2:
		           Page_switch(PAGE_1);   // 测试FLASH的次64K的硬件线路
				    special_addr1 = 0xaa;
                   special_addr2 = 0x55;
                   special_addr1 = 0xa0;
			       test_flash_adr1 = 0x00;
	               Delay_10ms();
				      special_addr1 = 0xaa;
                   special_addr2 = 0x55;
                   special_addr1 = 0xa0;
	               test_flash_adr2 = 0x55;
	               Delay_10ms();
				      special_addr1 = 0xaa;
                  special_addr2 = 0x55;
                  special_addr1 = 0xa0;
	               test_flash_adr3 = 0xaa;
	               Delay_10ms();

	               if((test_flash_adr1 == 0x00)&&(test_flash_adr2 == 0x55)
			          &&(test_flash_adr3 == 0xaa))
                      test_step++;
			       else
			       {
				      hard_status = 3;
	                  test_step++;
				   }
				   Page_switch(PAGE_0);    //切换回正常状态
			       break;
		     default:
			         test_step = 3;
		            break;
	     }
	}
	Page_switch(PAGE_0);
    return(hard_status);
}*/

⌨️ 快捷键说明

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