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

📄 main.asm

📁 2407的一些源代码
💻 ASM
字号:
;==========================================================================*
* File name : main.asm *
* Author: Qu Bo *
* Data: 2006.11.19*
* Version: 2.0 *
* Organization: DSP&EMC,National Key Laboratory of Power Electronics, 
*               Zhejiang University, Hangzhou 310027, China *
* Description : PROGRAM TO CONTROL A ELECTRIC CAR USE F2407A * 

;============================================================================*
        .include "F2407.H" 
        .def  	_c_int0
        .bss  	TEMP1,1 
        .bss  	DATA1,1
        .bss  	DATA2,1
        .bss  	FLAG,1
        .bss  	GPR0,1
        .bss    COUNT,1
        .bss 	DATA,1
        .bss	W_PLACE,1
        .bss	W_ADDR,1
        .bss	W_DATA,1
        .bss	R_PLACE,1
        .bss	R_ADDR,1
        .bss	R_DATA,1

;======================================================
;系统初始化
;使能EVA,EVB,A/D模块,其他的未使能(根据要求使能)
;======================================================
        .text                        ;加密位
        .word   #0ffffh
        .word	#0ffffh
        .word	#0ffffh
        .word	#0ffffh
_c_int0:
        LDP   	#0H
        SETC  	INTM                 ;屏蔽总中断程序
        CLRC  	SXM                  ;符号位不作扩展
        LACC  	IFR                  ;清标志
        SACL  	IFR
        CLRC  	CNF                  ;B0为数据存储区
        SETC  	OVM
        LDP   	#WDCR>>7
	    SPLK  	#006Fh,	WDCR 	     ;看门狗不使能
	    KICK_DOG  
	    SPLK   	#00h, GPR0
		OUT    	GPR0, WSGR           ;整体不设置延时
	    LDP   	#SCSR1>>7
	    SPLK  	#0000000011101100B,SCSR1
        LDP     #TEMP1
        SPLK    #0FFFFH,TEMP1
        OUT     TEMP1,2000H          ;使I/O单元的发光二极管不亮
        OUT     TEMP1,6000H          ;使数码管不亮
                  
INIT
		LDP		#MCRA>>7
		SPLK	#0H,MCRA             ;将I/O复用引脚IOPAn,IOPBn设置为普通I/O口
		SPLK	#03030H,PBDATDIR     ;因为E2PROM使用IOPB4,IOPB5两个引脚,故设置
		                             ;此两引脚为输出向IOPB4,IOPB5写1,即使SCL=SDA=1
		LDP		#T1CON>>7

		SPLK	#0080H,EVAIMRA 
		SPLK    #0FFFFH,EVAIFRA
  
		LDP		#FLAG
		SPLK	#0,FLAG 
		LDP		#COUNT
		SPLK	#0,COUNT
		SPLK	#0,R_DATA
        CLRC	INTM
;======================================================
MAIN
        LDP		#W_ADDR
        SPLK	#02H,W_PLACE         ;写存储区位置 0~8个区
        SPLK	#03H,W_ADDR          ;写存储区地址0~256
        SPLK	#0EFH,W_DATA         ;写入数据0H~0FFH
        SPLK	#02H,R_PLACE         ;读存储区位置 0~8个区
        SPLK	#03H,R_ADDR          ;读存储区地址0~0FFH
                                     ;注意读和写的地址应相同
        
        CALL    R_WRITE              ;调用R_WRITE子程序
        CALL    R_READ               ;调用R_READ子程序
LOOP
        NOP
        NOP
        NOP
        B       LOOP
;======================================================
R_WRITE
		NOP
		NOP
		CALL	START                ;调用开始状态子程序
		LDP		#DATA
		LACC    W_PLACE              ;设置写存储区
		SFL
		AND     #0EH
		OR      #0A0H
		SACL    DATA                 ;写控制命令
		CALL	WRITE                ;调用写子程序
		CALL	ACK                  ;调用应答子程序
		LDP		#DATA
		LACC    W_ADDR               ;写地址
		SACL    DATA
		CALL	WRITE
		CALL	ACK
		LDP		#DATA
		LACC    W_DATA
		SACL    DATA                 ;写数据
		CALL	WRITE
		CALL	ACK
		CALL	STOP                 ;调用结束子程序 
		RET
		
R_READ
		CALL	DELAY1
		CALL	START                ;调用开始状态子程序
		LDP		#DATA
		LACC    R_PLACE              ;设置读存储区
		SFL
		AND     #0EH
		OR      #0A0H
		SACL    DATA                 ;读写控制命令
		CALL	WRITE                ;调用写子程序
		CALL	ACK                  ;调用应答子程序
		LDP		#DATA
		LACC    R_ADDR
		SACL    DATA
		CALL	WRITE                ;写地址
		CALL	ACK                  ;调用写子程序
		CALL	START                ;调用应答子程序
		LDP		#DATA
		LACC    R_PLACE
		SFL
		AND     #0EH                 ;设置读存储区
		OR      #0A1H
		SACL    DATA                 ;读命令
		CALL	WRITE                ;调用写子程序
		CALL	ACK                  ;调用应答子程序
		CALL	READ                 ;调用读数据子程序
		CALL	STOP                 ;调用结束子程序
		RET
;******************开始状态子程序*****************		
START   
		LDP		#PBDATDIR>>7
		LACC	PBDATDIR
		SPLK	#03030H,PBDATDIR     ;设置IOPB4=1,IOPB5=1即SCL=1,SDA=1 
		CALL	DELAY
		LDP		#PBDATDIR>>7
		SPLK	#03010H,PBDATDIR     ;设置IOPB4=1,IOPB5=0即SCL=1,SDA=0
		NOP
		CALL	DELAY 
		SPLK	#03000H,PBDATDIR     ;设置IOPB4=0,IOPB5=0即SCL=0,SDA=0
        RET
;*******************写数据子程序*****************
WRITE
		CALL	DELAY
		LDP		#DATA
		LACC	DATA,1               ;DATA数据左移1位,低位填0
		SACL	DATA
		BIT		DATA,BIT8            ;比较BIT8,若为1跳转到SET段
		BCND	SET,TC               ;若为0,直接执行下边的程序
		LDP		#PBDATDIR>>7 
		LACC	PBDATDIR
		AND		#0F0D0H              ;使IOPB5=0,保持IOPB4不变,即使SDA=0
		SACL	PBDATDIR
		NOP
		B		CONTIUE
SET
		LDP		#PBDATDIR>>7 
		LACC	PBDATDIR
		OR		#0F020H              ;使IOPB4=0,保持IOPB5不变,即使SCL=0
		SACL	PBDATDIR
		NOP
CONTIUE
		CALL	DELAY                ;延时
		LDP		#PBDATDIR>>7 
		LACC	PBDATDIR
		OR		#0F010H              ;使IOPB4=1,保持IOPB5不变,即使SCL=1
		SACL	PBDATDIR
		NOP 
		CALL	DELAY
		CALL	DELAY 
		LDP		#PBDATDIR>>7 
		LACC	PBDATDIR
		AND		#0F0E0H              ;使IOPB4=0,保持IOPB5不变,即使SCL=0
		SACL	PBDATDIR
		NOP
		LDP		#COUNT
		LACC	COUNT                ;COUNT计数,当发送完8个数据(包括8位地址数据)后
		ADD		#1                   ;此段程序执行完毕。否则,继续执行WRITE子程序 
		SACL	COUNT
		SUB		#8
		BNZ		WRITE
		LDP		#COUNT
		SPLK	#0,COUNT
	    RET 

*************应答信号子程序********************
ACK		
		CALL	DELAY                ;延时
		LDP		#PBDATDIR>>7
		SPLK	#01000H,PBDATDIR     ;使IOPB4=0即SCL=0,注意高8位中为0时,相对应的低8位设置无作用
		NOP
		NOP
		CALL	DELAY
		LACC	PBDATDIR
		NOP 
ACK_C	
		BIT		PBDATDIR,BIT5        ;判断IOPB5即SDA是否为0	
		BCND	ACK_C,TC             ;若为0,执行下边的语句
		SPLK	#01010H,PBDATDIR     ;使IOPB4=1即SCL=1
		CALL	DELAY                ;延时
		CALL    DELAY                ;延时
		SPLK	#01000H,PBDATDIR     ;使IOPB4=0即SCL=0
		NOP  
		SPLK	#03000H,PBDATDIR     ;使IOPB4=0即SCL=0,使IOPB5=0即SDA=0
		RET       
******************结束子程序*******************
STOP

		CALL	DELAY
		LDP		#PBDATDIR>>7
		SPLK	#03000H,PBDATDIR     ;使IOPB4=IOPB5=0即 SCL=SDA=0
		CALL	DELAY                ;延时 
		SPLK	#03010H,PBDATDIR     ;使IOPB4=1即SCL=1,使IOPB5=0即SDA=0
		CALL	DELAY                ;延时
		SPLK	#03030H,PBDATDIR     ;使IOPB4=1即SCL=1,使IOPB5=1即SDA=1
		CALL	DELAY                ;延时
		SPLK	#00000H,PBDATDIR     ;关闭I/O口,即关闭SCL和SDA线
		RET	
*******************读数据子程序*****************
READ
		LDP		#PBDATDIR>>7
		LACC	PBDATDIR
		SPLK	#01000H,PBDATDIR     ;使IOPB4=0即SCL=0
READ_L
		CALL	DELAY                ;延时
		CALL	DELAY                ;延时
		SPLK	#01010H,PBDATDIR     ;使IOPB4=1即SCL=1
		CALL	DELAY                ;延时
		LACC	PBDATDIR
		BIT		PBDATDIR,BIT5        ;判断IOPB5即SDA是否为0	
		BCND	R_SET,TC             ;若为0,执行下边的语句
		LDP		#R_DATA
		LACC	R_DATA
		SFL
		AND		#0FFFEH
		SACL	R_DATA
		B		CON_R
R_SET
		LDP		#R_DATA
		LACC	R_DATA 
		SFL
		OR		#01H
		SACL	R_DATA
CON_R
		LDP		#COUNT
		LACC	COUNT
		ADD		#1
		SACL	COUNT
		SUB		#8
		BZ		READ_END 
		CALL	DELAY
		LDP		#PBDATDIR>>7
		LACC	PBDATDIR
		SPLK	#1000H,PBDATDIR
		B		READ_L
READ_END
		LDP		#COUNT
		SPLK	#0,COUNT
		CALL	DELAY
		
		RET
*******************延迟子程序*******************
DELAY
		RPT		#50
		NOP
		RET
DELAY1
		LACC	#8800H  
D_LOOP		
		SUB		#1
		BNZ		D_LOOP
		RET
	    .END

⌨️ 快捷键说明

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