📄 sci.asm
字号:
;=====================================================
.include "2407.h" ;头文件,2407寄存器的设置
.include "intx.h" ;头文件,中断向量表的设置
.include "varx.h" ;头文件,变量的定义
.include "conx.h" ;头文件,常量的定义
;=====================================================
.def _c_int0
;===========================================
.text
;===========================================
_c_int0:
CALL SYSINIT ;系统初始化
CALL IOINIT ;IO初始化
CALL SCI_INIT ;SCI初始化
LDP #05H
; SPLK #01H,SCI_FLAG ;发送标志位赋初值,test
SPLK #0H,SCI_FLAG ;清发送标志位
; SPLK #055H,TXD_PTR
SPLK #0ffH,TXD_PTR
;////////////////////////////////////////////
WAIT:
CALL SCI_RX
CALL SCI_TX
B WAIT
;========================================================
;系统初始化子程序
;////////////////////////////////////////////////////////
SYSINIT:
SETC INTM ;禁止所有可屏蔽中断
CLRC SXM ;禁止符号扩展
CLRC OVM ;累加器结果正常溢出
CLRC CNF ;配置B0为数据存储空间
LDP #0E0H
SPLK #81FEH,SCSR1 ;4倍频,24M,DEMO板用的是6M时钟
SPLK #0E8H,WDCR ;关看门狗
LDP #0H
SPLK #0H,IMR ;关闭所有可屏蔽中断,test
; SPLK #01H,IMR ;打开中断1
SPLK #0FFFFH,IFR ;清所有中断标志位
; CLRC INTM ;开总中断,test
RET
;=========================================================
IOINIT:
LDP #0E1H
LACL MCRA ;配置IOPA0和IOPA1口为串行口,TXD,RXD
OR #03H
SACL MCRA
RET
;=========================================================
SCI_INIT:
LDP #0E0H
SPLK #0FH,SCICCR ;地址位唤醒模式,8位数据,1位停止位,无奇偶校验
SPLK #07H,SCICTL1 ;接收、发送、内部时钟使能,SLEEP=1
SPLK #0H,SCICTL2 ;接收中断使能,test
; SPLK #02H,SCICTL2 ;接收中断使能
SPLK #01H,SCIHBAUD ;波特率=9600
SPLK #038H,SCILBAUD ;波特率=9600
SPLK #027H,SCICTL1 ;串口初始化完成
; LAR AR1,#SCIRXBUF ;接收缓冲寄存器地址7057h
; LAR AR2,#SCITXBUF ;发送缓冲寄存器地址7059h
; LAR AR3,#RXD_PTR ;接收数据指针
; LAR AR4,#TXD_PTR ;发送数据指针
RET
;=========================================================
SCI_RX: ;接收子程序
; LDP #00H ;TEST
; SPLK #01H,SCI_FLAG ;TEST
LDP #0E0H
BIT SCIRXST,BIT6 ;查询方式,判断SCI是否接到新信息7055H
BCND SCI_RX_OK,NTC ;1表示接到,0表示未接到
LACL SCIRXBUF ;读接收缓冲器中的数据
LDP #05H
SACL RXD_PTR ;保存在接收变量中,028DH起始地址
; SUB #0AAH ;TEST
SUB #0bbH
BCND SCI_RX_OK,NEQ ;TEST
LDP #05H
SPLK #01H,SCI_FLAG
; LACL SCI_FLAG
; ADD #01H
; AND #0FH
; SACL SCI_FLAG
;/////////////////////////////////////////////////////////
SCI_RX_OK:
RET
;=========================================================
SCI_TX: ;SCI发送子程序
;/////////////////////////////////////////////////////////
;以下是SCI发送子程序用到的辅助寄存器初始化定义
LAR AR1,#SCIRXBUF ;接收缓冲寄存器地址7057h
LAR AR2,#SCITXBUF ;发送缓冲寄存器地址7059h
LAR AR3,#RXD_PTR ;接收数据指针
LAR AR4,#TXD_PTR ;发送数据指针
;/////////////////////////////////////////////////////////
LDP #05H
LACL SCI_FLAG
; LACL #01H ;TEST
BCND SCI_TX_OK,EQ ;若SCI_FLAG=1,则发送数据
; BCND SCI_TX_OK,NEQ ;若SCI_FLAG=0,则发送数据
;////////////////////////////////////////////////////////
;以下是发送数据程序
MAR *,AR0 ;SCI_FLAG.0=1,发送数据
LAR AR0,#TXD_PTR ;285h
ADRK #02H ;N+1,发送N个数据,TEST发送1个数据,AR0=287H
MAR *,AR4
TXD_DATA:
LACC *+ ;读数据
CMPR 00
BCND TXD_DATA_END,TC
MAR *,AR2
SACL *,AR4 ;数据送发送缓冲寄存器
XMIT_RDY: ;发送N个数据的程序
LDP #0E0H
BIT SCICTL2,BIT7
BCND XMIT_RDY,NTC ;判断发送器是否空,0表示缓冲器满
B TXD_DATA
TXD_DATA_END: ;数据发送结束
LDP #05H
SPLK #0H,SCI_FLAG
; SPLK #01H,SCI_FLAG ;发送标志位赋初值TEST
;//////////////////////////////////////////////////////////
SCI_TX_OK:
RET
;=========================================================
;=========================================================
GISR1: ;接收中断入口
LDP #0E0H
LACC PIVR,1
ADD #PVECTORS
BACC
;/////////////////////////////////////////////////////////
SCI_RX_ISR: ;接收中断服务程序
;/////////////////////////////////////////////////////////
;仿照查询方式的发送部分,AR1-4应在此定义!!!!!!
;/////////////////////////////////////////////////////////
LDP #0E0H
MAR *,AR1 ;接收缓冲寄存器地址
BIT SCICTL1,BIT2 ;测试休眠位状态
BCND RXD_DATA,NTC ;SLEEP=0,数据已经被接收到缓冲器里了
LACC * ;休眠位=1,SCI待命,准备接收地址
SUB #0AAH
BCND TXD_FLAG,EQ ;AA表示上位机已准备好,请求下位机发送信息
SUB #01H
BCND SCI_RX_END,NEQ ;接收到的信息若不是AB,表示下位机忙
SPLK #033H,SCICTL1 ;接收到的信息是AB,SCI置位,禁止休眠
B SCI_RX_END
TXD_FLAG:
LDP #05H
SPLK #01H,SCI_FLAG ;置发送标志
B SCI_RX_END
RXD_DATA:
LACC *,AR3
SACL *+,AR0
LAR AR0,#RXD_PTR
ADRK #01h ;N个数,test N=1
MAR *,AR3
CMPR 00
BCND SCI_RX_END,NTC ;NTC表示未接收完,AR3暂不要恢复初值
LAR AR3,#RXD_PTR ;接收完毕,恢复接收数据指针
SPLK #037H,SCICTL1 ;置SLEEP=1,表示准备接收
;/////////////////////////////////////////////////////////
SCI_RX_END: ;接收中断返回
CLRC INTM ;开总中断
RET
;=========================================================
;假中断子程序
PHANTOM:
KICK_DOG
RET
;=========================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -