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

📄 oledwinch.c

📁 一种深度和拉力测量系统
💻 C
📖 第 1 页 / 共 4 页
字号:
	MEM_CLE=0;
	TRISD = 0xFF;
}
//----存储地址计算
void MEM_CalAddr(unsigned char sector_addr,
                 unsigned char block_addr,
                 unsigned char page_addr)
{
	second_addr = ((block_addr & 0x07)<<5) | page_addr;
	third_addr  = ((sector_addr & 0x07)<<5) | ((block_addr & 0xF8)>>3);
}

//--------------
void MEM_WeAddr(void)
{
//char first_addr,char second_addr,char third_addr
	TRISD=0X00;
	PORTD=0X00;
//address
	MEM_ALE=1;
	MEM_WE=0;
	PORTD=first_addr;
	MEM_WE=1;

	MEM_WE=0;
	PORTD= second_addr;
	MEM_WE=1;

	MEM_WE=0;	
	PORTD=third_addr;
	MEM_WE=1;
	MEM_ALE=0;

	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();
	Delay1TCY();			

	TRISD=0XFF;
}
//---------------------
unsigned char MEM_status(void)
{
	char stu;

	PORTE = 0xe6;
	TRISE = 0x00;				// Set port D as output

	MEM_DIR = 1;
	TRISD = 0x00;				// Set port D as output
	MEM_COMD(0x70);
	TRISD = 0x00;

	MEM_DIR = 0;
	TRISD = 0xFF;

	MEM_CE = 0;

	Delay1KTCYx(100);

	MEM_RE = 0;
	stu = PORTD;
	MEM_RE = 1;

	MEM_CE = 1;
	MEM_DIR = 1;
	return(stu);
}
//----------------------------------------------------------------------------------
void MEM_EraseBlock(unsigned char sector_addr,
                    unsigned char block_addr,
                    unsigned char page_addr)
{

	TRISD=0X00;
	MEM_CalAddr(sector_addr,block_addr,page_addr);
	MEM_COMD(0x60);					// Write a command(Erase)

	MEM_DIR = 1;
	TRISD = 0b00000000;

	MEM_ALE = 1;

	MEM_WE = 0;
	PORTD = second_addr;			// Write A9-A16
	MEM_WE = 1;

	MEM_WE = 0;
	PORTD = third_addr;				// Write A17-A21
	MEM_WE = 1;

	MEM_ALE = 0;

	MEM_COMD(0xd0);					// Erase start command

//	while(!(0x40 & MEM_status()));	// status: bit6=1 ready
	WaitMEM_Stu();

	MEM_CE = 1;
	MEM_DIR = 1;
	TRISD = 0b11111111;

}
//------------------------------------------------------------------------------------
void MEM_ReadLine(unsigned char sector_addr,
	          	  unsigned char block_addr,
                  unsigned char page_addr,
                  unsigned char line_addr)
{
     unsigned char i;

		MEM_CE = 0;					// chip1

	if(line_addr <4) {
		MEM_COMD(0x00);					// Read mode 0
		first_addr = line_addr;
	}
	else {
		MEM_COMD(0x01);					// Read mode 1
		first_addr = line_addr - 4;
	}

	first_addr = first_addr * 64;

	MEM_CalAddr(sector_addr,block_addr,page_addr);// Cal address
	MEM_WeAddr();						// Write address

	TRISD = 0b11111111;					// Port D: input
	MEM_DIR = 0;

	for(i=0;i<=63;i++) {				// Read 64 bytes
		MEM_RE = 0;
		DataPack[i]= PORTD;
		MEM_RE = 1;
	}

	MEM_CE = 1;
	MEM_DIR = 1;

}
//---------------------------------------------------------------------------------
void MEM_WriteLine(unsigned char sector_addr,
	           	   unsigned char block_addr,
                   unsigned char page_addr,
                   unsigned char line_addr)
{
     unsigned char i,j;
	TRISD = 0x00;
	MEM_CE = 0;					// chip1

	MEM_COMD(0x80);						// Serial data mode
	MEM_CalAddr(sector_addr,block_addr,page_addr);	// Cal address
	first_addr = 0;
	MEM_WeAddr();

	MEM_DIR = 1;
	TRISD = 0b00000000;					// Port D: output

	for(i=0;i<line_addr;i++) {
		for(j=0;j<=63;j++) {			// Write 64 bytes "FF" to a line
			MEM_WE = 0;
			PORTD = 0xff;		 
			MEM_WE = 1;
		}
	}

	for(j=0;j<=63;j++) {				// Write 64 bytes data to a line
		MEM_WE = 0;
		PORTD = DataPack[j];		 
		MEM_WE = 1;
	}

	for(i=line_addr+1;i<8;i++) {
		for(j=0;j<=63;j++) {			// Write 64 bytes "FF" to a line
			MEM_WE = 0;
			PORTD = 0xff;		 
			MEM_WE = 1;
		}
	}

	for(j=0;j<=15;j++) {				// Write 16 bytes "FF" to a line
		MEM_WE = 0;
		PORTD = 0xff;		 
		MEM_WE = 1;
	}

	MEM_COMD(0x10);						// Auto program mode
//	while(!(0x40 & MEM_status()));		// Test status: bit6=1 ready
	WaitMEM_Stu();

	MEM_CE = 1;
	MEM_DIR = 1;
	TRISD = 0b11111111;

}
//------------------------------
void MEM_LoadBadBlock(unsigned char sector_addr)
{
   unsigned char i;

	MEM_ReadLine(0,0,0,sector_addr+1);
	
	for(i=0;i<32;i++) {
		BadBlock_Table[i] = DataPack[i];
	}
}

//-------------------------------------------------
void MEM_CWritePage(unsigned char sector_addr,
                    unsigned char block_addr,
                    unsigned char page_addr,
		    		unsigned char x)
{
   unsigned int i,a;
	MEM_CE=0;

	MEM_COMD(0x80);
	MEM_CalAddr(sector_addr,block_addr,page_addr);	// Cal address
	first_addr = 0;
	MEM_WeAddr();					// write address

	MEM_DIR = 1;
	TRISD = 0X00;				// Port D: output

	for(i=0;i<=255;i++) {			// write 256 bytes
		MEM_WE = 0;
		PORTD = x;
		MEM_WE = 1;
	}

	for(i=0;i<=255;i++) {			// write 256 bytes
		MEM_WE = 0;
		PORTD = x;
		MEM_WE = 1;
	}

	for(i=0;i<=15;i++) {			// write 16 bytes
		MEM_WE = 0;
		PORTD = 0xff;
		MEM_WE = 1;
	}

	MEM_COMD(0x10);				// Auto program mode

//	while(!(0x40 & MEM_status()));
	WaitMEM_Stu();

	MEM_CE = 1;
	MEM_DIR = 1;
	TRISD = 0XFF;

}
//------------------------------------------------
void MEM_CWriteBlock(unsigned char sector_addr,
                     unsigned char block_addr,
		     		 unsigned char x)
{
   unsigned char i;

	for(i=0;i<16;i++) {
		MEM_CWritePage(sector_addr,block_addr,i,x);
	}
}
//---
void Init_FLASH_MEM(void)
{
	MEM_LoadBadBlock(0);
}

//--------------------------------------------------
unsigned char MEM_CompPage(unsigned char sector_addr,
		           		   unsigned char block_addr,
			   			   unsigned char page_addr,		
			   			   unsigned char x)
{
     unsigned int i;
     unsigned char data_byte;
	MEM_CE=0;

	MEM_COMD(0x00);				// Write command: Read mode 0
	MEM_CalAddr(sector_addr,block_addr,page_addr);	// Cal address
	first_addr = 0;
	MEM_WeAddr();

	TRISD = 0XFF;			// Port D: input
	MEM_DIR = 0;

	for(i=0;i<512;i++) {		// Read 512 bytes
		MEM_RE = 0;
		data_byte = PORTD;
		MEM_RE = 1;
		if(data_byte != x) {
			MEM_CE = 1;
			return(1);			// return=1 : the block is bad
		}	
	}

	MEM_CE = 0;
	MEM_DIR = 1;
	return(0);
}

//---------------------------------------------

unsigned char MEM_CompBlock(unsigned char sector_addr,
		            		unsigned char block_addr,
			    			unsigned char x)
{
  unsigned char i;
  unsigned char result;

	for(i=0;i<=15;i++) {
		result = MEM_CompPage(sector_addr,block_addr,i,x);
		if(result==1) return(1); 
	}
	return (0);
}
//-----------------------------------------------
void MEM_GetMark(unsigned char block_addr,unsigned char *temp1,unsigned char *temp2)
{
  unsigned char temp3;

	*temp1 = block_addr/8;///
	temp3  = block_addr & 0x07;///

	*temp2 = 1;

	while(temp3) {
		*temp2 = (*temp2) * 2;
		temp3 = temp3 - 1;
	}
}
//------------------------------------------------
unsigned char MEM_CheckBlock(unsigned block_addr)
{
  unsigned char temp1,temp2;			// temp1: offset of byte in Bad Block
										// temp2: mask

	MEM_GetMark(block_addr,&temp1,&temp2);
	if(BadBlock_Table[temp1] & temp2 ==0) {
		return 0;
	}
	else {
		return 1;
	} 
}
//---------------------------------------------
void MEM_MarkBad(unsigned char block_addr)
{
  unsigned char temp1,temp2;

	MEM_GetMark(block_addr,&temp1,&temp2);		// temp1,temp2
	temp2 = ~temp2;
	BadBlock_Table[temp1] = BadBlock_Table[temp1] & temp2;
}
//---------------
void MEM_FormatSector(unsigned char sector_addr)
{
  unsigned int i;
  unsigned char result;

	for(i=0;i<=31;i++) {
		BadBlock_Table[i] = 0xff;		// Bad block table: 32 btyes
	}

	for(i=4;i<=255;i++) {
		result = MEM_CompBlock(sector_addr,i,0xff);		// check "FF"
		if(result==1) MEM_MarkBad(i);
	}

	for(i=4;i<=255;i++) {

		MEM_CWriteBlock(sector_addr,i,0x55);
		result = MEM_CompBlock(sector_addr,i,0x55);		// check "0x55"

		if(result==1) {
			MEM_MarkBad(i);
		}
		else {
			MEM_EraseBlock(sector_addr,i,0);
			MEM_CWriteBlock(sector_addr,i,0xaa);
			result = MEM_CompBlock(sector_addr,i,0xaa); 	// check "0xaa"
			if(result==1) {
				MEM_MarkBad(i);
			} 
			else {
				MEM_EraseBlock(sector_addr,i,0);
			}
		}
	}

}
//-----------------------------------------
void MEM_Format(void)
{
  unsigned char i,j;


	MEM_EraseBlock(0,0,0);

	DataPack[0]= 0x88;
	for(i=1;i<=63;i++) {
		DataPack[i] = 0xff;
	}

	MEM_WriteLine(0,0,0,0);		// write a mark "88"

	for(j=0;j<=3;j++) {						// 4 sectors
		MEM_FormatSector(j);

		for(i=0;i<=31;i++) {
			DataPack[i] = BadBlock_Table[i];
			DataPack[i+32] = 0;
		}
		MEM_WriteLine(0,0,0,j+1);	// write the badblock table
	}
}
//=====================
//=====================
//
//----存储模式的PPS---
//
//=====================
void MEM_LableFirst(void)
{
			DataPack[0] = 0x37;
			DataPack[1] = 0;
			DataPack[2] = 0;
			DataPack[3] = 0;
			DataPack[4] = 0xff;
			DataPack[5] = 0xff;
			DataPack[6] = 0xff;
			DataPack[7] = 0xff;

			DataPack[8]  = 0x00;
			DataPack[9]  = 0x00;
			DataPack[10] = 0x00;
			DataPack[11] = 0x00;
			DataPack[12] = 0x00;
			DataPack[13] = 0x00;
			DataPack[14] = 0x00;

			DataPack[15] = 0xff;

	SCNTR = SCNTR + 16;
}
//----------------------------------------------
void MEM_LableData(void)
{

			DataPack[0] = 0x37;
			DataPack[1] = time.c[2];
			DataPack[2] = time.c[1];
			DataPack[3] = time.c[0];

			DataPack[4] = 0;
			DataPack[5] = 0;
			DataPack[6] = 0;
			DataPack[7] = 0;

			DataPack[8]  = 0x00;
			DataPack[9]  = 0x00;
			DataPack[10] = 0x00;
			DataPack[11] = 0x00;
			DataPack[12] = 0x00;
			DataPack[13] = 0x00;
			DataPack[14] = 0x00;

			DataPack[15] = 0xff;	

	SCNTR = SCNTR + 16;
}
//-----------------------------------------------------------------------------
void MEM_FindNext(void)			//find next good block
{
	MEM_LoadBadBlock(MEM_sector);

	do {
		if(MEM_block==255) {
			MEM_sector = MEM_sector + 1;
//			if(MEM_sector==4) {
			if(MEM_sector==16) {   //Memory full
				Out_MEM = 1;
				return;
			}
			MEM_LoadBadBlock(MEM_sector);
			MEM_block = 0;
			MEM_page = 0;
			MEM_line = 0;
		}
		if(MEM_CheckBlock(MEM_block)==1) return;	// This block is good
		MEM_block = MEM_block + 1;					// Check next block
	} while(1);
}
//-------------------------------------------------------------------------------
void MEM_FindFirst(void)
{

	MEM_sector = 0;
	MEM_block  = 3;
	MEM_page   = 0;
	MEM_line   = 0;

	do {
		MEM_block = MEM_block + 1;
		MEM_FindNext();
		if(Out_MEM==1) return;
		MEM_ReadLine(MEM_sector,MEM_block,MEM_page,MEM_line);
	} while(DataPack[0]==0x37);
}
//---------------------------------------------------------------------------------
void DataSave(void)
{
	DataPack[SCNTR + 0] = time.c[3];				// Real timer high 
	DataPack[SCNTR + 1] = time.c[2];
	DataPack[SCNTR + 2] = time.c[1];	
	DataPack[SCNTR + 3] = time.c[0];		
	DataPack[SCNTR + 4] = depth.c[3];		// DH
	DataPack[SCNTR + 5] = depth.c[2];		// 
	DataPack[SCNTR + 6] = depth.c[1];		// 
	DataPack[SCNTR + 7] = depth.c[0];		// DL

	SCNTR = SCNTR + 8;
	if(SCNTR==0x40) {

	SCNTR = 0;
OLED_Dis1(1,6,56,256);	
	MEM_WriteLine(MEM_sector,MEM_block,MEM_page,MEM_line);
OLED_Dis1(1,6,56,352);
	MEM_line = MEM_line + 1;

	if(MEM_line==8) {
		MEM_line=0;
		MEM_page=MEM_page + 1;

		if(MEM_page==16) {
			MEM_page=0;
			MEM_block=MEM_block + 1;
			MEM_FindNext();
			MEM_LableData();
		}
	}
 }
}
//-------------------------
void Init_MEM(void)							// Init memory chips
{
	Res1 = 0;
	Res2 = 0;

	PSEG  = 0;
	line=0;
	SCNTR = 0;

	Init_FLASH_MEM();						// Get badblock table of chip0

	MEM_ReadLine(0,2,0,0);				// Read programming
	SMU = DataPack[0];
	SMV = DataPack[1];
	SMH = DataPack[2];
	SML = DataPack[3];
	AMH = DataPack[4];
	AML = DataPack[5];

	Alarm_Time = (unsigned int)AMH*256 + 
	       		  (unsigned int)AML;

	AD_CYC = Alarm_Time;

	Prog_Time = (unsigned long)SMU*65536*256 + 
	       	  	 (unsigned long)SMV*65536 + 
	       		 (unsigned long)SMH*256 + 
	       		 (unsigned long)SML;

	Prog_Time=Prog_Time+time.l;

	MEM_FindFirst();						// find first unused data block
	if(Out_MEM==1) return;
	MEM_LableFirst();						// label first record of block
//	Save_MEM_STS(0);						// save status of the 1st chip
}
void Init_HowSPM(void)
{
	if(Out_MEM==1) { 
		RST=0;
		RST=1;
		Newlcd_init();
		ErrNo=832;
		NoSaveSample();	
	}
}
///-------------------
///----OLED-----
///-------------------
void LCDRDY(void)
{
	unsigned char busy,temp;
	temp=0xf3;
	TRISD = 0xff;
	LCD_RS=0;   //Read Status
	LCD_RW=1;
	do{
	PORTD=0xff;	
	LCD_EN=1;
	busy = PORTD;
	temp = (busy&0x80);
	LCD_EN=0;
	}while(temp!=0);

	TRISD = 0x00;	
}
/////
void LCDCMD1(unsigned char x)
{
	LCD_CS1=0;
	LCD_CS2=1;
	LCDRDY();
	LCD_RS=0;	//Command
	LCD_RW=0;	//Write
	PORTD = x;
	LCD_STROBE;
}
/////
void LCDData1(unsigned char x)
{
	LCD_CS1=0;
	LCD_CS2=1;
	LCDRDY();
	LCD_RS=1;  //Data
	LCD_RW=0;  //Write
	PORTD = x;
	LCD_STROBE;
}
/////
void LCDCMD2(unsigned char x)
{
	LCD_CS1=1;
	LCD_CS2=0;
	LCDRDY();
	LCD_RS=0;//Comd
	LCD_RW=0;	
	PORTD = x;
	LCD_STROBE;
}
/////
void LCDData2(unsigned char x)
{
	LCD_CS1=1;
	LCD_CS2=0;
	LCDRDY();
	LCD_RS=1;//Data
	LCD_RW=0;
	PORTD = x;
	LCD_STROBE;
}
//
void OLED_CLR(char x)
{
	int i,j;
	unsigned char a;
	for(i=0;i<8;i++){
	com=(0xb8+i);
		LCDCMD1(com);
		LCDCMD2(com);
	com=0x40;
		LCDCMD1(com);
		LCDCMD2(com);

⌨️ 快捷键说明

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