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

📄 mp3.lst

📁 mp3源码,是自己写的,关于vs1001与CD卡的读取歌曲,和播放.
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0035 E5CF      LDI	R28,0x5F
    0036 E0D4      LDI	R29,4
    0037 BFCD      OUT	0x3D,R28
    0038 BFDE      OUT	0x3E,R29
    0039 54C0      SUBI	R28,0x40
    003A 40D0      SBCI	R29,0
    003B EA0A      LDI	R16,0xAA
    003C 8308      STD	Y+0,R16
    003D 2400      CLR	R0
    003E E6E5      LDI	R30,0x65
    003F E0F0      LDI	R31,0
    0040 E013      LDI	R17,3
    0041 36E0      CPI	R30,0x60
    0042 07F1      CPC	R31,R17
    0043 F011      BEQ	0x0046
    0044 9201      ST	R0,Z+
    0045 CFFB      RJMP	0x0041
    0046 8300      STD	Z+0,R16
    0047 E6E4      LDI	R30,0x64
    0048 E0F0      LDI	R31,0
    0049 E6A0      LDI	R26,0x60
    004A E0B0      LDI	R27,0
    004B E010      LDI	R17,0
    004C 36E9      CPI	R30,0x69
    004D 07F1      CPC	R31,R17
    004E F021      BEQ	0x0053
    004F 95C8      LPM
    0050 9631      ADIW	R30,1
    0051 920D      ST	R0,X+
    0052 CFF9      RJMP	0x004C
    0053 940E005F  CALL	_main
_exit:
    0055 CFFF      RJMP	_exit
_DREQ:
    0056 940E0AC6  CALL	push_lset
FILE: F:\mine\mp3\MP3\main.c
(0001) #include<all.h>
(0002) #include<vs1001k.h>
(0003) #include<sdcom.h>
(0004) #include<fat.h>
(0005) 
(0006) char  songnumber=0;//歌曲编号
(0007) 
(0008) 
(0009) #pragma interrupt_handler DREQ:iv_INT0 //数据缓冲
(0010) void DREQ(void)
(0011) { delay(50);}
    0058 E302      LDI	R16,0x32
    0059 E010      LDI	R17,0
    005A 940E0293  CALL	_delay
    005C 940E0ADD  CALL	pop_lset
    005E 9518      RETI
_main:
  n                    --> Y+16
  table3               --> Y+8
  table2               --> Y+0
    005F 9764      SBIW	R28,0x14
(0012) 
(0013) 
(0014) void main(void)
(0015) { ulong n;
(0016)   uchar table2[8]={0x45,0x78,0x69,0x74,0,0,0,0};
    0060 E584      LDI	R24,0x54
    0061 E090      LDI	R25,0
    0062 01FE      MOVW	R30,R28
    0063 E008      LDI	R16,0x8
    0064 E010      LDI	R17,0
    0065 93FA      ST	R31,-Y
    0066 93EA      ST	R30,-Y
    0067 939A      ST	R25,-Y
    0068 938A      ST	R24,-Y
    0069 940E0B0C  CALL	asgncblk
(0017)   uchar table3[8]={0x53,0xef,0x6e,0x30,0,0,0,0};
    006B E58C      LDI	R24,0x5C
    006C E090      LDI	R25,0
    006D 01FE      MOVW	R30,R28
    006E 9638      ADIW	R30,0x8
    006F E008      LDI	R16,0x8
    0070 E010      LDI	R17,0
    0071 93FA      ST	R31,-Y
    0072 93EA      ST	R30,-Y
    0073 939A      ST	R25,-Y
    0074 938A      ST	R24,-Y
    0075 940E0B0C  CALL	asgncblk
(0018)   DDRB=0xbb;
    0077 EB8B      LDI	R24,0xBB
    0078 BB87      OUT	0x17,R24
(0019)   DDRD=0x02;
    0079 E082      LDI	R24,2
    007A BB81      OUT	0x11,R24
(0020)   PORTB=0xff;
    007B EF8F      LDI	R24,0xFF
    007C BB88      OUT	0x18,R24
(0021)   PORTD=0xff;
    007D BB82      OUT	0x12,R24
(0022)   MCUCR=0x08;//INT0低电平中断 INT1下降沿
    007E E088      LDI	R24,0x8
    007F BF85      OUT	0x35,R24
(0023)   GICR=0xC0;
    0080 EC80      LDI	R24,0xC0
    0081 BF8B      OUT	0x3B,R24
(0024) //  SEI();//开中断
(0025) //  while(1);
(0026)   
(0027)   SPCR=0x50;//高位先 
    0082 E580      LDI	R24,0x50
    0083 B98D      OUT	0x0D,R24
(0028)   SPSR=0x01;//rat/2
    0084 E081      LDI	R24,1
    0085 B98E      OUT	0x0E,R24
(0029)   while(sd_init()==0);//等待SD初始化
    0086 940E027F  CALL	_sd_init
    0088 2300      TST	R16
    0089 F3E1      BEQ	0x0086
(0030)   setlight;
    008A 9891      CBI	0x12,1
(0031)   vs1001k_reset();//VS1001K复位
    008B 940E0302  CALL	_vs1001k_reset
(0032)  
(0033)   GetinBoot();//进入
    008D 940E039E  CALL	_GetinBoot
(0034)   GetFatSec();//得到FAT扇区
    008F 940E05A6  CALL	_GetFatSec
(0035)   SongSector();//得到每首歌的扇区号
    0091 940E0645  CALL	_SongSector
(0036)     
(0037)  
(0038)   SEI();//开中断
    0093 9478      BSET	7
    0094 C004      RJMP	0x0099
(0039)   while(1)
(0040)   PlaySong(songnumber);
    0095 91000060  LDS	R16,0x60
    0097 940E08FB  CALL	_PlaySong
    0099 CFFB      RJMP	0x0095
(0041)   _NOP();
    009A 0000      NOP
(0042) }  
    009B 9664      ADIW	R28,0x14
    009C 9508      RET
FILE: F:\mine\mp3\MP3\sd.c
(0001) #include<all.h>
(0002) #include<vs1001k.h>
(0003) #include<sd.h>
(0004) #define SD_INIT_TRY   50
(0005) #define SD_IDLE_WAIT_MAX  100 //等待进入IDLE次数
(0006) #define SD_CMD_TIMEOUT    100 //读CMD次数
(0007) #define TIMEOUT_WRITE  10000   // 8M/8
(0008) #define TIMEOUT_READ   400000  // 8M/20
(0009) 
(0010) uchar mp3_data[DATA_LENGTH];
(0011) uchar response[5];
(0012) 
(0013) void sd_wait_nobusy(void)
(0014) {
(0015)   while(read_single()!=0xff);
_sd_wait_nobusy:
    009D 940E02B1  CALL	_read_single
    009F 3F0F      CPI	R16,0xFF
    00A0 F7E1      BNE	0x009D
(0016)   select_vs;
    00A1 9AC3      SBI	0x18,3
(0017) }
    00A2 9508      RET
_sd_delay:
  n                    --> R20
  dat                  --> R22
    00A3 940E0A91  CALL	push_gset2
    00A5 2F60      MOV	R22,R16
(0018) void sd_delay(uchar dat)
(0019) { uint n;
(0020)   for(n=0;n<dat;n++)
    00A6 2744      CLR	R20
    00A7 2755      CLR	R21
    00A8 C005      RJMP	0x00AE
(0021)    write_single(0xff);
    00A9 EF0F      LDI	R16,0xFF
    00AA 940E02AC  CALL	_write_single
    00AC 5F4F      SUBI	R20,0xFF
    00AD 4F5F      SBCI	R21,0xFF
    00AE 2E26      MOV	R2,R22
    00AF 2433      CLR	R3
    00B0 1542      CP	R20,R2
    00B1 0553      CPC	R21,R3
    00B2 F3B0      BCS	0x00A9
(0022) }   
    00B3 940E0A6E  CALL	pop_gset2
    00B5 9508      RET
_sd_write_command:
  response_length      --> R14
  dat                  --> R22
  n                    --> R20
  response             --> R10
  arg                  --> Y+10
  response_type        --> R12
  cmd                  --> R20
    00B6 940E0A9D  CALL	push_gset5
    00B8 2EC2      MOV	R12,R18
    00B9 2F40      MOV	R20,R16
    00BA 84AE      LDD	R10,Y+14
    00BB 84BF      LDD	R11,Y+15
(0023) /****************sd 发命令**********************/
(0024) uchar sd_write_command(uchar cmd,uchar response_type,ulong arg,uchar *response)
(0025) { uchar response_length,dat;
(0026)   int n;
(0027)   select_sd;//选择SD
    00BC 98C3      CBI	0x18,3
(0028)   write_single(cmd|0x40);
    00BD 2F04      MOV	R16,R20
    00BE 6400      ORI	R16,0x40
    00BF 940E02AC  CALL	_write_single
(0029)   write_single(arg>>24);
    00C1 E188      LDI	R24,0x18
    00C2 E090      LDI	R25,0
    00C3 01FE      MOVW	R30,R28
    00C4 8422      LDD	R2,Z+10
    00C5 8433      LDD	R3,Z+11
    00C6 8444      LDD	R4,Z+12
    00C7 8455      LDD	R5,Z+13
    00C8 938A      ST	R24,-Y
    00C9 0181      MOVW	R16,R2
    00CA 0192      MOVW	R18,R4
    00CB 940E0B00  CALL	lsr32
    00CD 940E02AC  CALL	_write_single
(0030)   write_single(arg>>16);
    00CF 01FE      MOVW	R30,R28
    00D0 8422      LDD	R2,Z+10
    00D1 8433      LDD	R3,Z+11
    00D2 8444      LDD	R4,Z+12
    00D3 8455      LDD	R5,Z+13
    00D4 0112      MOVW	R2,R4
    00D5 2444      CLR	R4
    00D6 2455      CLR	R5
    00D7 2D02      MOV	R16,R2
    00D8 940E02AC  CALL	_write_single
(0031)   write_single(arg>>8);
    00DA E088      LDI	R24,0x8
    00DB E090      LDI	R25,0
    00DC 01FE      MOVW	R30,R28
    00DD 8422      LDD	R2,Z+10
    00DE 8433      LDD	R3,Z+11
    00DF 8444      LDD	R4,Z+12
    00E0 8455      LDD	R5,Z+13
    00E1 938A      ST	R24,-Y
    00E2 0181      MOVW	R16,R2
    00E3 0192      MOVW	R18,R4
    00E4 940E0B00  CALL	lsr32
    00E6 940E02AC  CALL	_write_single
(0032)   write_single(arg);
    00E8 01FE      MOVW	R30,R28
    00E9 8502      LDD	R16,Z+10
    00EA 940E02AC  CALL	_write_single
(0033)   write_single(0x95);//CRC 对于CMD0有效,SPI忽略
    00EC E905      LDI	R16,0x95
    00ED 940E02AC  CALL	_write_single
(0034)   response_length=0;
    00EF 24EE      CLR	R14
(0035)   switch(response_type)
    00F0 2D4C      MOV	R20,R12
    00F1 2755      CLR	R21
    00F2 3041      CPI	R20,1
    00F3 E0E0      LDI	R30,0
    00F4 075E      CPC	R21,R30
    00F5 F069      BEQ	0x0103
    00F6 3042      CPI	R20,2
    00F7 E0E0      LDI	R30,0
    00F8 075E      CPC	R21,R30
    00F9 F049      BEQ	0x0103
    00FA 3043      CPI	R20,3
    00FB E0E0      LDI	R30,0
    00FC 075E      CPC	R21,R30
    00FD F041      BEQ	0x0106
    00FE 3044      CPI	R20,4
    00FF E0E0      LDI	R30,0
    0100 075E      CPC	R21,R30
    0101 F039      BEQ	0x0109
    0102 C008      RJMP	0x010B
(0036)   { case R1: 
(0037)     case R1B:response_length=1;break;
    0103 24EE      CLR	R14
    0104 94E3      INC	R14
    0105 C005      RJMP	0x010B
(0038) 	case R2: response_length=2;break;
    0106 E082      LDI	R24,2
    0107 2EE8      MOV	R14,R24
    0108 C002      RJMP	0x010B
(0039) 	case R3: response_length=5;break;
    0109 E085      LDI	R24,5
    010A 2EE8      MOV	R14,R24
(0040) 	default: break;
(0041)   }	
(0042)   n=0;
    010B 2744      CLR	R20
    010C 2755      CLR	R21
(0043)   do                              //等待响应
(0044)   { dat=read_single();
    010D 940E02B1  CALL	_read_single
    010F 2F60      MOV	R22,R16
(0045)     n++;
    0110 5F4F      SUBI	R20,0xFF
    0111 4F5F      SBCI	R21,0xFF
(0046)   }
(0047)   while(((dat&0x80)!=0)&&(n<SD_CMD_TIMEOUT));
    0112 FF67      SBRS	R22,7
    0113 C004      RJMP	0x0118
    0114 3644      CPI	R20,0x64
    0115 E0E0      LDI	R30,0
    0116 075E      CPC	R21,R30
    0117 F3AC      BLT	0x010D
(0048)   if(n>=SD_CMD_TIMEOUT)	//超时
    0118 3644      CPI	R20,0x64
    0119 E0E0      LDI	R30,0
    011A 075E      CPC	R21,R30
    011B F01C      BLT	0x011F
(0049)   { select_vs;
    011C 9AC3      SBI	0x18,3
(0050)     return 0;
    011D 2700      CLR	R16
    011E C01F      RJMP	0x013E
(0051)   }	
(0052)   for(n=response_length-1;n>=0;n--)//取数据
    011F 2D4E      MOV	R20,R14
    0120 2755      CLR	R21
    0121 5041      SUBI	R20,1
    0122 4050      SBCI	R21,0
    0123 C009      RJMP	0x012D
(0053)   { response[n]=dat;
    0124 01FA      MOVW	R30,R20
    0125 0DEA      ADD	R30,R10
    0126 1DFB      ADC	R31,R11
    0127 8360      STD	Z+0,R22
(0054)     dat=read_single();
    0128 940E02B1  CALL	_read_single
    012A 2F60      MOV	R22,R16

⌨️ 快捷键说明

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