📄 ch375c.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 + -