<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
十五、编写底层接口程序get_fattime()
1、目的
在flist命令时,显示各目录项的最后修改时间和日期。
2、先弄清楚目录项中日期和时间的格式:从第十三字节开始。
13 | 14-15 | 16-17 | 18-19 | 22-23 |
毫秒数 | 建立时间 | 建立日期 | 最后访问日期 | 最后写时间 |
100表示1秒 |
|
| 24-25 | 最后写日期 |
时间格式:0-4位两秒的数量,20代表40秒。5-8位分钟的数量,范围0-59分。11-15位小时的数量,范围0-23小时。
日期格式:0-4位日的数量,范围1-31。5-8位月的数量,范围1-12。9-15位,从1980开始的年数,范围0-127 ( 1980-2107年)。
3、首先编写从目录项格式转换为通用格式的代码,用在flist函数中。
首先从源代码中得到文件属性结构体中时间、日期格式。
fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */
fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */
在文件属性结构体中,日期和时间的信息是这样存在的,这个函数可以命名为f_gettime(TimeStruct * , fileinfo*),从文件属性中获取日期和时间,并转换为时间结构体里面的标准格式。
#define SECMASK 0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1F
#define MINMASK 0x7E0
#define HOURMASK 0xF800
#define DATEMASK 0x1F
#define MONTHMASK 0x1E0
#define YEARMASK 0xFE00
void f_gettime ( TimeStruct *FileTime, FILINFO *FileAttrib ) {
u16 FatDate,FatTime; //源在后面,目标在前面
FatTime=FileAttrib->ftime;
FatDate=FileAttrib->fdate;
FileTime->Second = (FatTime & SECMASK ) *2;
FileTime->Minute = (FatTime & MINMASK ) >>5;
FileTime->Hour = (FatTime & HOURMASK ) >>11;
FileTime->Date = FatDate & DATEMASK;
FileTime->Month = (FatDate & MONTHMASK ) >>5;
FileTime->Year = ( (FatDate & YEARMASK ) >>9 )+1980;
}
4、get_fattime()对返回值的要求
ps = get_fattime();
ST_DWORD(dir+DIR_CrtTime, ps); /* Created time */
由此可知,返回值是一个32位数,包括时间和日期,日期在高位。因此编写函数如下:
DWORD get_fattime (void){
u16 FatDate,FatTime;
u32 RTCCount;
TimeStruct FileTime;
RTCCount= RTC_GetCounter(); //获取RTC的当前计数
Time_CountToTime(RTCCount,&FileTime);//首先获取系统的时间,转换为标准时间格式
FatTime = (u16)( FileTime.Second/2 );
FatTime |= (u16)( FileTime.Minute << 5 );
FatTime |= (u16)( FileTime.Hour << 11 );
FatDate = (u16)( FileTime.Date );
FatDate |= (u16)( FileTime.Month <<5 );
FatDate |= (u16)( FileTime.Year <<9 );
return (u32)( (FatDate<<16 )+FatTime ); //系统要求的返回格式
}
5、编译、下载
以下图片可以看到显示效果。
文章评论(0条评论)
登录后参与讨论