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

📄 sd.lst

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -