📄 text1.c
字号:
#include <at89x52.h>
#include <stdio.h>
#include <string.h>
#include "LCD_FUN.H"
#include "DS1302_18B20.H"
#include "FileOperMenu.h"
#define LIB_CFG_DISK_IO 2 // 磁盘读写的数据的复制方式,1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制"
#define LIB_CFG_FILE_IO 2 // 文件读写的数据的复制方式,0为"外部子程序",1为"单DPTR复制",2为"双DPTR复制",3为"单DPTR和P2+R0复制"
#define LIB_CFG_INT_EN 1 // CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式"
#define CH375_CMD_PORT_ADDR 0x8FFF // CH375命令端口的I/O地址
#define CH375_DAT_PORT_ADDR 0x8EFF // CH375数据端口的I/O地址
// 62256提供的32KB的RAM分为两部分: 0000H-7DFFH为文件读写缓冲区, 7E00H-7FFFH为磁盘数据缓冲区
#define DISK_BASE_BUF_ADDR 0x7800 // 外部RAM的磁盘数据缓冲区的起始地址,从该单元开始的缓冲区长度为SECTOR_SIZE
#define FILE_DATA_BUF_ADDR 0x0000 // 外部RAM的文件数据缓冲区的起始地址,缓冲区长度不小于一次读写的数据长度
// 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以外部RAM剩余长度为32256字节
#define FILE_DATA_BUF_LEN 0x7800 // 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度
#define CH375_INT_NO 0 // CH375中断号, CH375的中断线INT#引脚连接单片机的INT0引脚
#define CH375_INT_FLAG IE0 // IE0,CH375中断标志
#define CH375_INT_EN EX0 // EX0,CH375中断允许
#include "CH375HF4.H"
void mDelay100mS( )
{
UINT8 i, j, c;
for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3;
}
///////// 将程序空间的字符串复制到内部RAM中,返回字符串长度 ////////
UINT8 mCopyCodeStringToIRAM( UINT8 *iDestination, UINT8 *iSource )
{
UINT8 i = 0;
while ( *iDestination = *iSource )
{
iDestination ++;
iSource ++;
i ++;
}
return( i );
}
///////// 检查操作状态,如果错误则显示错误代码并停机 /////////
void mStopIfError( UINT8 iError )
{
if ( iError == ERR_SUCCESS ) return; // 操作成功
LCD_clr();
LCD_set_XY(12,2);
printf( "Error:%#02X", (UINT16)iError ); // 显示错误
}
#include "meun.h"
/////////////////////////////定时器0,用于定时刷新屏幕///////////////////////////////////
void InitTimer0(void)
{
TMOD=TMOD&0xF0;
TMOD=TMOD|0x01; //模式1(16位定时器),仅受TR0控制
TL0 =-65530%256;
TH0 =-65530/256;
ET0=1; //允许T0中断
TR0=0;
}
void Time0(void) interrupt 1 using 3
{
flash=1;
}
////////////////////////////////////////////////////////////////////////////////////////
void USB_Attribute(void)
{
UINT16 i;
LCD_set_RC(0,0);
LCD_putc(91,0);LCD_putc(92,0);LCD_putc(20,0);LCD_putc(93,0);
LCD_set_RC(1,2);
LCD_putc(94,0);LCD_putc(95,0);LCD_putc(96,0);//显示 -正在查询,请稍后...
printf("...");
i=CH375DiskQuery();
mStopIfError( i );
LCD_clr();
LCD_set_RC(0,0);
LCD_putc(97,0);LCD_putc(98,0);LCD_putc(28,0);//显示 -总容量
LCD_set_RC(1,0);
LCD_putc(99,0);LCD_putc(101,0);LCD_putc(28,0);//显示 -可用量
LCD_set_RC(2,0);
LCD_putc(88,0);LCD_putc(89,0);LCD_putc(100,0);LCD_putc(102,0);//显示 -文件系统
LCD_set_RC(3,5);
LCD_putc(103,0);LCD_putc(104,0);//显示 -退出
LCD_set_XY(48,3);
switch(mCmdParam.Query.mDiskFat)
{
case DISK_FAT12:
printf("FAT12");
break;
case DISK_FAT16:
printf("FAT16");
break;
case DISK_FAT32:
printf("FAT32");
break;
default:
printf("Unknow");
break;
}
i=((UINT32)mCmdParam.Query.mTotalSector*10)/2048;
LCD_set_XY(36,0);
printf(":%3d.%dM",i/10,i%10);
LCD_set_XY(36,2);
i=((UINT32)mCmdParam.Query.mFreeSector*10)/2048;
printf(":%3d.%dM",i/10,i%10);
}
uchar code USBTab[][7]={
{55,56,57,58,59,60,0}, //优盘未插入
{42,14,15,61,56,57,0},//检测到优盘
{56,57,62,63,64,65,0}, //优盘连接断开
};
UINT8 FileMaxNum;
UINT8 FileNameBuf[MAX_PATH_LEN];//路径长度为40
UINT8 FilePathBuf[MAX_PATH_LEN];
UINT8 FilePastBuf[MAX_PATH_LEN];//用于粘贴
//UINT8 FileSavePath[20];
UINT8 FileWhere;
UINT8 FileSel;
UINT8 FileLay;
UINT8 FilePlace[20];
UINT8 FileSaveSel[20];
UINT8 CanPast=0; //可以粘贴标志,1为可以粘贴。
//-------------------FilePathBuf处理函数,将*号前面数据取出-----------------------
void File_CopyPath( UINT8 *iDestination, UINT8 *iSource )
{
while (*iSource!='*')
{
*iDestination = *iSource;
iDestination ++;
iSource ++;
}
*iDestination='\0';
}
//---------------文件处理函数----------------------------------------------------
UINT8 *File_NameInPath(UINT8 *p) //找出所在目录的文件名或者文件夹,所在路径保存在FileSavePath[20]中。
{
UINT8 i=0,PathPlac=0;
UINT8 *ptr;
ptr=p;
while (FileNameBuf[i]=*ptr)
{ //FileSavePath[i]=*ptr;
i++;
if(*ptr=='\\') //找出最后的//所在位置。
PathPlac=i;
ptr++;
}
//FileSavePath[PathPlac]='\0';
return (p+PathPlac);
}
//---------------取出文件后缀名扩展名称----------------------
UINT8 *File_NameType(UINT8 *ptr)
{
UINT8 i;
for(i=strlen(ptr);i>0;i--)
{
if(*(ptr+i-1)=='.')
return ptr+i;
}
return 0;
}
//---------------FilePathBuf向上一级--------------------------
void File_UpPath(void)
{
UINT8 i=0,PathPlac=0;
while (FilePathBuf[i])
i++;
FilePathBuf[i-2]='\0';
i=0;
while (FilePathBuf[i])
{
if(FilePathBuf[i]=='\\')
PathPlac=i;
i++;
}
FilePathBuf[PathPlac+1]='*';
FilePathBuf[PathPlac+2]='\0';
}
UINT8* File_SelName(UINT8 *Path,UINT8 SelNum)//SelNum必须少于FileMaxNum,从零开始。
{
UINT8 i;
i = mCopyCodeStringToIRAM( mCmdParam.Enumer.mPathName, Path);
mCmdParam.Enumer.mPathName[ i ] =SelNum;
i=CH375FileEnumer();
mStopIfError( i );
return File_NameInPath(mCmdParam.Enumer.mPathName);
}
////////////////////////删除文件 /////////////////////////////////////////////
void File_Del(UINT8 *p)
{
UINT8 i;
mCopyCodeStringToIRAM( mCmdParam.Open.mPathName,p);
i = CH375FileErase();
mStopIfError(i);
}
//////////////////枚举文件///////////////////////
UINT8 File_Enumer(UINT8 *path,bit type)//0为刷新文件数目;1为枚举文件;返回为文件数目-1(含0开始)
//void File_Enumer(void)
{
UINT8 i;
UINT16 j;
if(type)
printf("Enumer files:");
for ( j = 0; j < 255; j ++ ) //最多搜索前255个文件
{
i = mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, path); //搜索文件名,*为通配符,适用于所有文件或者子目录
mCmdParam.Open.mPathName[ i ] = j; // 根据字符串长度将结束符替换为搜索的序号,从0到255
i = CH375FileOpen(); // 打开文件,如果文件名中含有通配符*,则为搜索文件而不打开
if ( i == ERR_MISS_FILE ) {return(j-1);break;} // 再也搜索不到匹配的文件,已经没有匹配的文件名
if ( i == ERR_FOUND_NAME ) // 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中
{
if(type)
printf( "%03d:%s", (unsigned int)j, mCmdParam.Open.mPathName );// 显示序号和搜索到的匹配文件名或者子目录名
continue; //继续搜索下一个匹配的文件名,下次搜索时序号会加1
}
else // 出错
{
mStopIfError( i );
break;
}
}
}
/* 新建目录并打开,如果目录已经存在则直接打开 */
/* 输入参数: 目录名在mCmdParam.Create.mPathName中,与文件名规则相同 */
/* 返回状态码: ERR_SUCCESS = 打开目录成功或者创建目录成功,
ERR_FOUND_NAME = 已经存在同名文件,
ERR_MISS_DIR = 路径名无效或者上级目录不存在,
其它状态码参考CH375HF?.H */
UINT8 CreateDirectory( void )
{
UINT8 i, j;
UINT32 UpDirCluster;
PUINT8X DirXramBuf;
UINT8 code *DirConstData;
j = 0xFF;
for ( i = 0; i != sizeof( mCmdParam.Create.mPathName ); i ++ ) { /* 检查目录路径 */
if ( mCmdParam.Create.mPathName[ i ] == 0 ) break;
if ( mCmdParam.Create.mPathName[ i ] == PATH_SEPAR_CHAR1 || mCmdParam.Create.mPathName[ i ] == PATH_SEPAR_CHAR2 ) j = i; /* 记录上级目录 */
}
i = ERR_SUCCESS;
if ( j == 0 || j == 2 && mCmdParam.Create.mPathName[1] == ':' ) UpDirCluster = 0; /* 在根目录下创建子目录 */
else {
if ( j != 0xFF ) { /* 对于绝对路径应该获取上级目录的起始簇号 */
mCmdParam.Create.mPathName[ j ] = 0;
i = CH375FileOpen( ); /* 打开上级目录 */
if ( i == ERR_SUCCESS ) i = ERR_MISS_DIR; /* 是文件而非目录 */
else if ( i == ERR_OPEN_DIR ) i = ERR_SUCCESS; /* 成功打开上级目录 */
mCmdParam.Create.mPathName[ j ] = PATH_SEPAR_CHAR1; /* 恢复目录分隔符 */
}
UpDirCluster = CH375vStartCluster; /* 保存上级目录的起始簇号 */
}
if ( i == ERR_SUCCESS ) { /* 成功获取上级目录的起始簇号 */
i = CH375FileOpen( ); /* 打开本级子目录 */
if ( i == ERR_SUCCESS ) i = ERR_SUCCESS; /* 是文件而非目录 */
else if ( i == ERR_OPEN_DIR ) i =ERR_FOUND_NAME; /* 目录已经存在 */
else if ( i == ERR_MISS_FILE ) { /* 目录不存在,可以新建 */
i = CH375FileCreate( ); /* 以创建文件的方法创建目录 */
if ( i == ERR_SUCCESS ) {
// if ( &FILE_DATA_BUF[0] == &DISK_BASE_BUF[0] ) CH375DirtyBuffer( ); /* 如果FILE_DATA_BUF与DISK_BASE_BUF合用则必须清除磁盘缓冲区 */
DirXramBuf = &FILE_DATA_BUF[0]; /* 文件数据缓冲区 */
DirConstData = ". \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0.. \x10\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x21\x30\x0\x0\x0\x0\x0\x0";
for ( i = 0x40; i != 0; i -- ) { /* 目录的保留单元,分别指向自身和上级目录 */
*DirXramBuf = *DirConstData;
DirXramBuf ++;
DirConstData ++;
}
FILE_DATA_BUF[0x1A] = ( (PUINT8I)&CH375vStartCluster )[3]; /* 自身的起始簇号 */
FILE_DATA_BUF[0x1B] = ( (PUINT8I)&CH375vStartCluster )[2];
FILE_DATA_BUF[0x14] = ( (PUINT8I)&CH375vStartCluster )[1];
FILE_DATA_BUF[0x15] = ( (PUINT8I)&CH375vStartCluster )[0];
// FILE_DATA_BUF[0x1A] = ( (PUINT8I)&CH375vStartCluster )[0]; /* 对于小端Little-Endian系统,请用这4行代替前面4行 */
// FILE_DATA_BUF[0x1B] = ( (PUINT8I)&CH375vStartCluster )[1];
// FILE_DATA_BUF[0x14] = ( (PUINT8I)&CH375vStartCluster )[2];
// FILE_DATA_BUF[0x15] = ( (PUINT8I)&CH375vStartCluster )[3];
FILE_DATA_BUF[0x20+0x1A] = ( (PUINT8I)&UpDirCluster )[3]; /* 上级目录的起始簇号 */
FILE_DATA_BUF[0x20+0x1B] = ( (PUINT8I)&UpDirCluster )[2];
FILE_DATA_BUF[0x20+0x14] = ( (PUINT8I)&UpDirCluster )[1];
FILE_DATA_BUF[0x20+0x15] = ( (PUINT8I)&UpDirCluster )[0];
// FILE_DATA_BUF[0x20+0x1A] = ( (PUINT8I)&UpDirCluster )[0]; /* 对于小端Little-Endian系统,请用这4行代替前面4行 */
// FILE_DATA_BUF[0x20+0x1B] = ( (PUINT8I)&UpDirCluster )[1];
// FILE_DATA_BUF[0x20+0x14] = ( (PUINT8I)&UpDirCluster )[2];
// FILE_DATA_BUF[0x20+0x15] = ( (PUINT8I)&UpDirCluster )[3];
for ( i = 0xE0; i != 0; i -- ) { /* 清空目录区剩余部分 */
*DirXramBuf = 0;
DirXramBuf ++;
}
for ( i = 0xE0; i != 0; i -- ) { /* 清空目录区剩余部分 */
*DirXramBuf = 0;
DirXramBuf ++;
}
mCmdParam.Write.mSectorCount = 1;
i = CH375FileWrite( ); /* 写目录的第一个扇区 */
if ( i == ERR_SUCCESS ) {
DirXramBuf = &FILE_DATA_BUF[0];
for ( i = 0x40; i != 0; i -- ) { /* 清空目录区 */
*DirXramBuf = 0;
DirXramBuf ++;
}
for ( j = 1; j != CH375vSecPerClus; j ++ ) {
// if ( &FILE_DATA_BUF[0] == &DISK_BASE_BUF[0] ) CH375DirtyBuffer( ); /* 如果FILE_DATA_BUF与DISK_BASE_BUF合用则必须清除磁盘缓冲区 */
mCmdParam.Write.mSectorCount = 1;
i = CH375FileWrite( ); /* 清空目录的剩余扇区 */
if ( i != ERR_SUCCESS ) break;
}
if ( j == CH375vSecPerClus ) { /* 成功清空目录 */
mCmdParam.Modify.mFileSize = 0; /* 目录的长度总是0 */
mCmdParam.Modify.mFileDate = 0xFFFF;
mCmdParam.Modify.mFileTime = 0xFFFF;
mCmdParam.Modify.mFileAttr = 0x10; /* 置目录属性 */
i = CH375FileModify( ); /* 将文件信息修改为目录 */
}
}
}
}
}
return( i );
}
////////////////////复制文件//////////////////////
bit cy_cancel=0;
void File_Copy(UINT8 *des,UINT8 *sou)
{
UINT8 i;
UINT16 m,n, c,SecCount ;
UINT32 NewSize;
mCopyCodeStringToIRAM(mCmdParam.Open.mPathName,sou); /* 文件名,该文件在C51子目录下 */
i = CH375FileOpen( );/* 打开文件 */
if ( i ==ERR_SUCCESS )
{
LCD_set_XY(6,0);
printf( "Paste now...");
LCD_set_RC(3,5);
LCD_putc(82,0);LCD_putc(83,0);//显示 -资料
if ( CH375vFileSize > FILE_DATA_BUF_LEN )
{ /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
c=FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
}
else
{
c=(CH375vFileSize+511)/ 512;
}
SecCount =(CH375vFileSize+511)/ 512;
m=1;
NewSize=(UINT32)CH375vFileSize;
// printf( "cha xun:%d,%d,%ld\n ",SecCount ,c,(UINT32)CH375vFileSize);
for(n=c;n<=SecCount;m++)
{
n=c*m;
mCmdParam.Locate.mSectorOffset = 0x00000000;
mCmdParam.Locate.mSectorOffset =(n-c);
//printf("指针移动%d\n",n-c);
i = CH375FileLocate( );
mCmdParam.Read.mSectorCount =c;
CH375vFileSize += 511; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */
i = CH375FileRead( ); /* 从文件读取数据 */
CH375vFileSize -= 511; /* 恢复原文件长度 */
mStopIfError( i );
//printf( "读%d个扇区\n",c);
i = CH375FileClose( ); /* 关闭文件 */
mStopIfError( i );
strcpy( mCmdParam.Create.mPathName, des );
if(n==c)
{
i = CH375FileCreate( );
if(n==0)
break;//空文件的时候只新建一个空文件
}
else
{ i = CH375FileOpen( );}
mCmdParam.Locate.mSectorOffset =0xffffffff;
i = CH375FileLocate( );
mCmdParam.Write.mSectorCount =c;
//printf("写入%d个扇区\n",c);
CH375FileWrite();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -