⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sd.lis

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 LIS
📖 第 1 页 / 共 2 页
字号:
 00E0                   .dbline -1
 00E0                   .dbline 69
 00E0           ; }
 00E0           ; //****************************************************************************
 00E0           ; //SD卡初始化(SPI-MODE)
 00E0           ; //****************************************************************************
 00E0           ; uchar SD_Init(void)
 00E0           ; {  
 00E0                   .dbline 72
 00E0           ;    uchar retry,temp;
 00E0           ;    uchar i;
 00E0           ;    MMC_PORT&=~MMC_CS_PIN;      //SD卡使能
 00E0 C498              cbi 0x18,4
 00E2                   .dbline 74
 00E2           ;   
 00E2           ;   delay_nus(250);  //Wait MMC/SD ready...
 00E2 0AEF              ldi R16,250
 00E4 10E0              ldi R17,0
 00E6 8EDF              xcall _delay_nus
 00E8                   .dbline 75
 00E8           ;    for (i=0;i<0x0f;i++) 
 00E8 AA24              clr R10
 00EA 04C0              xjmp L18
 00EC           L15:
 00EC                   .dbline 76
 00EC                   .dbline 77
 00EC 0FEF              ldi R16,255
 00EE 0E940000          xcall _Write_Byte_SPI
 00F2                   .dbline 78
 00F2           L16:
 00F2                   .dbline 75
 00F2 A394              inc R10
 00F4           L18:
 00F4                   .dbline 75
 00F4 8A2D              mov R24,R10
 00F6 8F30              cpi R24,15
 00F8 C8F3              brlo L15
 00FA                   .dbline 80
 00FA           ;    {
 00FA           ;       Write_Byte_SPI(0xff); //send 74 clock at least!!!
 00FA           ;    }
 00FA           ;    //Send Command CMD0 to MMC/SD Card
 00FA           ;    retry=0;
 00FA EE24              clr R14
 00FC           L19:
 00FC                   .dbline 83
 00FC           ;    
 00FC           ;    do
 00FC           ;    { //retry 200 times to send CMD0 command 
 00FC                   .dbline 84
 00FC           ;      temp=SD_Write_Command(0,0);
 00FC 40E0              ldi R20,0
 00FE 50E0              ldi R21,0
 0100 60E0              ldi R22,0
 0102 70E0              ldi R23,0
 0104 6883              std y+0,R22
 0106 7983              std y+1,R23
 0108 9A01              movw R18,R20
 010A 0027              clr R16
 010C 88DF              xcall _SD_Write_Command
 010E C02E              mov R12,R16
 0110                   .dbline 85
 0110           ;      retry++;
 0110 E394              inc R14
 0112                   .dbline 86
 0112           ;      if(retry==100) 
 0112 8E2D              mov R24,R14
 0114 8436              cpi R24,100
 0116 01F4              brne L22
 0118                   .dbline 87
 0118           ;      { 
 0118                   .dbline 88
 0118           ;       ;//CMD0 Error!
 0118                   .dbline 89
 0118           ;      }
 0118           L22:
 0118                   .dbline 90
 0118           ;    } 
 0118           L20:
 0118                   .dbline 91
 0118           ;    while(temp!=1);  
 0118 8C2D              mov R24,R12
 011A 8130              cpi R24,1
 011C 79F7              brne L19
 011E                   .dbline 94
 011E           ;    
 011E           ;    //Send Command CMD1 to MMC/SD-Card
 011E           ;    retry=0;
 011E EE24              clr R14
 0120           L24:
 0120                   .dbline 96
 0120           ;    do
 0120           ;    { //retry 100 times to send CMD1 command 
 0120                   .dbline 97
 0120           ;      temp=SD_Write_Command(1,0);
 0120 40E0              ldi R20,0
 0122 50E0              ldi R21,0
 0124 60E0              ldi R22,0
 0126 70E0              ldi R23,0
 0128 6883              std y+0,R22
 012A 7983              std y+1,R23
 012C 9A01              movw R18,R20
 012E 01E0              ldi R16,1
 0130 76DF              xcall _SD_Write_Command
 0132 C02E              mov R12,R16
 0134                   .dbline 98
 0134           ;      retry++;
 0134 E394              inc R14
 0136                   .dbline 99
 0136           ;      if(retry==100) 
 0136 8E2D              mov R24,R14
 0138 8436              cpi R24,100
 013A 01F4              brne L27
 013C                   .dbline 100
 013C           ;      { 
 013C                   .dbline 101
 013C           ;      ;
 013C                   .dbline 102
 013C           ;      }
 013C           L27:
 013C                   .dbline 103
 013C           ;    } 
 013C           L25:
 013C                   .dbline 104
 013C           ;    while(temp!=0); 
 013C CC20              tst R12
 013E 81F7              brne L24
 0140                   .dbline 105
 0140           ;    retry=0; 
 0140 EE24              clr R14
 0142                   .dbline 106
 0142           ;     SD_Write_Command(16,512);     //设置一次读写BLOCK的长度为512个字节
 0142 40E0              ldi R20,0
 0144 52E0              ldi R21,2
 0146 60E0              ldi R22,0
 0148 70E0              ldi R23,0
 014A 6883              std y+0,R22
 014C 7983              std y+1,R23
 014E 9A01              movw R18,R20
 0150 00E1              ldi R16,16
 0152 65DF              xcall _SD_Write_Command
 0154                   .dbline 108
 0154           ;   
 0154           ;    MMC_PORT|=MMC_CS_PIN;   //MMC_CS_PIN=1;  //set MMC_Chip_Select to high 
 0154 C49A              sbi 0x18,4
 0156                   .dbline 109
 0156           ;    return(0); //All commands have been taken.
 0156 0027              clr R16
 0158                   .dbline -2
 0158           L14:
 0158 2296              adiw R28,2
 015A 0E940000          xcall pop_gset5
 015E                   .dbline 0 ; func end
 015E 0895              ret
 0160                   .dbsym r i 10 c
 0160                   .dbsym r temp 12 c
 0160                   .dbsym r retry 14 c
 0160                   .dbend
 0160                   .dbfunc e SD_Read_Block _SD_Read_Block fc
 0160           ;           temp -> R20
 0160           ;              i -> R22,R23
 0160           ;        address -> y+6
                        .even
 0160           _SD_Read_Block::
 0160 0E940000          xcall push_arg4
 0164 0E940000          xcall push_gset2
 0168 2297              sbiw R28,2
 016A                   .dbline -1
 016A                   .dbline 115
 016A           ; } 
 016A           ; //****************************************************************************
 016A           ; //从SD卡读一个扇区  Return 0 if no Error.
 016A           ; //****************************************************************************
 016A           ; uchar SD_Read_Block(unsigned long address)
 016A           ; {  
 016A                   .dbline 116
 016A           ;    uchar temp=0;uint i=0;
 016A 4427              clr R20
 016C                   .dbline 116
 016C 6627              clr R22
 016E 7727              clr R23
 0170                   .dbline 117
 0170           ;    reading=1; 
 0170 81E0              ldi R24,1
 0172 80930000          sts _reading,R24
 0176                   .dbline 118
 0176           ;    temp=SD_Write_Command(17,address);     //读出RESPONSE     
 0176 FE01              movw R30,R28
 0178 2680              ldd R2,z+6
 017A 3780              ldd R3,z+7
 017C 4084              ldd R4,z+8
 017E 5184              ldd R5,z+9
 0180 4882              std y+0,R4
 0182 5982              std y+1,R5
 0184 9101              movw R18,R2
 0186 01E1              ldi R16,17
 0188 4ADF              xcall _SD_Write_Command
 018A 402F              mov R20,R16
 018C           L30:
 018C                   .dbline 120
 018C                   .dbline 120
 018C                   .dbline 120
 018C           L31:
 018C                   .dbline 119
 018C           ;    while (Read_Byte_SPI()!= 0xfe)
 018C 0E940000          xcall _Read_Byte_SPI
 0190 0E3F              cpi R16,254
 0192 E1F7              brne L30
 0194                   .dbline 121
 0194           ;    {;}  //直到读取到了数据的开始头0XFE,才继续
 0194           ;    for(i=0; i<512; i++)
 0194 6627              clr R22
 0196 7727              clr R23
 0198 0AC0              xjmp L36
 019A           L33:
 019A                   .dbline 122
 019A                   .dbline 123
 019A 0E940000          xcall _Read_Byte_SPI
 019E 80E0              ldi R24,<_BUFFER
 01A0 90E0              ldi R25,>_BUFFER
 01A2 FB01              movw R30,R22
 01A4 E80F              add R30,R24
 01A6 F91F              adc R31,R25
 01A8 0083              std z+0,R16
 01AA                   .dbline 124
 01AA           L34:
 01AA                   .dbline 121
 01AA 6F5F              subi R22,255  ; offset = 1
 01AC 7F4F              sbci R23,255
 01AE           L36:
 01AE                   .dbline 121
 01AE 6030              cpi R22,0
 01B0 E2E0              ldi R30,2
 01B2 7E07              cpc R23,R30
 01B4 90F3              brlo L33
 01B6                   .dbline 125
 01B6           ;       {
 01B6           ;       BUFFER[i]=Read_Byte_SPI();
 01B6           ;       }
 01B6           ;    Read_Byte_SPI();//CRC - Byte 
 01B6 0E940000          xcall _Read_Byte_SPI
 01BA                   .dbline 126
 01BA           ;    Read_Byte_SPI();//CRC - Byte
 01BA 0E940000          xcall _Read_Byte_SPI
 01BE                   .dbline 127
 01BE           ;    reading=0; 
 01BE 2224              clr R2
 01C0 20920000          sts _reading,R2
 01C4                   .dbline 128
 01C4           ;    MMC_PORT|=MMC_CS_PIN;        //关闭SD卡
 01C4 C49A              sbi 0x18,4
 01C6                   .dbline 129
 01C6           ;    return(temp);
 01C6 042F              mov R16,R20
 01C8                   .dbline -2
 01C8           L29:
 01C8 2296              adiw R28,2
 01CA 0E940000          xcall pop_gset2
 01CE 2496              adiw R28,4
 01D0                   .dbline 0 ; func end
 01D0 0895              ret
 01D2                   .dbsym r temp 20 c
 01D2                   .dbsym r i 22 i
 01D2                   .dbsym l address 6 l
 01D2                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile C:\DOCUME~1\pas\桌面\SD卡MP3程序\sd.c
 0000           _BUFFER::
 0000                   .blkb 512
 0200                   .dbsym e BUFFER _BUFFER A[512:512]c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -