📄 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 *
;============================================================================*
.bss GPR0,1
.bss FLAG,1
.bss COUNT,1
.bss COUNT1,1
.bss TEMP1,1
.bss TEMP,1
.bss TEMP2,1
.bss TEMP3,1
.bss TEMP4,1
.bss DATA1,1
.bss DATA2,1
.bss DATA3,1
.bss DATA4,1
.bss AD_0,1
.bss AD_1,1
.bss AD_2,1
.bss AD_3,1
.bss COUNT_NEW,1
.bss COUNT_OLD,1
.bss FLAG1,1
.bss DATA_H,1
.bss DATA_L,1
.bss DLY_TIME,1
.bss SHOW_TIME,1
.include "F2407.h" ;头文件
.def _c_int0,CAP_INT,time_int
ST0 .SET 0
ST1 .SET 1
ST0_SAVE .usect ".blk0",1
ST1_SAVE .usect ".blk0",1
ACCH .usect ".blk0",1
ACCL .usect ".blk0",1
P_HI .usect ".blk0",1
P_LO .usect ".blk0",1
T_SAVE .usect ".blk0",1
;======================================================
;宏子程序
;======================================================
KICK_DOG .macro ;看门狗
LDP #00E0h
SPLK #05555h, WDKEY
SPLK #0AAAAh, WDKEY
LDP #0h
.endm
;======================================================
;系统初始化
;使能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 ;整体延时为0
LDP #SCSR1>>7
SPLK #0000000011111100B,SCSR1;使能ADC,SCI,SPI,CAN,EVB,EVA时钟
LDP #IMR>>7
SPLK #000AH,IMR ;INT2,INT4使能
LDP #EVBIMRA>>7
SPLK #80H,EVBIMRA ;通用定时器T1,周期中断使能
SPLK #00H,EVBIMRB ;通用定时器T2,均不使能
SPLK #04H,EVBIMRC ;捕获单元3中断使能
SPLK #0FFFFH,EVBIFRA ;写1清除EVB中的所有标志位
SPLK #0FFFFH,EVBIFRB
SPLK #0FFFFH,EVBIFRC
SPLK #01046H,T4CON ;0001 0000 0100 0110 连续增计数,使能定时器,使用自身周期寄存器
SPLK #0,T4CNT
LDP #PCDATDIR>>7
SPLK #0FFFDH,PCDATDIR ;配置相应引脚为输出,并使输出为高。
LDP #MCRC>>7
SPLK #0FFFFH,MCRC ;I/O复用采用所有基本功能,使能CAP6
LDP #CAPCONB>>7
SPLK #1208H,CAPCONB ;定时器4为CAP6计数器0001 0010 0000 1000
;使能CAP6,CAP6选用通用定时器2;CAP4,CAP5选用通用定时器1;CAP6检测下降沿.
SPLK #0,CAPFIFOB ;所有捕获单元的栈均为空
;======================================================
SPLK #0041H,GPTCONB ;
SPLK #164Ch,T3CON ;16
SPLK #134Ch,T4CON
SPLK #0FH,T3PR ;定时器1周期寄存器
SPLK #0FFFFH,T4PR
SPLK #00H,T3CNT ;定时器1计数器
SPLK #164CH,T4CNT ;定时器2计数器
SPLK #1010111000000000B,COMCONB;
SPLK #00H,ACTRB ;PWM1-6输出控制
SPLK #0FC0H,DBTCONB ;死区设置
LDP #MCRB>>7
SPLK #0FFFDH,MCRB
LDP #PCDATDIR>>7
SPLK #0FFFDH,PCDATDIR
LDP #COUNT
SPLK #3,COUNT
SPLK #0fH,COUNT1
SPLK #0,DATA_L
SPLK #0,DATA_H
LDP #TEMP3
SPLK #0H,TEMP3
OUT TEMP3,6000H ;使能数码管
SPLK #0FFFFH,TEMP4
OUT TEMP4,2000H ;不使能I/O控制单元发光二极管
;======================================================
CLRC INTM ;开中断
PP:
NOP
NOP
NOP
B PP
time_int
LDP #ST0_SAVE
SST #ST0,ST0_SAVE
SST #ST1,ST1_SAVE
LDP #ACCH
SACH ACCH
SACL ACCL
LDP #COUNT
LACC COUNT
BZ SH1
SUB #1
BZ SH2
SUB #1
BZ SH3
SUB #1
BZ SH4
B TIME_END
SH1
CALL S_LED4
B TIME_END
SH2
CALL S_LED3
B TIME_END
SH3
CALL S_LED2
B TIME_END
SH4
CALL S_LED1
TIME_END
LACC COUNT
SUB #1
SACL COUNT
BCND CNT_END,GT,EQ ;ACC>0,ACC=0跳转
SPLK #3,COUNT
CNT_END
LDP #EVBIFRA>>7
SPLK #0FFFFH,EVBIFRA
LDP #ACCH
LACC ACCH,16
ADDS ACCL
LDP #ST1>>7
LST #ST1,ST1_SAVE
LST #ST0,ST0_SAVE
CLRC INTM
RET
;======================================================
CAP_INT:
;=======================保护现场=======================
LDP #ST0_SAVE
SST #ST0,ST0_SAVE
SST #ST1,ST1_SAVE
LDP #ACCH
SACH ACCH
SACL ACCL
CLRC SXM
LDP #T4CNT>>7
LACC T4CNT
LDP #COUNT_NEW
SACL COUNT_NEW
SUB COUNT_OLD
SACL FLAG1
LACC COUNT_NEW
SACL COUNT_OLD
LDP #EVBIMRA>>7
SPLK #04H,EVBIFRC
LACC EVBIFRC
SACL EVBIFRC
LDP #FLAG1
LACC DATA_L
ADD DATA_H,16
ADD FLAG1
SACL DATA_L
SACH DATA_H
LACC COUNT1
SUB #1
SACL COUNT1
BNZ CAP_END
LACC DATA_L
ADD DATA_H,16
SFR
SFR
SFR
SFR
SFR
SFR
SFR
SACL FLAG
SPLK #128,COUNT1
SPLK #0,DATA_L
SPLK #0,DATA_H
CALL SHOW_L
;======================恢复保护========================
CAP_END
LDP #ACCH
LACC ACCH,16
ADDS ACCL
LDP #ST1>>7
LST #ST1,ST1_SAVE
LST #ST0,ST0_SAVE
CLRC INTM
RET
;======================================================
SHOW_L
CLRC SXM
LDP #DATA1
SPLK #4cH,TEMP2
LACC TEMP2,16
ADD #04b40H
RPT #15
SUBC FLAG
SACL TEMP
CALL ZS1
LDP #AD_0
LACC AD_0
SACL DATA1
LACC AD_1
SACL DATA2
LACC AD_2
SACL DATA3
LACC AD_3
SACL DATA4
RET
ZS1
CLRC SXM
LDP #TEMP
LACC TEMP
SUB #9999
BCND CON1,LT,EQ ;ACC<0,ACC=0跳转
SPLK #09999,TEMP
CON1 ;数据处理,转化为十进制形式
SPLK #1000,TEMP2
LACC TEMP
RPT #15
SUBC TEMP2 ;/1000
SACL AD_0
SACH TEMP
SPLK #100,TEMP2
LACC TEMP
RPT #15
SUBC TEMP2 ;/100
SACL AD_1
SACH TEMP
SPLK #10,TEMP2
LACC TEMP
RPT #15
SUBC TEMP2 ;/10
SACL AD_2
SACH AD_3 ;存个位
RET
S_LED1
SPLK #0000h,TEMP1
OUT TEMP1,08000h ;数据线置零
RPT #07H
NOP
LDPK TEMP1
SPLK #00E0h,TEMP1 ;LED1 片选
OUT TEMP1,06000h
LACC DATA1
AND #00FFH
ADD #TABLE
TBLR TEMP
LACC TEMP
ADD #80H
SACL TEMP ;加小数点
OUT TEMP,08000h ;数据线显示数据
RET
S_LED2
SPLK #0000h,TEMP1
OUT TEMP1,08000h
RPT #07H
NOP
SPLK #00d0h,TEMP1 ;LED2 片选
OUT TEMP1,06000h
LACC DATA2
ADD #TABLE
TBLR TEMP
OUT TEMP,08000h
RET
S_LED3
SPLK #0000h,TEMP1
OUT TEMP1,08000h
RPT #07H
NOP
SPLK #00b0h,TEMP1 ;LED3 片选
OUT TEMP1,06000h
LACC DATA3
ADD #TABLE
TBLR TEMP
OUT TEMP,08000h
RET
S_LED4
SPLK #0000h,TEMP1
OUT TEMP1,08000h
RPT #07H
NOP
SPLK #0070h,TEMP1 ;LED4 片选
OUT TEMP1,06000h
LACC DATA4
ADD #TABLE
TBLR TEMP
OUT TEMP,08000h
RET
;===============================================
TABLE:
.word #003Fh ;0
.word #0006h ;1
.word #005Bh ;2
.word #004Fh ;3
.word #0066h ;4
.word #006Dh ;5
.word #007Dh ;6
.word #0007h ;7
.word #007Fh ;8
.word #006Fh ;9
.word #0077h ;A
.word #007Ch ;B
.word #0039h ;C
.word #005Eh ;D
.word #0079h ;E
.word #0071h ;F
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -