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

📄 sd.lst

📁 这个是通过51做的SD卡读写和MP3的程序!
💻 LST
📖 第 1 页 / 共 5 页
字号:
    0C91 C005      RJMP	0x0C97
(0086)     while (*s) 
(0087)       {
(0088) 	 LCD_write_char(*s);
    0C92 01FA      MOVW	R30,R20
    0C93 8100      LDD	R16,Z+0
    0C94 DFD9      RCALL	_LCD_write_char
(0089) 	 s++;
    0C95 5F4F      SUBI	R20,0xFF
    0C96 4F5F      SBCI	R21,0xFF
    0C97 01FA      MOVW	R30,R20
    0C98 8020      LDD	R2,Z+0
    0C99 2022      TST	R2
    0C9A F7B9      BNE	0x0C92
    0C9B 940E1394  CALL	pop_gset3
    0C9D 9508      RET
_LCD_clear:
  i                    --> R20
    0C9E 940E13A5  CALL	push_gset1
(0090)       }
(0091)   }
(0092) /*-----------------------------------------------------------------------
(0093) LCD_clear         : LCD清屏函数
(0094) -----------------------------------------------------------------------*/
(0095) void LCD_clear(void)
(0096)   {
(0097)     unsigned int i;
(0098) 
(0099)     LCD_write_byte(0x0c, 0);	//普通显示模式		
    0CA0 2722      CLR	R18
    0CA1 E00C      LDI	R16,0xC
    0CA2 DFB1      RCALL	_LCD_write_byte
(0100)     LCD_write_byte(0x80, 0);    //设置RAM的X地址	
    0CA3 2722      CLR	R18
    0CA4 E800      LDI	R16,0x80
    0CA5 DFAE      RCALL	_LCD_write_byte
(0101) 
(0102)     for (i=0; i<504; i++)
    0CA6 2744      CLR	R20
    0CA7 2755      CLR	R21
    0CA8 C005      RJMP	0x0CAE
(0103)       LCD_write_byte(0, 1);		//写0数据	
    0CA9 E021      LDI	R18,1
    0CAA 2700      CLR	R16
    0CAB DFA8      RCALL	_LCD_write_byte
    0CAC 5F4F      SUBI	R20,0xFF
    0CAD 4F5F      SBCI	R21,0xFF
    0CAE 3F48      CPI	R20,0xF8
    0CAF E0E1      LDI	R30,1
    0CB0 075E      CPC	R21,R30
    0CB1 F3B8      BCS	0x0CA9
    0CB2 940E13A8  CALL	pop_gset1
    0CB4 9508      RET
(0104)   }
(0105) /*-----------------------------------------------------------------------
(0106) LCD_init          : 3310LCD初始化
(0107) -----------------------------------------------------------------------*/
(0108) void LCD_init(void)
(0109)   {
(0110)     PORTD &= ~LCD_RST;          // 产生一个让LCD复位的低电平脉冲
_LCD_init:
    0CB5 9892      CBI	0x12,2
(0111)     delay_1us();
    0CB6 DF92      RCALL	_delay_1us
(0112)     PORTD |= LCD_RST;
    0CB7 9A92      SBI	0x12,2
(0113)     delay_1us();
    0CB8 DF90      RCALL	_delay_1us
(0114)     LCD_write_byte(0x21, 0);	// 使用扩展命令设置LCD模式
    0CB9 2722      CLR	R18
    0CBA E201      LDI	R16,0x21
    0CBB DF98      RCALL	_LCD_write_byte
(0115)     LCD_write_byte(0xc8, 0);	// 设置偏置电压
    0CBC 2722      CLR	R18
    0CBD EC08      LDI	R16,0xC8
    0CBE DF95      RCALL	_LCD_write_byte
(0116)     LCD_write_byte(0x06, 0);	// 温度校正
    0CBF 2722      CLR	R18
    0CC0 E006      LDI	R16,6
    0CC1 DF92      RCALL	_LCD_write_byte
(0117)     LCD_write_byte(0x13, 0);	// 1:48
    0CC2 2722      CLR	R18
    0CC3 E103      LDI	R16,0x13
    0CC4 DF8F      RCALL	_LCD_write_byte
(0118)     delay_1us();
    0CC5 DF83      RCALL	_delay_1us
(0119)     LCD_write_byte(0x20, 0);	// 使用基本命令
    0CC6 2722      CLR	R18
    0CC7 E200      LDI	R16,0x20
    0CC8 DF8B      RCALL	_LCD_write_byte
(0120)     LCD_clear();	            // 清屏
    0CC9 DFD4      RCALL	_LCD_clear
(0121)     LCD_write_byte(0x0c, 0);	// 设定显示模式,正常显示    
    0CCA 2722      CLR	R18
    0CCB E00C      LDI	R16,0xC
    0CCC DF87      RCALL	_LCD_write_byte
    0CCD 9508      RET
_ReadBlock:
  temp                 --> Y+0
  LBA                  --> Y+4
    0CCE 940E12BF  CALL	push_arg4
    0CD0 9724      SBIW	R28,4
FILE: C:\DOCUME~1\pas\桌面\SD卡MP3程序\fat.c
(0001) /************************************************************/
(0002) /*		         FAT Code for   M32L					    */
(0003) /*				   By   pasyong								*/
(0004) /*				   2006-4									*/
(0005) /*				   Base ICC6.31A					        */
(0006) /************************************************************/
(0007) #include <iom32v.h>
(0008) #include <macros.h>
(0009) #include <string.h>
(0010) #include "sd.h"
(0011) #include "fat.h"
(0012) #include "3310.h"
(0013) 
(0014) extern uchar BUFFER[512];
(0015) unsigned char  LONGNAME_BUFFER_ADDR[30];
(0016) unsigned char  DIRNAME_BUFFER_ADDR[30];
(0017) unsigned char *LongNameBuffer =		(unsigned char *) LONGNAME_BUFFER_ADDR;
(0018) unsigned char *DirNameBuffer =		(unsigned char *) DIRNAME_BUFFER_ADDR;
(0019) struct partrecord PartInfo;
(0020) unsigned char Fat32Enabled;
(0021) unsigned long FirstDataSector;
(0022) unsigned int  BytesPerSector;
(0023) unsigned int  SectorsPerCluster;
(0024) unsigned long FirstFATSector;
(0025) unsigned long FirstDirSector;
(0026) unsigned long FileSize;
(0027) unsigned long FatInCache = 0;
(0028) 
(0029) //********************************************************************************************
(0030) //读一个扇区
(0031) void ReadBlock(unsigned long LBA)
(0032) //********************************************************************************************
(0033) {   unsigned long temp;
(0034)     temp=LBA<<9;
    0CD1 E089      LDI	R24,0x9
    0CD2 E090      LDI	R25,0
    0CD3 01FE      MOVW	R30,R28
    0CD4 8024      LDD	R2,Z+4
    0CD5 8035      LDD	R3,Z+5
    0CD6 8046      LDD	R4,Z+6
    0CD7 8057      LDD	R5,Z+7
    0CD8 938A      ST	R24,-Y
    0CD9 0181      MOVW	R16,R2
    0CDA 0192      MOVW	R18,R4
    0CDB 940E13E1  CALL	lsl32
    0CDD 01FE      MOVW	R30,R28
    0CDE 8300      STD	Z+0,R16
    0CDF 8311      STD	Z+1,R17
    0CE0 8322      STD	Z+2,R18
    0CE1 8333      STD	Z+3,R19
(0035)     SD_Read_Block(temp);
    0CE2 01FE      MOVW	R30,R28
    0CE3 8100      LDD	R16,Z+0
    0CE4 8111      LDD	R17,Z+1
    0CE5 8122      LDD	R18,Z+2
    0CE6 8133      LDD	R19,Z+3
    0CE7 940E0B9A  CALL	_SD_Read_Block
    0CE9 9628      ADIW	R28,0x8
    0CEA 9508      RET
_fatClustToSect:
  clust                --> Y+4
    0CEB 940E12BF  CALL	push_arg4
    0CED 940E13A3  CALL	push_gset2
(0036) }
(0037) /*-----------------------------------------------------------------------
(0038)  查询数据区一个簇开始扇区号
(0039) -----------------------------------------------------------------------*/
(0040) unsigned long fatClustToSect(unsigned long clust)
(0041) {
(0042) 	return ((clust-2) * SectorsPerCluster) + FirstDataSector;
    0CEF E042      LDI	R20,2
    0CF0 E050      LDI	R21,0
    0CF1 E060      LDI	R22,0
    0CF2 E070      LDI	R23,0
    0CF3 01FE      MOVW	R30,R28
    0CF4 8024      LDD	R2,Z+4
    0CF5 8035      LDD	R3,Z+5
    0CF6 8046      LDD	R4,Z+6
    0CF7 8057      LDD	R5,Z+7
    0CF8 1A24      SUB	R2,R20
    0CF9 0A35      SBC	R3,R21
    0CFA 0A46      SBC	R4,R22
    0CFB 0A57      SBC	R5,R23
    0CFC 906002C2  LDS	R6,SectorsPerCluster
    0CFE 907002C3  LDS	R7,SectorsPerCluster+1
    0D00 2488      CLR	R8
    0D01 2499      CLR	R9
    0D02 929A      ST	R9,-Y
    0D03 928A      ST	R8,-Y
    0D04 927A      ST	R7,-Y
    0D05 926A      ST	R6,-Y
    0D06 0181      MOVW	R16,R2
    0D07 0192      MOVW	R18,R4
    0D08 940E1361  CALL	empy32u
    0D0A 0118      MOVW	R2,R16
    0D0B 0129      MOVW	R4,R18
    0D0C 908002C8  LDS	R8,FirstDataSector+2
    0D0E 909002C9  LDS	R9,FirstDataSector+3
    0D10 906002C6  LDS	R6,FirstDataSector
    0D12 907002C7  LDS	R7,FirstDataSector+1
    0D14 0C26      ADD	R2,R6
    0D15 1C37      ADC	R3,R7
    0D16 1C48      ADC	R4,R8
    0D17 1C59      ADC	R5,R9
    0D18 0181      MOVW	R16,R2
    0D19 0192      MOVW	R18,R4
    0D1A 940E1391  CALL	pop_gset2
    0D1C 9624      ADIW	R28,4
    0D1D 9508      RET
(0043) }
(0044) /*-----------------------------------------------------------------------
(0045)  查询一个簇所占扇区数
(0046) -----------------------------------------------------------------------*/
(0047) unsigned int fatClusterSize(void)
(0048) {
(0049) 	// return the number of sectors in a disk cluster
(0050) 	return SectorsPerCluster;
_fatClusterSize:
    0D1E 910002C2  LDS	R16,SectorsPerCluster
    0D20 911002C3  LDS	R17,SectorsPerCluster+1
    0D22 9508      RET
_fatInit:
  t2                   --> R10
  t1                   --> R12
  data                 --> R10
  bpb                  --> R10
    0D23 940E139F  CALL	push_gset4
    0D25 9722      SBIW	R28,2
(0051) }
(0052) /*-----------------------------------------------------------------------
(0053) 查询SD卡文件系统信息
(0054) -----------------------------------------------------------------------*/
(0055) unsigned char fatInit()
(0056) {
(0057)     unsigned int data;unsigned char t1,t2;
(0058) 
(0059) 	struct bpb710 *bpb;
(0060) 	// 读MBR结构
(0061) 	ReadBlock(0);  
    0D26 E000      LDI	R16,0
    0D27 E010      LDI	R17,0
    0D28 E020      LDI	R18,0
    0D29 E030      LDI	R19,0
    0D2A DFA3      RCALL	_ReadBlock
(0062) 	// 读取分区表信息
(0063) 	PartInfo = *((struct partrecord *) ((struct partsector *)BUFFER)->psPart);
    0D2B E784      LDI	R24,0x74
    0D2C E092      LDI	R25,2
    0D2D ECEB      LDI	R30,0xCB
    0D2E E0F2      LDI	R31,2
    0D2F E100      LDI	R16,0x10
    0D30 E010      LDI	R17,0
    0D31 93FA      ST	R31,-Y
    0D32 93EA      ST	R30,-Y
    0D33 939A      ST	R25,-Y
    0D34 938A      ST	R24,-Y
    0D35 940E13F9  CALL	asgnblk
(0064) 	// 读引导扇区
(0065) 	// 引导扇区号在PartInfo.prStartLBA中
(0066) 	ReadBlock(PartInfo.prStartLBA);  //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
    0D37 912002D5  LDS	R18,0x2D5
    0D39 913002D6  LDS	R19,0x2D6
    0D3B 910002D3  LDS	R16,0x2D3
    0D3D 911002D4  LDS	R17,0x2D4
    0D3F DF8E      RCALL	_ReadBlock
(0067) 	bpb = (struct bpb710 *) ((struct bootsector710 *) BUFFER)->bsBPB;
    0D40 EC81      LDI	R24,0xC1
    0D41 E090      LDI	R25,0
    0D42 015C      MOVW	R10,R24
(0068) 
(0069) 	FirstDataSector	= PartInfo.prStartLBA;
    0D43 904002D5  LDS	R4,0x2D5
    0D45 905002D6  LDS	R5,0x2D6
    0D47 902002D3  LDS	R2,0x2D3
    0D49 903002D4  LDS	R3,0x2D4
    0D4B 923002C7  STS	FirstDataSector+1,R3
    0D4D 922002C6  STS	FirstDataSector,R2
    0D4F 925002C9  STS	FirstDataSector+3,R5
    0D51 924002C8  STS	FirstDataSector+2,R4
(0070) 	if(bpb->bpbFATsecs)
    0D53 01FC      MOVW	R30,R24
    0D54 8423      LDD	R2,Z+11
    0D55 8434      LDD	R3,Z+12
    0D56 2022      TST	R2
    0D57 F411      BNE	0x0D5A
    0D58 2033      TST	R3
    0D59 F121      BEQ	0x0D7E
(0071) 	{
(0072) 		// bpbFATsecs非0,为FAT16,FAT表所占的扇区数在bpbFATsecs里
(0073) 		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
    0D5A 01F5      MOVW	R30,R10
    0D5B 8523      LDD	R18,Z+11
    0D5C 8534      LDD	R19,Z+12
    0D5D 01F5      MOVW	R30,R10
    0D5E 8105      LDD	R16,Z+5
    0D5F 2711      CLR	R17
    0D60 940E1351  CALL	empy16s
    0D62 01F5      MOVW	R30,R10
    0D63 8023      LDD	R2,Z+3
    0D64 8034      LDD	R3,Z+4
    0D65 0E20      ADD	R2,R16
    0D66 1E31      ADC	R3,R17
    0D67 2444      CLR	R4
    0D68 2455      CLR	R5
    0D69 908002C8  LDS	R8,FirstDataSector+2
    0D6B 909002C9  LDS	R9,FirstDataSector+3
    0D6D 906002C6  LDS	R6,FirstDataSector
    0D6F 907002C7  LDS	R7,FirstDataSector+1
    0D71 0C62      ADD	R6,R2
    0D72 1C73      ADC	R7,R3
    0D73 1C84      ADC	R8,R4
    0D74 1C95      ADC	R9,R5
    0D75 927002C7  STS	FirstDataSector+1,R7
    0D77 926002C6  STS	FirstDataSector,R6
    0D79 929002C9  STS	FirstDataSector+3,R9
    0D7B 928002C8  STS	FirstDataSector+2,R8
(0074) 	}
    0D7D C02F      RJMP	0x0DAD
(0075) 	else
(0076) 	{
(0077) 		// bpbFATsecs是0,为FAT32,FAT表所占的扇区数在bpbBigFATsecs里
(0078) 		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
    0D7E 01F5      MOVW	R30,R10
    0D7F 8C21      LDD	R2,Z+25
    0D80 8C32      LDD	R3,Z+26
    0D81 8C43      LDD	R4,Z+27
    0D82 8C54      LDD	R5,Z+28
    0D83 01F5      MOVW	R30,R10
    0D84 8065      LDD	R6,Z+5
    0D85 2477      CLR	R7
    0D86 2488      CLR	R8
    0D87 2499      CLR	R9
    0D88 925A      ST	R5,-Y
    0D89 924A      ST	R4,-Y
    0D8A 923A      ST	R3,-Y
    0D8B 922A      ST	R2,-Y
    0D8C 0183      MOVW	R16,R6
    0D8D 0194      MOVW	R18,R8
    0D8E 940E1361  CALL	empy32u
    0D90 01F5      MOVW	R30,R10
    0D91 8023      LDD	R2,Z+3
    0D92 8034      LDD	R3,Z+4
    0D93 2444      CLR	R4
    0D94 2455      CLR	R5
    0D95 0E20      ADD	R2,R16
    0D96 1E31      ADC	R3,R17
    0D97 1E42      ADC	R4,R18
    0D98 1E53      ADC	R5,R19
    0D99 908002C8  LDS	R8,FirstDataSector+2
    0D9B 909002C9  LDS	R9,FirstDataSector+3
    0D9D 906002C6  LDS	R6,FirstDataSector
    0D9F 907002C7  LDS	R7,FirstDataSector+1
    0DA1 0C62      ADD	R6,R2
    0DA2 1C73      ADC	R7,R3
    0DA3 1C84      ADC	R8,R4
    0DA4 1C95      ADC	R9,R5
    0DA5 927002C7  STS	FirstDataSector+1,R7
    0DA7 926002C6  STS	FirstDataSector,R6
    0DA9 929002C9  STS	FirstDataSector+3,R9
    0DAB 928002C8  STS	FirstDataSector+2,R8
(0079) 	}
(0080) 	
(0081) 	SectorsPerCluster	= bpb->bpbSecPerClust;
    0DAD 01F5      MOVW	R30,R10
    0DAE 8022      LDD	R2,Z+2
    0DAF 2433      CLR	R3
    0DB0 923002C3  STS	SectorsPerCluster+1,R3
    0DB2 922002C2  STS	SectorsPerCluster,R2
(0082) 	BytesPerSector		= bpb->bpbBytesPerSec;
    0DB4 01F5      MOVW	R30,R10
    0DB5 8020      LDD	R2,Z+0
    0DB6 8031      LDD	R3,Z+1
    0DB7 923002C5  STS	BytesPerSector+1,R3
    0DB9 922002C4  STS	BytesPerSector,R2
(0083) 	FirstFATSector		= bpb->bpbResSectors + PartInfo.prStartLBA;
    0DBB 904002D5  LDS	R4,0x2D5
    0DBD 905002D6  LDS	R5,0x2D6
    0DBF 902002D3  LDS	R2,0x2D3
    0DC1 903002D4  LDS	R3,0x2D4
    0DC3 8063      LDD	R6,Z+3
    0DC4 8074      LDD	R7,Z+4
    0DC5 2488      CLR	R8
    0DC6 2499      CLR	R9
    0DC7 0C62      ADD	R6,R2
    0DC8 1C73      ADC	R7,R3
    0DC9 1C84      ADC	R8,R4
    0DCA 1C95      ADC	R9,R5
    0DCB 927002BF  STS	FirstFATSector+1,R7

⌨️ 快捷键说明

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