📄 main.asm
字号:
.title "main.asm"
.include "F2407REGS.H"
.include "REGS_USER.H"
.global _c_int0
.global GISR1
.global GISR2
.global GISR3
.global GISR4
.global XINT1_ISR
.global XINT2_ISR
.global T3P_ISR
.global T4P_ISR
.global PHANTOM
.ref PVECTORS
;**********************Code Section************************
.text
;**********************主程序******************************
_c_int0:
CALL INIT_SYS ;系统初始化
CALL INIT_16C550 ;SC16C550初始化
CLRC INTM ;开中断
LDP #DP_550
SPLK #0003H,LCR_550
TEST:
; LDP #010H
; SPLK #0078H,TXD_REG
; CALL TRAN
NOP
NOP
NOP
B TEST
;*******************CPU中断1服务程序******************
GISR1:
;保护现场
LDP #DP_USER0
SACL ACC_TEMP ;保护ACC
;保护辅助寄存器
LAR AR0,#ST0_TEMP ;保护ST0和ST1
LAR AR1,#ST1_TEMP
MAR *,AR0
SST #0,*,AR1
SST #1,*
LDP #DP_PF1 ;计算中断子向量地址
LACC PIVR,1
ADD #PVECTORS
BACC ;跳转至子中断服务程序
;*******************外部RS485中断服务程序******************
XINT1_ISR:
LDP #DP_550 ;翻页至400页
BIT LSR_550,BIT0 ;测试SC16C550线状态寄存器值第0位LSR[0]
BCND GISR1_RET,NTC ;若LSR[0]为1,则读取接收数据,否则跳出
LDP #DP_550
LACL RHR_550 ;将接收数据读入ACC
LDP #010H
SACL RXD_REG ;将接收数据放入接收保存寄存器
LDP #0E0h
SPLK #8005h,XINT1CR;标志位清0
B GISR1_RET ;中断返回
;*******************外部并口中断服务程序******************
XINT2_ISR:
;LDP #DP_USER0
;BIT ST_CODE,BIT4
;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;
LDP #DP_USER2
LAR AR3,#P8D_REG
MAR *,AR3
LDP #01A0H
LACL P8DATA ;读并口数据
LDP #DP_USER2
SACL *+
B GISR1_RET ;中断返回
;*******************CPU中断1返回程序***********************
GISR1_RET:
;恢复现场
;恢复ACC
;恢复辅助寄存器
LDP #10H ;恢复ST0和ST1
LAR AR0,#ST0_TEMP
LAR AR1,#ST1_TEMP
MAR *,AR0
LST #0,*,AR1
LST #1,*
CLRC INTM ;开总中断
RET
;*******************CPU中断2服务程序******************
GISR2:
;保护现场
;保护ACC
;保护辅助寄存器
;保护MUX位置
T3P_ISR:
GISR2_RET:
;恢复现场
CLRC INTM ;开总中断
RET
;*******************CPU中断3服务程序******************
GISR3:
;保护现场
GISR3_RET:
;恢复现场
CLRC INTM ;开总中断
RET
;*******************CPU中断4服务程序******************
GISR4:
;保护现场
;保护ACC
;保护辅助寄存器
;保护MUX位置
T4P_ISR:
GISR4_RET:
;恢复现场
CLRC INTM ;开总中断
RET
;*******************假中断服务程序*************************
PHANTOM:
;KICK_DOG
NOP
RET
;******************系统初始化函数*************************
INIT_SYS:
;CPU初始化
SETC INTM ;禁止中断
CLRC SXM ;符号扩展位不使能
CLRC OVM ;累加器中结果正常溢出
CLRC CNF ;CNF=0,可配置的双口RAM区被映射到数据存储空间
;中断配置
LDP #0H
SPLK #0001h,IMR ;INT1中断允许
SPLK #0FFFFh,IFR ;清除所有的中断标志
;系统配置
LDP #0E0h
SPLK #8300h,SCSR1 ;CLIKN=15M, CLKOUT=30M
;LACL SCSR2
;OR #0020H ;DON=1,将0800H-0FFFFH配置为内部SRAM
;SACL SCSR2
;SPLK #01FFH,WSRG
;看门狗配置
SPLK #0E8h,WDCR ;不使能看门狗
;收发控制配置
LDP #DP_PF2 ;设置IOPE2和IOPF0为IO功能
LACL MCRC
AND #0FEFBH
SACL MCRC
LACL PEDATDIR ;设置IOPE2为输出方式
OR #0400H
SACL PEDATDIR
LACL PFDATDIR ;设置IOPF0为输出方式
OR #0100H
SACL PFDATDIR
LACL PEDATDIR ;设置485为接收状态
AND #0FFFBH
SACL PEDATDIR
;外部引脚中断
LDP #DP_PF2 ;设置IOPA2为XINT1功能
LACL MCRA
OR #0004H
SACL MCRA
LDP #0E0h
SPLK #8005h,XINT1CR ;XINT1高优先级上升沿触发
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -