📄 1011.lis
字号:
.module _1011.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\pas\桌面\mp3代码\u盘MP3代码\1011.c
0000 .dbfunc e spi_init _spi_init fV
.even
0000 _spi_init::
0000 .dbline -1
0000 .dbline 18
0000 ; #include <iom64v.h>
0000 ; #include <macros.h>
0000 ; #include "delay.h"
0000 ; #define uchar unsigned char
0000 ; #define uint unsigned int
0000 ;
0000 ; #define MP3_DDR DDRB
0000 ; #define MP3_PORT PORTB
0000 ; #define MP3_PIN PINB
0000 ; #define MP3_CMD_CS BIT(4)
0000 ; #define MP3_DATA_REST BIT(5)
0000 ; #define MP3_DATA_REQ BIT(6)
0000 ; #define MP3_DATA_CS BIT(7)
0000 ;
0000 ;
0000 ; //SPI initialize
0000 ; void spi_init(void)
0000 ; {
0000 .dbline 19
0000 ; DDRB = 0xBF; //SI输入,SO,SCK,SS输出
0000 8FEB ldi R24,191
0002 87BB out 0x17,R24
0004 .dbline 20
0004 ; SPCR = 0x50; //setup SPI
0004 80E5 ldi R24,80
0006 8DB9 out 0xd,R24
0008 .dbline 21
0008 ; SPSR = 0x01; //setup SPI
0008 81E0 ldi R24,1
000A 8EB9 out 0xe,R24
000C .dbline -2
000C L1:
000C .dbline 0 ; func end
000C 0895 ret
000E .dbend
000E .dbfunc e mp3_port_init _mp3_port_init fV
.even
000E _mp3_port_init::
000E .dbline -1
000E .dbline 25
000E ; }
000E ;
000E ; void mp3_port_init()
000E ; {
000E .dbline 26
000E ; spi_init();
000E F8DF xcall _spi_init
0010 .dbline 27
0010 ; MP3_DDR|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
0010 87B3 in R24,0x17
0012 806B ori R24,176
0014 87BB out 0x17,R24
0016 .dbline 28
0016 ; MP3_DDR&=~MP3_DATA_REQ;
0016 BE98 cbi 0x17,6
0018 .dbline 29
0018 ; MP3_PORT|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
0018 88B3 in R24,0x18
001A 806B ori R24,176
001C 88BB out 0x18,R24
001E .dbline -2
001E L2:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbend
0020 .dbfunc e Write_Byte_MMC _Write_Byte_MMC fV
0020 ; byte -> R16
.even
0020 _Write_Byte_MMC::
0020 .dbline -1
0020 .dbline 33
0020 ; }
0020 ;
0020 ; void Write_Byte_MMC(unsigned char byte)
0020 ; {
0020 .dbline 34
0020 ; SPDR = byte;
0020 0FB9 out 0xf,R16
0022 L4:
0022 .dbline 36
0022 .dbline 37
0022 .dbline 38
0022 L5:
0022 .dbline 35
0022 ; while (!(SPSR & (1<<SPIF)))
0022 779B sbis 0xe,7
0024 FECF rjmp L4
0026 .dbline -2
0026 L3:
0026 .dbline 0 ; func end
0026 0895 ret
0028 .dbsym r byte 16 c
0028 .dbend
0028 .dbfunc e Read_Byte_MMC _Read_Byte_MMC fc
.even
0028 _Read_Byte_MMC::
0028 .dbline -1
0028 .dbline 42
0028 ; {
0028 ; ;
0028 ; }
0028 ; }
0028 ;
0028 ; unsigned char Read_Byte_MMC(void)
0028 ; {
0028 .dbline 43
0028 ; SPDR = 0xFF;
0028 8FEF ldi R24,255
002A 8FB9 out 0xf,R24
002C L8:
002C .dbline 45
002C .dbline 46
002C .dbline 47
002C L9:
002C .dbline 44
002C ; while (!(SPSR &(1<<SPIF)))
002C 779B sbis 0xe,7
002E FECF rjmp L8
0030 .dbline 49
0030 ; {
0030 ; ;
0030 ; }
0030 ;
0030 ; return SPDR;
0030 0FB1 in R16,0xf
0032 .dbline -2
0032 L7:
0032 .dbline 0 ; func end
0032 0895 ret
0034 .dbend
0034 .dbfunc e vs1003_cmd_write _vs1003_cmd_write fV
0034 ; data -> R20,R21
0034 ; address -> R22
.even
0034 _vs1003_cmd_write::
0034 0E940000 xcall push_gset2
0038 A901 movw R20,R18
003A 602F mov R22,R16
003C .dbline -1
003C .dbline 53
003C ; }
003C ;
003C ; void vs1003_cmd_write(uchar address,uint data)
003C ; {
003C .dbline 54
003C ; SPCR = 0x53; //
003C 83E5 ldi R24,83
003E 8DB9 out 0xd,R24
0040 .dbline 55
0040 ; SPSR = 0x00; //低速度spi
0040 2224 clr R2
0042 2EB8 out 0xe,R2
0044 .dbline 57
0044 ; //==============
0044 ; MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
0044 C79A sbi 0x18,7
0046 .dbline 58
0046 ; MP3_PORT&=~MP3_CMD_CS; //MP3_CMD_CS=0;
0046 C498 cbi 0x18,4
0048 .dbline 59
0048 ; Write_Byte_MMC(0x02); //VS1011的写命令
0048 02E0 ldi R16,2
004A EADF xcall _Write_Byte_MMC
004C .dbline 60
004C ; delay_nus(40);
004C 08E2 ldi R16,40
004E 10E0 ldi R17,0
0050 0E940000 xcall _delay_nus
0054 .dbline 61
0054 ; Write_Byte_MMC(address); //地址
0054 062F mov R16,R22
0056 E4DF xcall _Write_Byte_MMC
0058 .dbline 62
0058 ; Write_Byte_MMC(data>>8);
0058 8A01 movw R16,R20
005A 012F mov R16,R17
005C 1127 clr R17
005E E0DF xcall _Write_Byte_MMC
0060 .dbline 63
0060 ; Write_Byte_MMC(data);
0060 042F mov R16,R20
0062 DEDF xcall _Write_Byte_MMC
0064 .dbline 64
0064 ; delay_nus(200);
0064 08EC ldi R16,200
0066 10E0 ldi R17,0
0068 0E940000 xcall _delay_nus
006C .dbline 65
006C ; MP3_PORT|=MP3_CMD_CS; //MP3_CMD_CS=1;
006C C49A sbi 0x18,4
006E .dbline 67
006E ;
006E ; SPCR = 0x50; //
006E 80E5 ldi R24,80
0070 8DB9 out 0xd,R24
0072 .dbline 68
0072 ; SPSR = 0x01; //高速spi
0072 81E0 ldi R24,1
0074 8EB9 out 0xe,R24
0076 .dbline -2
0076 L11:
0076 0E940000 xcall pop_gset2
007A .dbline 0 ; func end
007A 0895 ret
007C .dbsym r data 20 i
007C .dbsym r address 22 c
007C .dbend
007C .dbfunc e vs1003_data_write _vs1003_data_write fV
007C ; data -> R20
.even
007C _vs1003_data_write::
007C 0E940000 xcall push_gset1
0080 402F mov R20,R16
0082 .dbline -1
0082 .dbline 73
0082 ; //=========================
0082 ; }
0082 ;
0082 ; void vs1003_data_write(uchar data)
0082 ; {
0082 .dbline 74
0082 ; MP3_PORT&=~MP3_DATA_CS; //MP3_DATA_CS=0;
0082 C798 cbi 0x18,7
0084 .dbline 75
0084 ; Write_Byte_MMC(data);
0084 042F mov R16,R20
0086 CCDF xcall _Write_Byte_MMC
0088 .dbline 76
0088 ; MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
0088 C79A sbi 0x18,7
008A .dbline 77
008A ; MP3_PORT|=MP3_CMD_CS; //MP3_CMD_CS=1;
008A C49A sbi 0x18,4
008C .dbline -2
008C L12:
008C 0E940000 xcall pop_gset1
0090 .dbline 0 ; func end
0090 0895 ret
0092 .dbsym r data 20 c
0092 .dbend
0092 .dbfunc e vs1003_read _vs1003_read fi
0092 ; temp1 -> R22
0092 ; temp -> R20,R21
0092 ; address -> R10
.even
0092 _vs1003_read::
0092 0E940000 xcall push_gset3
0096 A02E mov R10,R16
0098 .dbline -1
0098 .dbline 81
0098 ; }
0098 ;
0098 ; uint vs1003_read(uchar address)
0098 ; {
0098 .dbline 82
0098 ; uchar temp1=0;
0098 6627 clr R22
009A .dbline 83
009A ; uint temp=0;
009A 4427 clr R20
009C 5527 clr R21
009E .dbline 84
009E ; MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
009E C79A sbi 0x18,7
00A0 .dbline 85
00A0 ; MP3_PORT&=~MP3_CMD_CS; //MP3_CMD_CS=0;
00A0 C498 cbi 0x18,4
00A2 .dbline 86
00A2 ; Write_Byte_MMC(0x03); //VS1011的读命令
00A2 03E0 ldi R16,3
00A4 BDDF xcall _Write_Byte_MMC
00A6 .dbline 87
00A6 ; delay_nus(30);
00A6 0EE1 ldi R16,30
00A8 10E0 ldi R17,0
00AA 0E940000 xcall _delay_nus
00AE .dbline 88
00AE ; Write_Byte_MMC(address); //地址
00AE 0A2D mov R16,R10
00B0 B7DF xcall _Write_Byte_MMC
00B2 .dbline 89
00B2 ; temp=Read_Byte_MMC();
00B2 BADF xcall _Read_Byte_MMC
00B4 402F mov R20,R16
00B6 5527 clr R21
00B8 .dbline 90
00B8 ; temp=temp<<8;
00B8 542F mov R21,R20
00BA 4427 clr R20
00BC .dbline 91
00BC ; temp1=Read_Byte_MMC();
00BC B5DF xcall _Read_Byte_MMC
00BE 602F mov R22,R16
00C0 .dbline 92
00C0 ; temp=temp|temp1;
00C0 262E mov R2,R22
00C2 3324 clr R3
00C4 4229 or R20,R2
00C6 5329 or R21,R3
00C8 .dbline 93
00C8 ; MP3_PORT|=MP3_CMD_CS; //MP3_CMD_CS=1;
00C8 C49A sbi 0x18,4
00CA .dbline 95
00CA ;
00CA ; return temp;
00CA 8A01 movw R16,R20
00CC .dbline -2
00CC L13:
00CC 0E940000 xcall pop_gset3
00D0 .dbline 0 ; func end
00D0 0895 ret
00D2 .dbsym r temp1 22 c
00D2 .dbsym r temp 20 i
00D2 .dbsym r address 10 c
00D2 .dbend
00D2 .dbfunc e vs1003_init _vs1003_init fV
.even
00D2 _vs1003_init::
00D2 .dbline -1
00D2 .dbline 99
00D2 ; }
00D2 ;
00D2 ; void vs1003_init(void)
00D2 ; {
00D2 .dbline 100
00D2 ; vs1003_cmd_write(0x00,0x0800); //NEW MODE
00D2 20E0 ldi R18,2048
00D4 38E0 ldi R19,8
00D6 0027 clr R16
00D8 ADDF xcall _vs1003_cmd_write
00DA .dbline 101
00DA ; vs1003_cmd_write(0x0b,0X1010); //VOLUME
00DA 20E1 ldi R18,4112
00DC 30E1 ldi R19,16
00DE 0BE0 ldi R16,11
00E0 A9DF xcall _vs1003_cmd_write
00E2 .dbline 102
00E2 ; vs1003_cmd_write(0x02,0X1fff); //BASS
00E2 2FEF ldi R18,8191
00E4 3FE1 ldi R19,31
00E6 02E0 ldi R16,2
00E8 A5DF xcall _vs1003_cmd_write
00EA .dbline 103
00EA ; vs1003_cmd_write(0x03,0X4000); //CLOCK F
00EA 20E0 ldi R18,16384
00EC 30E4 ldi R19,64
00EE 03E0 ldi R16,3
00F0 A1DF xcall _vs1003_cmd_write
00F2 .dbline -2
00F2 L14:
00F2 .dbline 0 ; func end
00F2 0895 ret
00F4 .dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -