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

📄 ch375c.h

📁 一段C的小程序
💻 H
字号:
/* 2004.06.05
****************************************
**  Copyright  (C)  W.ch  1999-2004   **
**  Web:  http://www.winchiphead.com  **
****************************************
**  USB Host File Interface for CH375 **
**  TC2.0@PC, KC7.0@MCS51             **
****************************************
*/
/* CH375 主机文件系统接口 */
/* 支持: FAT12/FAT16 */

/* MCS-51单片机C语言的U盘文件读写示例程序, 适用于89C52或者更大程序空间的单片机 */
/* 该程序将U盘中的/C51/CH375HFT.C文件中的小写字母转成大写字母后, 写到新建的文件NEWFILE.TXT中,
   如果找不到原文件CH375HFT.C, 那么该程序将显示C51子目录下所有以CH375开头的文件名, 并新建NEWFILE.TXT文件并写入提示信息,
   如果找不到C51子目录, 那么该程序将显示根目录下的所有文件名, 并新建NEWFILE.TXT文件并写入提示信息
*/
/* CH375的INT#引脚采用查询方式处理, 数据复制方式为"单DPTR复制", 所以速度较慢, 适用于所有MCS51单片机 */


/* C51   CH375HFT.C */
/* LX51  CH375HFT.OBJ , CH375HFA.LIB */
/* OHX51 CH375HFT */
/* 以下定义的详细说明请看CH375HFA.H文件 */
#define LIB_CFG_DISK_IO			1		/* 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */
#define LIB_CFG_FILE_IO			1		/* 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制" */
#define LIB_CFG_INT_EN			0		/* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */

#define CH375_CMD_PORT_ADDR  0xfef1	    //	0xBDF1	0xfef1/* CH375命令端口的I/O地址 */
#define CH375_DAT_PORT_ADDR  0xfaf0 	//	0xBCF0  0xfaf0	/* CH375数据端口的I/O地址 */
/* 62256提供的32KB的RAM分为三部分: 0000H-01FFH为磁盘读写缓冲区, 0200H-7DFFH为文件数据缓冲区, 7E00H-7FFFH为外部RAM变量区 */
#define	DISK_BASE_BUF_ADDR		0x00	/* 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE */
#define FILE_DATA_BUF_ADDR		0x00	/* 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度 */
/* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以外部RAM剩余长度为31744字节 */
#define FILE_DATA_BUF_LEN		0x200	/* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */

#define CH375_INT_WIRE			INT0	/* P3.2, INT0, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */

#include "CH375HFA.H"


//-------下面的代码是从c51.c中复制过来的变量伸明----------
#define uchar unsigned char
#define uint unsigned int
#define   day0    XBYTE[0x7f07]
#define   month0  XBYTE[0x7f08]
#define   year0   XBYTE[0x7f09]


#define  ReadFromEEP 20
#define  EqualWritCount 20   

 #define ICC_DATA  DBYTE[0Xd0]
 #define ICC_DATA1 DBYTE[0Xd1]
 #define ICC_DATA2 DBYTE[0Xd2]
 #define ICC_DATA3 DBYTE[0Xd3]
 #define ICC_DATA4 DBYTE[0Xd4]
 #define ICC_DATA5 DBYTE[0Xd5]
 #define ICC_DATA6 DBYTE[0Xd6]
 #define ICC_DATA7 DBYTE[0Xd7]
 #define ICC_DATA8 DBYTE[0Xd8]
 #define ICC_DATA9 DBYTE[0Xd9]
void send_char(unsigned char my_char);
void SegMentLcd_outbit(uchar i);
void SegMentLcd_SystemON();
void SegMentLcd_ON();
void Disp_SegMentLcd(uchar whichAddress,uchar D0_3);
void CLSSegMentLcd(); //LCD清屏
void DispSegmentNumber(uchar whichNO,uchar mydata,uchar PointBit); //在数字区进行数据显示
void   ClsSegmentNumber();  //清除数字区的全部显示
uint xdata  Now_BlankAdd, Now_StartAdd;                            //记录仪上的空白地址指针,及起始地址
unsigned long xdata NowIC_BlankAddress ;
unsigned long xdata NowIC_StartAddress;  //IC卡的空白地址指针,及起始地址
uchar ShengFen4_2(uint abc);
uchar toASC(uchar abc); //将送入的ABC转成为ASC;
void IIC_WRITE_ONEBYTE(uchar i,uchar j,uchar k);
void IIC_READ_ONEBYTE(uchar i,uchar j,uchar k);
 void ClsWDT(); //清除看门狗
//------------------------------------------------------------

/* 延时100毫秒,不精确 */
void	mDelay100mS( )
{
	UINT8	i, j, c;
	for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3;
}
//	mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "\\1234567.TXT" );  /* 新文件名,在根目录下 */
	


/* 检查操作状态,如果错误则显示错误代码并停机 */
void	mStopIfError( UINT8 iError )
{
	if ( iError == ERR_SUCCESS ) return;  /* 操作成功 */
	while ( 1 ) {
	 	mDelay100mS( );
 		mDelay100mS( );
	}
}

//void CLSSegMentLcd(); //LCD清屏
//void DispSegmentNumber(uchar whichNO,uchar mydata,uchar PointBit); //在数字区进行数据显示
//void Disp_SegMentLcd(uchar whichAddress,uchar D0_3);
//uint xdata PassgressAdd,AllCounts;
 
void USBFileOrq( ) {	
    uchar	i,HowFlash,otherIntB;
    uint c,otherIntA;
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
		for ( i = 0; i < 5; i ++ ) {  /* 有的U盘总是返回未准备好,不过可以被忽略 */
			mDelay100mS( );
			if ( CH375DiskReady( ) == ERR_SUCCESS ) break;  /* 查询磁盘是否准备好 */
		}
ClsWDT();
//--------------------------------------------------------------------------------
//-------------------------------------产生新文件 --------------------------------
//--------------------------------------------------------------------------------
 
 mCmdParam.Create.mPathName[0]=0x5c;	//"/"
//车牌号作为文件名
IIC_READ_ONEBYTE(1,17,2); 
c=ICC_DATA*256+ICC_DATA1; //川 [2位]

i= ShengFen4_2(c);
mCmdParam.Create.mPathName[1]= toASC(i/10);   mCmdParam.Create.mPathName[2]= toASC(i%10);

IIC_READ_ONEBYTE(1,19,6);
mCmdParam.Create.mPathName[3]=ICC_DATA;mCmdParam.Create.mPathName[4]=ICC_DATA1;
mCmdParam.Create.mPathName[5]=ICC_DATA2;mCmdParam.Create.mPathName[6]=ICC_DATA3;
mCmdParam.Create.mPathName[7]=ICC_DATA4;mCmdParam.Create.mPathName[8]=ICC_DATA5;

 
 
//扩展名-->  ".rec"	
    mCmdParam.Create.mPathName[9]=0x2e;   mCmdParam.Create.mPathName[10]=0x52;
	mCmdParam.Create.mPathName[11]=0x45;  mCmdParam.Create.mPathName[12]=0x43; 
//结束符-->  00H
    mCmdParam.Create.mPathName[13]=0;      mCmdParam.Create.mPathName[14]=0;
ClsWDT();
  		i = CH375FileCreate( );  /* 新建文件并打开,如果文件已经存在则先删除后再新建 */
		mStopIfError( i );
//------------------------------------------------------------------------------------------------------
//--------------------------------开始读取从0--空白地址的数据并写入到USB文件中--------------------------
//------------------------------------------------------------------------------------------------------
IIC_READ_ONEBYTE(0,0X40,6);
if(ICC_DATA!=0xaa)               {otherIntA  =0x150;}
else if(ICC_DATA1!=0xbb)         {otherIntA  =0x150;}
else if(ICC_DATA2!=ICC_DATA3 )   {otherIntA  =0x150;}
else if(ICC_DATA4!=ICC_DATA5 )   {otherIntA  =0x150;}
else                             {otherIntA  =ICC_DATA2*256+ICC_DATA5;}  //指出当前的空白地址是多少
 otherIntA= otherIntA+45;     //每次要读8个数据出来写入到缓冲区!!
ClsWDT(); 
Now_StartAdd=otherIntA+3840;

//1.开始写入行驶数据到USB中
 otherIntB=0;
 Now_BlankAdd=0;//进度条累加
HowFlash=0;
 for(c=0;c<otherIntA;c+=ReadFromEEP,Now_BlankAdd+=ReadFromEEP)
 {
 ClsWDT();
 i=c>>8; 
 IIC_READ_ONEBYTE(i,c,ReadFromEEP); 

for(i=0;i<ReadFromEEP;i++,otherIntB++) {mCmdParam.ByteWrite.mByteBuffer[otherIntB] =DBYTE[0XD0+i];} //DBYTE[0XD0+i];}
//-----------------------------------
//-------进度条显示------------------
//-----------------------------------

NowIC_BlankAddress=Now_BlankAdd*4;
   NowIC_BlankAddress*=5;
   NowIC_BlankAddress*=5;
  i=NowIC_BlankAddress/Now_StartAdd;
   DispSegmentNumber(3,0xe0,0);
   DispSegmentNumber(4,i/100,0);DispSegmentNumber(5,i/10%10,0);DispSegmentNumber(6,i%10,0);
   DispSegmentNumber(7,0xe0,0);
ClsWDT();
//向USb扇区中写入数据
 if(otherIntB==EqualWritCount)
  {HowFlash++;
   otherIntB=0;
  	mCmdParam.ByteWrite.mByteCount =EqualWritCount;
    i = CH375ByteWrite( );                 // 向文件写入数据 
   }
 }
ClsWDT();
//2. write 'VIVIVIVI' to USB----------------
     ICC_DATA=0x56;      ICC_DATA1= 0x49;
     ICC_DATA2=0x56;      ICC_DATA3= 0x49;
     ICC_DATA4=0x56;      ICC_DATA5= 0x49;
     ICC_DATA6=0x56;      ICC_DATA7= 0x49;
     ICC_DATA8=0x56;      ICC_DATA9= 0x49;
  for(i=0;i<10;i++,otherIntB++)  {mCmdParam.ByteWrite.mByteBuffer[i] =DBYTE[0XD0+i];} //DBYTE[0XD0+i];}
  	mCmdParam.ByteWrite.mByteCount =10;
    i = CH375ByteWrite( );                 // 向文件写入数据
 
//3.开始写入瞬时数据到USB中
otherIntB=0;
for(c=0x7000;c<0x7f00;c+=ReadFromEEP,Now_BlankAdd+=ReadFromEEP)
 {ClsWDT();
 i=c>>8; 
 IIC_READ_ONEBYTE(i,c,ReadFromEEP); 
 for(i=0;i<ReadFromEEP;i++,otherIntB++) { mCmdParam.ByteWrite.mByteBuffer[otherIntB] = DBYTE[0XD0+i];
 } //DBYTE[0XD0+i];}


//向USb扇区中写入数据
 if(otherIntB==EqualWritCount)
  {HowFlash++;
   otherIntB=0;
  	mCmdParam.ByteWrite.mByteCount =EqualWritCount;
   i = CH375ByteWrite( );                 // 向文件写入数据 
ClsWDT();

//-----------------------------------
//-------进度条显示------------------
//----------------------------------- 
if(i<99)
   {

NowIC_BlankAddress=Now_BlankAdd*4;
   NowIC_BlankAddress*=5;
   NowIC_BlankAddress*=5;
   i=NowIC_BlankAddress/Now_StartAdd;
    DispSegmentNumber(3,0xe0,0);
    DispSegmentNumber(4,i/100,0);DispSegmentNumber(5,i/10%10,0);DispSegmentNumber(6,i%10,0);
    DispSegmentNumber(7,0xe0,0);
  }
   }
 }
 

//-------------------完   成-------------------------------------- 
 c=2000+year0;
  mCmdParam.Modify.mFileAttr = 0xff;  // 输入参数: 新的文件属性,为0FFH则不修改
		mCmdParam.Modify.mFileTime = 0xffff;  // 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间
		mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( c, month0, day0 ); // 输入参数: 新的文件日期: 2004.05.18
	//	mCmdParam.Modify.mFileDate = MAKE_FILE_TIME(hour0, minuts0, second0 ); // 输入参数: 新的文件日期: 2004.05.18
		mCmdParam.Modify.mFileSize = 0xffffffff;  // 输入参数: 新的文件长度,以字节为单位写文件应该由程序库关闭文件时自动更新长度,所以此处不修改
		i = CH375FileModify( );  // 修改当前文件的信息,修改日期
		mStopIfError( i ); 
		mCmdParam.Close.mUpdateLen = 1;  /* 自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */
		i = CH375FileClose( );
		mStopIfError( i );

 
		ClsWDT();
Disp_SegMentLcd(26,6);//USB采集完成!
ClsSegmentNumber ();
DispSegmentNumber(3,0xe0,0);
DispSegmentNumber(4,0xe0,0);
DispSegmentNumber(5,0xe0,0);
DispSegmentNumber(6,0xe0,0);
 
//	if ( CH375IntStatus == USB_INT_DISCONNECT ) {goto USB_EXIT;}
//while ( CH375DiskStatus != DISK_DISCONNECT )
// {	    
// xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘拔出 */
// ClsWDT();}

 }

⌨️ 快捷键说明

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