📄 mp3play.lst
字号:
__start:
__text_start:
2B69 EFCF LDI R28,0xFF
2B6A E1D0 LDI R29,0x10
2B6B BFCD OUT 0x3D,R28
2B6C BFDE OUT 0x3E,R29
2B6D 51C0 SUBI R28,0x10
2B6E 40D0 SBCI R29,0
2B6F EA0A LDI R16,0xAA
2B70 8308 STD Y+0,R16
2B71 2400 CLR R0
2B72 E0EA LDI R30,0xA
2B73 E0F4 LDI R31,4
2B74 E01A LDI R17,0xA
2B75 3DE9 CPI R30,0xD9
2B76 07F1 CPC R31,R17
2B77 F011 BEQ 0x2B7A
2B78 9201 ST R0,Z+
2B79 CFFB RJMP 0x2B75
2B7A 8300 STD Z+0,R16
2B7B ECE8 LDI R30,0xC8
2B7C E5F3 LDI R31,0x53
2B7D E0A0 LDI R26,0
2B7E E0B1 LDI R27,1
2B7F E516 LDI R17,0x56
2B80 3DE2 CPI R30,0xD2
2B81 07F1 CPC R31,R17
2B82 F021 BEQ 0x2B87
2B83 95C8 LPM
2B84 9631 ADIW R30,1
2B85 920D ST R0,X+
2B86 CFF9 RJMP 0x2B80
2B87 940E3E19 CALL _main
_exit:
2B89 CFFF RJMP _exit
FILE: E:\software\MP3程序\Ch375b\375interface.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #define UINT8 unsigned char
(0004) /******************************************************************************/
(0005)
(0006) #define USED_BUS //屏闭后使用I/O模拟总线操作
(0007)
(0008) #ifdef USED_BUS
(0009) #define CH375_CMD_PORT_ADDR 0xfe00 //命令口
(0010) #define CH375_DAT_PORT_ADDR 0xfc00 //数据口
(0011) #endif
(0012) #define CH375_INT BIT(1) //CH375联络信号
(0013)
(0014)
(0015)
(0016) #ifndef USED_BUS
(0017) #define CH375_CS BIT(0)
(0018) #define CH375_A0 BIT(1)
(0019) #define CH375_RD BIT(1)
(0020) #define CH375_WR BIT(0)
(0021) void mDelay1uS(void) /* 至少延时1uS,根据单片机主频调整 */
(0022) {
(0023) //UINT8 i;
(0024) //for ( i = 1; i != 0; i -- );
(0025) NOP();
(0026) }
(0027) #endif
(0028)
(0029) void CH375_PORT_INIT( ) /* 由于使用通用I/O模块并口读写时序,所以进行初始化 */
(0030) {
(0031) #ifdef USED_BUS
(0032) Print_str("Init CH375 used External bus...\r\n");
_CH375_PORT_INIT:
2B8A E000 LDI R16,0
2B8B E011 LDI R17,1
2B8C 940E2D6C CALL _Print_str
(0033) #else
(0034) Print_str("Init CH375 used I/O bus...\r\n");
(0035) DDRA = 0x00; /* 设置8位并口为输入 */
(0036) PORTC=CH375_CS; //设置CS,WR,RD默认为高电平 0x08为3310引脚*/
(0037) DDRC =CH375_CS|CH375_A0; /* 设置CS,WR,RD,A0为输出,设置INT#为输入 */
(0038) PORTG = CH375_WR|CH375_RD;
(0039) DDRG = CH375_WR|CH375_RD;
(0040) #endif
(0041)
(0042) DDRD &= ~(CH375_INT);
2B8E 9889 CBI 0x11,1
2B8F 9508 RET
(0043) }
(0044)
(0045) void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定义的被CH375程序库调用的子程序,向CH375写命令 */
(0046) {
(0047) #ifdef USED_BUS
(0048) *(volatile unsigned char *)CH375_CMD_PORT_ADDR = mCmd; /*通过并口直接读写CH375而非普通I/O模拟 */
_xWriteCH375Cmd:
mCmd --> R16
2B90 9300FE00 STS 0xFE00,R16
(0049) NOP(); /* 至少延时1uS */
2B92 0000 NOP
2B93 9508 RET
(0050) #else
(0051) PORTC |=CH375_A0;// 0x08; /* 输出A0=1 */
(0052) PORTA = mCmd; /* 向CH375的并口输出数据 */
(0053) DDRA = 0xFF; /* 并口D0-D7输出 */
(0054) PORTC &=~(CH375_CS);// 0xF9; /* 输出有效写控制信号, 写CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */
(0055) PORTG &=~(CH375_WR);
(0056) DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
(0057) PORTC |= CH375_CS;// 0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */
(0058) PORTG |= CH375_WR|CH375_RD;
(0059) DDRA = 0x00; /* 禁止数据输出 */
(0060) PORTC &= ~(CH375_A0); /* 输出A0=0; 可选操作 */
(0061) NOP();//mDelay1uS( ); mDelay1uS( ); /* 至少延时2uS */
(0062) #endif
(0063) }
(0064)
(0065) void xWriteCH375Data( UINT8 mData ) /* 外部定义的被CH375程序库调用的子程序,向CH375写数据 */
(0066) {
(0067) #ifdef USED_BUS
(0068) *(volatile unsigned char *)CH375_DAT_PORT_ADDR = mData; /* 通过并口直接读写CH375而非普通I/O模拟 */
_xWriteCH375Data:
mData --> R16
2B94 9300FC00 STS 0xFC00,R16
(0069) NOP(); /* 至少延时1uS */
2B96 0000 NOP
2B97 9508 RET
(0070) #else
(0071) PORTA = mData; /* 向CH375的并口输出数据 */
(0072) DDRA = 0xFF; /* 并口D0-D7输出 */
(0073) PORTC &= ~(CH375_A0|CH375_CS);//0xF1; /* 输出有效写控制信号, 写CH375芯片的数据端口, A0=0; CS=0; WR=0; RD=1; */
(0074) PORTG &= ~(CH375_WR);
(0075) DDRA = 0xFF; /* 该操作无意义,仅作延时,CH375要求读写脉冲宽度大于100nS */
(0076) PORTC |= CH375_CS;//0x07; /* 输出无效的控制信号, 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */
(0077) PORTG |= CH375_RD|CH375_WR;
(0078) DDRA = 0x00; /* 禁止数据输出 */
(0079) NOP();//mDelay1uS( ); /* 至少延时1.2uS */
(0080) #endif
(0081) }
(0082)
(0083) UINT8 xReadCH375Data( void ) /* 外部定义的被CH375程序库调用的子程序,从CH375读数据 */
(0084) {
(0085) UINT8 mData;
(0086) #ifdef USED_BUS
(0087) NOP(); /* 至少延时1uS */
_xReadCH375Data:
mData --> R16
2B98 0000 NOP
(0088) mData = *(volatile unsigned char *)CH375_DAT_PORT_ADDR; /*通过并口直接读写CH375而非普通I/O模拟 */
2B99 9100FC00 LDS R16,0xFC00
(0089) return( mData );
2B9B 9508 RET
FILE: E:\software\MP3程序\Delay\delay.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) /*-----------------------------------------------------------------------
(0004) 延时函数
(0005) 系统时钟:8M
(0006) -----------------------------------------------------------------------*/
(0007) void delay_1us(void)
(0008) {;}
_delay_1us:
2B9C 9508 RET
_delay_nus:
i --> R20
n --> R22
2B9D 940E7CF6 CALL push_gset2
2B9F 01B8 MOVW R22,R16
(0009) void delay_nus(unsigned int n) //N us延时函数
(0010) {
(0011) unsigned int i=0;
2BA0 2744 CLR R20
2BA1 2755 CLR R21
(0012) for (i=0;i<n;i++)
2BA2 C003 RJMP 0x2BA6
(0013) delay_1us();
2BA3 DFF8 RCALL _delay_1us
2BA4 5F4F SUBI R20,0xFF
2BA5 4F5F SBCI R21,0xFF
2BA6 1746 CP R20,R22
2BA7 0757 CPC R21,R23
2BA8 F3D0 BCS 0x2BA3
2BA9 940E7CD3 CALL pop_gset2
2BAB 9508 RET
(0014) }
(0015) void delay_1ms(void) //1ms延时函数
(0016) {
(0017) unsigned int i;
(0018) for (i=0;i<1140;i++);
_delay_1ms:
i --> R16
2BAC 2700 CLR R16
2BAD 2711 CLR R17
2BAE C002 RJMP 0x2BB1
2BAF 5F0F SUBI R16,0xFF
2BB0 4F1F SBCI R17,0xFF
2BB1 3704 CPI R16,0x74
2BB2 E0E4 LDI R30,4
2BB3 071E CPC R17,R30
2BB4 F3D0 BCS 0x2BAF
2BB5 9508 RET
FILE: E:\software\MP3程序\Vs1003\vs1003.c
(0001) #include <iom64v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005) #include "vs1003.h"
(0006) void vs1003_infor(void);
(0007)
(0008) void DelayIni(void)
(0009) {
(0010) TCCR0 = 0x00; //stop
_DelayIni:
2BB6 2422 CLR R2
2BB7 BE23 OUT 0x33,R2
(0011) TCNT0 = 0x83; //set count
2BB8 E883 LDI R24,0x83
2BB9 BF82 OUT 0x32,R24
2BBA 9508 RET
(0012) }
(0013)
(0014) void delay_ms(unsigned char ms)
(0015) {
(0016) TCCR0 = 0x04; //start timer
_delay_ms:
ms --> R16
2BBB E084 LDI R24,4
2BBC BF83 OUT 0x33,R24
2BBD C009 RJMP 0x2BC7
(0017) while(ms--)
(0018) {
(0019) while((TIFR & (1<<TOV0)) != (1<<TOV0));
2BBE B786 IN R24,0x36
2BBF 7081 ANDI R24,1
2BC0 3081 CPI R24,1
2BC1 F7E1 BNE 0x2BBE
(0020) TIFR |= (1<<TOV0);
2BC2 B786 IN R24,0x36
2BC3 6081 ORI R24,1
2BC4 BF86 OUT 0x36,R24
(0021) TCNT0 = 0x83; //set count
2BC5 E883 LDI R24,0x83
2BC6 BF82 OUT 0x32,R24
2BC7 2E20 MOV R2,R16
2BC8 2433 CLR R3
2BC9 5001 SUBI R16,1
2BCA 2022 TST R2
2BCB F791 BNE 0x2BBE
(0022) }
(0023) TCCR0 = 0x00; //stop
2BCC 2422 CLR R2
2BCD BE23 OUT 0x33,R2
2BCE 9508 RET
(0024) }
(0025)
(0026) void mp3portIni(void)
(0027) {
(0028) DDRD |= nDCS; // 使能芯片片选输出
_mp3portIni:
2BCF 9A8A SBI 0x11,2
(0029) DDRD |= nCS; // 使能数据接口片选输出
2BD0 9A8B SBI 0x11,3
(0030) DDRD &= ~DREQ;
2BD1 9888 CBI 0x11,0
(0031)
(0032) PORTD |= nDCS;
2BD2 9A92 SBI 0x12,2
(0033) PORTD |= nCS;
2BD3 9A93 SBI 0x12,3
(0034) PORTD |= DREQ;
2BD4 9A90 SBI 0x12,0
(0035)
(0036) DDRB = 0xff; // 使能硬件复位输出
2BD5 EF8F LDI R24,0xFF
2BD6 BB87 OUT 0x17,R24
(0037) DDRB &= ~(1<<3);
2BD7 98BB CBI 0x17,3
(0038) PORTB = 0xff;
2BD8 BB88 OUT 0x18,R24
(0039)
(0040) SPCR = (1 << SPE) | (1 << MSTR) | (0 << SPR1) | (0 << SPR0);
2BD9 E580 LDI R24,0x50
2BDA B98D OUT 0x0D,R24
(0041) SPSR |= 1<<SPI2X;
2BDB 9A70 SBI 0x0E,0
2BDC 9508 RET
_spiByte:
tmp --> R20
data --> R16
2BDD 940E7CDF CALL push_gset1
(0042) }
(0043)
(0044) unsigned char spiByte(unsigned char data)
(0045) {
(0046) unsigned char tmp;
(0047) SPDR = data;
2BDF B90F OUT 0x0F,R16
(0048) while( !(SPSR & (1 << SPIF)) );
2BE0 9B77 SBIS 0x0E,7
2BE1 CFFE RJMP 0x2BE0
(0049) tmp = SPDR;
2BE2 B14F IN R20,0x0F
(0050) return tmp;
2BE3 2F04 MOV R16,R20
2BE4 940E7CE2 CALL pop_gset1
2BE6 9508 RET
(0051) }
(0052)
(0053) void spiSend(unsigned char data)
(0054) {
(0055) SPDR = data;
_spiSend:
data --> R16
2BE7 B90F OUT 0x0F,R16
(0056) while( !(SPSR & (1 << SPIF)) );
2BE8 9B77 SBIS 0x0E,7
2BE9 CFFE RJMP 0x2BE8
2BEA 9508 RET
_mp3WriteReg:
lByte --> R20
hByte --> R22
add --> R10
2BEB 940E7CFA CALL push_gset3
2BED 2F62 MOV R22,R18
2BEE 2EA0 MOV R10,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -