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

📄 sd.lis

📁 LED条屏显示程序,但是对初学者
💻 LIS
📖 第 1 页 / 共 3 页
字号:
 00F8           L26:
 00F8 1601              movw R2,R12
 00FA 2A20              and R2,R10
 00FC 3B20              and R3,R11
 00FE 2220              tst R2
 0100 29F7              brne L20
 0102 3320              tst R3
 0104 19F7              brne L20
 0106           X0:
 0106                   .dbline 96
 0106           ;       {
 0106           ;        tmp=Read_Byte_SD();  
 0106           ;       } 
 0106           ;  //SD_Disable(); 
 0106           ;  return(tmp); 
 0106 062F              mov R16,R22
 0108                   .dbline -2
 0108           L19:
 0108 0E940000          xcall pop_gset4
 010C 2296              adiw R28,2
 010E                   .dbline 0 ; func end
 010E 0895              ret
 0110                   .dbsym r Timeout 20 c
 0110                   .dbsym r tmp 22 c
 0110                   .dbsym l address 8 l
 0110                   .dbsym r CMD 22 c
 0110                   .dbend
                        .area lit(rom, con, rel)
 0000           L28:
 0000 4000              .byte 64,0
 0002 0000              .byte 0,0
 0004 0095              .byte 0,149
                        .area text(rom, con, rel)
 0110                   .dbfile E:\MYWORK~1\开发设计\AVR-MP3\mp3开发板光盘\驱动程序\MP3BOA~1.8\SD.c
 0110                   .dbfunc e SDInit _SDInit fc
 0110           ;              b -> R10
 0110           ;              a -> R20
 0110           ;          retry -> R22
 0110           ;            CMD -> y+0
                        .even
 0110           _SDInit::
 0110 0E940000          xcall push_gset3
 0114 2697              sbiw R28,6
 0116                   .dbline -1
 0116                   .dbline 101
 0116           ; }
 0116           ; 
 0116           ; //=======================================================================
 0116           ; uint8 SDInit(void)
 0116           ; { 
 0116                   .dbline 103
 0116           ;  uint8 a,b,retry; 
 0116           ;  uint8 CMD[]={0x40,0x00,0x00,0x00,0x00,0x95}; 
 0116 80E0              ldi R24,<L28
 0118 90E0              ldi R25,>L28
 011A FE01              movw R30,R28
 011C 06E0              ldi R16,6
 011E 10E0              ldi R17,0
 0120 FA93              st -y,R31
 0122 EA93              st -y,R30
 0124 9A93              st -y,R25
 0126 8A93              st -y,R24
 0128 0E940000          xcall asgncblk
 012C                   .dbline 105
 012C           ;  
 012C           ;  asm("cli"); //clear all interrupt.
 012C F894              cli
 012E                   .dbline 108
 012E           ;  // Set certain pins to inputs and others to outputs 
 012E           ;  // Only SPI_DI (data in) is an input 
 012E           ;  SD_Direction_REG&=~(1<<SPI_DI); 
 012E BE98              cbi 0x17,6
 0130                   .dbline 109
 0130           ;  SD_Direction_REG|=(1<<SPI_Clock); 
 0130 BF9A              sbi 0x17,7
 0132                   .dbline 110
 0132           ;  SD_Direction_REG|=(1<<SPI_DO); 
 0132 BD9A              sbi 0x17,5
 0134                   .dbline 111
 0134           ;  SD_Direction_REG|=(1<<SD_Chip_Select); 
 0134 BC9A              sbi 0x17,4
 0136                   .dbline 112
 0136           ;  SD_Write|=(1<<SD_Chip_Select); 
 0136 C49A              sbi 0x18,4
 0138                   .dbline 113
 0138           ;  SD_Write|=(1<<SPI_DI); 
 0138 C69A              sbi 0x18,6
 013A                   .dbline 116
 013A           ; 
 013A           ;  //We need to wait for the SD_Direction_REG to be ready 
 013A           ;  for(a=0;a<200;a++) 
 013A 4427              clr R20
 013C 02C0              xjmp L32
 013E           L29:
 013E                   .dbline 117
 013E                   .dbline 118
 013E 0000              nop
 0140                   .dbline 119
 0140           L30:
 0140                   .dbline 116
 0140 4395              inc R20
 0142           L32:
 0142                   .dbline 116
 0142 483C              cpi R20,200
 0144 E0F3              brlo L29
 0146                   .dbline 119
 0146           ;     {
 0146           ;      nop();
 0146           ;     }; 
 0146                   .dbline 121
 0146           ;  //Enable SPI in Master Mode with IDLE low and clock at 8M/128 
 0146           ; SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1); 
 0146 83E5              ldi R24,83
 0148 8DB9              out 0xd,R24
 014A                   .dbline 122
 014A           ; SPSR&=~(1<<SPI2X); 
 014A 7098              cbi 0xe,0
 014C                   .dbline 125
 014C           ;   
 014C           ;  // We need to give the card about a Hundred cycles to load 
 014C           ;  for (b=0;b<0x0f;++b) 
 014C AA24              clr R10
 014E 03C0              xjmp L36
 0150           L33:
 0150                   .dbline 126
 0150                   .dbline 127
 0150 0FEF              ldi R16,255
 0152 5CDF              xcall _Write_Byte_SD
 0154                   .dbline 128
 0154           L34:
 0154                   .dbline 125
 0154 A394              inc R10
 0156           L36:
 0156                   .dbline 125
 0156 8A2D              mov R24,R10
 0158 8F30              cpi R24,15
 015A D0F3              brlo L33
 015C                   .dbline 131
 015C           ;      {
 015C           ;       Write_Byte_SD(0xff); 
 015C           ;      } 
 015C           ; 
 015C           ;  //Send the initialization commands to the card 
 015C           ;  retry=0; 
 015C 6627              clr R22
 015E 0CC0              xjmp L38
 0160           L37:
 0160                   .dbline 134
 0160           ;   
 0160           ;  while(Write_Command_SD1(CMD)!=0X01)
 0160           ;  {
 0160                   .dbline 135
 0160           ;   Delay_ms(10);              //很重要,要不然就要REST才可以
 0160 0AE0              ldi R16,10
 0162 10E0              ldi R17,0
 0164 0E940000          xcall _Delay_ms
 0168                   .dbline 137
 0168           ;  //fail and return 
 0168           ;  if(retry++>50) 
 0168 262E              mov R2,R22
 016A 3324              clr R3
 016C 6F5F              subi R22,255    ; addi 1
 016E 82E3              ldi R24,50
 0170 8215              cp R24,R2
 0172 10F4              brsh L40
 0174                   .dbline 138
 0174           ;  { 
 0174                   .dbline 139
 0174           ;  return 1; 
 0174 01E0              ldi R16,1
 0176 21C0              xjmp L27
 0178           L40:
 0178                   .dbline 141
 0178           L38:
 0178                   .dbline 133
 0178 8E01              movw R16,R28
 017A 4CDF              xcall _Write_Command_SD1
 017C 0130              cpi R16,1
 017E 81F7              brne L37
 0180                   .dbline 144
 0180           ;  } 
 0180           ;  } 
 0180           ; 
 0180           ; //Send the 2nd command 
 0180           ;  retry=0; 
 0180 6627              clr R22
 0182                   .dbline 145
 0182           ;  CMD[0]=0x41; 
 0182 81E4              ldi R24,65
 0184 8883              std y+0,R24
 0186                   .dbline 146
 0186           ;  CMD[5]=0xFF; 
 0186 8FEF              ldi R24,255
 0188 8D83              std y+5,R24
 018A 0CC0              xjmp L44
 018C           L43:
 018C                   .dbline 149
 018C           ; 
 018C           ; while(Write_Command_SD1(CMD)!=0) 
 018C           ;       {
 018C                   .dbline 150
 018C           ;          Delay_ms(10);
 018C 0AE0              ldi R16,10
 018E 10E0              ldi R17,0
 0190 0E940000          xcall _Delay_ms
 0194                   .dbline 151
 0194           ;        if (retry++>50) 
 0194 262E              mov R2,R22
 0196 3324              clr R3
 0198 6F5F              subi R22,255    ; addi 1
 019A 82E3              ldi R24,50
 019C 8215              cp R24,R2
 019E 10F4              brsh L46
 01A0                   .dbline 152
 01A0           ;           {
 01A0                   .dbline 153
 01A0           ;           return 2; 
 01A0 02E0              ldi R16,2
 01A2 0BC0              xjmp L27
 01A4           L46:
 01A4                   .dbline 155
 01A4           L44:
 01A4                   .dbline 148
 01A4 8E01              movw R16,R28
 01A6 36DF              xcall _Write_Command_SD1
 01A8 0023              tst R16
 01AA 81F7              brne L43
 01AC                   .dbline 158
 01AC           ;           } 
 01AC           ;        } 
 01AC           ; 
 01AC           ;  //Set the SPI bus to full speed 8M/2
 01AC           ;  SPCR&=~((1<<SPR0)|(1<<SPR1)); 
 01AC 8DB1              in R24,0xd
 01AE 8C7F              andi R24,252
 01B0 8DB9              out 0xd,R24
 01B2                   .dbline 159
 01B2           ;  SPSR|=(1<<SPI2X); 
 01B2 709A              sbi 0xe,0
 01B4                   .dbline 163
 01B4           ;  
 01B4           ;  //Raise Chip Select 
 01B4           ; 
 01B4           ;  SD_Disable(); 
 01B4 C49A              sbi 0x18,4
 01B6                   .dbline 163
 01B6                   .dbline 164
 01B6           ;  asm("sei");
 01B6 7894              sei
 01B8                   .dbline 165
 01B8           ;  return 0; 
 01B8 0027              clr R16
 01BA                   .dbline -2
 01BA           L27:
 01BA 2696              adiw R28,6
 01BC 0E940000          xcall pop_gset3
 01C0                   .dbline 0 ; func end
 01C0 0895              ret
 01C2                   .dbsym r b 10 c
 01C2                   .dbsym r a 20 c
 01C2                   .dbsym r retry 22 c
 01C2                   .dbsym l CMD 0 A[6:6]c
 01C2                   .dbend
 01C2                   .dbfunc e SD_set_length _SD_set_length fc
 01C2           ;          retry -> R20
 01C2           ;         length -> R22,R23
                        .even
 01C2           _SD_set_length::
 01C2 0E940000          xcall push_gset2
 01C6 B801              movw R22,R16
 01C8 2297              sbiw R28,2
 01CA                   .dbline -1
 01CA                   .dbline 170
 01CA           ; } 
 01CA           ; 
 01CA           ; //=======================================================================
 01CA           ; uint8 SD_set_length(uint16 length)
 01CA           ; {
 01CA 08C0              xjmp L50
 01CC           L49:
 01CC                   .dbline 175
 01CC           ;  uint8 retry;
 01CC           ;  //Command to set the block length;
 01CC           ; 
 01CC           ;  while(Write_Command_SD(0x50,length)!=0) 
 01CC           ;       {
 01CC                   .dbline 176
 01CC           ;        if (retry++>10) 
 01CC 242E              mov R2,R20
 01CE 3324              clr R3
 01D0 4F5F              subi R20,255    ; addi 1
 01D2 8AE0              ldi R24,10
 01D4 8215              cp R24,R2
 01D6 10F4              brsh L52
 01D8                   .dbline 177
 01D8           ;           { 
 01D8                   .dbline 178
 01D8           ;                  return 1;
 01D8 01E0              ldi R16,1
 01DA 0CC0              xjmp L48
 01DC           L52:
 01DC                   .dbline 180
 01DC           L50:
 01DC                   .dbline 174
 01DC 1B01              movw R2,R22
 01DE 4424              clr R4
 01E0 5524              clr R5
 01E2 4882              std y+0,R4
 01E4 5982              std y+1,R5
 01E6 9101              movw R18,R2
 01E8 00E5              ldi R16,80
 01EA 38DF              xcall _Write_Command_SD
 01EC 0023              tst R16
 01EE 71F7              brne L49
 01F0                   .dbline 181
 01F0           ;           } 
 01F0           ;        }
 01F0           ;  SD_Disable(); 
 01F0 C49A              sbi 0x18,4
 01F2                   .dbline 181

⌨️ 快捷键说明

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