📄 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,_c_int1
;===================以下定义变量和常数=======================
.bss GPR0,1
.bss AD_0,1 ;第一个数码管的值
.bss AD_1,1 ;第二个数码管的值
.bss AD_2,1 ;第三个数码管的值
.bss AD_3,1 ;第四个数码管的值
.bss TEMP,1 ;临时变量
.bss TEMP1,1 ;临时变量
.bss DATA1,1
.bss DATA2,1
.bss DATA3,1
.bss DATA4,1
.bss COUNT,1 ;计数值
.bss COUNT1,1 ;计数值
.bss DLY_TIME,1 ;数码管每次显示的时间
.bss SHOW_TIME,1 ;循环周期
.bss INT_FLAG,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 #MCRA>>7
LACL MCRA
OR #04H
SACL MCRA
LDP #WDCR>>7
SPLK #006Fh, WDCR ;看门狗不使能
KICK_DOG
SPLK #0FFFh, GPR0 ;设置整体延时
OUT GPR0, WSGR
LDP #SCSR1>>7
SPLK #0000011010001100B,SCSR1;仅使能ADC EVA EVB时钟 5MHz
SPLK #004Fh,SCSR2
LDP #IMR>>7
SPLK #0001H,IMR ;中端级1使能
;============================================================
LDP #EVBIMRA>>7
SPLK #0H,EVBIMRA ;禁止T3的所有中断,禁止比较中断4,5,6,禁止功率驱动保护中断B(PDPINTB)
SPLK #0H,EVBIMRB ;禁止T4的所有中断(T4上溢下溢周期比较等)
SPLK #0H,EVBIMRC ;禁止捕获中断(CAP4 CAP5 CAP6)
SPLK #0FFFFH,EVBIFRA ;清除全部中断标志"写1清0"T3,比较功率保护等
SPLK #0FFFFH,EVBIFRB ;清T4所有中断标志
SPLK #0FFFFH,EVBIFRC ;清捕获中断标志(CAP4 CAP5 CAP6)
SPLK #0648H,GPTCONB ;0000 0110 0100 1000全局通用定时器控制寄存器B
;T4比较中断启动AD 使能所有通用定时器比较输出
;T4比较输出高有效
SPLK #0h,T3CON ;定时器3控制寄存器不设置,T4的定时器控制寄存器4设置
SPLK #0B46H,T4CON ;连续增减 X/8时钟 内部CPU时钟 比较使能
;0000 1011 0100 0110 ;使用自身寄存器
SPLK #0H,T3PR ;T3周期
SPLK #02000H,T4PR ;T4周期值
SPLK #0H,T3CMPR ;T3比较值
SPLK #1000H,T4CMPR ;T4比较值
SPLK #0H,T3CNT ;T3计数值
SPLK #0H,T4CNT ;T4计数值
SPLK #0H,COMCONB ;EVB中比较控制寄存器B
SPLK #0H,ACTRB ;EVB中比较方式控制寄存器B
SPLK #0H,DBTCONB ;EVB中可编程死区单元
LDP #COUNT
SPLK #0,COUNT ;设置计数初值
SPLK #100,COUNT1
SPLK #0,INT_FLAG
LDP #MCRB>>7
SPLK #0FFFDH,MCRB ;MCRB设置为基本功能,支持在线仿真
LDP #PCDATDIR>>7
SPLK #0FFFDH,PCDATDIR
;============================================================
;外部中断INT
;============================================================
LDP #0E0H
SPLK #01H,XINT1CR ;#01使能外部中断2
;#00屏蔽外部中断2
CLRC INTM ;INTM=0使能全局中断
;INTM=1屏蔽全局中断
;============================================================
MAIN
LDP #DATA1
LACC COUNT ;计算中断数
SACL TEMP ;存入TEMP以送显示
LDP #AD_0
SPLK #0,AD_0
SPLK #0,AD_1
SPLK #0,AD_2
SPLK #0,AD_3
CALL ZS1 ;调用数据处理子程序
LACC AD_0
SACL DATA1
LACC AD_1
SACL DATA2
LACC AD_2
SACL DATA3
LACC AD_3
SACL DATA4
SPLK #0FFH,DLY_TIME ;显示时间
SPLK #0FH,SHOW_TIME ;循环周期
CALL SHOW ;调用显示子程序
CALL SHOW_DLY ;调用显示时间
RPT #10
NOP
LDP #INT_FLAG
LACC INT_FLAG
BCND MAIN,EQ,LT ;标志位,等于或小于0跳转到主程序开始
LDP #COUNT1
LACC COUNT1
SUB #1
SACL COUNT1
BCND MAIN,GT ;大于0,跳转到主程序开始
;确保按键按下去一次只加1
CLRC INTM ;开中断
SPLK #120,COUNT1
B MAIN
;========================中断处理============================
_c_int1:
LDP #0E0H
LACL PIVR
LDP #0E0h
LACL XINT1CR
OR #08000H ;清中断标志
SACL XINT1CR
LDP #COUNT
LACC COUNT
ADD #1
SACL COUNT
SPLK #1,INT_FLAG
RET
;===============数据处理子程序(转化为10进制)=================
ZS1
LDP #TEMP
LACC TEMP
SUB #1000
SACL TEMP
BCND XS1,LT ;LT,ACC<0
LDP #AD_0
LACC AD_0
ADD #1
SACL AD_0
B ZS1
XS1
ADD #1000 ;<1000,恢复为原值
SACL TEMP
XS_1
LACC TEMP
SUB #100
SACL TEMP
BCND XS2,LT
LDP #AD_1
LACC AD_1
ADD #1
SACL AD_1
B XS_1
XS2
ADD #100
SACL TEMP
XS_2
LACC TEMP
SUB #10
SACL TEMP
BCND XS3,LT
LDP #AD_2
LACC AD_2
ADD #1
SACL AD_2
B XS_2
XS3
ADD #10
SACL AD_3
RET
;=====================显示子程序=========================
SHOW
LDP #DATA1
LACC DATA1
SACL TEMP
CALL SEARCH ;加偏移量
CALL S_LED1 ;送数码管显示
LACC DATA2
SACL TEMP
CALL SEARCH
CALL S_LED2
LACC DATA3
SACL TEMP
CALL SEARCH
CALL S_LED3
LACC DATA4
SACL TEMP
CALL SEARCH
CALL S_LED4
SPLK #00FFh,TEMP1
OUT TEMP1,06000h ;此地址为使能端,低电平使能
RET ;这里置高使数码管均不亮
SEARCH ;置偏移量子程序
LDP #TEMP
LACC TEMP
AND #00FFH ;清高位
ADD #TABLE
TBLR TEMP
RET
S_LED1
LDPK TEMP1
RPT #0FH
NOP
SPLK #0E0h,TEMP1 ;LED1片选
OUT TEMP1,06000h ;送数据使能LED1
OUT TEMP,8000h ;数据线显示数据
CALL DELAY ;调用延时
SPLK #0000h,TEMP1
OUT TEMP1,8000h ;数据线置零
RET
S_LED2
RPT #0FH
NOP
SPLK #0D0h,TEMP1 ;LED2片选
OUT TEMP1,06000h
OUT TEMP,8000h
CALL DELAY
SPLK #0000h,TEMP1
OUT TEMP1,8000h
RET
S_LED3
RPT #0FH
NOP
SPLK #0B0h,TEMP1 ;LED3 片选
OUT TEMP1,06000h
OUT TEMP,8000h
CALL DELAY
SPLK #0000h,TEMP1
OUT TEMP1,8000h
RET
S_LED4
RPT #0FH
NOP
SPLK #070h,TEMP1 ;LED4片选
OUT TEMP1,06000h
OUT TEMP,8000h
CALL DELAY
SPLK #0000h,TEMP1
OUT TEMP1,8000h
RET
DELAY:
CLRC SXM ;允许符号位扩展
LDP #DLY_TIME
LACC DLY_TIME ;显示时间
DELAY1:
SUB #01 ;延时子程序
RPT #0FH
NOP
BCND DELAY1,NEQ
NOP
NOP
RET
SHOW_DLY:
CLRC SXM
LDP #SHOW_TIME
LACC SHOW_TIME
DELAY2:
SUB #01
RPT #0FH
NOP
BCND DELAY2,NEQ
NOP
NOP
RET
DEAD_LOOP:
NOP
NOP
NOP
B DEAD_LOOP
;============================================================
;数码管显示字符代码
; _1
; 6| |2
; _7
; 5| |3
; _4 .8
;
;============================================================
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -