?? m16_vs1003_test.lst
字號:
__start:
__text_start:
4F E5CF LDI R28,0x5F
50 E0D4 LDI R29,4
51 BFCD OUT 0x3D,R28
52 BFDE OUT 0x3E,R29
53 51CE SUBI R28,0x1E
54 40D0 SBCI R29,0
55 EA0A LDI R16,0xAA
56 8308 ST Y,R16
57 2400 CLR R0
58 EAE9 LDI R30,0xA9
59 E0F0 LDI R31,0
5A E013 LDI R17,3
5B 3BEF CPI R30,0xBF
5C 07F1 CPC R31,R17
5D F011 BEQ 0x0060
5E 9201 ST Z+,R0
5F CFFB RJMP 0x005B
60 8300 ST Z,R16
61 E5E4 LDI R30,0x54
62 E0F0 LDI R31,0
63 E6A0 LDI R26,0x60
64 E0B0 LDI R27,0
65 E010 LDI R17,0
66 E000 LDI R16,0
67 BF0B OUT 0x3B,R16
68 39ED CPI R30,0x9D
69 07F1 CPC R31,R17
6A F021 BEQ 0x006F
6B 95C8 LPM
6C 9631 ADIW R30,1
6D 920D ST X+,R0
6E CFF9 RJMP 0x0068
6F 940E 00A1 CALL _main
_exit:
71 CFFF RJMP _exit
_Usart_Init:
temp --> R10
baud --> R10
72 940E 0E0C CALL push_xgsetF00C
74 0158 MOVW R10,R16
FILE: C:\DOCUME~1\浪仔\桌面\教學實驗板\M16_VS1003_test\Usart.c
(0001)
(0002) //---------------------------- USART串口驅動程序 ----------------------------
(0003) //
(0004) //USART串口驅動程序:發送與接收
(0005) //整理日期:2009.7.8
(0006) //
(0007) //----------------------------------------------------------------------------
(0008)
(0009) #include "Usart.h"
(0010)
(0011) //定義fosc頻率
(0012) #define fosc 16000000
(0013)
(0014)
(0015) //---------------------------------
(0016) //
(0017) // USART初始化函數
(0018) // baud:波特率
(0019) //
(0020) //---------------------------------
(0021) void Usart_Init(unsigned int baud)
(0022) {
(0023) unsigned int temp;
(0024) temp = fosc/16/baud-1;
75 0115 MOVW R2,R10
76 2444 CLR R4
77 2455 CLR R5
78 E440 LDI R20,0x40
79 E452 LDI R21,0x42
7A E06F LDI R22,0xF
7B E070 LDI R23,0
7C 925A ST -Y,R5
7D 924A ST -Y,R4
7E 923A ST -Y,R3
7F 922A ST -Y,R2
80 018A MOVW R16,R20
81 019B MOVW R18,R22
82 940E 0D48 CALL div32s
84 E041 LDI R20,1
85 E050 LDI R21,0
86 E060 LDI R22,0
87 E070 LDI R23,0
88 0118 MOVW R2,R16
89 0129 MOVW R4,R18
8A 1A24 SUB R2,R20
8B 0A35 SBC R3,R21
8C 0A46 SBC R4,R22
8D 0A57 SBC R5,R23
8E 0151 MOVW R10,R2
(0025) UBRRH=(unsigned char )(temp>>8);
8F 2C23 MOV R2,R3
90 2433 CLR R3
91 BC20 OUT 0x20,R2
(0026) UBRRL=(unsigned char) (temp);
92 B8A9 OUT 0x09,R10
(0027) UCSRB=(1<<RXEN)|(1<<TXEN);
93 E188 LDI R24,0x18
94 B98A OUT 0x0A,R24
(0028) UCSRC=(1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
95 E88E LDI R24,0x8E
96 BD80 OUT 0x20,R24
97 940C 0E13 JMP pop_xgsetF00C
(0029) }
(0030)
(0031)
(0032) //-----------------------------------
(0033) //
(0034) // USART發送函數
(0035) // data:要發送的數據
(0036) //
(0037) //-----------------------------------
(0038) void Usart_Transmit(unsigned char data)
(0039) {
(0040) while(!(UCSRA&(1<<UDRE)));
_Usart_Transmit:
data --> R16
99 9B5D SBIS 0x0B,5
9A CFFE RJMP _Usart_Transmit
(0041) UDR=data;
9B B90C OUT 0x0C,R16
9C 9508 RET
(0042) }
(0043)
(0044)
(0045) //-----------------------------------
(0046) //
(0047) // USART接收函數
(0048) // UDR:返回的數據
(0049) //
(0050) //-----------------------------------
(0051) unsigned char Usart_Receive(void)
(0052) {
(0053) while(!(UCSRA&(1<<RXC)));
_Usart_Receive:
9D 9B5F SBIS 0x0B,7
9E CFFE RJMP _Usart_Receive
(0054) return UDR;
9F B10C IN R16,0x0C
A0 9508 RET
FILE: C:\DOCUME~1\浪仔\桌面\教學實驗板\M16_VS1003_test\main.c
(0001)
(0002) //--------------------------- 實驗程序名稱:MP3播放器 ------------------------------
(0003) //
(0004) //開發平臺:ATmega16教學實驗板
(0005) //外設使用:1. T/C0定時器 2. AD模數轉換(通道7) 3. SPI總線
(0006) //模塊使用:1.AD鍵盤 2.SD卡 3.VS1003模塊
(0007) //頻率:外頻16MHz
(0008) //電壓:3.3V
(0009) //
(0010) //存儲體:SD卡
(0011) //文件系統:FAT32
(0012) //顯示器:不帶
(0013) //音樂文件:SD卡上命名“音樂”文件夾,在“音樂”文件夾內存儲歌曲,格式為“MP3“。
(0014) //按鍵操作: | Key6 | Key5 | Key4 | Key3 | Key2 | Key1 |
(0015) // | 播放 | 停止 | 上一首 | 音量+ | 音量- | 下一首 |
(0016) //
(0017) //原理:使用ATmega16讀取SD卡中音樂文件傳輸到VS1003進行解碼播放。
(0018) //重點:1.文件系統 2.SD卡驅動
(0019) //
(0020) //作者:廖華明(師兄)
(0021) //日期:2009.7.8
(0022) //
(0023) //----------------------------------------------------------------------------------
(0024)
(0025) #include "SPI.h"
(0026) #include "Usart.h"
(0027) #include "fat.h"
(0028) #include "vs1003.h"
(0029) #include "AD_key.h"
(0030)
(0031)
(0032) //-------------- 音樂播放程序 -------------------//
(0033)
(0034) void VS1003_Play(void);
(0035)
(0036)
(0037)
(0038) //----------------- ------------------------------
(0039) //
(0040) // 主函數
(0041) //
(0042) //------------------------------------------------
(0043) void main()
(0044) {
(0045) Usart_Init(9600); // 串口初始化9600bps
_main:
A1 E800 LDI R16,0x80
A2 E215 LDI R17,0x25
A3 940E 0072 CALL _Usart_Init
(0046) SPI_Init(); // SPI初始化,默認速度400Hz
A5 940E 0C36 CALL _SPI_Init
(0047) VS1003_Init(); // VS1003芯片初始化
A7 940E 031B CALL _VS1003_Init
(0048) while(SD_Init()); // SD卡循環初始化
A9 940E 0401 CALL _SD_Init
AB 2300 TST R16
AC F7E1 BNE 0x00A9
(0049) Fat_Init(); // 文件系統初始化
AD 940E 050F CALL _Fat_Init
(0050) AD_Init(); // AD初始化
AF 940E 0D20 CALL _AD_Init
(0051) TC0_Init(); // T/C0初始化
B1 940E 0D36 CALL _TC0_Init
(0052)
(0053) VS1003_Play(); // 音樂播放
B3 C000 RJMP _VS1003_Play
B4 940E 0DF7 CALL push_xgsetF0FC
B6 9766 SBIW R28,0x16
(0054) }
(0055)
(0056)
(0057)
(0058) //----------------- ------------------------------
(0059) //
(0060) // 音樂播放函數
(0061) //
(0062) //------------------------------------------------
(0063) void VS1003_Play(void)
(0064) {
(0065) uint32 n;
(0066) uint32 i;
(0067) uint32 size_buf=0; // 已播放的文件大小
B7 E040 LDI R20,0
B8 E050 LDI R21,0
B9 E060 LDI R22,0
BA E070 LDI R23,0
BB 834E STD Y+6,R20
BC 835F STD Y+7,R21
BD 8768 STD Y+8,R22
BE 8779 STD Y+9,R23
(0068) uint32 num; // 音樂文件所在的簇
(0069) uint8 music_num=0; // 正在播放文件的號碼
BF 2400 CLR R0
C0 8A0D STD Y+21,R0
(0070) uint8 play_flag=0; // 播放標志
C1 8A0C STD Y+20,R0
(0071) uint16 data_pointer=0;
C2 2411 CLR R1
C3 8A1B STD Y+19,R1
C4 8A0A STD Y+18,R0
(0072) uint8 music_next=0,music_last=0; // 音樂換曲標志
C5 24CC CLR R12
C6 24EE CLR R14
(0073) uint8 vol_flag=0; // 音量調節標志
C7 24AA CLR R10
(0074)
(0075) AD_Flag=0; // AD鍵盤標志
C8 2422 CLR R2
C9 9220 03BB STS AD_Flag,R2
(0076) AD_time=0; // AD鍵盤采樣次數
CB 9220 03BA STS AD_time,R2
(0077) key_num=0; // 按鍵號
CD 9220 03B8 STS key_num,R2
(0078)
(0079) GetMusicFile(); // 獲取音樂文件
CF 940E 0BA6 CALL _GetMusicFile
(0080)
(0081) num = fclust[music_num]; // 調用音樂文件
D1 E48B LDI R24,0x4B
D2 E093 LDI R25,3
D3 89ED LDD R30,Y+21
D4 27FF CLR R31
D5 0FEE LSL R30
D6 1FFF ROL R31
D7 0FEE LSL R30
D8 1FFF ROL R31
D9 0FE8 ADD R30,R24
DA 1FF9 ADC R31,R25
DB 8020 LD R2,Z
DC 8031 LDD R3,Z+1
DD 8042 LDD R4,Z+2
DE 8053 LDD R5,Z+3
DF 862E STD Y+14,R2
E0 863F STD Y+15,R3
E1 8A48 STD Y+16,R4
E2 8A59 STD Y+17,R5
E3 C1CE RJMP 0x02B2
(0082)
(0083) while(1)
(0084) {
(0085) for(i=0;i<8;i++)
E4 E040 LDI R20,0
E5 E050 LDI R21,0
E6 E060 LDI R22,0
E7 E070 LDI R23,0
E8 874A STD Y+10,R20
E9 875B STD Y+11,R21
EA 876C STD Y+12,R22
EB 877D STD Y+13,R23
EC C169 RJMP 0x0256
(0086) {
(0087) SD_ReadBlock(FirstDataSector+(num-2)*8+i,Fat_Buffer); // 獲取音樂文件的數據
ED EF8A LDI R24,0xFA
EE E090 LDI R25,0
EF 8399 STD Y+1,R25
F0 8388 ST Y,R24
F1 E042 LDI R20,2
F2 E050 LDI R21,0
F3 E060 LDI R22,0
F4 E070 LDI R23,0
F5 850E LDD R16,Y+14
F6 851F LDD R17,Y+15
F7 8928 LDD R18,Y+16
F8 8939 LDD R19,Y+17
F9 1B04 SUB R16,R20
FA 0B15 SBC R17,R21
FB 0B26 SBC R18,R22
FC 0B37 SBC R19,R23
FD E083 LDI R24,3
FE E090 LDI R25,0
FF 938A ST -Y,R24
100 940E 0E5A CALL lsl32
102 0118 MOVW R2,R16
103 0129 MOVW R4,R18
104 9120 03B6 LDS R18,FirstDataSector+2
106 9130 03B7 LDS R19,FirstDataSector+3
108 9100 03B4 LDS R16,FirstDataSector
10A 9110 03B5 LDS R17,FirstDataSector+1
10C 0D02 ADD R16,R2
10D 1D13 ADC R17,R3
10E 1D24 ADC R18,R4
10F 1D35 ADC R19,R5
110 842A LDD R2,Y+10
111 843B LDD R3,Y+11
112 844C LDD R4,Y+12
113 845D LDD R5,Y+13
114 0D02 ADD R16,R2
115 1D13 ADC R17,R3
116 1D24 ADC R18,R4
117 1D35 ADC R19,R5
118 940E 045E CALL _SD_ReadBlock
(0088) do
(0089) {
(0090) //--------------------------- AD按鍵檢測 ---------------------------//
(0091)
(0092) if(key_num==6&&AD_time==0)play_flag=1; // Key6按下,播放
11A 9180 03B8 LDS R24,key_num
11C 3086 CPI R24,6
11D F441 BNE 0x0126
11E 9020 03BA LDS R2,AD_time
120 2022 TST R2
121 F421 BNE 0x0126
122 2400 CLR R0
123 9403 INC R0
124 8A0C STD Y+20,R0
125 C036 RJMP 0x015C
(0093) else if(key_num==5&&AD_time==0)play_flag=0; // Key5按下,停止
126 9180 03B8 LDS R24,key_num
128 3085 CPI R24,5
129 F439 BNE 0x0131
12A 9020 03BA LDS R2,AD_time
12C 2022 TST R2
12D F419 BNE 0x0131
12E 2400 CLR R0
12F 8A0C STD Y+20,R0
130 C02B RJMP 0x015C
(0094) else if(key_num==1&&AD_time==0)music_next=1; // Key1按下,下一首
131 9180 03B8 LDS R24,key_num
133 3081 CPI R24,1
134 F439 BNE 0x013C
135 9020 03BA LDS R2,AD_time
137 2022 TST R2
138 F419 BNE 0x013C
139 24CC CLR R12
13A 94C3 INC R12
13B C020 RJMP 0x015C
(0095) else if(key_num==4&&AD_time==0)music_last=1; // Key4按下,上一首
13C 9180 03B8 LDS R24,key_num
13E 3084 CPI R24,4
13F F439 BNE 0x0147
140 9020 03BA LDS R2,AD_time
142 2022 TST R2
143 F419 BNE 0x0147
144 24EE CLR R14
145 94E3 INC R14
146 C015 RJMP 0x015C
(0096) else if(key_num==3&&AD_time==0)vol_flag=1; // Key3按下,音量+
147 9180 03B8 LDS R24,key_num
149 3083 CPI R24,3
14A F439 BNE 0x0152
14B 9020 03BA LDS R2,AD_time
14D 2022 TST R2
14E F419 BNE 0x0152
14F 24AA CLR R10
150 94A3 INC R10
151 C00A RJMP 0x015C
(0097) else if(key_num==2&&AD_time==0)vol_flag=2; // Key2按下,音量-
152 9180 03B8 LDS R24,key_num
154 3082 CPI R24,2
155 F431 BNE 0x015C
156 9020 03BA LDS R2,AD_time
158 2022 TST R2
159 F411 BNE 0x015C
15A E082 LDI R24,2
15B 2EA8 MOV R10,R24
(0098)
(0099) //-------------- 音量調節 ----------------//
(0100) if(vol_flag!=0)
15C 20AA TST R10
15D F409 BNE 0x015F
15E C04B RJMP 0x01AA
(0101) {
(0102) if(vol_flag==1)
15F 2D8A MOV R24,R10
160 3081 CPI R24,1
161 F4C9 BNE 0x017B
(0103) {
(0104) if(VOL>27)VOL=29;
162 E18B LDI R24,0x1B
163 E090 LDI R25,0
164 9020 00AD LDS R2,VOL
166 9030 00AE LDS R3,VOL+1
168 1582 CP R24,R2
169 0593 CPC R25,R3
16A F430 BCC 0x0171
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -