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

📄 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 	GPR0,1  
		.bss  	W_ADDR,1
		.bss    R_ADDR,1
      	.bss  	W_DATA,1
		.bss	R_DATA,1
ST0		.set	0
ST1		.set	1

;======================================================================
;系统初始化
;使能SPI模块,其他的未使能(根据要求使能)。
;======================================================================
        .text                           ;加密位 
        .word   #0ffffh
        .word	#0ffffh
        .word	#0ffffh
        .word	#0ffffh
_c_int0:
	    KICK_DOG
        LDP   	#0H
        SETC  	INTM                    ;屏蔽总中断程序
        CLRC  	SXM                     ;符号位不作扩展
        LACC  	IFR                     ;清标志
        SACL  	IFR
        CLRC  	CNF                     ;B0为数据存储区
        SETC  	OVM
        LDP   	#WDCR>>7
	    SPLK  	#006Fh,	WDCR 	        ;不使能看门狗
        LDP     #06h
	    SPLK   	#00h,	GPR0            ;设置整体延时为0
		OUT    	GPR0,	WSGR
	    LDP   	#SCSR1>>7
	    SPLK  	#0000000000100000B,SCSR1;仅使能SPI模块
	    LDP	  	#IMR>>7
	    SPLK  	#0000H,IMR
	    LDP   	#MCRA>>7
	    SPLK  	#0000000000000000B,MCRA ;A2,B7~B4 I/O(keyboard) 
        SPLK	#0FFDFH,MCRB            ;
;======================================================================
        LDP		#SPICCR>>7
        SPLK	#00FH,SPICCR    ;串行外设接口配置控制寄存器
                                ;位7,SPI软件复位位,用户在改变配置前应该把该位清0
                                ;恢复操作前置1,表示准备发送或接收下一个字符
                                ;位6,为1时,在SPICLK下降沿输出数据,上升沿输入数据
                                ;位6,为0时,在SPICLK上升沿输出数据,下降沿输入数据
                                ;位3,2,1,0数据长度选择位,1111字符长度为16
        SPLK	#0CH,SPICTL     ;1100,串行外设接口操作控制寄存器
                                ;位4,超时中断使能位 0禁止超时中断,1使能超时中断
                                ;位3,SPI时钟相位选择位 0正常的SPI时钟模式
                                ;1延时半个周期的SPICLK信号
                                ;位2,SPI主从工作方式选择位 0从工作方式 1主工作方式
                                ;位1,0 禁止发送 1 允许发送
                                ;位0,SPI中断使能位 0 禁止中断 1 使能中断
        SPLK	#0H,SPIPRI      ;串行外设接口中断优先级控制寄存器
                                ;位6,SPI中断优先级选择位,0 高优先级中断请求 1 低优先级中断请求
                                ;位5,4  00 一旦仿真挂起,立即停止
        SPLK	#07FH,SPIBRR    ;0111 1111串行外设接口波特率设置寄存器
                                ;位7保留,位6~位0 SPIBRR为3~127 设置波特率
                                ;SPI波特率=SYSCLK/(SPIBRR+1)
        SPLK	#0H,SPISTS      ;串行外设接口状态寄存器
                                ;位7 0无中断请求 1中断请求 位6 中断标志位 0无中断请求 1有
                                ;位5 1发送缓冲器中有数据 0无数据
        SPLK	#0EH,SPICTL     ;1110 允许发送
        SPLK	#08FH,SPICCR    ;串行外设接口配置控制寄存器
                                ;恢复操作前置1,表示准备发送或接收下一个字符
	   	LDP     #PCDATDIR>>7
        SPLK	#02000H,PCDATDIR;端口C数据与方向控制寄存器
                                ;位15~8 0配置相应的引脚为输入方式 1配置相应的引脚为输出方式
                                ;位7~0  
                                ;如果引脚为输入方式 0读相应引脚值为低电平 1读相应引脚为高电平
                                ;如果引脚为输出方式 0置相应引脚值使输出低电平 1相反      
;======================================================================
MAIN:

        LDP		#W_ADDR
        SPLK	#10H,W_ADDR     ;写地址最大值为64
        SPLK    #10H,R_ADDR     ;读地址
        SPLK    #06969H,W_DATA  ;写数据
        CALL    SPI_W_R
		
Loop:
		KICK_DOG
		B	    Loop	
;======================================================================
; 子程序
;======================================================================
SPI_W_R
		CALL	E_RASE
		CALL	W_enable
		CALL	W_start
		CALL	W_disable 
	    CALL	R_start 
	    RET 


_ReadSPIbuf:

		BIT		SPISTS,BIT6		;检测SPI INT FLAG位
		BCND 	_ReadSPIbuf,NTC ;等待发送或接收数据完成
		LACL	SPIRXBUF
		KICK_DOG				;将ACC的低位字放到SPIRXBUF中
		RET 
;======================================================================
E_RASE
		LDP     #PCDATDIR>>7    ;硬件设置的输入口为33脚 SPISTE/IOPC5  然后经过一个反相器(74HC14)
	    SPLK	#02000H,PCDATDIR;故将33脚设为普通I/O口
	    LDP		#W_ADDR
	    LACC	W_ADDR
	    AND		#03FH
	    OR      #01C0H          ;擦除代码
	    LDP		#0E0h 
		SACL    SPITXBUF        ;write start bit "1" and operation code
		CALL	_ReadSPIbuf 	
		CALL	_Delay     
		LDP     #PCDATDIR>>7
	    SPLK	#02020H,PCDATDIR
	    CALL	_Delay 
	    CALL	DENG
		CALL	_Delay
		RET
;====================================================================== 
W_enable:
;=================STARRT WRITE ENABLE================================== 	
	    LDP		#0E0h 
	    LDP     #PCDATDIR>>7 
	    SPLK	#02000H,PCDATDIR
	    LDP		#0E0h 
		SPLK	#1001100000000000B,SPITXBUF;write start bit "1" and operation code
		CALL	_ReadSPIbuf 	
		LDP     #PCDATDIR>>7
	    SPLK	#02020H,PCDATDIR
		CALL	_Delay   
		RET         
;====================END WRITE ENABLE==================================
;====================START WRITE=======================================
W_start:
	    LDP     #PCDATDIR>>7 
	    SPLK	#02000H,PCDATDIR  
	    LDP		#W_ADDR
	    LACC	W_ADDR
	    AND		#03FH
	    OR      #0140H            ;写数据代码
		LDP		#0E0h  
		SACL    SPITXBUF          ;write start bit "1" and operation code  
		CALL	_ReadSPIbuf 
		CALL	_Delay
		LDP		#W_DATA
		LACC    W_DATA            ;待写数据
	    LDP		#0E0h   
	    SACL    SPITXBUF          ;write the high "8" bit data
	    CALL	_ReadSPIbuf 
	    CALL	_Delay
	    LDP     #PCDATDIR>>7 
	    SPLK	#02020H,PCDATDIR  
	    CALL	_Delay
        CALL	DENG

		CALL	_Delay
		RET
;====================END WRITE=======================================
;====================START WRITE DISABLE=============================
W_disable:	
	    LDP     #PCDATDIR>>7 
	    SPLK	#02000H,PCDATDIR
		LDP		#0E0h    
		SPLK	#1000000000000000B,SPITXBUF;write start bit "1" and operation code   
		CALL	_ReadSPIbuf 
		CALL	_Delay  
		LDP     #PCDATDIR>>7 
	    SPLK	#02020H,PCDATDIR
		CALL	_Delay
		RET                         
	
;====================END WRITE DISABLE===============================
;========================START READ==================================   
R_start:
		LDP     #PCDATDIR>>7 
	    SPLK	#02000H,PCDATDIR
	    LDP		#R_ADDR
	    LACC    R_ADDR
	    AND     #03FH
	    SFL
	    OR      #0300H	  
		LDP		#0E0h	
		SACL    SPITXBUF        ;write start bit "1" and operation code
		CALL	_ReadSPIbuf	  
		CALL	_Delay 
    	LDP		#0E0h     
		SPLK	#00H,SPITXBUF   ;read the high "8"bits
	    CALL	_ReadSPIbuf 
	    LDP		#R_DATA
	    SACL	R_DATA	
		 LDP     #PCDATDIR>>7 
	    SPLK	#02020H,PCDATDIR
	    CALL	_Delay     
		ret
;========================END READ======================================
_Delay:
  
		RPT     #0FFh
		NOP
		NOP	
		RET
;======================================================================
DENG:
        LDP     #PCDATDIR>>7 
	    SPLK	#02000H,PCDATDIR
		LDP     #0E0H
DD:
		SPLK    #0,SPITXBUF
CC:
		BIT     SPISTS,BIT6
		BCND    CC,NTC  
	 	LACL    SPIRXBUF
	 	SUB     #0FFFFH
	 	BNZ     DD
        RET

    .end

⌨️ 快捷键说明

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