📄 main.asm
字号:
;============================================================================*
.include "F2407.h" ;头文件
.bss GPR0,1
.bss TEMP,1
.bss TEMP1,1
.bss TEMP2,1
.bss TEMP3,1
.bss TEMP4,1
.bss COUNT,1
.def _c_int0
;======================================================
KICK_DOG .macro ;看门狗宏指令
LDP #00E0h ;指针指向7000h~707Fh单元
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 #01FFh, GPR0
OUT GPR0, WSGR ;设置整体延时
LDP #SCSR1>>7
SPLK #0000011010001100B,SCSR1;仅使能ADC EVA EVB时钟,节能
LDP #IMR>>7
SPLK #0001H,IMR ;中端级1使能
LDP #COUNT
SPLK #0FFH,COUNT ;赋COUNT初始值
SPLK #0FFH,TEMP4 ;初始状态送高电平,使所有的灯灭
OUT TEMP4,2000H ;地址2000H~3FFFH均有效
;======================================================
MAIN:
;===============算术,逻辑指令=========================
NOP ;空操作指令
LDP #06H ;指定存储器页地址为6H
LACC #055AAH ;立即数55AAH存入ACC
SACL TEMP ;ACC低16位存入TEMP
ADD #010H ;立即数010H加给ACC
SUB #0FFFFH ;ACC减去立即数0ffffH
ABS ;ACC取绝对值
AND #00FF0H ;ACC与00ff0H相与
OR #0FF00H ;ACC与0ff00H相或
SFL ;ACC值整体左移一位,相当于×2
SFR ;ACC值整体右移一位,相当于/2
;===============辅助寄存器指令=========================
MAR AR3 ;修改当前AR为AR3
LAR AR3,#TEMP ;间接装入TEMP的地址到AR3
SACL *+,AR3 ;ACC存入AR3所指的地址空间
;且AR3=AR3+1
LACC *+,AR3 ;从AR3所指的地址空间值装入ACC
;且AR3=AR3+1
;====================乘法指令==========================
LDP #TEMP1 ;页地址指向TEMP1所在页
LT TEMP1 ;TEMP1装入TREG
MPY TEMP ;TREG乘TEMP
;乘积装入PREG寄存器
SPM 0 ;设置PREG装入ACC时位移量为0
PAC ;PREG装入ACC
;===============I/O及存储器指令========================
LACC #01H ;立即数01H装入ACC
ADD #TABLE ;TABLE加给ACC
TBLR TEMP2 ;读取ACC所对应的地址区值
;并将该值存入TEMP2
OUT TEMP2,04000H ;将TEMP2
;输出值I/O地址为4000H的外设和外扩存储器中
IN TEMP2,04001H ;将I/O地址为4001H的外设和外扩存储器中的数据
;存入TEMP2
ADD #1H ;立即数1加给ACC
TBLR TEMP2 ;将TEMP2
;存入ACC所对应的地址区
;===============跳转及控制指令=========================
LDP #COUNT ;选择页地址
LACC TEMP3 ;TEMP3装入ACC
BCND GT0,GT ;ACC大于0则跳至GT0
LACC COUNT ;将COUNT装入ACC
SUB #1 ;COUNT减1
SACL COUNT ;将ACC的值存入COUNT中
RPT #0FFH ;延时
NOP ;空指令
BNZ MAIN ;COUNT不等于0 跳至MAIN
LDP #TEMP4 ;打开TEMP4所在的页
RPT #0FH ;延时
NOP ;空指令
SPLK #0FFH,TEMP4 ;此两句赋值将TEMP4的值送给灯,灯灭
OUT TEMP4,2000H ;地址2000H~3FFFH均有效
SPLK #1,TEMP3 ;TEMP3置为1
SPLK #03FFFH,COUNT ;改变此处COUNT的值,调整灯灭的时间
B MAIN ;返回MAIN
GT0
LACC COUNT ;将COUNT装入ACC
SUB #1 ;COUNT减1
SACL COUNT ;将ACC的值存入COUNT中
RPT #0FFH ;重复执行空指令以实现延时
NOP ;
BNZ MAIN ;COUNT不等于0 跳至MAIN
LDP #TEMP4 ;打开TEMP4所在的页
RPT #0FH ;延时
NOP ;空指令
SPLK #000H,TEMP4 ;此两句赋值将TEMP4的值送给灯,灯亮
OUT TEMP4,3FFFH ;地址2000H~3FFFH均有效
SPLK #0,TEMP3 ;TEMP3置为0
SPLK #03FFFH,COUNT ;改变此处COUNT的值,调整灯亮的时间
B MAIN ;返回MAIN
;======================数据区==========================
.data
TABLE
.WORD 00000H
.WORD 0000FH
.WORD 000F0H
.WORD 00F00H
.WORD 0F000H
.WORD 0FFFFH
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -