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

📄 system.asm

📁 基于凌阳SPCE061A芯片的USB通讯可实现1.通过USB通讯
💻 ASM
字号:
//====================================================================================//
// 文件名:    system.asm
// 描  述:   该文件的程序主要用于初始化SPCE061A和PDIUSBD12,以及对PDIUSBD12的读写操作
// 日  期:   2003/04/03
//====================================================================================//
.include hardware.inc; 
//for led
.public _F_TurnOnFirstLed
.public _F_TurnOffFirstLed
.public _F_TurnOnSecondLed
.public _F_TurnOffSecondLed
//for d12
.public _F_InitWriteD12
.public _F_InitReadD12
.public _F_ReadD12 
.public _F_WriteCmdOrDataToD12
//for system
.public _F_System_Initial
.public _F_Interrupt_On
.public _F_Delay
.public _F_Interrupt_Off

.define Fosc_CLK_RATE 	FoscCLK_49      //选择不同Fosc信号频率
.define CPU_CLK_RATE    CPUCLK_Fosc  	//改变CPUClk频率

.code 	
//====================================================================
// 函  数:    F_System_Initial()
// 语  法:    void F_System_Initial(void) (for c)
// 描  述:    该函数用于初始化SPCE061A的中断、时钟、I/0、复位PDIUSBD12
//			  初始化:
//			  IOB0,IOB1为同相高电平输出
//			  IOB2=INT_N=1为带上拉电阻的输入
//			  IOB3=RESET_N=1为同相高电平输出
//            IOB4=CS_N=1同相高电平输出
//            IOB5=ALE=0同相低电平输出
//			  IOB6=WR_N=1为同相高电平输出
//			  IOB7=RD_N=1为同相高电平输出
// 参  数:   无  
// 返回值:   无
//=====================================================================
_F_System_Initial: .PROC
	    push R1,R1 to [sp];
	    int off;
	    R1=0x0100; 				//开中断IRQ3_EXT1
	    [P_INT_Ctrl_New]=R1; 
	    R1=Fosc_CLK_RATE;       //
		R1|=CPU_CLK_RATE;       //设置系统时钟      	
	    [P_SystemClock]=R1;	
	    
	
	    R1=0x00ff; 				//设置IOA8-IOA15为带上拉电阻地输入
		[P_IOA_Dir]=R1;         //设置IOA0-IOA7为同相低电平输出
		[P_IOA_Attrib]=R1;     
		R1=0xff00;            
		[P_IOA_Data]=R1; 
	
	    R1=0xFFFB;              //CS_N=IOB4=1,ALE=IOB5=0,WR_N=IOB6=1,RD_N=IOB7=1;
	    [P_IOB_Dir]=R1;         //IOB3=RESET_N=1,IOB2=INT_N=1,IOB0、IOB1输出
		[P_IOB_Attrib]=R1;      //不选中D12
		R1=0xFFDF ;             
	    [P_IOB_Data]=R1;     
	    
	    R1=0xFFC7; 
	    [P_IOB_Data]=R1;   		//CS_N=0,ALE=0,WR_N=1,RD_N=1,RESET_N=0,INT_N=1
	    call F_Delay;      	    //系统复位延时。
	    R1=0xFFCF;
	    [P_IOB_Data]=R1;   		//CS_N=0,ALE=0,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
	    
	    pop R1,R1 from [sp];
	   	retf; 
		.endp;

//====================================================================
// 函  数:    	F_Interrupt_On()
// 语  法:    	void F_Interrupt_On(void) (for c)
// 描  述:    	开中断函数
// 参  数:   	无  
// 返回值:		无
// 使用寄存器:	无
//=====================================================================

_F_Interrupt_On: .PROC
F_Interrupt_On:
		int irq;
	    retf; 
		.endp; 
//====================================================================
// 函  数:    	F_Interrupt_Off()
// 语  法:    	void F_Interrupt_Off(void) (for c)
// 描  述:   	开中断函数
// 参  数:   	无
// 返回值:   	无
// 使用寄存器:	无
//=====================================================================
_F_Interrupt_Off: .PROC
F_Interrupt_Off:
	    int off; 
	    retf;
		.endp; 

//====================================================================
// 函  数:    	F_Delay()
// 语  法:    	void F_Delay(void) (for c)
// 描  述:   	延时函数
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_Delay: .proc
F_Delay: 
	    push R1,R2 to [sp];
	    R2=0x000f;
	Loop1:
	    R1=0xffff;
	Loop2:    
	    R1-=1;
	    jnz Loop2;
	    R2-=1;
	    jnz Loop1;
	    nop;
	    pop R1,R2 from [sp];
	    retf;
		.endp

//====================================================================
// 函  数:    	F_TurnOffFirstLed()
// 语  法:    	void F_TurnOffFirstLed(void) (for c)
// 描  述:   	熄灭与IOA0相连的LED
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_TurnOffFirstLed: .proc
		push R1 to [sp];
		R1=[P_IOA_Buffer];
		R1&=0xFFFE;
		[P_IOA_Data]=R1;
		pop R1 from [sp];
		retf
		.endp


//====================================================================
// 函  数:    	F_TurnOffFirstLed()
// 语  法:    	void F_TurnOffFirstLed(void)
// 描  述:   	点亮与IOA0相连的LED
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_TurnOnFirstLed: .proc
		push R1 to [sp];
		R1=[P_IOA_Buffer];
		R1|=0x0001;
		[P_IOA_Data]=R1;
		pop R1 from [sp];
		retf;
		.endp

//====================================================================
// 函  数:    	SP_TurnOffFirstLed()
// 语  法:    	void SP_TurnOffFirstLed(void)
// 描  述:   	熄灭与IOA1相连的LED
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_TurnOffSecondLed: .proc
		push R1 to [sp];
		R1=[P_IOA_Buffer];
		R1&=0xFFFD;
		[P_IOA_Data]=R1;
		pop R1 from [sp];
		retf;
		.endp


//====================================================================
// 函  数:    	SP_TurnOffFirstLed()
// 语  法:    	void SP_TurnOffFirstLed(void)
// 描  述:   	点亮与IOA1相连的LED
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_TurnOnSecondLed: .proc
		push R1 to [sp];
		R1=[P_IOA_Buffer];
		R1|=0x0002;
		[P_IOA_Data]=R1;
		pop R1 from [sp];
		retf;
		.endp
		 
//====================================================================
// 函  数:    	F_InitWriteD12()
// 语  法:    	void F_TurnOffFirstLed(void)
// 描  述:   	初始化写PDIUSBD12
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_InitWriteD12:         .proc
		push R1,R1 to [sp];
	    R1 = 0xFFFF;
        [P_IOA_Dir] = R1;      // Port IOA15- IOA8: 同相高电平输出
        [P_IOA_Attrib] = R1;   // 
        R1 = 0xFF00;           //
        [P_IOA_Data] = R1;     // 
        
        R1 = 0x00Cf;           //
        [P_IOB_Data] = R1;     //     
        
        pop R1,R1 from [sp];
        retf ;
        .endp
//====================================================================
// 函  数:    	F_InitReadD12()
// 语  法:    	void F_InitReadD12(void)
// 描  述:   	初始化读PDIUSBD12
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_InitReadD12:          .PROC
		push R1,R1 to [sp];
 
        R1 = 0x00FF ;
        [P_IOA_Dir] = R1;        // Port IOA15- IOA8: 设置为悬浮式输入input(FL)
        R1 = 0xFFFF;             // 
        [P_IOA_Attrib] = R1;     //
        R1 = 0x0000;             // 
        [P_IOA_Data] = R1;       // 

        R1 = 0x00Cf;             //
        [P_IOB_Data] = R1;       // 
        
        pop R1,R1 from [sp]; 
        retf 
        .ENDP

//====================================================================
// 函  数:    	F_ReadD12()
// 语  法:    	void F_ReadD12(unsigned int D_Addr)
// 描  述:   	从PDIUSBD12读数据
// 参  数:   	D_Addr:为偶地址0xff02
// 返回值:   	R1
//=====================================================================
_F_ReadD12:      .PROC
        push bp to [sp]; 
        bp = sp + 1 ;
        R1 = [bp+3] ;            // D12 Address
        call	F_ReadD12;       // R1: return value
        pop bp from [sp] ;
        retf ;
        .ENDP
           
F_ReadD12:
        push R2,r3 to [sp]; 
        R1 = R1 lsl 4;           // move 02  to IOA8-IOA15
        R1 = R1 lsl 4;  
        [P_IOA_Data] = R1;       // 送偶地址到D12
        R3 = 0x00EF;             // CS_N=0, ALE=IOB8=1,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
        [P_IOB_Data] = R3;     
        R1=0x00Cf;
        [P_IOB_Data] = R1;       // CS_N=0,ALE=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
        R1=0x004f; 
        [P_IOB_Data] = R1;       // CS_N=0,ALE=0,WR_N=1,RD_N=0;RESET_N=1,INT_N=1
        nop;
        R1 = [P_IOA_Data];       // Get data
        R1 = R1 lsr 4;           // Prepare high 8 bits Addr. to low 8 bits
        R2 = R1 lsr 4;           // Get low byte data
        R1=R2;                   // R1 save ruturn value
        R2 = 0x00CF;             // CS_N=0,ALE=0,WR_N=1,RD_N=1 ;RESET_N=1,INT_N=1
        [P_IOB_Buffer] = R2;     // 
        
		pop R2,r3 from [sp];     // don't pop R1(return value)   
        retf ;
//===================================================================================================
// 函  数:    	F_WriteCmdOrDataToD12()
// 语  法:    	void F_WriteCmdOrDataToD12(unsigned int D_or_C_Addr,unsigned int Data_or_Command)
// 描  述:   	向PDIUSBD12写数据或命令
// 参  数:   	D_or_C_Addr:地址参数;Data_or_Command:命令或数据参数
// 返回值:   	无
//===================================================================================================
_F_WriteCmdOrDataToD12: .PROC
        push bp to [sp] ;
        bp = sp + 1; 
        push R1,R2 to [sp];
        R1 = [bp+3];              // Address
        R2 = [bp+4] ;             // Data
        call	F_WriteCmdOrDataToD12;
        pop R1,R2 from [sp];
        pop bp from [sp] ;
        retf ;
        .ENDP
F_WriteCmdOrDataToD12:
        push R1,r3 to [sp];

        R1 = R1 lsl 4;
        R1 = R1 lsl 4; 
        R2 = R2 lsl 4;          // shift low 8 bits data to high 8 bits
        R2 = R2 lsl 4;          //        
        [P_IOA_Data] = R1;      // move 02 or 03 Addr to IOA8-IOA15
        
        R1=0x00EF;              // CS_N=0,ALE=IOA7=1,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
        [P_IOB_Data] = R1;      // ALE=1
        
        R1=0x00CF;              // CS_N=0,ALE=IOA7=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
        [P_IOB_Data] = R1;	    // 在ALE 下降沿的时候,D12锁定地址;

        R1=0x008F; 
        [P_IOA_Buffer] = R2;    // 准备数据写入D12
        [P_IOB_Data] = R1;      // CS_N=0,ALE=0,WR_N=0,RD_N=1;RESET_N=1,INT_N=1
        nop;
        R1=0x00CF;				// CS_N=0,ALE=0,WR_N=1,RD_N=1;
        [P_IOB_Data] = R1;
        pop R1,r3 from [sp];
        retf; 

.PUBLIC _F_Clear_WatchDog
_F_Clear_WatchDog:
		PUSH R1 TO [SP];
		R1=0x0001;
		[P_Watchdog_Clear]=R1;
		POP R1 FROM [SP];
		RETF;

⌨️ 快捷键说明

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