📄 sd.lst
字号:
0BD3 940E13A5 CALL push_gset1
FILE: C:\DOCUME~1\pas\桌面\SD卡MP3程序\1011.c
(0001) /************************************************************/
(0002) /* VS1011 Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #define uchar unsigned char
(0010) #define uint unsigned int
(0011) #define MP3_DDR DDRB
(0012) #define MP3_PORT PORTB
(0013) #define MP3_PIN PINB
(0014) #define MP3_CMD_CS BIT(0)
(0015) #define MP3_DATA_CS BIT(3)
(0016) #define MP3_DATA_REQ BIT(2)
(0017) #define MP3_DATA_REST BIT(1)
(0018) void delay_Nus(unsigned int n)
(0019) {
(0020) unsigned char b;
(0021) for (b = 1; b<n; b++)
0BD5 E041 LDI R20,1
0BD6 C001 RJMP 0x0BD8
0BD7 9543 INC R20
0BD8 2E24 MOV R2,R20
0BD9 2433 CLR R3
0BDA 1620 CP R2,R16
0BDB 0631 CPC R3,R17
0BDC F3D0 BCS 0x0BD7
0BDD 940E13A8 CALL pop_gset1
0BDF 9508 RET
(0022) ;
(0023) }
(0024) //SPI initialize
(0025) // clock rate: 500000hz
(0026) void spi_init(void)
(0027) {
(0028) DDRB=0xBF; //SI输入,SO,SCK,SS输出
_spi_init:
0BE0 EB8F LDI R24,0xBF
0BE1 BB87 OUT 0x17,R24
(0029) SPCR = 0x53; //setup SPI
0BE2 E583 LDI R24,0x53
0BE3 B98D OUT 0x0D,R24
(0030) SPSR = 0x00; //setup SPI
0BE4 2422 CLR R2
0BE5 B82E OUT 0x0E,R2
0BE6 9508 RET
(0031) }
(0032) void Write_Byte_SPI(unsigned char byte)
(0033) {
(0034) SPDR = byte;
_Write_Byte_SPI:
byte --> R16
0BE7 B90F OUT 0x0F,R16
(0035) while (!(SPSR & (1<<SPIF)));
0BE8 9B77 SBIS 0x0E,7
0BE9 CFFE RJMP 0x0BE8
0BEA 9508 RET
(0036) }
(0037) unsigned char Read_Byte_SPI(void)
(0038) {
(0039) SPDR = 0xFF;
_Read_Byte_SPI:
0BEB EF8F LDI R24,0xFF
0BEC B98F OUT 0x0F,R24
(0040) while (!(SPSR &(1<<SPIF)));
0BED 9B77 SBIS 0x0E,7
0BEE CFFE RJMP 0x0BED
(0041) return SPDR;
0BEF B10F IN R16,0x0F
0BF0 9508 RET
(0042) }
(0043) void mp3_port_init()
(0044) {
(0045) spi_init();
_mp3_port_init:
0BF1 DFEE RCALL _spi_init
(0046) MP3_DDR|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
0BF2 B387 IN R24,0x17
0BF3 608B ORI R24,0xB
0BF4 BB87 OUT 0x17,R24
(0047) MP3_DDR&=~MP3_DATA_REQ;
0BF5 98BA CBI 0x17,2
(0048) MP3_PORT|=MP3_DATA_CS |MP3_CMD_CS|MP3_DATA_REST;
0BF6 B388 IN R24,0x18
0BF7 608B ORI R24,0xB
0BF8 BB88 OUT 0x18,R24
0BF9 9508 RET
_vs1011_cmd_write:
data --> R20
address --> R22
0BFA 940E13A3 CALL push_gset2
0BFC 01A9 MOVW R20,R18
0BFD 2F60 MOV R22,R16
(0049) //MP3_PORT&=~MP3_DATA_REST;
(0050) }
(0051) void vs1011_cmd_write(uchar address,uint data)
(0052) {
(0053) MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
0BFE 9AC3 SBI 0x18,3
(0054) MP3_PORT&=~MP3_CMD_CS; //MP3_CMD_CS=0;
0BFF 98C0 CBI 0x18,0
(0055) Write_Byte_SPI(0x02); //VS1011的写命令
0C00 E002 LDI R16,2
0C01 DFE5 RCALL _Write_Byte_SPI
(0056) //delay_nus(20);
(0057) Write_Byte_SPI(address); //地址
0C02 2F06 MOV R16,R22
0C03 DFE3 RCALL _Write_Byte_SPI
(0058) Write_Byte_SPI(data>>8);
0C04 018A MOVW R16,R20
0C05 2F01 MOV R16,R17
0C06 2711 CLR R17
0C07 DFDF RCALL _Write_Byte_SPI
(0059) Write_Byte_SPI(data);
0C08 2F04 MOV R16,R20
0C09 DFDD RCALL _Write_Byte_SPI
(0060) //delay_nus(200);
(0061) MP3_PORT|=MP3_CMD_CS; //MP3_CMD_CS=1;
0C0A 9AC0 SBI 0x18,0
0C0B 940E1391 CALL pop_gset2
0C0D 9508 RET
_vs1011_data_write:
data --> R20
0C0E 940E13A5 CALL push_gset1
0C10 2F40 MOV R20,R16
(0062) }
(0063)
(0064) void vs1011_data_write(uchar data)
(0065) {
(0066) MP3_PORT&=~MP3_DATA_CS; //MP3_DATA_CS=0;
0C11 98C3 CBI 0x18,3
(0067) Write_Byte_SPI(data);
0C12 2F04 MOV R16,R20
0C13 DFD3 RCALL _Write_Byte_SPI
(0068) MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
0C14 9AC3 SBI 0x18,3
(0069) MP3_PORT|=MP3_CMD_CS; //MP3_CMD_CS=1;
0C15 9AC0 SBI 0x18,0
0C16 940E13A8 CALL pop_gset1
0C18 9508 RET
_vs1011_read:
temp1 --> R22
temp --> R20
address --> R10
0C19 940E13A1 CALL push_gset3
0C1B 2EA0 MOV R10,R16
(0070) }
(0071)
(0072) uint vs1011_read(uchar address)
(0073) {
(0074) uchar temp1=0;
0C1C 2766 CLR R22
(0075) uint temp=0;
0C1D 2744 CLR R20
0C1E 2755 CLR R21
(0076) MP3_PORT|=MP3_DATA_CS; //MP3_DATA_CS=1;
0C1F 9AC3 SBI 0x18,3
(0077) MP3_PORT&=~MP3_CMD_CS; //MP3_CMD_CS=0;
0C20 98C0 CBI 0x18,0
(0078) Write_Byte_SPI(0x03); //VS1011的读命令
0C21 E003 LDI R16,3
0C22 DFC4 RCALL _Write_Byte_SPI
(0079) //delay_nus(20);
(0080) Write_Byte_SPI(address); //地址
0C23 2D0A MOV R16,R10
0C24 DFC2 RCALL _Write_Byte_SPI
(0081) temp=Read_Byte_SPI();
0C25 DFC5 RCALL _Read_Byte_SPI
0C26 2F40 MOV R20,R16
0C27 2755 CLR R21
(0082) temp=temp<<8;
0C28 2F54 MOV R21,R20
0C29 2744 CLR R20
(0083) temp1=Read_Byte_SPI();
0C2A DFC0 RCALL _Read_Byte_SPI
0C2B 2F60 MOV R22,R16
(0084) temp=temp|temp1;
0C2C 2E26 MOV R2,R22
0C2D 2433 CLR R3
0C2E 2942 OR R20,R2
0C2F 2953 OR R21,R3
(0085) MP3_PORT|=MP3_CMD_CS; //MP3_CMD_CS=1;
0C30 9AC0 SBI 0x18,0
(0086) return temp;
0C31 018A MOVW R16,R20
0C32 940E1394 CALL pop_gset3
0C34 9508 RET
(0087)
(0088) }
(0089)
(0090) void vs1011_init(void)
(0091) {
(0092)
(0093) delay_Nus(50);
_vs1011_init:
0C35 E302 LDI R16,0x32
0C36 E010 LDI R17,0
0C37 DF9B RCALL _delay_Nus
(0094) vs1011_cmd_write(0x00,0x0800); //NEW MODE
0C38 E020 LDI R18,0
0C39 E038 LDI R19,0x8
0C3A 2700 CLR R16
0C3B DFBE RCALL _vs1011_cmd_write
(0095) vs1011_cmd_write(0x02,0X75); //BASS
0C3C E725 LDI R18,0x75
0C3D E030 LDI R19,0
0C3E E002 LDI R16,2
0C3F DFBA RCALL _vs1011_cmd_write
(0096) vs1011_cmd_write(0x03,0X9800); //CLOCK F
0C40 E020 LDI R18,0
0C41 E938 LDI R19,0x98
0C42 E003 LDI R16,3
0C43 DFB6 RCALL _vs1011_cmd_write
(0097) vs1011_cmd_write(0x0b,0X3030); //VOLUME
0C44 E320 LDI R18,0x30
0C45 E330 LDI R19,0x30
0C46 E00B LDI R16,0xB
0C47 DFB2 RCALL _vs1011_cmd_write
0C48 9508 RET
FILE: C:\DOCUME~1\pas\桌面\SD卡MP3程序\3310.c
(0001) /************************************************************/
(0002) /* 3310 Code for M32L */
(0003) /* By pasyong */
(0004) /* 2006-4 */
(0005) /* Base ICC6.31A */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #include "english_6x8_pixel.h"
(0010)
(0011) #define LCD_PORT PORTC
(0012) #define LCD_DC BIT(0)
(0013) #define LCD_CE BIT(1)
(0014) #define LCD_RST BIT(2)
(0015)
(0016) void delay_1us(void) //1us延时函数
(0017) {
(0018) asm("nop");
_delay_1us:
0C49 0000 NOP
0C4A 9508 RET
(0019) }
(0020)
(0021) void lcd_port()
(0022) {
(0023) DDRC=0x03;
_lcd_port:
0C4B E083 LDI R24,3
0C4C BB84 OUT 0x14,R24
(0024) PORTC|=LCD_CE|LCD_DC;
0C4D B385 IN R24,0x15
0C4E 6083 ORI R24,3
0C4F BB85 OUT 0x15,R24
(0025) DDRD=0xff;
0C50 EF8F LDI R24,0xFF
0C51 BB81 OUT 0x11,R24
(0026) PORTC|=LCD_RST;
0C52 9AAA SBI 0x15,2
0C53 9508 RET
(0027) }
(0028) /*-----------------------------------------------------------------------
(0029) LCD_write_byte : 使用SPI接口写数据到LCD
(0030)
(0031) 输入参数:data :写入的数据;
(0032) command :写数据/命令选择;
(0033) -----------------------------------------------------------------------*/
(0034) void LCD_write_byte(unsigned char data, unsigned char command)
(0035) {
(0036) LCD_PORT&= ~LCD_CE ; // 使能LCD
_LCD_write_byte:
command --> R18
data --> R16
0C54 98A9 CBI 0x15,1
(0037)
(0038) if (command == 0)
0C55 2322 TST R18
0C56 F411 BNE 0x0C59
(0039) {
(0040) LCD_PORT&= ~LCD_DC ; // 传送命令
0C57 98A8 CBI 0x15,0
(0041) }
0C58 C001 RJMP 0x0C5A
(0042) else
(0043) {
(0044) LCD_PORT|= LCD_DC ; // 传送数据
0C59 9AA8 SBI 0x15,0
(0045) }
(0046)
(0047) SPDR = data; // 传送数据到SPI寄存器
0C5A B90F OUT 0x0F,R16
(0048)
(0049) while ((SPSR & 0x80) == 0); // 等待数据传送完毕
0C5B 9B77 SBIS 0x0E,7
0C5C CFFE RJMP 0x0C5B
(0050)
(0051) LCD_PORT|= LCD_CE ; // 关闭LCD
0C5D 9AA9 SBI 0x15,1
0C5E 9508 RET
_LCD_set_XY:
Y --> R22
X --> R20
0C5F 940E13A3 CALL push_gset2
0C61 2F62 MOV R22,R18
0C62 2F40 MOV R20,R16
(0052) }
(0053) /*-----------------------------------------------------------------------
(0054) LCD_set_XY : 设置LCD坐标函数
(0055)
(0056) 输入参数:X :0-83
(0057) Y :0-5
(0058) -----------------------------------------------------------------------*/
(0059) void LCD_set_XY(unsigned char X, unsigned char Y)
(0060) {
(0061) LCD_write_byte(0x40 | Y, 0); // column
0C63 2722 CLR R18
0C64 2F06 MOV R16,R22
0C65 6400 ORI R16,0x40
0C66 DFED RCALL _LCD_write_byte
(0062) LCD_write_byte(0x80 | X, 0); // row
0C67 2722 CLR R18
0C68 2F04 MOV R16,R20
0C69 6800 ORI R16,0x80
0C6A DFE9 RCALL _LCD_write_byte
0C6B 940E1391 CALL pop_gset2
0C6D 9508 RET
_LCD_write_char:
line --> R20
c --> R22
0C6E 940E13A3 CALL push_gset2
0C70 2F60 MOV R22,R16
(0063) }
(0064)
(0065) /*-----------------------------------------------------------------------
(0066) LCD_write_char : 显示英文字符
(0067)
(0068) 输入参数:c :显示的字符;
(0069) -----------------------------------------------------------------------*/
(0070) void LCD_write_char(unsigned char c)
(0071) {
(0072) unsigned char line;
(0073) c -= 32;
0C71 5260 SUBI R22,0x20
(0074) for (line=0; line<6; line++)
0C72 2744 CLR R20
0C73 C00F RJMP 0x0C83
(0075) LCD_write_byte(font6x8[c][line], 1);
0C74 E021 LDI R18,1
0C75 E086 LDI R24,6
0C76 9F86 MUL R24,R22
0C77 0110 MOVW R2,R0
0C78 E584 LDI R24,0x54
0C79 E090 LDI R25,0
0C7A 0E28 ADD R2,R24
0C7B 1E39 ADC R3,R25
0C7C 2FE4 MOV R30,R20
0C7D 27FF CLR R31
0C7E 0DE2 ADD R30,R2
0C7F 1DF3 ADC R31,R3
0C80 9104 LPM R16,0(Z)
0C81 DFD2 RCALL _LCD_write_byte
0C82 9543 INC R20
0C83 3046 CPI R20,6
0C84 F378 BCS 0x0C74
0C85 940E1391 CALL pop_gset2
0C87 9508 RET
_LCD_write_english_string:
s --> R20
Y --> R10
X --> R22
0C88 940E13A1 CALL push_gset3
0C8A 2EA2 MOV R10,R18
0C8B 2F60 MOV R22,R16
0C8C 814E LDD R20,Y+6
0C8D 815F LDD R21,Y+7
(0076) }
(0077) /*-----------------------------------------------------------------------
(0078) LCD_write_english_String : 英文字符串显示函数
(0079)
(0080) 输入参数:*s :英文字符串指针;
(0081) X、Y : 显示字符串的位置,x 0-83 ,y 0-5
(0082) -----------------------------------------------------------------------*/
(0083) void LCD_write_english_string(unsigned char X,unsigned char Y,char *s)
(0084) {
(0085) LCD_set_XY(X,Y);
0C8E 2D2A MOV R18,R10
0C8F 2F06 MOV R16,R22
0C90 DFCE RCALL _LCD_set_XY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -