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

📄 file.c

📁 这个是录音琴的程序,用光电感应器来检测琴键的动作.并且将他记录下来,可以回放.
💻 C
📖 第 1 页 / 共 2 页
字号:
功能: 写入U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE WriterUsbFile(UHWORD writeLength,UBYTE *pBuffer)
{
	UHWORD	len,i,j;
	UBYTE	bSuccess,bStop,step,SecCnt2Write,bUpdate;

	if(!DiskFlags.UDiskOK)
		return	false;

	if(!ThisFile.bFileOpen)
		return	false;

	if(writeLength>32768)
		return	false;

	ThisFile.bFileOpen=0;
	bSuccess=1;
	bStop=0;
	bUpdate=1;
	j=0;

	if(ThisFile.StartCluster<1)
	{
		ThisFile.StartCluster=CreateClusterLink(0x00000000);
		ThisFile.LengthInByte=0;
		ThisFile.ClusterPointer=ThisFile.StartCluster;
		ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
		ThisFile.OffsetofSector=0;
		ThisFile.SectorofCluster=0;
		ThisFile.pointer=0;
		ThisFile.FatSectorPointer=0;
	}

	if(ThisFile.OffsetofSector>0)
	{
		if(writeLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
			len=DeviceInfo.BPB_BytesPerSec;
		else
			len=writeLength+ThisFile.OffsetofSector;

		if(!RBC_Read(ThisFile.SectorPointer,1,DBUF))
			return	false;

		len=len-ThisFile.OffsetofSector;

		for(i=0;i<len;i++)
			DBUF[ThisFile.OffsetofSector+i]=*(pBuffer+i);

		if(!RBC_Write(ThisFile.SectorPointer,1,DBUF))
			return	false;

		ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
		step=ThisFile.OffsetofSector/DeviceInfo.BPB_BytesPerSec;
		writeLength-=len;
		j+=len;
		ThisFile.pointer+=len;

		if(step>0)
			FileInfoUpdate(step);
	}

	while(writeLength>0)
	{
		if(bUpdate==1)
		{
			StartSec2Write=ThisFile.SectorPointer;
		 	BufStartAddress=pBuffer+j;
		 	SecCnt2Write=0;
		 	bUpdate=0;
		}

		step=(writeLength-1)/DeviceInfo.BPB_BytesPerSec+1;

		if(step+ThisFile.SectorofCluster<DeviceInfo.BPB_SecPerClus+1)
		{
			SecCnt2Write+=step;
			len=writeLength;
			ThisFile.OffsetofSector=len;

			writeLength-=len;
			j+=len;
			ThisFile.pointer+=len;

			if(!RBC_Write(StartSec2Write,SecCnt2Write,BufStartAddress))
				return	false;

		   	step=ThisFile.OffsetofSector/DeviceInfo.BPB_BytesPerSec;
		   	FileInfoUpdate(step);
		}
		else
		{
			while(step+ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus)
			{
		   		step=DeviceInfo.BPB_SecPerClus-ThisFile.SectorofCluster;
		   		SecCnt2Write+=step;
		   		len=step*DeviceInfo.BPB_BytesPerSec;
		   		ThisFile.OffsetofSector=len;

		   		writeLength-=len;
		 		j+=len;
		 		ThisFile.pointer+=len;

		   		OldClusterPointer=ThisFile.ClusterPointer;
		   		FileInfoUpdate(step);

		   		if(ThisFile.ClusterPointer!=OldClusterPointer+1)
				{
		   			if(!RBC_Write(StartSec2Write,SecCnt2Write,BufStartAddress))
						return	false;

		   			bUpdate=1;
		   			break;
				}

		   		if(SecCnt2Write>63)		// 如果超过每次最大写的数量
		   		{
		   			if(!RBC_Write(StartSec2Write,SecCnt2Write,BufStartAddress))
						return	false;

		   			bUpdate=1;
		   			break;
		   		}

		   		step=(writeLength-1)/DeviceInfo.BPB_BytesPerSec+1;
			}
		}
	}

	WriteFileEnd();

	j=0;
	ThisFile.bFileOpen=1;

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: void UsbSaveFile(UBYTE *fileName);
功能: U盘文件储存.
-----------------------------------------------------------------------------------*/
void UsbSaveFile(UBYTE *fileName)
{
	UBYTE	idata	i;
	UWORD 	idata	lenth;

	((UBYTE*)&lenth)[0] = InOutBuf[18];
	((UBYTE*)&lenth)[1] = InOutBuf[19];
	((UBYTE*)&lenth)[2] = InOutBuf[20];
	((UBYTE*)&lenth)[3] = InOutBuf[21];

	lenth += 22;

	for(i=0;i<8;i++)
		UsbItemBuf[i] = fileName[i];

	UsbItemBuf[8]  = 'M';
	UsbItemBuf[9]  = 'I';
	UsbItemBuf[10] = 'D';

	UsbItemBuf[11] = 0x20;
	UsbItemBuf[12] = 0x18;
	UsbItemBuf[13] = 0x75;
	UsbItemBuf[14] = 0xCD;
	UsbItemBuf[15] = 0xB4;
	UsbItemBuf[16] = 0xE2;
	UsbItemBuf[17] = 0x2E;
	UsbItemBuf[18] = 0xE2;
	UsbItemBuf[19] = 0x20;
	UsbItemBuf[20] = 0x20;
	UsbItemBuf[21] = 0xCE;
	UsbItemBuf[22] = 0xB4;
	UsbItemBuf[23] = 0xE2;
	UsbItemBuf[24] = 0x20;
	UsbItemBuf[25] = 0x20;
	UsbItemBuf[26] = 0x20;
	UsbItemBuf[27] = 0x20;
	UsbItemBuf[28] = 0x20;
	UsbItemBuf[29] = 0x20;
	UsbItemBuf[30] = 0x20;
	UsbItemBuf[31] = 0x20;


	RemoveUsbFile(&UsbItemBuf);
	CreateUsbFile(&UsbItemBuf);
	WriterUsbFile(lenth,InOutBuf);
}

/*-----------------------------------------------------------------------------------
名称: UHWORD ReadtUsbList(UBYTE *pBuffer);
功能: 读取U盘根目录.
-----------------------------------------------------------------------------------*/
UHWORD ReadtUsbList(UBYTE *pBuffer)
{
	UHWORD	idata	i,item,sector;
	UBYTE	idata	j,k;
	UWORD	idata	sectorToRead,dirClusterPointer;

	if(!DiskFlags.UDiskOK)
		return	false;

	item   = 0;
	sector = 0;
	dirClusterPointer = ThisDir.StartCluster;

	for(;;)
	{
		if(!SeekSectorToRead(&dirClusterPointer,&sector,&sectorToRead))
			return	false;

		if(!RBC_Read(sectorToRead,1,DBUF))
			return	false;

		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
		{
			if(DBUF[i]==0x00)
				return(item/32);

			else if(DBUF[i]==0xE5)
				continue;

			else if((DBUF[i]&0x40==0x40)&&(DBUF[i+11]&0x0f==0x0f))
			{
				j=(DBUF[i]&0x0F)*32;

				if((DBUF[i+8+j]=='M')&&(DBUF[i+9+j]=='I')&&(DBUF[i+10+j]=='D'))
				{
					for(k=0;k<32;k++)
						pBuffer[item++] = DBUF[i+j+k];
				}

				i = i+j;
			}
			else
			{
				if((DBUF[i+8]=='M')&&(DBUF[i+9]=='I')&&(DBUF[i+10]=='D'))
				{
					for(k=0;k<32;k++)
						pBuffer[item++] = DBUF[i+k];
				}
			}
		}
	}

	return(item/32);
}

/*-----------------------------------------------------------------------------------
名称: UBYTE OpenUsbFile(UBYTE *pBuffer);
功能: 打开U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE OpenUsbFile(UBYTE *pBuffer)
{
	UHWORD	i,sector;
	UBYTE	j,bstop;
	UWORD	sectorToRead,dirClusterPointer;

	PDIR_STRUC	pDir;

	if(!DiskFlags.UDiskOK)
		return	false;

	bstop  = 0;
	sector = 0;
	ThisFile.bFileOpen = 0;
	dirClusterPointer = ThisDir.StartCluster;

	for(;;)
	{
		if(!SeekSectorToRead(&dirClusterPointer,&sector,&sectorToRead))
			return	false;

		if(!RBC_Read(sectorToRead,1,DBUF))
			return	false;

		for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
		{
			if(DBUF[i]==0x00)
				return	false;

			j=0;
			while(DBUF[i+j]==*(pBuffer+j))
			{
				 j=j+1;
				 if(j>10)
				 	break;
			}

			if(j>10)
			{
			    for(j=0;j<32;j++)
			    	UsbItemBuf[j]=DBUF[i+j];

			    ThisFile.bFileOpen=1;
			    bstop=1;
			    break;
			}
		}

		if(bstop==1)
			break;
	}

	pDir=(PDIR_STRUC)UsbItemBuf;

	if(DiskFlags.bIsFat32==0)
		ThisFile.StartCluster=SwapINT16(pDir->DIR_FstClusLO);
	else
		ThisFile.StartCluster=MakeWord(UsbItemBuf[21],UsbItemBuf[20],UsbItemBuf[27],UsbItemBuf[26]);

	ThisFile.LengthInByte=SwapINT32(pDir->DIR_FileSize);
	ThisFile.ClusterPointer=ThisFile.StartCluster;
	ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.StartCluster);
	ThisFile.OffsetofSector=0;
	ThisFile.SectorofCluster=0;
	ThisFile.pointer=0;

	for(j=0;j<11;j++)
		ThisFile.FileName[j]=*(pBuffer+j);

	FreeClusterNum=DeviceInfo.FSI_Nxt_Free;
	FreeSecNum=ThisFatSecNum(DeviceInfo.FSI_Nxt_Free);

	if(!RBC_Read(FreeSecNum,1,CurFatSector))
		return	false;

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE ReadUsbFile(UHWORD readLength,UBYTE *pBuffer);
功能: 读取U盘文件.
-----------------------------------------------------------------------------------*/
UBYTE ReadUsbFile(UHWORD readLength,UBYTE *pBuffer)
{
	UHWORD	idata	len,i,j;
	UBYTE	idata	bSuccess;

	if(!DiskFlags.UDiskOK)
		return	false;

	if(!ThisFile.bFileOpen)
		return	false;

	j=0;
	bSuccess=1;
	ThisFile.bFileOpen=0;

	if(readLength>RAM_SIZE)
		return	false;

	if(readLength+ThisFile.pointer>ThisFile.LengthInByte)
		return	false;

	while(readLength>0)
	{
		if(readLength+ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec)
		   	len = DeviceInfo.BPB_BytesPerSec;
		else
		   	len = readLength+ThisFile.OffsetofSector;

		if(ThisFile.OffsetofSector>0)
		{
			if(RBC_Read(ThisFile.SectorPointer,1,DBUF))
		   	{
		   		len=len-ThisFile.OffsetofSector;

		   		for(i=0;i<len;i++)
		   			*(pBuffer+i)=DBUF[ThisFile.OffsetofSector+i];

		   		ThisFile.OffsetofSector=ThisFile.OffsetofSector+len;
		   	}
		   	else
				return	false;
		}
		else
		{
			if(!RBC_Read(ThisFile.SectorPointer,1,pBuffer+j))
				return	false;

		   	ThisFile.OffsetofSector=len;
		}

		readLength -= len;
		j += len;

		if(ThisFile.OffsetofSector>DeviceInfo.BPB_BytesPerSec-1)
		{
		   	ThisFile.OffsetofSector-=DeviceInfo.BPB_BytesPerSec;
		   	ThisFile.SectorofCluster+=1;

		   	if(ThisFile.SectorofCluster>DeviceInfo.BPB_SecPerClus-1)
		   	{
		   		ThisFile.SectorofCluster=0;
		 		ThisFile.ClusterPointer=GetNextClusterNum(ThisFile.ClusterPointer);

		 		if(DiskFlags.bIsFat32==0)
		 		{
		 			if(ThisFile.ClusterPointer>0xffef)
					   return	false;
		 		}
		 		else
		 		{
		 			if(ThisFile.ClusterPointer>0x0ffffff8)
					   return	false;
		 		}

		 		ThisFile.SectorPointer=FirstSectorofCluster(ThisFile.ClusterPointer);
		   	}
		   	else
		   		ThisFile.SectorPointer=ThisFile.SectorPointer+1;
		}
	}

	ThisFile.bFileOpen=1;
	ThisFile.pointer += j;

	return	true;
}

/*-----------------------------------------------------------------------------------
名称: UBYTE FileOpenDisk(UHWORD Point);
功能: 根据序号打开磁盘文件到RAM.
-----------------------------------------------------------------------------------*/
UBYTE FileOpenDisk(UHWORD Point)
{
	UBYTE	idata	i;
	UHWORD	idata	len;

	Point *= 32;

	for(i=0;i<8;i++)
		InputFileName[i] = InOutBuf[Point+i];

	if(OpenUsbFile(&InOutBuf[Point]))
	{
		len = MakeWord(InOutBuf[Point+31],InOutBuf[Point+30],InOutBuf[Point+29],InOutBuf[Point+28]);

		if(ReadUsbFile(len,InOutBuf))
			return	true;
		else
			return	false;
	}
	else
		return	false;
}














⌨️ 快捷键说明

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