📄 writefile.c
字号:
//*************************************************************************************************
// Module Name : WriteFile.C
// CreateDate : 2005-05-09
// ModifData : 2005-05-09
// Description :
// Author : 李远正
// Version : V1.0
//*************************************************************************************************
//
// U盘文件读写模块,
// MCS-51单片机C语言程序, 仅适用于V2.5及以上版本的模块
// 因为使用U盘文件读写模块而不是使用U盘文件级子程序库,所以占用较少的单片机资源
#include <C8051F020.H>
#include <string.h>
#include <stdio.h>
#include "Function.H"
#include "12C887.H" // Save temporary data
#include "USBP.H"
#include "WriteFile.H"
//=================================================================================================
// 显示U盘操作的进度子程序
void DisplayGuage ( unsigned char guage )
{
GUAGE = guage;
SCREEN = 51; // 进入 51 屏幕,显示U盘操作进度
Display( );
}
//-------------------------------------------------------------------------------------------------
// 检查操作状态,如果错误则显示错误代码并停机,应该替换为实际的处理措施
void mStopIfError( unsigned char iError )
{
if ( iError == ERR_SUCCESS ) return; // 操作成功返回
SCREEN = 52; modifying = 1; // 进入 52 屏幕,显示错误
Display( );
}
//-------------------------------------------------------------------------------------------------
// 16位大端与小端格式的数据处理
unsigned short SwapUINT16( unsigned short d )
{
return( ( d << 8 ) & 0xFF00 | ( d >> 8 ) & 0xFF );
}
//=================================================================================================
// 向缓冲区写入要发送的数字
void mCopyNumberToBUF( unsigned char number )
{
WriteFileSize++; // 文件总大小
*buffer++ = number;
*buffer = '\0';
}
//-------------------------------------------------------------------------------------------------
// 向缓冲区写入要发送的字符串
void mCopyCodeStringToBUF( unsigned char *CodeString )
{
for ( ; *CodeString!=0; ) // 遇到停止符\0结束
{
WriteFileSize++; // 文件总大小
*buffer++ = *CodeString++;
}
}
//-------------------------------------------------------------------------------------------------
// 向指定缓冲区写入数据块文件
// 要写入数据的缓冲区首地址: BufStart
// 记录文件数据的总大少 : TotalFileSize
// 记录数据写到缓冲区的位置: buffer
void WriteDataToBUF( unsigned char *BufStart )
{
unsigned char i, IronNumber;
unsigned int MetalDistance;
#define Distance MetalDistance // 节约一个变量单元
WriteFileSize = 0; // 写入文件数据数目清零
buffer = BufStart; // 指向缓冲区碎片数据(需要重新写入的)的末地址
if ( superaddition ) // 追加数据次数计数
{
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
mCopyCodeStringToBUF( "(数据追加)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
}
mCopyCodeStringToBUF( "现在日期是 20" );
i = time_buf[6];
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 ); mCopyNumberToBUF( '-' );
i = time_buf[5];
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 ); mCopyNumberToBUF( '-' );
i = time_buf[4];
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
mCopyCodeStringToBUF( "现在时间是 " );
i = time_buf[2];
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 ); mCopyNumberToBUF( ':' );
i = time_buf[1];
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 ); mCopyNumberToBUF( ':' );
i = time_buf[0];
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
mCopyCodeStringToBUF( "“直道区”检测到铁片的数目为:" );
i = Read12C887RAM( IRON_NUMBER_RANGE ); // 从 12C887 中取出数据
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 );
mCopyCodeStringToBUF( "(个)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
IronNumber = i; // 检测铁片数目,确定存储数据量多少
if( IronNumber > 0 )
{
mCopyCodeStringToBUF( "第一片铁片到起跑线的距离为:" );
i = Read12C887RAM( DISTANCE_RANGE_1_H ); // 从 12C887 中取出数据
MetalDistance = ( unsigned int )i*256;
i = Read12C887RAM( DISTANCE_RANGE_1_L );
MetalDistance += i;
mCopyNumberToBUF( MetalDistance/10000+0x30 ); mCopyNumberToBUF( MetalDistance%10000/1000+0x30 ); mCopyNumberToBUF( '.' ); mCopyNumberToBUF( MetalDistance%1000/100+0x30 ); mCopyNumberToBUF( MetalDistance%100/10+0x30 ); mCopyNumberToBUF( MetalDistance%10+0x30 );
mCopyCodeStringToBUF( "(m)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
}
if( IronNumber > 1 )
{
mCopyCodeStringToBUF( "第二片铁片到起跑线的距离为:" );
i = Read12C887RAM( DISTANCE_RANGE_2_H ); // 从 12C887 中取出数据
MetalDistance = ( unsigned int )i*256;
i = Read12C887RAM( DISTANCE_RANGE_2_L );
MetalDistance += i;
mCopyNumberToBUF( MetalDistance/10000+0x30 ); mCopyNumberToBUF( MetalDistance%10000/1000+0x30 ); mCopyNumberToBUF( '.' ); mCopyNumberToBUF( MetalDistance%1000/100+0x30 ); mCopyNumberToBUF( MetalDistance%100/10+0x30 ); mCopyNumberToBUF( MetalDistance%10+0x30 );
mCopyCodeStringToBUF( "(m)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
}
if( IronNumber > 2 )
{
mCopyCodeStringToBUF( "第三片铁片到起跑线的距离为:" );
i = Read12C887RAM( DISTANCE_RANGE_3_H ); // 从 12C887 中取出数据
MetalDistance = ( unsigned int )i*256;
i = Read12C887RAM( DISTANCE_RANGE_3_L );
MetalDistance += i;
mCopyNumberToBUF( MetalDistance/10000+0x30 ); mCopyNumberToBUF( MetalDistance%10000/1000+0x30 ); mCopyNumberToBUF( '.' ); mCopyNumberToBUF( MetalDistance%1000/100+0x30 ); mCopyNumberToBUF( MetalDistance%100/10+0x30 ); mCopyNumberToBUF( MetalDistance%10+0x30 );
mCopyCodeStringToBUF( "(m)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
}
mCopyCodeStringToBUF( "全程路程:" );
i = Read12C887RAM( DISTANCE_RANGE_H ); // 从 12C887 中取出数据
Distance = ( unsigned int )i*256;
i = Read12C887RAM( DISTANCE_RANGE_L ); // 从 12C887 中取出数据
Distance += i;
mCopyNumberToBUF( Distance/10000+0x30 ); mCopyNumberToBUF( Distance%10000/1000+0x30 ); mCopyNumberToBUF( '.' ); mCopyNumberToBUF( Distance%1000/100+0x30 ); mCopyNumberToBUF( Distance%100/10+0x30 ); mCopyNumberToBUF( Distance%10+0x30 );
mCopyCodeStringToBUF( "(m)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
mCopyCodeStringToBUF( "全程行驶时间为:" );
i = Read12C887RAM( JOURNEY_TIME_RANGE ); // 从 12C887 中取出数据
mCopyNumberToBUF( i/10+0x30 ); mCopyNumberToBUF( i%10+0x30 );
mCopyCodeStringToBUF( "(s)" );
mCopyNumberToBUF( 0x0D ); mCopyNumberToBUF( 0x0A ); // 回车换行
*buffer = '\0'; // 文件结束标志
}
//=================================================================================================
// File Procedure: USB
//=================================================================================================
// 保存文件数据到U盘中名为:(智能小车.TXT) 的文本文件中
void FileProcess( void )
{
unsigned char guage = 0; // 进度参数
unsigned char i, SecCount; //
unsigned long OldFileSize; // 原文件数据大少
unsigned int LastSize; // 原文件尾部不足一个扇区的零碎数据字节数(0--511)
#ifdef CH375HM_INT
#if CH375HM_INT == 0
ExecCommand( CMD_QueryStatus, 0 ); // 查询当前模块的状态,中断方式则不需要此步骤
mIntStatus = mCmdParam.Status.mIntStatus;
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -