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

📄 text1.c

📁 使用51单片机作为控制器
💻 C
📖 第 1 页 / 共 3 页
字号:
 				////////////////////加入按键中断////////////
                i=(UINT8)((UINT32)n*100/SecCount);
				if(i>100)
					i=100;
                LCD_set_XY(0,1);
				printf("%3d%% complete",(UINT16)i);
				if(key_esc)
				{   key_esc_elim();
					i = CH375FileErase();
					cy_cancel=1;
					return;
				}
				 cy_cancel=0;
				////////////////////////////////////////////
				i = CH375FileClose( );
				mStopIfError( i );
                //printf("total sec:%d\n",n);
                    
		        strcpy(mCmdParam.Open.mPathName,sou);  /* 文件名,该文件在C51子目录下 */
		        i = CH375FileOpen( );
				mStopIfError( i );
		    }
            i = CH375FileClose();
	    	mStopIfError( i );
           	strcpy( mCmdParam.Create.mPathName, des );
			i = CH375FileOpen();
       		mCmdParam.Modify.mFileAttr = 0xff;  /* 输入参数: 新的文件属性,为0FFH则不修改 */
			ReadTime();
			mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( TimeBuf[2],TimeBuf[1], TimeBuf[0] );  /* 输入参数: 新的文件时间,为0FFFFH则不修改,使用新建文件产生的默认时间 */
			mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2000+TimeBuf[6],TimeBuf[4],TimeBuf[3] );  /* 输入参数: 新的文件日期: 2004.05.18 */
			mCmdParam.Modify.mFileSize =NewSize;  /* 输入参数: 如果原文件较小,那么新的文件长度与原文件一样长,否则被RAM所限,如果文件长度大于64KB,那么NewSize必须为UINT32 */
	 		i = CH375FileModify( );  /* 修改当前文件的信息,修改日期和长度 */
			mStopIfError( i );   
			mCmdParam.Close.mUpdateLen =0;    
            i = CH375FileClose( );
	    	mStopIfError( i );
            LCD_set_XY(0,2);
 			printf("To %s",des);
        }
}
/////////////////////////打开文件并显示部分///////////////////////////////
//------------------由开始位置显示文本内容,返回显示后的剩余位置 -------------
UINT32 LCD_TextDisp(UINT32 FileStart)
{	
	UINT8 Disp_j=0;   //Disp_i为显示指针位置,范围为0-83。因为屏幕可以显示84个英文字符。
    UINT8 i ;        //i为已经显示的字符数。i<=Disp_i。
	bit flag;        //回车是否在行末标志。
    LCD_clr();        //清屏
	LCD_set_XY(0,0);
	for(i=0;;i++)  //显示每一个屏幕所能显示的内容
	{	
		if(FILE_DATA_BUF[FileStart+i]==13)//如果有回车符。则要换行。
		{	
			if(Disp_j%14)
			{	
				if(FILE_DATA_BUF[FileStart+i+2]==13)
					flag=1;
				else
					flag=0;
				if(Disp_j/14==5)              //如果显示屏幕最后一行有回车。则显示满。退出
					break;
				else
				{	LCD_set_XY(0,Disp_j/14+1);
					Disp_j=(Disp_j/14)*14+14;
				}
			}
			else
 //如果回车在一行最末尾,则跳过。回车为2字节由ASCII为(13,10)组成,保留10显示。
			{	flag=1;
				continue;
			}                   
		}
		else
		{	if(!flag&&FILE_DATA_BUF[FileStart+i]==10)
		 		//如果回车不在一行最末尾,则跳过10的显示。回车为2字节由ASCII为(13,10)组成,回车在行末才保留10显示。(为显示效果而设)
				continue;
			if(FILE_DATA_BUF[FileStart+i]=='\0')
				return FileStart+i;
			LCD_write_char(FILE_DATA_BUF[FileStart+i],0);
			Disp_j++;                   //除了回车符号,其它符号都在屏幕上显示。因而指针要加1
			if(Disp_j==84)
				break;                  //显示指针以满。退出			
		}		
	}
	return FileStart+i+1;                //返回完成位置数+1,加一以便下次从新位置开始。
}

extern void FileRedisp(UINT8 FileWhereI,UINT8 FileSelJ);
#define PAGEMAX 500
void File_TextDisp(void)
{   UINT8 i;
	UINT16 SecCount;
	UINT32 NewSize;
	UINT32 Place=0;        //显示页数位置记录
	UINT32 PlaceBackup=0;        //显示页数位置记录
	UINT16 Page=0;           //显示的页数记录;
    UINT8  PageBuf[PAGEMAX];   //记录500页码显示内容数。
	i = CH375FileOpen( );
	if ( CH375vFileSize > FILE_DATA_BUF_LEN ) 
	{  /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
		SecCount = FILE_DATA_BUF_LEN / 512;  /* 由于演示板用的62256只有32K字节,其中CH375子程序用512字节,所以只读取不超过63个扇区,也就是不超过32256字节 */
		NewSize = FILE_DATA_BUF_LEN;  /* 由于RAM有限所以限制长度 */
	}
	else 
	{  /* 如果原文件较小,那么使用原长度 */
		SecCount = ( CH375vFileSize + 511 ) >> 9;  /* (CH375vFileSize+511)/512, 计算文件的扇区数,因为读写是以扇区为单位的,先加511是为了读出文件尾部不足1个扇区的部分 */
		NewSize = (UINT16)CH375vFileSize;  /* 原文件的长度 */
	}
	mCmdParam.Read.mSectorCount = SecCount;  /* 读取全部数据,如果超过60个扇区则只读取60个扇区 */
	/*			current_buffer = & FILE_DATA_BUF[0];  如果文件读写的数据的复制方式为"外部子程序",那么需要设置存放数据的缓冲区的起始地址 */
	CH375vFileSize += 511;  /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */
	i = CH375FileRead( );  /* 从文件读取数据 */
	CH375vFileSize -= 511;  /* 恢复原文件长度 */
	mStopIfError( i );
	if (CH375vFileSize < FILE_DATA_BUF_LEN ) 
		FILE_DATA_BUF[CH375vFileSize]='\0';
    Place=LCD_TextDisp(Place);
	PageBuf[Page]=(UINT8)(Place);
	while(1)
	{
        if(key_up)
		{	
			key_up_elim();
			if(Page)
			{
				Place=PlaceBackup-PageBuf[Page-1];//上一次结束位置为PlaceBack;今次结束位置为Place,
			    //当上翻时候应从上一次结束位置算出上一次开始位置。
				PlaceBackup=Place;
				Page--;
				Place=LCD_TextDisp(Place);
			}
		}
		if(key_down)
		{	
			key_down_elim();
			if(Place<NewSize)	
			{
				PlaceBackup=Place;
    			Place=LCD_TextDisp(Place);
				if(Page<PAGEMAX-1)
					Page++;         //最大保存PAGEMAX页数,以便倒退显示,PAGEMAX-1为从零开始
				PageBuf[Page]=(UINT8)(Place-PlaceBackup);
			}
		}
		if(key_esc)
		{
			key_esc_elim();
			break;
		}
	}
}
///////////////////////////////打开并显示图片文件////////////////////////////////////
extern UINT8 BCDConvert(UINT8);
UINT8 File_PicConv(UINT8 temp)
{
	if(temp>='a'&&temp<='f')//字符转换为对应16进制
		temp=temp-87;
	else if(temp>='A'&&temp<='F')//字符转换为对应16进制
		temp=temp-55;
	else if(temp>='0'&&temp<='9')//字符转换为对应16进制
		temp=temp-48;
	else
		temp=0;
	return temp;
}
/*将文件缓冲区分成2部分,图片原始数据放到第一部分,另一部分放处理后数据,原始数据以'X'开头标志有效*/
void File_PicDisp(void)
{	
	UINT8 x=0,y=0,i,PicX,PicY,Temp;//PicX,PicY分别为图片象素的长和宽
    UINT16 SecCount,Cnt,j;
	LCD_clr();
    i = CH375FileOpen( );/* 打开文件 */
	if (CH375vFileSize > FILE_DATA_BUF_LEN/2-513)//文件太大
		return;
	SecCount=(CH375vFileSize+511)/512; /* 默认情况下,以扇区方式读取数据时,无法读出文件尾部不足1个扇区的部分,所以必须临时加大文件长度以读取尾部零头 */
	mCmdParam.Read.mSectorCount =SecCount;		    
	i = CH375FileRead();  /* 从文件读取数据 */
	for(i=0;FILE_DATA_BUF[i]=='/'||i==250;i++);
	Temp=FILE_DATA_BUF[i]-48;
    Temp=Temp<<4;
    PicX=FILE_DATA_BUF[i+1]-48;
    PicX=BCDConvert(Temp|PicX);

	Temp=FILE_DATA_BUF[i+3]-48;
    Temp=Temp<<4;
    PicY=FILE_DATA_BUF[i+4]-48;
    PicY=BCDConvert(Temp|PicY);
	SecCount=(UINT16)PicY*(UINT16)PicX/8;//借用SecCount变量,避免增加新变量
    for(j=0,Cnt=0;Cnt<SecCount;j++)
	{
		if(FILE_DATA_BUF[j]=='X'||FILE_DATA_BUF[j]=='x')
		{	
			i=File_PicConv(FILE_DATA_BUF[j+1]);
            Temp=File_PicConv(FILE_DATA_BUF[j+2]);
            Temp=0x0f&Temp;
			i=i<<4;
			(FILE_DATA_BUF+0x3c00)[Cnt]=Temp|i;
			j=j+2;
			Cnt++;
		}
	}
    LCD_DrawPic(x,y,FILE_DATA_BUF+0x3c00,PicX,PicY); 
    //LCD_DrawPic(0,0,bitmap1,PicX,PicY);  
	while(1)
	{
		if(key_right)
		{
			key_right_elim();
			Temp=84-PicX;
			if(x<Temp)
				{x+=4;LCD_clr();}
			LCD_DrawPic(x,y,FILE_DATA_BUF+0x3c00,PicX,PicY); 
		}		
		if(key_left)
		{
			key_left_elim();
			if(x>3)
				{x-=4;LCD_clr();}
			LCD_DrawPic(x,y,FILE_DATA_BUF+0x3c00,PicX,PicY); 
		}
		if(key_up)
		{
			key_up_elim();
			if(y>0)
				{y--;LCD_clr();}
			LCD_DrawPic(x,y,FILE_DATA_BUF+0x3c00,PicX,PicY); 
		}		
		if(key_down)
		{
			key_down_elim();
            Temp=48-PicY;
			if(y*8<Temp)
				{y++;LCD_clr();}
			LCD_DrawPic(x,y,FILE_DATA_BUF+0x3c00,PicX,PicY); 
		}
		if(key_esc)
			{key_esc_elim();break;}
	}
}
////////////////////////////////查看文件属性/////////////////////////////////////////
void File_Attribute(void)
{//前提:已经选择文件名
	UINT32 size;
	UINT16 i;
    LCD_set_XY(60,5);
	printf("Exit");
	i = CH375FileOpen();
	if(i==ERR_SUCCESS)
	{
		 //	mCmdParam.Modify.mFileSize中是文件的长度,以字节为单位,长度可以是0
		//mCmdParam.Modify.mFileDate 中是文件修改时间,格式参考CH375HF?.H 中的说明
		//mCmdParam.Modify.mFileTime 中是文件修改时间,格式参考CH375HF?.H 中的说明
		//mCmdParam.Modify.mFileAttr 中是文件属性,例如数值01H 说明该文件是只读文件
		//printf("Modify time:%ld\n",(UINT16)mCmdParam.Modify.mFileAttr);
		//printf("Modify data:%ld\n",(UINT16)mCmdParam.Modify.mFileDate);
		//printf("Attribute:%02X",(UINT16)mCmdParam.Modify.mFileAttr);
		LCD_set_XY(0,0);
        printf("-%s-",File_SelName(FilePathBuf,FileSel));
		LCD_set_XY(0,3);
		printf("Path:%s",FileNameBuf);
		LCD_set_XY(0,2);
		printf("Attr:");
		i=CH375FileQuery( ); /* 查询当前文件的信息 */
		if(mCmdParam.Modify.mFileAttr==0X20)
			printf("Archive");
		if(mCmdParam.Modify.mFileAttr==0X01)
			printf("Read only");
		if(mCmdParam.Modify.mFileAttr==0X02)
			printf("Hidden");
		if(mCmdParam.Modify.mFileAttr==0x10)
			printf("Subdir");
		if(mCmdParam.Modify.mFileAttr==0x04)
			printf("System file");
		if(mCmdParam.Modify.mFileAttr==0x08)
			printf("VOLUME_ID");
		size=(UINT32)CH375vFileSize;
		LCD_set_XY(0,1);
        if(i=size>>20)
		{	i=size*10>>20;
			printf("Size:%d.%dMB\n",i/10,i%10);}
        else if(i=size>>10)
			printf("Size:%dKB\n",i);
		else
			printf("Size:%dByte\n",(UINT16)size);
		i = CH375FileClose();  /* 关闭文件 */
		mStopIfError( i );
	}
	else
	{
		printf("%s",File_SelName(FilePathBuf,FileSel));
		LCD_set_RC(1,0);
		LCD_putc(87,0);LCD_putc(88,0);LCD_putc(89,0);LCD_putc(90,0);//显示 -为文件夹
		LCD_set_XY(0,3);
		printf("Path:%s",FileNameBuf);
	}
}
//------------------------------------------------------------------------------------
extern void Meun_InOper(void);
extern uchar Item;
void File_DealWith(void)
{	UINT8 i,NameCnt=1;
	UINT8 TempBuf[MAX_PATH_LEN];
    FileOperInit();
	while(1)
	{
	    if(key_up)
		{	
			key_up_elim();
            Menu_Up();
		}
        if(key_down)
		{	key_down_elim();
			Menu_Down();
		}        
        if(key_esc)
		{	key_esc_elim();
			break;
		}
        if(key_enter)
		{	key_enter_elim();
			switch(Item)
			{
				case 0:             //打开
					Meun_InOper();
					break;
				case 1:           //属性
				    LCD_clr();
				    File_SelName(FilePathBuf,FileSel);
					File_Attribute();
				    while(1)
				    {
						if(key_esc)
							{key_esc_elim();break;}
				    }
					break;
				case 2:           //复制
					File_SelName(FilePathBuf,FileSel);
					i = CH375FileOpen();
	                if(i ==ERR_SUCCESS)
					{   
						CanPast=1;
						strcpy(FilePastBuf,FileNameBuf);
					}
					break;
				case 3:           //剪切
					File_SelName(FilePathBuf,FileSel);
					i = CH375FileOpen();
	                if(i ==ERR_SUCCESS)
					{   
						CanPast=2;
						strcpy(FilePastBuf,FileNameBuf);
					}
					break;
				case 4:           //删除
					LCD_clr();
					LCD_set_RC(3,0);
					LCD_putc(84,0);LCD_putc(85,0);//显示 -确认
    				LCD_set_RC(3,5);
					LCD_putc(82,0);LCD_putc(83,0);//显示 -取消
                    LCD_set_RC(0,0);
					LCD_putc(74,0);LCD_putc(75,0);LCD_putc(86,0);//显示 -删除?
					LCD_set_XY(0,2);
					printf("%s",File_SelName(FilePathBuf,FileSel));
					while(1)
					{
						if(key_enter)
							{	key_enter_elim();
								//File_SelName(FilePathBuf,FileSel);//
								File_Del(FileNameBuf);
								FileMaxNum=File_Enumer(FilePathBuf,0);
								if(FileWhere)	
									FileWhere--;
								if(FileSel)
									FileSel--;
								break;
							}

⌨️ 快捷键说明

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