📄 sci_final.asm
字号:
.include "F2407REGS.H" ;引用头部文件
N .set 3 ;发送接收16个数据
RXD_PTR .set 60h ;临时存放接收到的数据
FRE .set 61h
.bss STACK,6
.def _c_int0
;=================================================================================
;(1)建立中断向量表
.sect ".vectors" ;定义主向量段
RSVECT B _c_int0 ;PM 0 复位向量 1
INT1 B GISR1 ;PM 2 中断优先级1 4
INT2 B PHANTOM ;PM 4 中断优先级2 5
INT3 B PHANTOM ;PM 6 中断优先级3 6
INT4 B PHANTOM ;PM 8 中断优先级4 7
INT5 B PHANTOM ;PM A 中断优先级5 8
INT6 B PHANTOM ;PM C 中断优先级6 9
RESERVED B PHANTOM ;PM E (保留位) 10
SW_INT8 B PHANTOM ;PM 10 用户定义软件中断 -
; .
SW_INT31 B PHANTOM ;PM 3E 用户定义软件中断 -
;中断子向量入口定义pvecs
.sect ".pvecs" ;定义子向量段
PVECTORS B PHANTOM ;保留向量地址偏移量0000h
B PHANTOM ;保留向量地址偏移量0001h
B PHANTOM ;保留向量地址偏移量0002h
B PHANTOM ;保留向量地址偏移量0003h
B PHANTOM ;保留向量地址偏移量0004h
B PHANTOM ;保留向量地址偏移量0005h
B SCI_RX_ISR ;保留向量地址偏移量0006h SCI接收中断
B PHANTOM ;保留向量地址偏移量0007h
B PHANTOM ;保留向量地址偏移量0008h
B PHANTOM ;保留向量地址偏移量0009h
B PHANTOM ;保留向量地址偏移量000Ah
B PHANTOM ;保留向量地址偏移量000Bh
B PHANTOM ;保留向量地址偏移量000Ch
B PHANTOM ;保留向量地址偏移量000Dh
B PHANTOM ;保留向量地址偏移量000Eh
B PHANTOM ;保留向量地址偏移量000Fh
B PHANTOM ;保留向量地址偏移量0010h
B PHANTOM ;保留向量地址偏移量0011h
B PHANTOM ;保留向量地址偏移量0012h
B PHANTOM ;保留向量地址偏移量0013h
B PHANTOM ;保留向量地址偏移量0014h
B PHANTOM ;保留向量地址偏移量0015h
B PHANTOM ;保留向量地址偏移量0016h
B PHANTOM ;保留向量地址偏移量0017h
B PHANTOM ;保留向量地址偏移量0018h
B PHANTOM ;保留向量地址偏移量0019h
B PHANTOM ;保留向量地址偏移量001Ah
B PHANTOM ;保留向量地址偏移量001Bh
B PHANTOM ;保留向量地址偏移量001Ch
B PHANTOM ;保留向量地址偏移量001Dh
B PHANTOM ;保留向量地址偏移量001Eh
B PHANTOM ;保留向量地址偏移量001Fh
B PHANTOM ;保留向量地址偏移量0020h
B PHANTOM ;保留向量地址偏移量0021h
B PHANTOM ;保留向量地址偏移量0022h
B PHANTOM ;保留向量地址偏移量0023h
B PHANTOM ;保留向量地址偏移量0024h
B PHANTOM ;保留向量地址偏移量0025h
B PHANTOM ;保留向量地址偏移量0026h
;B T1PINT_ISR ;保留向量地址偏移量0027h,T1PINT中断
B PHANTOM ;保留向量地址偏移量0028h
B PHANTOM ;保留向量地址偏移量0041h
;==============================================================================
;(2)主程序:
.text
; data table
*******************************************************
_c_int0
SETC INTM ;关总中断
CLRC SXM ;符号扩展位清零
CLRC OVM ;清楚溢出标志位
CLRC CNF ;B0区被配置为数据空间
SPM 0 ;乘积输出不移位
LDP #0E0H
SPLK #06FDH,SCSR1 ;CLKIN=10M,1倍频,CLKOUT=10 M
SPLK #0E8h,WDCR ;关看门狗
LDP #00H
SPLK #01H,IMR ;使能INT1,INT2
SPLK #0FFFFh,IFR ;清中断标志
CALL SCI_INIT ;串口初始化
CALL DA_INIT ;DA初始化
LAR AR1,#SCIRXBUF ;接收缓冲寄存器地址
LAR AR2,#RXD_PTR ;接收的数据指针
LDP #00H
SPLK #02H, 60H ;设置默认输出锯齿波
SPLK #0AAH, 61H ;设置默认频率50Hz
SPLK #0AFH, 62H ;设置默认幅值0AFH
SPLK #00H, 67H ;计数清零
SPLK #00H, 68H ;计数清零
SPLK #00H, 69H ;计数清零
LAR AR5,#STACK
CLRC INTM ;开总中断
;=========================================================================
OUTPUT:
LDP #0H ;选择波形
LACL 60H
SUB #01H
BCND A1, EQ ;方波,跳至方波输出程序
SUB #01H
BCND A2, EQ ;锯齿波,跳至锯齿波输出程序
SUB #01H
BCND A3,EQ ;三角波,跳至三角波输出程序
B OUTPUT_END ;波形不正确,跳出中断
A1:
LDP #0H
LACL #07FH ;判断是否到128个点
SUB 67H ;
BCND HIGH, C ;不到的话输出高电平
SPLK #0H, 64H ;到的话输出0
OUT 64H, 0300H
B S1
HIGH: LACL 62H
SACL 64H
OUT 64H, 0300H
S1: LACL #0FFH ;判断是否到256个点
SUB 67H
BCND S2, NEQ ;到256个点就清67H并返回
SPLK #0H, 67H
B OUTPUT_END
S2: LDP #0H ;不到256个点就加1返回
LACL 67H
ADD #01H
SACL 67H
B OUTPUT_END
A2:
LDP #0H
LT 68H ;把记数的值放入TREG
MPY 62H ;和设定的幅值相乘
SPM #0H
PAC ;PREG右移8位给ACC
RPT #7
SFR
SACL 64H
OUT 64H,0300H ;把64H中的值放入0300H
LACL #0FFH ;累加器放入FFH
SUB 68H ;计算是否数了256个点
BCND T1, NEQ
SPLK #0H, 68H ;并把68中的数清0
B OUTPUT_END
T1: LDP #0H ;记数器的值加1并返回
LACL 68H
ADD #01H
SACL 68H
B OUTPUT_END
A3:
LDP #0H
LT 69H ;把记数的值放入TREG
MPY 62H ;和设定的幅值相乘
SPM #0H
PAC ;PREG右移8位给ACC
RPT #7
SFR
SACL 64H
OUT 64H,0300H ;把64H中的值放入0300H
LACL #07FH ;累加器放入7FH
SUB 69H ;计算是否数了128个点
BCND Q1, C
LACL #0FFH
SUB 69H
BCND Q2,NEQ
SPLK #0H,69H
B OUTPUT_END
Q1: LDP #0H ;产生三角波上升沿
LACL 69H
ADD #01H
SACL 69H
B OUTPUT_END
Q2: LDP #0H ;产生三角波下降沿
LACL 69H
SUB #01H
SACL 69H
B OUTPUT_END
OUTPUT_END: ;中断返回
;恢复现场
;
LDP #00H
MAR *,AR6
LAR AR6,61H
WAIT: NOP
B OUTPUT
;=============================================================================
;(3)串行通信初始化程序:
SCI_INIT:
LDP #MCRA>>7
LACL MCRA ;被寻址的存储空间的值加载到累加器ACC的低16位,ACC高16位填零
OR #03H ;将MCRA.0和MCRA.1置1,其余位不变
SACL MCRA ;配置串行口引脚为特殊功能:TXD、RXD
LDP #DP_PF1 ;DP_PF1 .set 224;页(7000h/80h)(0XE0)
SPLK #0007H,SCICCR ;空闲模式,8位数据,;1位停止位, 无奇校验
SPLK #0003H,SCICTL1 ;SLEEP=0
SPLK #0002H,SCICTL2 ;接收、发送中断使能
SPLK #000H,SCIHBAUD
SPLK #081H,SCILBAUD ;波特率为9600 ;10M
SPLK #000H,SCIPRI ;设置为高优先级
SPLK #0027H,SCICTL1 ;串口初始化完成
LAR AR1,#SCIRXBUF ;接收缓冲寄存器地址
LAR AR2,#RXD_PTR ;接收的数据指针
LDP #00H
SPLK #0001h,IMR ;允许INT1中断
SPLK #0FFFFh,IFR ;清所有中断标志
CLRC INTM ;开总中断
RET
;================================================================================
;(4)D/A初始化程序
DA_INIT:
LDP #MCRC>>7 ;IOPE7为output low
LACL MCRC
AND #0FF7FH ;设置为一般I/0口
SACL MCRC
LACL PEDATDIR
OR #8000H ;定义为输出
AND #0FF7FH ;输出值为0
SACL PEDATDIR ;设置输出值
RET
;================================================================================
;(6)SCI接收中断程序
GISR1:
MAR *,AR5
SST #1,*+
SST #0,*+
SACH *+
SACL * ;保护现场
LDP #0E0H
LACC PIVR,1 ;读取外设中断向量寄存器(PIVR),并左移一位
ADD #PVECTORS ;加上外设中断人口地址
BACC ;跳到相应的中断服务子程序
;==================================================
SCI_RX_ISR:
LAR AR1,#SCIRXBUF ;接收缓冲寄存器地址
LDP #DP_PF1
MAR *,AR1
BIT SCICTL1,BIT2
BCND RXD_DATA,NTC ;SLEEP=0,接收数据
LACC * ;读入地址
SUB #3CH
BCND SCI_RX_END,NEQ ;地址错误,退出中断
SPLK #0033H,SCICTL1 ;地址为<,则清SLEEP=0,表示准备接收数据
B SCI_RX_END
RXD_DATA:
;接收N个数据
LACC *,AR2 ;从SCIRXBUR(AR1)读入数据
SACL *+,AR0 ;保存数据,将当前辅助寄存器设置成AR0
LAR AR0,#RXD_PTR
ADRK #N
MAR *,AR2
CMPR 00 ;判断AR2是否与AR0相等,若相等,则已经接受完,TC置1,否则置0
BCND SCI_RX_END,NTC ;判是否接收完,若TC=0,则表示没有接受完,跳转至SCI_RX_END,继续接收
LAR AR1,#SCIRXBUF
LAR AR2,#RXD_PTR ;已接收完,恢复接收的数据指针
LDP #SCICTL1>>7
SPLK #0037H,SCICTL1 ;置SLEEP=1表示准备接收地址
LDP #00H
SPLK #00H, 67H ;计数清零
SPLK #00H, 68H ;计数清零
SPLK #00H, 69H ;计数清零
SCI_RX_END: ;中断返回
MAR *,AR5
LACL *-
ADDH *-
LST #0,*-
LST #1,* ;恢复现场
CLRC INTM ;开总中断,因为一进中断就自动关闭总中断
RET
;==================================================
;(9)假中断程序
PHANTOM
KICK_DOG ;复位看门狗
RET
END
;=================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -