📄 main.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 + -