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

📄 system.asm

📁 台湾凌阳单片机SPCE061A单芯片做的一个带按健LCD显示
💻 ASM
字号:
//====================================================================================//
// 文件名:    system.asm
// 描  述:   该文件的程序主要用于初始化SPCE061A和PDIUSBD12,以及对PDIUSBD12的读写操作
// 日  期:   2003/04/03
//====================================================================================//
.include hardware.inc; 
//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频率

.define D12_ALE     0X0020      //==IOB5
.define D12_CE      0X0010      //==IOB4
.define D12_RE      0X0400      //==IOB10
.define D12_WE      0X0200      //==IOB9
.define D12_RESET   0X0100      //==IOB8
.code 	
//====================================================================
// 函  数:    F_System_Initial()
// 语  法:    void F_System_Initial(void) (for c)
// 描  述:    该函数用于初始化SPCE061A的中断、时钟、I/0、复位PDIUSBD12
//			  初始化:
//			
//			  IOB2=INT_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=R1|CPU_CLK_RATE|0X08;       //设置系统时钟  
	    [P_SystemClock]=R1;	
	    
	
	    
	    R1=0xfFFF ;           
	    [P_IOB_Data]=R1;   
	    
	    R1=0xFFFb ; 
	    [P_IOB_Attrib]=R1;      //不选中D12,FLASH  
	    
	    R1=0xFFFb;              //设置IOB2=D12_int=输入,其他都输出,皆为高电平
	    [P_IOB_Dir]=R1;    
	 
	    R1=0x9eEF; 
	   [P_IOB_Data]=R1;   	    //CS_N=0,ALE=1,WR_N=1,RD_N=1,RESET_N=0,INT_N=1
        call F_Delay;      	    //D12系统复位延时。
	   
	    R1=0x9ffF;
	    [P_IOB_Data]=R1;   	    //CS_N=1,ALE=1,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
	    
	    R1=0xFFFF; 		    //设置IOA0-IOA15为带上拉电阻地输出
	      
	    
	    [P_IOA_Data]=R1;        //设置IOA0-IOA15为同相高电平输出
	    [P_IOA_Attrib]=R1;     
	    [P_IOA_Dir]=R1;   
	    	        
	    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_InitWriteD12()
// 语  法:    	void F_TurnOffFirstLed(void)
// 描  述:   	初始化写PDIUSBD12
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_InitWriteD12:         .proc
		push R2,R2 to [sp];
		
		r2=[P_IOA_Dir] ;
	    R2 |= 0xffff;          //设置为输出
        [P_IOA_Dir] = R2;   
              
        r2=[P_IOA_Data];
	    R2 |= 0xFFFF;          //都为高电平
        [P_IOA_Data] = R2;
           
        setbit(D12_RESET|D12_RE|D12_WE);
        nop;
        clrbit((~D12_ALE)&(~D12_CE));
        nop;      
        pop R2,R2 from [sp];
        retf ;
        .endp
//====================================================================
// 函  数:    	F_InitReadD12()
// 语  法:    	void F_InitReadD12(void)
// 描  述:   	初始化读PDIUSBD12
// 参  数:   	无
// 返回值:   	无
//=====================================================================
_F_InitReadD12:          .PROC
		push R1,R1 to [sp];
		      
        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,r4 to [sp]; 
       
        r4=[P_IOA_Data]
        r4|=0x00ff;
        r1|=0xff00;
        r1=r1&r4; 
        [P_IOA_Data] = R1;       // 送偶地址到D12
        nop;
        r1=[P_IOA_Dir] ; 
        R1 &= 0xFF00 ;          //  IOA端口设置为输入
        [P_IOA_Dir] = R1;  
        
        nop;                   //   CS_N=0, ALE=IOB8=1,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
        clrbit(~D12_CE);
        nop;
        setbit(D12_ALE);
        nop;
        clrbit(~D12_ALE);
        nop;                   //   CS_N=0,ALE=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
        clrbit(~D12_RE);
                               //   CS_N=0,ALE=0,WR_N=1,RD_N=0;RESET_N=1,INT_N=1
        nop;
        
        R1 = [P_IOA_Data];    // Get data
        nop;
       
        setbit(D12_CE|D12_RE);
       
       r2=[P_IOA_Dir] ; 
       R2 |= 0xFFff ;         // IOA端口设置为输出
       [P_IOA_Dir] = R2;   
		pop R2,r4 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,R4 to [sp];
        R1 = [bp+3];              // Address
        R4 = [bp+4] ;             // Data
        call	F_WriteCmdOrDataToD12;
        pop R1,R4 from [sp];
        pop bp from [sp] ;
        retf ;
        .ENDP
F_WriteCmdOrDataToD12:
        push R1,r3 to [sp];

        r3=[P_IOA_Data]
        r3|=0x00FF;
        r1|=0xFF00;
        r1=r1&r3;           //        
        [P_IOA_Data] = R1; 
           
                            // CS_N=0,ALE=IOA7=1,WR_N=1,RD_N=1,RESET_N=1,INT_N=1
        nop;    
        setbit(D12_ALE);
        nop;
        clrbit(~D12_ALE);
                           // CS_N=0,ALE=IOA7=0,WR_N=1,RD_N=1;RESET_N=1,INT_N=1
        nop;              // 在ALE 下降沿的时候,D12锁定地址;
        [P_IOA_Buffer] = R4;    // 准备数据写入D12
        nop;
        clrbit(~D12_WE);
                          //  CS_N=0,ALE=0,WR_N=0,RD_N=1;RESET_N=1,INT_N=1
        nop;
       
        setbit(D12_WE|D12_CE);
        
        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 + -