📄 sd.lst
字号:
0C91 C005 RJMP 0x0C97
(0086) while (*s)
(0087) {
(0088) LCD_write_char(*s);
0C92 01FA MOVW R30,R20
0C93 8100 LDD R16,Z+0
0C94 DFD9 RCALL _LCD_write_char
(0089) s++;
0C95 5F4F SUBI R20,0xFF
0C96 4F5F SBCI R21,0xFF
0C97 01FA MOVW R30,R20
0C98 8020 LDD R2,Z+0
0C99 2022 TST R2
0C9A F7B9 BNE 0x0C92
0C9B 940E1394 CALL pop_gset3
0C9D 9508 RET
_LCD_clear:
i --> R20
0C9E 940E13A5 CALL push_gset1
(0090) }
(0091) }
(0092) /*-----------------------------------------------------------------------
(0093) LCD_clear : LCD清屏函数
(0094) -----------------------------------------------------------------------*/
(0095) void LCD_clear(void)
(0096) {
(0097) unsigned int i;
(0098)
(0099) LCD_write_byte(0x0c, 0); //普通显示模式
0CA0 2722 CLR R18
0CA1 E00C LDI R16,0xC
0CA2 DFB1 RCALL _LCD_write_byte
(0100) LCD_write_byte(0x80, 0); //设置RAM的X地址
0CA3 2722 CLR R18
0CA4 E800 LDI R16,0x80
0CA5 DFAE RCALL _LCD_write_byte
(0101)
(0102) for (i=0; i<504; i++)
0CA6 2744 CLR R20
0CA7 2755 CLR R21
0CA8 C005 RJMP 0x0CAE
(0103) LCD_write_byte(0, 1); //写0数据
0CA9 E021 LDI R18,1
0CAA 2700 CLR R16
0CAB DFA8 RCALL _LCD_write_byte
0CAC 5F4F SUBI R20,0xFF
0CAD 4F5F SBCI R21,0xFF
0CAE 3F48 CPI R20,0xF8
0CAF E0E1 LDI R30,1
0CB0 075E CPC R21,R30
0CB1 F3B8 BCS 0x0CA9
0CB2 940E13A8 CALL pop_gset1
0CB4 9508 RET
(0104) }
(0105) /*-----------------------------------------------------------------------
(0106) LCD_init : 3310LCD初始化
(0107) -----------------------------------------------------------------------*/
(0108) void LCD_init(void)
(0109) {
(0110) PORTD &= ~LCD_RST; // 产生一个让LCD复位的低电平脉冲
_LCD_init:
0CB5 9892 CBI 0x12,2
(0111) delay_1us();
0CB6 DF92 RCALL _delay_1us
(0112) PORTD |= LCD_RST;
0CB7 9A92 SBI 0x12,2
(0113) delay_1us();
0CB8 DF90 RCALL _delay_1us
(0114) LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
0CB9 2722 CLR R18
0CBA E201 LDI R16,0x21
0CBB DF98 RCALL _LCD_write_byte
(0115) LCD_write_byte(0xc8, 0); // 设置偏置电压
0CBC 2722 CLR R18
0CBD EC08 LDI R16,0xC8
0CBE DF95 RCALL _LCD_write_byte
(0116) LCD_write_byte(0x06, 0); // 温度校正
0CBF 2722 CLR R18
0CC0 E006 LDI R16,6
0CC1 DF92 RCALL _LCD_write_byte
(0117) LCD_write_byte(0x13, 0); // 1:48
0CC2 2722 CLR R18
0CC3 E103 LDI R16,0x13
0CC4 DF8F RCALL _LCD_write_byte
(0118) delay_1us();
0CC5 DF83 RCALL _delay_1us
(0119) LCD_write_byte(0x20, 0); // 使用基本命令
0CC6 2722 CLR R18
0CC7 E200 LDI R16,0x20
0CC8 DF8B RCALL _LCD_write_byte
(0120) LCD_clear(); // 清屏
0CC9 DFD4 RCALL _LCD_clear
(0121) LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
0CCA 2722 CLR R18
0CCB E00C LDI R16,0xC
0CCC DF87 RCALL _LCD_write_byte
0CCD 9508 RET
_ReadBlock:
temp --> Y+0
LBA --> Y+4
0CCE 940E12BF CALL push_arg4
0CD0 9724 SBIW R28,4
FILE: C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
(0001) /************************************************************/
(0002) /* FAT Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #include <string.h>
(0010) #include "sd.h"
(0011) #include "fat.h"
(0012) #include "3310.h"
(0013)
(0014) extern uchar BUFFER[512];
(0015) unsigned char LONGNAME_BUFFER_ADDR[30];
(0016) unsigned char DIRNAME_BUFFER_ADDR[30];
(0017) unsigned char *LongNameBuffer = (unsigned char *) LONGNAME_BUFFER_ADDR;
(0018) unsigned char *DirNameBuffer = (unsigned char *) DIRNAME_BUFFER_ADDR;
(0019) struct partrecord PartInfo;
(0020) unsigned char Fat32Enabled;
(0021) unsigned long FirstDataSector;
(0022) unsigned int BytesPerSector;
(0023) unsigned int SectorsPerCluster;
(0024) unsigned long FirstFATSector;
(0025) unsigned long FirstDirSector;
(0026) unsigned long FileSize;
(0027) unsigned long FatInCache = 0;
(0028)
(0029) //********************************************************************************************
(0030) //读一个扇区
(0031) void ReadBlock(unsigned long LBA)
(0032) //********************************************************************************************
(0033) { unsigned long temp;
(0034) temp=LBA<<9;
0CD1 E089 LDI R24,0x9
0CD2 E090 LDI R25,0
0CD3 01FE MOVW R30,R28
0CD4 8024 LDD R2,Z+4
0CD5 8035 LDD R3,Z+5
0CD6 8046 LDD R4,Z+6
0CD7 8057 LDD R5,Z+7
0CD8 938A ST R24,-Y
0CD9 0181 MOVW R16,R2
0CDA 0192 MOVW R18,R4
0CDB 940E13E1 CALL lsl32
0CDD 01FE MOVW R30,R28
0CDE 8300 STD Z+0,R16
0CDF 8311 STD Z+1,R17
0CE0 8322 STD Z+2,R18
0CE1 8333 STD Z+3,R19
(0035) SD_Read_Block(temp);
0CE2 01FE MOVW R30,R28
0CE3 8100 LDD R16,Z+0
0CE4 8111 LDD R17,Z+1
0CE5 8122 LDD R18,Z+2
0CE6 8133 LDD R19,Z+3
0CE7 940E0B9A CALL _SD_Read_Block
0CE9 9628 ADIW R28,0x8
0CEA 9508 RET
_fatClustToSect:
clust --> Y+4
0CEB 940E12BF CALL push_arg4
0CED 940E13A3 CALL push_gset2
(0036) }
(0037) /*-----------------------------------------------------------------------
(0038) 查询数据区一个簇开始扇区号
(0039) -----------------------------------------------------------------------*/
(0040) unsigned long fatClustToSect(unsigned long clust)
(0041) {
(0042) return ((clust-2) * SectorsPerCluster) + FirstDataSector;
0CEF E042 LDI R20,2
0CF0 E050 LDI R21,0
0CF1 E060 LDI R22,0
0CF2 E070 LDI R23,0
0CF3 01FE MOVW R30,R28
0CF4 8024 LDD R2,Z+4
0CF5 8035 LDD R3,Z+5
0CF6 8046 LDD R4,Z+6
0CF7 8057 LDD R5,Z+7
0CF8 1A24 SUB R2,R20
0CF9 0A35 SBC R3,R21
0CFA 0A46 SBC R4,R22
0CFB 0A57 SBC R5,R23
0CFC 906002C2 LDS R6,SectorsPerCluster
0CFE 907002C3 LDS R7,SectorsPerCluster+1
0D00 2488 CLR R8
0D01 2499 CLR R9
0D02 929A ST R9,-Y
0D03 928A ST R8,-Y
0D04 927A ST R7,-Y
0D05 926A ST R6,-Y
0D06 0181 MOVW R16,R2
0D07 0192 MOVW R18,R4
0D08 940E1361 CALL empy32u
0D0A 0118 MOVW R2,R16
0D0B 0129 MOVW R4,R18
0D0C 908002C8 LDS R8,FirstDataSector+2
0D0E 909002C9 LDS R9,FirstDataSector+3
0D10 906002C6 LDS R6,FirstDataSector
0D12 907002C7 LDS R7,FirstDataSector+1
0D14 0C26 ADD R2,R6
0D15 1C37 ADC R3,R7
0D16 1C48 ADC R4,R8
0D17 1C59 ADC R5,R9
0D18 0181 MOVW R16,R2
0D19 0192 MOVW R18,R4
0D1A 940E1391 CALL pop_gset2
0D1C 9624 ADIW R28,4
0D1D 9508 RET
(0043) }
(0044) /*-----------------------------------------------------------------------
(0045) 查询一个簇所占扇区数
(0046) -----------------------------------------------------------------------*/
(0047) unsigned int fatClusterSize(void)
(0048) {
(0049) // return the number of sectors in a disk cluster
(0050) return SectorsPerCluster;
_fatClusterSize:
0D1E 910002C2 LDS R16,SectorsPerCluster
0D20 911002C3 LDS R17,SectorsPerCluster+1
0D22 9508 RET
_fatInit:
t2 --> R10
t1 --> R12
data --> R10
bpb --> R10
0D23 940E139F CALL push_gset4
0D25 9722 SBIW R28,2
(0051) }
(0052) /*-----------------------------------------------------------------------
(0053) 查询SD卡文件系统信息
(0054) -----------------------------------------------------------------------*/
(0055) unsigned char fatInit()
(0056) {
(0057) unsigned int data;unsigned char t1,t2;
(0058)
(0059) struct bpb710 *bpb;
(0060) // 读MBR结构
(0061) ReadBlock(0);
0D26 E000 LDI R16,0
0D27 E010 LDI R17,0
0D28 E020 LDI R18,0
0D29 E030 LDI R19,0
0D2A DFA3 RCALL _ReadBlock
(0062) // 读取分区表信息
(0063) PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
0D2B E784 LDI R24,0x74
0D2C E092 LDI R25,2
0D2D ECEB LDI R30,0xCB
0D2E E0F2 LDI R31,2
0D2F E100 LDI R16,0x10
0D30 E010 LDI R17,0
0D31 93FA ST R31,-Y
0D32 93EA ST R30,-Y
0D33 939A ST R25,-Y
0D34 938A ST R24,-Y
0D35 940E13F9 CALL asgnblk
(0064) // 读引导扇区
(0065) // 引导扇区号在PartInfo.prStartLBA中
(0066) ReadBlock(PartInfo.prStartLBA); //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
0D37 912002D5 LDS R18,0x2D5
0D39 913002D6 LDS R19,0x2D6
0D3B 910002D3 LDS R16,0x2D3
0D3D 911002D4 LDS R17,0x2D4
0D3F DF8E RCALL _ReadBlock
(0067) bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
0D40 EC81 LDI R24,0xC1
0D41 E090 LDI R25,0
0D42 015C MOVW R10,R24
(0068)
(0069) FirstDataSector = PartInfo.prStartLBA;
0D43 904002D5 LDS R4,0x2D5
0D45 905002D6 LDS R5,0x2D6
0D47 902002D3 LDS R2,0x2D3
0D49 903002D4 LDS R3,0x2D4
0D4B 923002C7 STS FirstDataSector+1,R3
0D4D 922002C6 STS FirstDataSector,R2
0D4F 925002C9 STS FirstDataSector+3,R5
0D51 924002C8 STS FirstDataSector+2,R4
(0070) if(bpb->bpbFATsecs)
0D53 01FC MOVW R30,R24
0D54 8423 LDD R2,Z+11
0D55 8434 LDD R3,Z+12
0D56 2022 TST R2
0D57 F411 BNE 0x0D5A
0D58 2033 TST R3
0D59 F121 BEQ 0x0D7E
(0071) {
(0072) // bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
(0073) FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
0D5A 01F5 MOVW R30,R10
0D5B 8523 LDD R18,Z+11
0D5C 8534 LDD R19,Z+12
0D5D 01F5 MOVW R30,R10
0D5E 8105 LDD R16,Z+5
0D5F 2711 CLR R17
0D60 940E1351 CALL empy16s
0D62 01F5 MOVW R30,R10
0D63 8023 LDD R2,Z+3
0D64 8034 LDD R3,Z+4
0D65 0E20 ADD R2,R16
0D66 1E31 ADC R3,R17
0D67 2444 CLR R4
0D68 2455 CLR R5
0D69 908002C8 LDS R8,FirstDataSector+2
0D6B 909002C9 LDS R9,FirstDataSector+3
0D6D 906002C6 LDS R6,FirstDataSector
0D6F 907002C7 LDS R7,FirstDataSector+1
0D71 0C62 ADD R6,R2
0D72 1C73 ADC R7,R3
0D73 1C84 ADC R8,R4
0D74 1C95 ADC R9,R5
0D75 927002C7 STS FirstDataSector+1,R7
0D77 926002C6 STS FirstDataSector,R6
0D79 929002C9 STS FirstDataSector+3,R9
0D7B 928002C8 STS FirstDataSector+2,R8
(0074) }
0D7D C02F RJMP 0x0DAD
(0075) else
(0076) {
(0077) // bpbFATsecs是0,为FAT32,FAT表所占的扇区数在bpbBigFATsecs里
(0078) FirstDataSector += bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
0D7E 01F5 MOVW R30,R10
0D7F 8C21 LDD R2,Z+25
0D80 8C32 LDD R3,Z+26
0D81 8C43 LDD R4,Z+27
0D82 8C54 LDD R5,Z+28
0D83 01F5 MOVW R30,R10
0D84 8065 LDD R6,Z+5
0D85 2477 CLR R7
0D86 2488 CLR R8
0D87 2499 CLR R9
0D88 925A ST R5,-Y
0D89 924A ST R4,-Y
0D8A 923A ST R3,-Y
0D8B 922A ST R2,-Y
0D8C 0183 MOVW R16,R6
0D8D 0194 MOVW R18,R8
0D8E 940E1361 CALL empy32u
0D90 01F5 MOVW R30,R10
0D91 8023 LDD R2,Z+3
0D92 8034 LDD R3,Z+4
0D93 2444 CLR R4
0D94 2455 CLR R5
0D95 0E20 ADD R2,R16
0D96 1E31 ADC R3,R17
0D97 1E42 ADC R4,R18
0D98 1E53 ADC R5,R19
0D99 908002C8 LDS R8,FirstDataSector+2
0D9B 909002C9 LDS R9,FirstDataSector+3
0D9D 906002C6 LDS R6,FirstDataSector
0D9F 907002C7 LDS R7,FirstDataSector+1
0DA1 0C62 ADD R6,R2
0DA2 1C73 ADC R7,R3
0DA3 1C84 ADC R8,R4
0DA4 1C95 ADC R9,R5
0DA5 927002C7 STS FirstDataSector+1,R7
0DA7 926002C6 STS FirstDataSector,R6
0DA9 929002C9 STS FirstDataSector+3,R9
0DAB 928002C8 STS FirstDataSector+2,R8
(0079) }
(0080)
(0081) SectorsPerCluster = bpb->bpbSecPerClust;
0DAD 01F5 MOVW R30,R10
0DAE 8022 LDD R2,Z+2
0DAF 2433 CLR R3
0DB0 923002C3 STS SectorsPerCluster+1,R3
0DB2 922002C2 STS SectorsPerCluster,R2
(0082) BytesPerSector = bpb->bpbBytesPerSec;
0DB4 01F5 MOVW R30,R10
0DB5 8020 LDD R2,Z+0
0DB6 8031 LDD R3,Z+1
0DB7 923002C5 STS BytesPerSector+1,R3
0DB9 922002C4 STS BytesPerSector,R2
(0083) FirstFATSector = bpb->bpbResSectors + PartInfo.prStartLBA;
0DBB 904002D5 LDS R4,0x2D5
0DBD 905002D6 LDS R5,0x2D6
0DBF 902002D3 LDS R2,0x2D3
0DC1 903002D4 LDS R3,0x2D4
0DC3 8063 LDD R6,Z+3
0DC4 8074 LDD R7,Z+4
0DC5 2488 CLR R8
0DC6 2499 CLR R9
0DC7 0C62 ADD R6,R2
0DC8 1C73 ADC R7,R3
0DC9 1C84 ADC R8,R4
0DCA 1C95 ADC R9,R5
0DCB 927002BF STS FirstFATSector+1,R7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -