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

📄 interface.s

📁 Atmega64单片机程序(完整工程)
💻 S
字号:
	.module Interface.c
	.area text(rom, con, rel)
;    RelaStaSect -> y+2
;         buffer -> R10,R11
;         Device -> R10
	.even
_GetVolumeFirstSect::
	xcall push_gset3
	mov R10,R16
	sbiw R28,6
; /****************************************Copyright (c)**************************************************
; **                               广州周立功单片机发展有限公司
; **                                     研    究    所
; **                                        ARM开发组
; **
; **                                 http://www.zlgmcu.com
; **
; **--------------文件信息--------------------------------------------------------------------------------
; **文   件   名: flash.c
; **创   建   人: 陈明计
; **最后修改日期:  2003年9月3日
; **描        述: FAT文件系统在PC上编译的软盘驱动程序(底层驱动)
; **
; **--------------历史版本信息----------------------------------------------------------------------------
; ** 创建人: 陈明计
; ** 版  本: V1.0
; ** 日 期: 2003年9月3日
; ** 描 述: 原始版本
; **
; **--------------当前版本修订------------------------------------------------------------------------------
; ** 修改人:
; ** 日 期:
; ** 描 述:
; **
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; 
; #define   IN_FLOPPY 
; 
; #include "SYS_Config.h" 
; #include "FS_Config.h" 
; #include "SD_Drive.h" 
; #include "USART1.h"
; #include "fat.h" 
; 
; extern INT8U Data_Buf[SD_BLOCKSIZE];//在main函数中定义
; 
; INT32U GetVolumeFirstSect(INT8U Device)
; {
;     INT8U  *buffer;
;     INT32U RelaStaSect ;
;     
; 	Device=Device;
;     buffer=Data_Buf;
	ldi R24,<_Data_Buf
	ldi R25,>_Data_Buf
	movw R10,R24
;     /* 从SD卡中读一个块  */
;     //INT8U  SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
;     if( SD_ReadBlock(0x00,buffer)!=0 )
	std y+1,R11
	std y+0,R10
	ldi R16,0
	ldi R17,0
	ldi R18,0
	ldi R19,0
	xcall _SD_ReadBlock
	tst R16
	breq L2
;         return DISK_INIT_NOT_OK ; 
	ldi R16,131
	ldi R17,0
	ldi R18,0
	ldi R19,0
	xjmp L1
L2:
;     
;     if( (buffer[510]==0x55)&&(buffer[511]==0xAA) )
	movw R30,R10
	subi R30,2  ; addi 510
	sbci R31,254
	ldd R24,z+0
	cpi R24,85
	breq X0
	xjmp L4
X0:
	movw R30,R10
	subi R30,1  ; addi 511
	sbci R31,254
	ldd R24,z+0
	cpi R24,170
	breq X1
	xjmp L4
X1:
;     {
;         if( ( (buffer[0]==0xEB)&&(buffer[2]==0x90) ) || (buffer[0]==0xE9) )
	movw R30,R10
	ldd R24,z+0
	cpi R24,235
	brne L9
	ldd R24,z+2
	cpi R24,144
	breq L8
L9:
	movw R30,R10
	ldd R24,z+0
	cpi R24,233
	brne L6
L8:
;             RelaStaSect=0 ;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+2,R20
	std z+3,R21
	std z+4,R22
	std z+5,R23
	xjmp L7
L6:
;         else 
;         {
;             //RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])<<8+(INT32U)(buffer[456])<<16+(INT32U)(buffer[457])<<24;//为何不行???
; 			//RelaStaSect=(INT32U)(buffer[454])+(INT32U)(buffer[455])*0x100+(INT32U)(buffer[456])*0x10000+(INT32U)(buffer[457])*0x1000000;
; 		    RelaStaSect=(INT32U)(buffer[454])+
	movw R30,R10
	subi R30,57  ; addi 455
	sbci R31,254
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	ldi R20,0
	ldi R21,1
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R30,R10
	subi R30,58  ; addi 454
	sbci R31,254
	ldd R2,z+0
	clr R3
	clr R4
	clr R5
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R10
	subi R30,56  ; addi 456
	sbci R31,254
	ldd R6,z+0
	clr R7
	clr R8
	clr R9
	ldi R20,0
	ldi R21,0
	ldi R22,1
	ldi R23,0
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R10
	subi R30,55  ; addi 457
	sbci R31,254
	ldd R6,z+0
	clr R7
	clr R8
	clr R9
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,1
	st -y,R9
	st -y,R8
	st -y,R7
	st -y,R6
	movw R16,R20
	movw R18,R22
	xcall empy32u
	add R2,R16
	adc R3,R17
	adc R4,R18
	adc R5,R19
	movw R30,R28
	std z+2,R2
	std z+3,R3
	std z+4,R4
	std z+5,R5
; 			            (INT32U)(buffer[455])*0x100+
; 			            (INT32U)(buffer[456])*0x10000+
; 			            (INT32U)(buffer[457])*0x1000000;
; 		
; 		}
L7:
;     }
L4:
;     return RelaStaSect ;
	movw R30,R28
	ldd R16,z+2
	ldd R17,z+3
	ldd R18,z+4
	ldd R19,z+5
L1:
	adiw R28,6
	xcall pop_gset3
	.dbline 0 ; func end
	ret
;       DiskInfo -> R14,R15
;             rt -> R10,R11
;             Dp -> R12,R13
;      Parameter -> R14,R15
;        Command -> R10
	.even
_SD_Command::
	xcall push_gset5
	movw R14,R18
	mov R10,R16
	sbiw R28,2
; }
; 
; /*********************************************************************************************************
; ** 函数名称: SDCommand
; ** 功能描述: 底层驱动程序与上层的接口程序
; ** 输   入: DISK_INIT:驱动程序初始化
; **           DISK_CLOSE:关闭驱动器(移除驱动程序)
; **           DISK_CREATE_BOOT_SECTOR:重建引导扇区
; **           DISK_READ_SECTOR:读扇区
; **           DISK_WRITE_SECTOR:写扇区
; 
; ** 输   出: DISK_READ_OK:读扇区完成
; **           DISK_READ_NOT_OK:读扇区失败
; **           DISK_WRITE_OK:写扇区完成
; **           DISK_WRITE_NOT_OK:写扇区失败
; **           DISK_INIT_OK:初始化完成
; **           DISK_INIT_NOT_OK:初始化失败
; **           BAD_DISK_COMMAND:无效的命令
; ** 全局变量: 无
; ** 调用模块: 无
; ** 作   者: 陈明计
; ** 日   期: 2003年9月3日
; **-------------------------------------------------------------------------------------------------------
; ** 修 改 人:
; ** 日   期:
; **------------------------------------------------------------------------------------------------------
; ********************************************************************************************************/
; INT16U SD_Command(INT8U Command,void *Parameter)
; {
;     INT16U rt ;
;     Disk_RW_Parameter *Dp ;
;     Disk_Info         *DiskInfo ;
;     
;     Dp=(Disk_RW_Parameter*)Parameter ;
	movw R12,R14
;     
;     switch(Command)
	clr R11
	tst R10
	brne X2
	tst R11
	breq L14
X2:
	movw R24,R10
	cpi R24,1
	ldi R30,0
	cpc R25,R30
	brne X5
	xjmp L19
X5:
	cpi R24,2
	ldi R30,0
	cpc R25,R30
	brne X6
	xjmp L20
X6:
	cpi R24,3
	ldi R30,0
	cpc R25,R30
	brne X7
	xjmp L24
X7:
	xjmp L11
X3:
;     {
L14:
;         case DISK_INIT :/*设备初始化*/
;              rt=DISK_INIT_NOT_OK ;
	ldi R24,131
	ldi R25,0
	movw R10,R24
;              {
;                 DiskInfo=GetEmptyDiskInfoAddr();
	xcall _GetEmptyDiskInfoAddr
	movw R14,R16
;          	    if(DiskInfo!=NULL)
	cpi R16,0
	cpc R16,R17
	brne X8
	xjmp L12
X8:
X4:
;          	    {
;               	     DiskInfo->DiskCommand=SD_Command ;
	ldi R24,<PL_SD_Command
	ldi R25,>PL_SD_Command
	movw R30,R14
	std z+45,R25
	std z+44,R24
;                	     DiskInfo->RsvdForLow=GetVolumeFirstSect(0);
	clr R16
	xcall _GetVolumeFirstSect
	movw R30,R14
	std z+40,R16
	std z+41,R17
	std z+42,R18
	std z+43,R19
;                      /*获取卷首扇区*/
; 		             if(DiskInfo->RsvdForLow==DISK_INIT_NOT_OK)
	ldi R20,131
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R14
	ldd R2,z+40
	ldd R3,z+41
	ldd R4,z+42
	ldd R5,z+43
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L17
; 		                 rt=DISK_INIT_NOT_OK;  
	ldi R24,131
	ldi R25,0
	movw R10,R24
	xjmp L12
L17:
; 		             else
; 		                 rt=DISK_INIT_OK;   
	ldi R24,3
	ldi R25,0
	movw R10,R24
;            	    }
;        	     }
;        	     break ;
	xjmp L12
L19:
;         case DISK_CLOSE :
; 	         rt=RETURN_OK;
	clr R10
	clr R11
; 	         break ;
	xjmp L12
L20:
;         case DISK_READ_SECTOR : /*读扇区*/
;              rt=DISK_READ_NOT_OK ;
	ldi R24,128
	ldi R25,0
	movw R10,R24
; 	     /* 从SD卡中读一个块  */
;              //INT8U  SD_ReadBlock(INT32U blockaddr,INT8U *recbuf);
;              if( SD_ReadBlock(Dp->SectorIndex+Dp->RsvdForLow,Dp->Buf)==0 )
	movw R30,R12
	ldd R2,z+9
	ldd R3,z+10
	std y+1,R3
	std y+0,R2
	movw R30,R12
	ldd R2,z+5
	ldd R3,z+6
	ldd R4,z+7
	ldd R5,z+8
	movw R30,R12
	ldd R6,z+1
	ldd R7,z+2
	ldd R8,z+3
	ldd R9,z+4
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R16,R6
	movw R18,R8
	xcall _SD_ReadBlock
	tst R16
	breq X9
	xjmp L12
X9:
;              {
;                  rt=DISK_READ_OK ;
	ldi R24,1
	ldi R25,0
	movw R10,R24
; 		 //FS调试用
; 	             #if FS_DEBUG_EN
; 				 #if USART1_EN
; 	             {  
;                      Uart1_SendString("\nFS Reading Logic Sector :");//调试用,数据区开始扇区号
	ldi R16,<L23
	ldi R17,>L23
	xcall _Uart1_SendString
; 		             PUT_INT32U_DecTOString(Dp->SectorIndex);
	movw R30,R12
	ldd R16,z+1
	ldd R17,z+2
	ldd R18,z+3
	ldd R19,z+4
	xcall _PUT_INT32U_DecTOString
; 		         }
; 				 #endif
; 				 #endif
;              }
;              break ;
	xjmp L12
L24:
;         case DISK_WRITE_SECTOR :/*写扇区*/
;              rt=DISK_WRITE_NOT_OK ;
	ldi R24,130
	ldi R25,0
	movw R10,R24
; 	     /* 向SD卡中写入一个块  */
;              //INT8U SD_WriteBlock(INT32U blockaddr,INT8U *recbuf);
;              if( SD_WriteBlock(Dp->SectorIndex+Dp->RsvdForLow,Dp->Buf)==0 )
	movw R30,R12
	ldd R2,z+9
	ldd R3,z+10
	std y+1,R3
	std y+0,R2
	movw R30,R12
	ldd R2,z+5
	ldd R3,z+6
	ldd R4,z+7
	ldd R5,z+8
	movw R30,R12
	ldd R6,z+1
	ldd R7,z+2
	ldd R8,z+3
	ldd R9,z+4
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R16,R6
	movw R18,R8
	xcall _SD_WriteBlock
	tst R16
	brne L12
;              {
;                  rt=DISK_WRITE_OK ;
	ldi R24,2
	ldi R25,0
	movw R10,R24
; 		         //FS调试用
; 		         #if FS_DEBUG_EN
; 				 #if USART1_EN
; 		 		 {
; 		     
; 	    	         Uart1_SendString("\nFS Writing Logic Sector :");//调试用,数据区开始扇区号
	ldi R16,<L27
	ldi R17,>L27
	xcall _Uart1_SendString
; 	    	         PUT_INT32U_DecTOString(Dp->SectorIndex);
	movw R30,R12
	ldd R16,z+1
	ldd R17,z+2
	ldd R18,z+3
	ldd R19,z+4
	xcall _PUT_INT32U_DecTOString
; 			     }
; 		         #endif 
; 		         #endif
;              }
;              break ;
	xjmp L12
L11:
;         default :rt=BAD_DISK_COMMAND ; break ;
	ldi R24,65535
	ldi R25,255
	movw R10,R24
L12:
;     }
;     return rt ;
	movw R16,R10
L10:
	adiw R28,2
	xcall pop_gset5
	.dbline 0 ; func end
	ret
	.area data(ram, con, rel)
L27:
	.blkb 27
	.area idata
	.byte 10,'F,'S,32,'W,'r,'i,'t,'i,'n,'g,32,'L,'o,'g,'i
	.byte 'c,32,'S,'e,'c,'t,'o,'r,32,58,0
	.area data(ram, con, rel)
L23:
	.blkb 27
	.area idata
	.byte 10,'F,'S,32,'R,'e,'a,'d,'i,'n,'g,32,'L,'o,'g,'i
	.byte 'c,32,'S,'e,'c,'t,'o,'r,32,58,0
	.area data(ram, con, rel)
	.area func_lit
PL_SD_Command:	.word `_SD_Command

⌨️ 快捷键说明

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