📄 file_system.lst
字号:
C51 COMPILER V7.50 FILE_SYSTEM 11/27/2005 23:13:40 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE FILE_SYSTEM
OBJECT MODULE PLACED IN file_system.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE file_system.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*file_system.c file
2 Created by Computer-lov. Date: 2005.3.19
3 Last edited date: 2005.5.31
4 Copyright (c) 2005 Computer-lov
5 version 1.1
6 */
7
8 #include "file_system.h"
9 #include "IDE.H"
10 #include "hardware.h"
11 #include "lcd.h"
12 #include "mp3.h"
13 #include "keyboard.h"
14
15
16 FILE xdata file;
17 unsigned int dir_length; //文件名长度
18 unsigned int folder_length; //文件夹名长度
19
20 //////////////////////////////////// 判断是否为一个 MP3 文件 ///////////////////////////////
21 unsigned char is_a_mp3_file(void)
22 {
23 1 if((file.name[0]==0x00)||(file.name[0]==0xE5)||(file.name[0]=='.'))return 0;
24 1 if(file.attribute==0x0F)return 0; //此项目为长文件名项目
25 1 if(file.attribute & 0x04)return 0; //此文件为系统文件
26 1 if(file.attribute & 0x08)return 0; //此项目为系统标卷
27 1 if(file.attribute & 0x10)return 0; //此项目为子目录
28 1 if((file.name[8]=='M')&&(file.name[9]=='P')&&(file.name[10]=='3'))return 1;
29 1 else return 0;
30 1 }
31 ///////////////////////////////////////////////////////////////////////////////////////////////
32
33 unsigned long int LAST_FAT_LBA;
34 //最后一次读取FAT时的逻辑块地址,用来判断本次读取是否需要重新从硬盘中读取,以加快速度
35 unsigned int disp_count=0;
36 unsigned char disp_time;
37
38 ////////////////////////////////////////////////////////////////////////////////////////////////
39 unsigned long int get_next_sector(void) //根据当前簇号,获取下一个扇区地址
40 {
41 1 unsigned long int LBA;
42 1 unsigned int i;
43 1 LBA=(file.next_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4); //计算扇区地址
44 1 i=(file.next_cluster_number)*4-LBA*dbr[driver_number].bytes_per_sectors; //计算偏移地址
45 1 if(LAST_FAT_LBA!=LBA) //如果数据不在FAT_buffer[]中,则需要重新读取
46 1 {
47 2 LAST_FAT_LBA=LBA;
48 2 LBA=LBA+FAT_start_sector[driver_number];
49 2 read_IDE_FAT_sector(LBA);
50 2 }
51 1 ((unsigned char *)&(file.next_cluster_number))[3]=FAT_buffer[i];
52 1 i++;
53 1 ((unsigned char *)&(file.next_cluster_number))[2]=FAT_buffer[i];
54 1 i++;
55 1 ((unsigned char *)&(file.next_cluster_number))[1]=FAT_buffer[i];
C51 COMPILER V7.50 FILE_SYSTEM 11/27/2005 23:13:40 PAGE 2
56 1 i++;
57 1 ((unsigned char *)&(file.next_cluster_number))[0]=FAT_buffer[i]; //获取下一簇号
58 1 LBA=file.next_cluster_number-(dbr[driver_number].root_cluster_num); //保
-存簇号
59 1 LBA=LBA*(dbr[0].sectors_per_cluster)+DATA_start_sector[0]; //转换成扇区地址
60 1 // IDE_LED=!IDE_LED; //硬盘指示灯闪烁
61 1 disp_time++;
62 1 if(disp_time>3)
63 1 {
64 2 disp_time=0;
65 2 LCD_go_home();
66 2 disp_count+=2;
67 2 for(i=0;i<14;i++)write_LCD_data(((unsigned char *)dir_name)[(i+disp_count)%(dir_length+4)]);
68 2 }
69 1 return LBA;
70 1 }
71 ////////////////////////////////////////////////////////////////////////////////////////////////
72
73 ///////////////////////////////////////////////// 获取文件夹的下一扇区地址 ///////////////////
74 unsigned long int get_dir_next_sector(void)
75 {
76 1 unsigned long int LBA,LBA2;
77 1 unsigned int i;
78 1 LBA=current_dir.current_cluster_number-(dbr[driver_number].root_cluster_num);
79 1 LBA=LBA*(dbr[driver_number].sectors_per_cluster)+DATA_start_sector[driver_number];
80 1 LBA2=(current_dir.current_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4); //计算扇区地址
81 1 i=(current_dir.current_cluster_number)*4-LBA2*dbr[driver_number].bytes_per_sectors; //计算偏移地址
82 1 LBA2=LBA2+FAT_start_sector[driver_number];
83 1 read_IDE_sector(LBA2);
84 1 ((unsigned char *)&(current_dir.current_cluster_number))[3]=buffer[i];
85 1 i++;
86 1 ((unsigned char *)&(current_dir.current_cluster_number))[2]=buffer[i];
87 1 i++;
88 1 ((unsigned char *)&(current_dir.current_cluster_number))[1]=buffer[i];
89 1 i++;
90 1 ((unsigned char *)&(current_dir.current_cluster_number))[0]=buffer[i]; //获取下一簇号
91 1 return LBA;
92 1 }
93 ////////////////////////////////////////////////////////////////////////////////////////////////
94
95 ////////////////////////////////////////////////////////////////////////////////////////////////
96 void get_nst_file(void) //获取第n个MP3文件
97 {
98 1 unsigned int i,j,k,temp_count;
99 1 unsigned long int LBA;
100 1 unsigned char xdata temp_buffer[32];
101 1 disp_count=0;
102 1 temp_count=0;
103 1 current_dir.current_cluster_number=current_dir.first_cluster_number;
104 1 do
105 1 {
106 2 LBA=get_dir_next_sector();
107 2 for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
108 2 {
109 3 read_IDE_sector(LBA);
110 3 for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
111 3 {
112 4 if(j==15){for(k=0;k<32;k++)temp_buffer[k]=buffer[k+512-32];} //如果已到最后一个项,则将之保存
113 4 for(k=0;k<11;k++)file.name[k]=buffer[j*32+k];
114 4 file.attribute=buffer[j*32+11];
115 4 if(is_a_mp3_file())
116 4 {
C51 COMPILER V7.50 FILE_SYSTEM 11/27/2005 23:13:40 PAGE 3
117 5 temp_count++;
118 5 if(temp_count==play_count)
119 5 {
120 6 ((unsigned char *)&(file.first_cluster_number))[0]=buffer[j*32+0x15];
121 6 ((unsigned char *)&(file.first_cluster_number))[1]=buffer[j*32+0x14];
122 6 ((unsigned char *)&(file.first_cluster_number))[2]=buffer[j*32+0x1B];
123 6 ((unsigned char *)&(file.first_cluster_number))[3]=buffer[j*32+0x1A];
124 6 ((unsigned char *)&(file.length))[3]=buffer[j*32+0x1C];
125 6 ((unsigned char *)&(file.length))[2]=buffer[j*32+0x1D];
126 6 ((unsigned char *)&(file.length))[1]=buffer[j*32+0x1E];
127 6 ((unsigned char *)&(file.length))[0]=buffer[j*32+0x1F];
128 6 file.next_cluster_number=file.first_cluster_number;
129 6 dir_length=folder_length;
130 6 if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;} //如果为第一项,则用刚刚保存
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -