📄 u_func_a.lst
字号:
250 ------读A盘扇区程序---------------------------------------------------
251 ********************************************************************************
252 说明: 写入单片机中数据缓冲区
253 入口参数:扇区号LBA
254 出口参数:0x14:操作成功,0x1f:操作失败
255 *******************************************************************************/
256 unsigned char Rd_Sector_a(unsigned long LBA)
257 {
258 1 unsigned char sta,i,j,Next_Num=0;
259 1 unsigned char xdata *pt;
260 1 sta=0x1f;
261 1 pt=Data_Buf;
*** WARNING C182 IN LINE 261 OF U_FUNC_A.C: pointer to different objects
262 1 CH375HM_INDEX_WR_a( DISK_READ ); /* 从USB存储器读数据块 */
263 1 CH375HM_DATA_WR_a( (unsigned char)LBA ); /* LBA的最低8位 */
264 1 CH375HM_DATA_WR_a( (unsigned char)( LBA >> 8 ) );
265 1 CH375HM_DATA_WR_a( (unsigned char)( LBA >> 16 ) );
266 1 CH375HM_DATA_WR_a( (unsigned char)( LBA >> 24 ) ); /* LBA的最高8位 */
267 1 CH375HM_DATA_WR_a( 1 ); /* 扇区数 */
268 1 Delay();
269 1 for(i=0;i<9;i++)
270 1 {
271 2 sta=Wait_Int_a();
272 2 if(sta==0x1f||sta==0x14) return sta;
273 2 CH375HM_INDEX_WR_a(RD_USB_DATA);
274 2 Next_Num=CH375HM_DATA_RD_a();
275 2 for(j=0;j<Next_Num;j++)
276 2 {
277 3 *pt=CH375HM_DATA_RD_a();
278 3 pt++;
279 3 }
280 2 CH375HM_INDEX_WR_a(DISK_RD_GO);
281 2 }
282 1 return 0xff;
283 1 }
284
285 /*******************************************************************************
286 ------写A盘扇区程序---------------------------------------------------
287 ********************************************************************************
288 说明: 入口参数:扇区号LBA
289 出口参数:无
290 *******************************************************************************/
291 void Wr_Sector_a(unsigned long LBA)
292 {
293 1 unsigned char sta,i,j;
294 1 unsigned char xdata *pt;
295 1 sta=0x1f;
296 1 pt=Data_Buf;
*** WARNING C182 IN LINE 296 OF U_FUNC_A.C: pointer to different objects
297 1 CH375HM_INDEX_WR_a( DISK_WRITE ); /* 写数据块到USB存储器 */
298 1 CH375HM_DATA_WR_a( (unsigned char)LBA ); /* LBA的最低8位 */
299 1 CH375HM_DATA_WR_a( (unsigned char)( LBA >> 8 ) );
300 1 CH375HM_DATA_WR_a( (unsigned char)( LBA >> 16 ) );
C51 COMPILER V8.02 U_FUNC_A 07/21/2008 09:40:01 PAGE 6
301 1 CH375HM_DATA_WR_a( (unsigned char)( LBA >> 24 ) ); /* LBA的最高8位 */
302 1 CH375HM_DATA_WR_a( 1 ); /* 扇区数 */
303 1 Delay();
304 1 for(i=0;i<9;i++)
305 1 {
306 2 sta=sta=Wait_Int_a();
307 2 if(sta==0x1f||sta==0x14) return;
308 2 CH375HM_INDEX_WR_a(WR_USB_DATA7);
309 2 CH375HM_DATA_WR_a(64);
310 2 for(j=0;j<64;j++)
311 2 {
312 3 CH375HM_DATA_WR_a(*pt);
313 3 pt++;
314 3 }
315 2 CH375HM_INDEX_WR_a(DISK_WR_GO);
316 2 }
317 1 }
318
319 /*******************************************************************************
320 ------读CH375的中断状态---------------------------------------------------
321 ********************************************************************************
322 说明: 入口参数:无
323 出口参数:中断状态
324 *******************************************************************************/
325 unsigned char Wait_Int_a()
326 {
327 1 unsigned sta=0,temp=0;
328 1 while(temp!=0x40)
329 1 temp=P3IF&0x40;
330 1 P3IF&=0xbf;//清中断6的中断标志
331 1 CH375HM_INDEX_WR_a(GET_STATUS);
332 1 Delay();
333 1 sta=CH375HM_DATA_RD_a();
334 1 return sta;
335 1 }
336
337
338 /*******************************************************************************
339 ------读A盘的基本数据---------------------------------------------------
340 ********************************************************************************
341 说明: 入口参数:无
342 出口参数:0x14:操作成功,0x1f:操作失败
343 *******************************************************************************/
344 unsigned char Get_Base_a()
345 {
346 1 unsigned char a,b;
347 1 unsigned char xdata *pt;
348 1 Rd_Sector_a(0x00000000);
349 1 pt=Data_Buf;
*** WARNING C182 IN LINE 349 OF U_FUNC_A.C: pointer to different objects
350 1 a=*pt;b=*(pt+1);
351 1 if(a!=0xeb&&b!=0x58)
352 1 {
353 2 hidd_sect_a=*(pt+0x1c6);
354 2 Rd_Sector_a( (unsigned long)hidd_sect_a );
355 2 }
356 1 a=*pt;b=*(pt+1);
357 1 if(a==0xeb&&b==0x58)
358 1 {
359 2 hidd_sect_a=*(pt+0x1c);
360 2 byte_sect_a=*(pt+0x0b)+(*(pt+0x0c)<<8);
361 2 sect_clust_a=*(pt+0x0d);
C51 COMPILER V8.02 U_FUNC_A 07/21/2008 09:40:01 PAGE 7
362 2 resv_sect_a=*(pt+0x0e)+(*(pt+0x0f)<<8);
363 2 sect_fat_a=*(pt+0x24)+(*(pt+0x25)<<8);
364 2 root_a=hidd_sect_a+resv_sect_a+2*sect_fat_a;
365 2 return 0x14;
366 2 }
367 1 else return 0x1f;
368 1 }
369
370 /*******************************************************************************
371 ------显示A盘盘名---------------------------------------------------
372 ********************************************************************************
373 说明: 入口参数:无
374 出口参数:无
375 *******************************************************************************/
376 void Show_Disk_a()
377 {
378 1 unsigned char i;
379 1 unsigned char *disk_name_a;
380 1 unsigned char xdata *pt;
381 1 unsigned int data charact;
382 1 Rd_Sector_a(root_a);
383 1 pt=Data_Buf;
*** WARNING C182 IN LINE 383 OF U_FUNC_A.C: pointer to different objects
384 1 for(i=0;i<16;i++)
385 1 {
386 2 // charact=Data_Buf[0x0b+i*32]; //这种也赋不了
387 2 charact=*(pt+0x0b+i*32); //charact不定义为data就赋不了值。???
388 2 if(charact==0x08)
389 2 {
390 3 disk_name_a=pt+i*32; //disk_name定义成指向xdata也赋不了值。???
391 3 *(disk_name_a+11)=0;
392 3 LCD_Printf(1,2,disk_name_a);
393 3 return;
394 3 }
395 2 }
396 1
397 1 }
398
399 /*******************************************************************************
400 ------读长文件项---------------------------------------------------
401 ********************************************************************************
402 说明: 入口参数:无
403 出口参数:无
404 *******************************************************************************/
405 void Get_Lfat_a()
406 {
407 1 unsigned char xdata *pt;
408 1 unsigned char temp1,temp2,i=0,*na,nai=0;
409 1 unsigned int Temp_Ofst;
410 1 unsigned char which[26]={1,3,5,7,9,14,16,18,20,22,24,28,30}; //确定长文件名储存的地方
411 1 pt=Data_Buf;
*** WARNING C182 IN LINE 411 OF U_FUNC_A.C: pointer to different objects
412 1 na=Fat[Currt_File].name;
413 1 if(St_Ofst_a==0) //若短文件名在扇区的第一个32字节,则指向上一个扇区的最后32字节
414 1 {
415 2 Rd_Sector_a(Rd_Rec.Last_Sect);
416 2 Temp_Ofst=480;
417 2 }
418 1 else Temp_Ofst=St_Ofst_a-32;//若短文件名不在本扇区的第一个32字节,则指向上一个32字节
419 1 do{ //读长文件名
420 2 while(i<13)
421 2 {
C51 COMPILER V8.02 U_FUNC_A 07/21/2008 09:40:01 PAGE 8
422 3 temp1=*(pt+Temp_Ofst+which[i]);
423 3 if(temp1==0x2e)
424 3 {
425 4 *(na+nai)=0;
426 4 break;
427 4 }
428 3 temp2=*(pt+Temp_Ofst+which[i]+1);
429 3 if(temp2!=0)
430 3 {
431 4 *(na+nai)=0x7e;
432 4 *(na+nai+1)=0x31;
433 4 *(na+nai+2)=0;
434 4 break;
435 4 }
436 3 *(na+nai)=temp1;
437 3 nai++;
438 3 i++;
439 3 }
440 2 if(Temp_Ofst==0) //若已在本扇区最开始
441 2 {
442 3 if(*(pt+Temp_Ofst)<0x3f) break; //若是长文件名的最后一段
443 3 else
444 3 {
445 4 Rd_Sector_a(Rd_Rec.Last_Sect);
446 4 Temp_Ofst=512;
447 4 }
448 3 }
449 2 Temp_Ofst-=32;
450 2 }while(*(pt+Temp_Ofst+32)<0x3f);
451 1 Rd_Sector_a(Rd_Rec.Currt_Sect);
452 1 }
453
454
455 /*******************************************************************************
456 ------读A盘文件名---------------------------------------------------
457 ********************************************************************************
458 说明: 目前只读一个扇区中的文件名
459 入口参数:文件夹首簇号
460 出口参数:0xff:文件名已读完,其他:已读文件数
461 *******************************************************************************/
462 unsigned char Dis_Fat_In_Clust_a(unsigned long Menu_Clust)
463 {
464 1 unsigned long Menu_LBA;
465 1 unsigned char *na,i,j,rd_short=0;
466 1 unsigned char xdata *pt;
467 1 St_Ofst_a=0;
468 1 Currt_File=0;
469 1 File_Over=0;
470 1 Menu_LBA=(Menu_Clust-2)*sect_clust_a+root_a;
471 1 Rd_Rec.Currt_Sect=Rd_Rec.Last_Sect=Menu_LBA;
472 1 Rd_Rec.Next_Sect=Rd_Rec.Currt_Sect+1;
473 1
474 1
475 1 while(Rd_Rec.Currt_Sect-Menu_LBA<sect_clust_a) //读完整个簇
476 1 {
477 2 Rd_Sector_a(Rd_Rec.Currt_Sect);
478 2 pt=Data_Buf;
*** WARNING C182 IN LINE 478 OF U_FUNC_A.C: pointer to different objects
479 2 if(*(pt+St_Ofst_a)!=0xe5&&*(pt+St_Ofst_a+11)!=0x0f&&*(pt+St_Ofst_a+11)!=0x08&&*(pt+St_Ofst_a)!=0x2e)
-//判断是否为有效文件
480 2 {
481 3 na=Fat[Currt_File].ext; //读扩展名
C51 COMPILER V8.02 U_FUNC_A 07/21/2008 09:40:01 PAGE 9
482 3 for(i=0;i<3;i++)
483 3 {
484 4 *(na+i)=*(pt+St_Ofst_a+8+i);
485 4 }
486 3
487 3 // Fat[Currt_File].St_Clust=*(pt+St_Ofst+0x1a)+*(pt+St_Ofst+0x1b)<<8+*(pt+St_Ofst+0x14)<<16; //定义Fat
-[Currt_File].St_Clust为一个长整型这样赋不了值?
488 3
489 3 Fat[Currt_File].St_Clust.num[3]=*(pt+St_Ofst_a+0x1a); //起始簇
490 3 Fat[Currt_File].St_Clust.num[2]=*(pt+St_Ofst_a+0x1b);
491 3 Fat[Currt_File].St_Clust.num[1]=*(pt+St_Ofst_a+0x14);
492 3 Fat[Currt_File].St_Clust.num[0]=*(pt+St_Ofst_a+0x15);
493 3 // Fat[Currt_File].Big=*(pt+St_Ofst+0x1c)+*(pt+St_Ofst+0x1d)<<8+*(pt+St_Ofst+0x1e)<<16+*(pt+St_Ofst+0x1f
-)<<24; //这个跟Fat[Currt_File].St_Clust一样赋不了??
494 3 Fat[Currt_File].Big.num[0]=*(pt+St_Ofst_a+0x1f); //文件大小
495 3 Fat[Currt_File].Big.num[1]=*(pt+St_Ofst_a+0x1e);
496 3 Fat[Currt_File].Big.num[2]=*(pt+St_Ofst_a+0x1d);
497 3 Fat[Currt_File].Big.num[3]=*(pt+St_Ofst_a+0x1c);
498 3
499 3 Fat[Currt_File].Sector=Rd_Rec.Currt_Sect; //文件目录项所在的扇区
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -