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

📄 m16_vs1003_test.lst

📁 M16-Mp3.rar
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -