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

📄 testlcd.lst

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
     572 E5CF      LDI	R28,0x5F
     573 E0D4      LDI	R29,4
     574 BFCD      OUT	0x3D,R28
     575 BFDE      OUT	0x3E,R29
     576 52C0      SUBI	R28,0x20
     577 40D0      SBCI	R29,0
     578 EA0A      LDI	R16,0xAA
     579 8308      STD	Y+0,R16
     57A 2400      CLR	R0
     57B EBE2      LDI	R30,0xB2
     57C E0F0      LDI	R31,0
     57D E012      LDI	R17,2
     57E 3DEA      CPI	R30,0xDA
     57F 07F1      CPC	R31,R17
     580 F011      BEQ	0x0583
     581 9201      ST	R0,Z+
     582 CFFB      RJMP	0x057E
     583 8300      STD	Z+0,R16
     584 E9E2      LDI	R30,0x92
     585 E0FA      LDI	R31,0xA
     586 E6A0      LDI	R26,0x60
     587 E0B0      LDI	R27,0
     588 E01A      LDI	R17,0xA
     589 E000      LDI	R16,0
     58A BF0B      OUT	0x3B,R16
     58B 3EE4      CPI	R30,0xE4
     58C 07F1      CPC	R31,R17
     58D F021      BEQ	0x0592
     58E 95C8      LPM
     58F 9631      ADIW	R30,1
     590 920D      ST	R0,X+
     591 CFF9      RJMP	0x058B
     592 940E 1128 CALL	_main
_exit:
     594 CFFF      RJMP	_exit
FILE: D:\学习\AVRpro\Mega16程序\TestLCD\VS1011B.c
(0001) # include "iom16v.h"
(0002) # include "macros.h"
(0003) # include "VS1011B.h"
(0004) 
(0005) #define uchar unsigned char
(0006) #define uint  unsigned int
(0007) #ifndef  SPI_CS_Deassert()
(0008) 		 #define MMC_SD_PORT       PORTB  //引脚定义
(0009) 		 #define MMC_SD_CS_PIN     4      //mega16,MMC/SD卡的片选引脚,接PortB4/ss
(0010) 		 #define SPI_CS_Deassert() MMC_SD_PORT |=  BIT(MMC_SD_CS_PIN)  //SS为高,释放MMC
(0011) #endif
(0012) 
(0013) extern unsigned char CurVol,CurBass;
(0014) extern void Delay(unsigned int DelayTimes);
(0015) 
(0016) //以最低速度运行	//low speed
(0017) void VS1011B_SPI_Low(void)
(0018) {
(0019) 	SPCR =   BIT(SPE)|BIT(MSTR)|BIT(SPR1)|BIT(SPR0);
_VS1011B_SPI_Low:
     595 E583      LDI	R24,0x53
     596 B98D      OUT	0x0D,R24
(0020) 	SPSR &= ~BIT(SPI2X);
     597 9870      CBI	0x0E,0
     598 9508      RET
(0021) }
(0022) 
(0023) //以FCK/4速度运行	//full speed
(0024) void VS1011B_SPI_High(void)
(0025) {
(0026) 	SPCR =  BIT(SPE)|BIT(MSTR);
_VS1011B_SPI_High:
     599 E580      LDI	R24,0x50
     59A B98D      OUT	0x0D,R24
(0027) 	SPSR |= BIT(SPI2X);
     59B 9A70      SBI	0x0E,0
     59C 9508      RET
(0028) }
(0029) 
(0030) //向VS1011B写一字节		//write one byte to vs1011b
(0031) void VS1011B_WriteByte(unsigned char CH)
(0032) {   
(0033) 	SPDR = CH;
_VS1011B_WriteByte:
  CH                   --> R16
     59D B90F      OUT	0x0F,R16
(0034) 	while(!(SPSR & BIT(SPIF)));
     59E 9B77      SBIS	0x0E,7
     59F CFFE      RJMP	0x059E
     5A0 9508      RET
(0035) }
(0036) 
(0037) //从VS1011B读一字节		//read one byte from vs1011b
(0038) unsigned char VS1011B_ReadByte(void)
(0039) {
(0040)     SPDR = 0xff;
_VS1011B_ReadByte:
     5A1 EF8F      LDI	R24,0xFF
     5A2 B98F      OUT	0x0F,R24
(0041) 	while(!(SPSR & BIT(SPIF)));
     5A3 9B77      SBIS	0x0E,7
     5A4 CFFE      RJMP	0x05A3
(0042) 	return SPDR;
     5A5 B10F      IN	R16,0x0F
     5A6 9508      RET
_VS1011B_WriteCMD:
  dat                  --> R10
  addr                 --> R12
     5A7 940E 16A2 CALL	push_xgset003C
     5A9 0159      MOVW	R10,R18
     5AA 2EC0      MOV	R12,R16
(0043) }
(0044) 
(0045) //写寄存器,参数,地址和数据	//config register
(0046) void VS1011B_WriteCMD(unsigned char addr, unsigned int dat)
(0047) {
(0048) 	VS1011B_XDCS_H();
     5AB 9AD8      SBI	0x1B,0
(0049) 	VS1011B_XCS_L();
     5AC 98D9      CBI	0x1B,1
(0050) 	VS1011B_WriteByte(0x02);
     5AD E002      LDI	R16,2
     5AE DFEE      RCALL	_VS1011B_WriteByte
(0051) 	VS1011B_WriteByte(addr);
     5AF 2D0C      MOV	R16,R12
     5B0 DFEC      RCALL	_VS1011B_WriteByte
(0052) 	VS1011B_WriteByte(dat>>8);
     5B1 0185      MOVW	R16,R10
     5B2 2F01      MOV	R16,R17
     5B3 2711      CLR	R17
     5B4 DFE8      RCALL	_VS1011B_WriteByte
(0053) 	VS1011B_WriteByte(dat);
     5B5 2D0A      MOV	R16,R10
     5B6 DFE6      RCALL	_VS1011B_WriteByte
(0054) 	VS1011B_XCS_H();
     5B7 9AD9      SBI	0x1B,1
     5B8 940C 1690 JMP	pop_xgset003C
_VS1011B_ReadCMD:
  temp                 --> R10
  addr                 --> R10
     5BA 92AA      ST	R10,-Y
     5BB 92BA      ST	R11,-Y
     5BC 2EA0      MOV	R10,R16
(0055) }
(0056) 
(0057) //读寄存器,参数 地址 返回内容	//read register
(0058) unsigned int VS1011B_ReadCMD(unsigned char addr)
(0059) {
(0060) 	unsigned int temp;
(0061) 	VS1011B_XDCS_H();
     5BD 9AD8      SBI	0x1B,0
(0062) 	VS1011B_XCS_L();
     5BE 98D9      CBI	0x1B,1
(0063) 	VS1011B_WriteByte(0x03);
     5BF E003      LDI	R16,3
     5C0 DFDC      RCALL	_VS1011B_WriteByte
(0064) 	VS1011B_WriteByte(addr);
     5C1 2D0A      MOV	R16,R10
     5C2 DFDA      RCALL	_VS1011B_WriteByte
(0065) 	temp = VS1011B_ReadByte();
     5C3 DFDD      RCALL	_VS1011B_ReadByte
     5C4 2EA0      MOV	R10,R16
     5C5 24BB      CLR	R11
(0066) 	temp <<= 8;
     5C6 2CBA      MOV	R11,R10
     5C7 24AA      CLR	R10
(0067) 	temp += VS1011B_ReadByte();
     5C8 DFD8      RCALL	_VS1011B_ReadByte
     5C9 2E20      MOV	R2,R16
     5CA 2433      CLR	R3
     5CB 0CA2      ADD	R10,R2
     5CC 1CB3      ADC	R11,R3
(0068) 	VS1011B_XCS_H();
     5CD 9AD9      SBI	0x1B,1
(0069) 	return temp;
     5CE 0185      MOVW	R16,R10
     5CF 90B9      LD	R11,Y+
     5D0 90A9      LD	R10,Y+
     5D1 9508      RET
_VS1011B_WriteDAT:
  dat                  --> R10
     5D2 92AA      ST	R10,-Y
     5D3 2EA0      MOV	R10,R16
(0070) }
(0071) 
(0072) //写数据,音乐数据		//write data (music data)
(0073) void VS1011B_WriteDAT(unsigned char dat)
(0074) {
(0075) 	VS1011B_XDCS_L();
     5D4 98D8      CBI	0x1B,0
(0076) 	VS1011B_WriteByte(dat);
     5D5 2D0A      MOV	R16,R10
     5D6 DFC6      RCALL	_VS1011B_WriteByte
(0077) 	VS1011B_XDCS_H();
     5D7 9AD8      SBI	0x1B,0
(0078) 	VS1011B_XCS_H();
     5D8 9AD9      SBI	0x1B,1
     5D9 90A9      LD	R10,Y+
     5DA 9508      RET
_VS1011B_Init:
  Tmp                  --> R10
  retry                --> R20
     5DB 940E 16C7 CALL	push_xgsetF03C
(0079) }
(0080) 
(0081) // 1 means fail, 0 OK!
(0082) unsigned char VS1011B_Init(void)
(0083) {
(0084) 	unsigned char retry;
(0085) 	unsigned int Tmp;
(0086) 	DDRB |= BIT(4)|BIT(5)|BIT(7);  //mega16,这些SPI端口要输出
     5DD B387      IN	R24,0x17
     5DE 6B80      ORI	R24,0xB0
     5DF BB87      OUT	0x17,R24
(0087) 	DDRB &=~BIT(6); //MISO为输入方式 
     5E0 98BE      CBI	0x17,6
(0088) 	SPI_CS_Deassert();  //释放MMC/SD卡
     5E1 9AC4      SBI	0x18,4
(0089) 	VS1011B_PORT_INI();
     5E2 B38A      IN	R24,0x1A
     5E3 6483      ORI	R24,0x43
     5E4 BB8A      OUT	0x1A,R24
(0090) 	DDRA &=~BIT(VS1011B_DREQ); //DREQ为输入			
     5E5 98D2      CBI	0x1A,2
(0091) 	PORTA|= BIT(VS1011B_DREQ); //DREQ=1
     5E6 9ADA      SBI	0x1B,2
(0092) 	
(0093) 	VS1011B_XCS_H();
     5E7 9AD9      SBI	0x1B,1
(0094) 	VS1011B_XDCS_H();
     5E8 9AD8      SBI	0x1B,0
(0095) 	VS1011B_XRESET_L();
     5E9 98DE      CBI	0x1B,6
(0096) 	Delay(2);
     5EA E002      LDI	R16,2
     5EB E010      LDI	R17,0
     5EC D484      RCALL	_Delay
(0097) 	VS1011B_XRESET_H();//使能芯片	//chip select
     5ED 9ADE      SBI	0x1B,6
(0098) 	VS1011B_SPI_Low();//先以低频操作	//low speed
     5EE DFA6      RCALL	_VS1011B_SPI_Low
(0099) 	Delay(2);
     5EF E002      LDI	R16,2
     5F0 E010      LDI	R17,0
     5F1 D47F      RCALL	_Delay
(0100) 	Delay(2);
     5F2 E002      LDI	R16,2
     5F3 E010      LDI	R17,0
     5F4 D47C      RCALL	_Delay
(0101) 	retry=0;
     5F5 2744      CLR	R20
(0102) 	
(0103) 	VS1011B_ReadCMD(0x03);
     5F6 E003      LDI	R16,3
     5F7 DFC2      RCALL	_VS1011B_ReadCMD
     5F8 C00C      RJMP	0x0605
(0104) 	while(VS1011B_ReadCMD(0x03)!=CLOCK_REG)//写时钟寄存器	//set PLL register
(0105) 	{
(0106) 		VS1011B_WriteCMD(0x03,CLOCK_REG);
     5F9 E020      LDI	R18,0
     5FA E330      LDI	R19,0x30
     5FB E003      LDI	R16,3
     5FC DFAA      RCALL	_VS1011B_WriteCMD
(0107) 		if(retry++ >10 )return 1;
     5FD 2E24      MOV	R2,R20
     5FE 2433      CLR	R3
     5FF 5F4F      SUBI	R20,0xFF
     600 E08A      LDI	R24,0xA
     601 1582      CP	R24,R2
     602 F410      BCC	0x0605
     603 E001      LDI	R16,1
     604 C056      RJMP	0x065B
     605 E003      LDI	R16,3
     606 DFB3      RCALL	_VS1011B_ReadCMD
     607 3000      CPI	R16,0
     608 E3E0      LDI	R30,0x30
     609 071E      CPC	R17,R30
     60A F771      BNE	0x05F9
(0108) 	}
(0109) 
(0110) 	Delay(2);
     60B E002      LDI	R16,2
     60C E010      LDI	R17,0
     60D D463      RCALL	_Delay
(0111) 	
(0112) 	VS1011B_WriteCMD(0x05,0xBB81);//0xBB81 AC45);
     60E E821      LDI	R18,0x81
     60F EB3B      LDI	R19,0xBB
     610 E005      LDI	R16,5
     611 DF95      RCALL	_VS1011B_WriteCMD
(0113) 	
(0114) 	retry=0;
     612 2744      CLR	R20
(0115) 	Tmp=CurVol*256+CurVol;
     613 90A0 00D1 LDS	R10,CurVol
     615 2D2A      MOV	R18,R10
     616 940E 19FC CALL	0x19FC
     618 0118      MOVW	R2,R16
     619 2C4A      MOV	R4,R10
     61A 2455      CLR	R5
     61B 0C24      ADD	R2,R4
     61C 1C35      ADC	R3,R5
     61D 0151      MOVW	R10,R2
     61E C008      RJMP	0x0627
(0116) 	while(VS1011B_ReadCMD(0x0b) != Tmp)//设音量	//set Volume
(0117) 	{
(0118) 		VS1011B_WriteCMD(0x0b,Tmp);
     61F 0195      MOVW	R18,R10
     620 E00B      LDI	R16,0xB
     621 DF85      RCALL	_VS1011B_WriteCMD
     622 940E 18E6 CALL	0x18E6
(0119) 		if(retry++ >10 )return 2;
     624 F410      BCC	0x0627
     625 E002      LDI	R16,2
     626 C034      RJMP	0x065B
     627 E00B      LDI	R16,0xB
     628 DF91      RCALL	_VS1011B_ReadCMD
     629 0168      MOVW	R12,R16
     62A 150A      CP	R16,R10
     62B 051B      CPC	R17,R11
     62C F791      BNE	0x061F
(0120) 	}
(0121) 
(0122) 	retry=0;
     62D 2744      CLR	R20
(0123) 	Tmp=CurBass;
     62E 90A0 00D0 LDS	R10,CurBass
     630 24BB      CLR	R11
     631 C008      RJMP	0x063A
(0124) 	while(VS1011B_ReadCMD(0x02)!=Tmp)//写低音寄存器	
(0125) 	{
(0126) 		VS1011B_WriteCMD(0x02,Tmp);
     632 0195      MOVW	R18,R10
     633 E002      LDI	R16,2
     634 DF72      RCALL	_VS1011B_WriteCMD
     635 940E 18E6 CALL	0x18E6
(0127) 		if(retry++ >10 )return 1;
     637 F410      BCC	0x063A
     638 E001      LDI	R16,1
     639 C021      RJMP	0x065B
     63A E002      LDI	R16,2
     63B DF7E      RCALL	_VS1011B_ReadCMD
     63C 0168      MOVW	R12,R16
     63D 150A      CP	R16,R10
     63E 051B      CPC	R17,R11
     63F F791      BNE	0x0632
(0128) 	}
(0129) 	Delay(2);
     640 E002      LDI	R16,2
     641 E010      LDI	R17,0
     642 D42E      RCALL	_Delay
(0130) 	
(0131) 	retry=0;
     643 2744      CLR	R20
     644 C009      RJMP	0x064E
(0132) 	while(VS1011B_ReadCMD(0x00) != 0x0800)//0x0800)//写mode寄存器	//set mode register
(0133) 	{
(0134) 		VS1011B_WriteCMD(0x00,0x0800);//0x0800);
     645 E020      LDI	R18,0
     646 E038      LDI	R19,0x8
     647 2700      CLR	R16
     648 DF5E      RCALL	_VS1011B_WriteCMD
     649 940E 18E6 CALL	0x18E6
(0135) 		if(retry++ >10 )return 3;//
     64B F410      BCC	0x064E
     64C E003      LDI	R16,3
     64D C00D      RJMP	0x065B
     64E 2700      CLR	R16
     64F DF6A      RCALL	_VS1011B_ReadCMD
     650 01B8      MOVW	R22,R16
     651 3000      CPI	R16,0
     652 E0E8      LDI	R30,0x8
     653 071E      CPC	R17,R30
     654 F781      BNE	0x0645
(0136) 	}
(0137) 
(0138) 	Delay(2);
     655 E002      LDI	R16,2
     656 E010      LDI	R17,0
     657 D419      RCALL	_Delay
(0139) 
(0140) 	VS1011B_SoftReset();
     658 D004      RCALL	_VS1011B_SoftReset
(0141) 	VS1011B_SPI_High();
     659 DF3F      RCALL	_VS1011B_SPI_High
(0142) 	return 0;
     65A 2700      CLR	R16
     65B 940C 16CE JMP	pop_xgsetF03C
(0143) }
(0144) 

⌨️ 快捷键说明

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