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

📄 mp3.lst

📁 用AVR的MP3代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
    038A DF74      RCALL	_CH375LibInit
    038B 2EA0      MOV	R10,R16
    038C 24BB      CLR	R11
    038D C001      RJMP	0x038F
(0073)    	//if(i==0) test_1011();
(0074)    	while ( CH375DiskStatus != DISK_CONNECT ) 
(0075)     	xQueryInterrupt( );  /* 查询CH375中断并更新中断状态,等待U盘插入 */
    038E DF53      RCALL	_xQueryInterrupt
    038F 91800645  LDS	R24,CH375DiskStatus
    0391 3082      CPI	R24,2
    0392 F7D9      BNE	0x038E
(0076)    	mDelaymS( 200 );  /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
    0393 EC08      LDI	R16,0xC8
    0394 E010      LDI	R17,0
    0395 E020      LDI	R18,0
    0396 E030      LDI	R19,0
    0397 DF76      RCALL	_mDelaymS
(0077) 	 	
(0078) 	/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
(0079)    	for ( i = 0; i < 5; i ++ )  /* 有的U盘总是返回未准备好,不过可以被忽略 */
    0398 24AA      CLR	R10
    0399 24BB      CLR	R11
    039A C008      RJMP	0x03A3
(0080)    	{ 
(0081) 	 	if ( CH375DiskReady( ) == ERR_SUCCESS ) 
    039B 940E239B  CALL	_CH375DiskReady
    039D 2300      TST	R16
    039E F409      BNE	0x03A0
(0082)         	break;  /* 查询磁盘是否准备好 */
    039F C008      RJMP	0x03A8
    03A0 01C5      MOVW	R24,R10
    03A1 9601      ADIW	R24,1
    03A2 015C      MOVW	R10,R24
    03A3 01C5      MOVW	R24,R10
    03A4 3085      CPI	R24,5
    03A5 E0E0      LDI	R30,0
    03A6 079E      CPC	R25,R30
    03A7 F398      BCS	0x039B
(0083) 	}
(0084) 		
(0085) 	/* 查询磁盘物理容量 */
(0086) 	LCD_write_String(0,0,"DiskSize" );
    03A8 EC8A      LDI	R24,0xCA
    03A9 E091      LDI	R25,1
    03AA 8399      STD	Y+1,R25
    03AB 8388      STD	Y+0,R24
    03AC 2722      CLR	R18
    03AD 2700      CLR	R16
    03AE 940E0687  CALL	_LCD_write_String
(0087) 	i = CH375DiskSize( );  
    03B0 940E11EE  CALL	_CH375DiskSize
    03B2 2EA0      MOV	R10,R16
    03B3 24BB      CLR	R11
(0088) 	data= (unsigned char)(mCmdParam.DiskSize.mDiskSizeSec >> 11);
    03B4 E08B      LDI	R24,0xB
    03B5 E090      LDI	R25,0
    03B6 904005E4  LDS	R4,mCmdParam+2
    03B8 905005E5  LDS	R5,mCmdParam+3
    03BA 902005E2  LDS	R2,mCmdParam
    03BC 903005E3  LDS	R3,mCmdParam+1
    03BE 938A      ST	R24,-Y
    03BF 0181      MOVW	R16,R2
    03C0 0192      MOVW	R18,R4
    03C1 940E27E6  CALL	lsr32
    03C3 2EC0      MOV	R12,R16
(0089) 	t1=data/100;
    03C4 E614      LDI	R17,0x64
    03C5 940E277B  CALL	div8u
    03C7 2EE0      MOV	R14,R16
(0090) 	LCD_set_XY(56,0);
    03C8 2722      CLR	R18
    03C9 E308      LDI	R16,0x38
    03CA 940E065E  CALL	_LCD_set_XY
(0091) 	LCD_write_char(t1+48);
    03CC 2D0E      MOV	R16,R14
    03CD 5D00      SUBI	R16,0xD0
    03CE 940E066D  CALL	_LCD_write_char
(0092) 	data=data%100;
    03D0 E614      LDI	R17,0x64
    03D1 2D0C      MOV	R16,R12
    03D2 940E2779  CALL	mod8u
    03D4 2EC0      MOV	R12,R16
(0093) 	t1=data/10;
    03D5 E01A      LDI	R17,0xA
    03D6 940E277B  CALL	div8u
    03D8 2EE0      MOV	R14,R16
(0094) 	LCD_write_char(t1+48);
    03D9 5D00      SUBI	R16,0xD0
    03DA 940E066D  CALL	_LCD_write_char
(0095) 	t2=data%10;
    03DC E01A      LDI	R17,0xA
    03DD 2D0C      MOV	R16,R12
    03DE 940E2779  CALL	mod8u
    03E0 2EC0      MOV	R12,R16
(0096) 	LCD_write_char(t2+48);
    03E1 5D00      SUBI	R16,0xD0
    03E2 940E066D  CALL	_LCD_write_char
(0097) 	LCD_write_String(76,0,"M" );
    03E4 EC88      LDI	R24,0xC8
    03E5 E091      LDI	R25,1
    03E6 8399      STD	Y+1,R25
    03E7 8388      STD	Y+0,R24
    03E8 2722      CLR	R18
    03E9 E40C      LDI	R16,0x4C
    03EA 940E0687  CALL	_LCD_write_String
    03EC C05C      RJMP	0x0449
(0098) 	
(0099) 	/*枚举根目寻下的MP3文件*/
(0100) 	while(1)
(0101) 	{
(0102) 		for ( c = 0; c < 255; c ++ )
    03ED 2422      CLR	R2
    03EE 2433      CLR	R3
    03EF 92300601  STS	c+1,R3
    03F1 92200600  STS	c,R2
    03F3 C04C      RJMP	0x0440
(0103) 	 	{  /* 最多搜索前255个文件 */
(0104) 			strcpy( mCmdParam.Open.mPathName,"\\*" );  /* 搜索根目录下文件名*/
    03F4 EC25      LDI	R18,0xC5
    03F5 E031      LDI	R19,1
    03F6 EE02      LDI	R16,0xE2
    03F7 E015      LDI	R17,5
    03F8 940E275F  CALL	_strcpy
(0105) 			i = strlen( (char *)mCmdParam.Open.mPathName );  /* 计算文件名长度,以处理文件名结束符 */
    03FA EE02      LDI	R16,0xE2
    03FB E015      LDI	R17,5
    03FC 940E2768  CALL	_strlen
    03FE 0158      MOVW	R10,R16
(0106) 			mCmdParam.Open.mPathName[ i ] =0xFF;  /* 将结束符替换为255说明序号在变量中 */
    03FF EE82      LDI	R24,0xE2
    0400 E095      LDI	R25,5
    0401 01F5      MOVW	R30,R10
    0402 0FE8      ADD	R30,R24
    0403 1FF9      ADC	R31,R25
    0404 EF8F      LDI	R24,0xFF
    0405 8380      STD	Z+0,R24
(0107) 			CH375vFileSize=c;       /*指定搜索的序号,几乎没有上限*/
    0406 90200600  LDS	R2,c
    0408 90300601  LDS	R3,c+1
    040A 2444      CLR	R4
    040B 2455      CLR	R5
    040C 9230063B  STS	CH375vFileSize+1,R3
    040E 9220063A  STS	CH375vFileSize,R2
    0410 9250063D  STS	CH375vFileSize+3,R5
    0412 9240063C  STS	CH375vFileSize+2,R4
(0108) 			i = CH375FileEnumer( );  /* 文件名中含有通配符*,则为搜索文件而不打开 */
    0414 940E178C  CALL	_CH375FileEnumer
    0416 2EA0      MOV	R10,R16
    0417 24BB      CLR	R11
(0109) 			if ( i == ERR_MISS_FILE ) 
    0418 01C5      MOVW	R24,R10
    0419 3482      CPI	R24,0x42
    041A E0E0      LDI	R30,0
    041B 079E      CPC	R25,R30
    041C F409      BNE	0x041E
(0110)             	break;  /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
    041D C02B      RJMP	0x0449
(0111) 			if ( i != ERR_SUCCESS ) 
    041E 20AA      TST	R10
    041F F411      BNE	0x0422
    0420 20BB      TST	R11
    0421 F009      BEQ	0x0423
(0112)             	break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
    0422 C026      RJMP	0x0449
(0113) 			if(CH375vFileSize!=0xFFFFFFFF)   /*枚举到MP3文件*/
    0423 EF4F      LDI	R20,0xFF
    0424 EF5F      LDI	R21,0xFF
    0425 EF6F      LDI	R22,0xFF
    0426 EF7F      LDI	R23,0xFF
    0427 9040063C  LDS	R4,CH375vFileSize+2
    0429 9050063D  LDS	R5,CH375vFileSize+3
    042B 9020063A  LDS	R2,CH375vFileSize
    042D 9030063B  LDS	R3,CH375vFileSize+1
    042F 1624      CP	R2,R20
    0430 0635      CPC	R3,R21
    0431 0646      CPC	R4,R22
    0432 0657      CPC	R5,R23
    0433 F019      BEQ	0x0437
(0114) 			{
(0115) 				mp3_play( (char *)mCmdParam.Open.mPathName );
    0434 EE02      LDI	R16,0xE2
    0435 E015      LDI	R17,5
    0436 D0DD      RCALL	_mp3_play
    0437 91800600  LDS	R24,c
    0439 91900601  LDS	R25,c+1
    043B 9601      ADIW	R24,1
    043C 93900601  STS	c+1,R25
    043E 93800600  STS	c,R24
    0440 91800600  LDS	R24,c
    0442 91900601  LDS	R25,c+1
    0444 3F8F      CPI	R24,0xFF
    0445 E0E0      LDI	R30,0
    0446 079E      CPC	R25,R30
    0447 F408      BCC	0x0449
    0448 CFAB      RJMP	0x03F4
    0449 CFA3      RJMP	0x03ED
    044A 9625      ADIW	R28,5
    044B 9508      RET
_CheckKey:
  oldKey               --> R20
  delay                --> R22
  key                  --> R10
    044C 940E27B1  CALL	push_gset3
(0116) 			}
(0117) 		}
(0118)   	}
(0119) }
(0120) 
(0121) // By 老圣(13809003593),2006.10.28
(0122) // 检查按键,并要时检查VS1011的是否需要数据并更新数据
(0123) uchar CheckKey(void)
(0124) {	
(0125) 	uchar key;
(0126)     uchar oldKey = KeyNone;	// 要返回的按键值,缺省为无按键
    044E 2744      CLR	R20
(0127)     uchar delay;
(0128)     
(0129)     UpdateData();
    044F D087      RCALL	_UpdateData
    0450 C01A      RJMP	0x046B
(0130)         
(0131)     while (1)
(0132)     {
(0133) 	    key = PINE & KeyMask;
    0451 B181      IN	R24,0x01
    0452 778C      ANDI	R24,0x7C
    0453 2EA8      MOV	R10,R24
(0134)         if (KeyMask != key)	// 有键按下
    0454 378C      CPI	R24,0x7C
    0455 F099      BEQ	0x0469
(0135)         {        	
(0136)             for (delay = 0;delay < 10;delay++)	// 延时
    0456 2766      CLR	R22
    0457 C002      RJMP	0x045A
(0137)             { 
(0138)             	UpdateData();	// 延时过程中更新数据以避免声音断续
    0458 D07E      RCALL	_UpdateData
    0459 9563      INC	R22
    045A 306A      CPI	R22,0xA
    045B F3E0      BCS	0x0458
(0139) 			}            
(0140)             
(0141)             oldKey = key;
    045C 2D4A      MOV	R20,R10
    045D C009      RJMP	0x0467
(0142)             while (1)	// 等待按键释放
(0143)             {
(0144)             	key = PINE & KeyMask;
    045E B181      IN	R24,0x01
    045F 778C      ANDI	R24,0x7C
    0460 2EA8      MOV	R10,R24
(0145)                 
(0146)                 UpdateData();	// 延时过程中更新数据以避免声音断续
    0461 D075      RCALL	_UpdateData
(0147)          
(0148)       

⌨️ 快捷键说明

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