📄 ex7.asm
字号:
.title "ex7"
.global _c_int00
.mmregs
PERSEC .set 60h ;存1/100秒的个数单元,地址为0061H
SEC .set 61h ;存秒的个数单元,地址为0061H
MIN .set 62h ;存分的个数单元,地址为0062H
STATUS .set 63h ;存状态值单元,地址为0063H
HOUS .set 67h ;存小时的个数单元,地址为0067H
TMP0 .set 64h ;临时变量0单元,地址为0064H
TMP1 .set 65h ;临时变量1单元,地址为0065H
TMP .set 66h ;临时变量单元,地址为0066H
D_LED .set 01003h
;D_LED0 .set 01h ; 这6个地址定义语句没有用处。
;D_LED1 .set 02h
;D_LED2 .set 03h
;D_LED3 .set 04h
;D_LED4 .set 05h
;D_LED5 .set 06h
LED_DISP .macro hexdata ;计算十六进制数的BCD码的宏
LD hexdata,B ;hexdata送到B
ST #0Ah,TMP0 ;#0Ah写到TMP0 内容中
RPT #15
SUBC TMP0,B ;该语句执行16次,算法。
STH B,12,TMP0 ;存放BCD码个位在TMP0中
STL B,12,TMP1 ;存放BCD码十位在TMP1中
.endm
DELAY .macro sec_tenth ;延时 sec_tenth/10 秒
STM sec_tenth-1,AR5 ;sec_tenth减1后送给AR5
loop1? STM #09h,AR6 ;#09h送给AR6
loop0? STM #49999,AR7 ;#49999送给AR7
BANZ $,*AR7- ;如果AR7不为0,重新执行本语句,且AR7减1
BANZ loop0?,*AR6- ;如果AR6不为0,转向loop0?
BANZ loop1?,*AR5- ;如果AR5不为0,转向loop1?
.endm
.data ;段码, 下面的数据段数据内容初始化伪指令没有作用。
.word 3F00h,0600h,5B00h,4f00h,6600h,6d00h,7d00h,0700h,7f00h,6f00h
.sect ".vectors"
rst: B _c_int00 ; 复位中断服务程序入口地址,转到_c_int00
NOP
NOP
.space 18*4*16
tint: B timeout ;定时器中断入口地址,转到timeout
NOP
NOP
.space 12*4*16
.text
_c_int00
LD #0h,DP ;#0h送给DP
STM #3000h,SP ;#3000h送给SP
SSBX INTM ;禁止所有非屏蔽中断
RSBX SXM ;无符号扩展位
STM #07FFFh,SWWSR ;#07FFFh送给SWWSR,加7个等待周期
stm #0001h,2Bh ;软等待数扩展,SWCR地址为2BH,内容赋值
ST #0h,CLKMD ; CLKMD=0
tst: BITF CLKMD,#1h ;如果CLKMD 与 #1H =0,TC=0,否则,TC=1
BC tst,TC ; 如果TC=1,转向TST。用于测试CLKMD是否为0
ST #1007h,CLKMD ;#1007h送CLKMD,工作主频为20MH
;BITF CLKMD,#1h ;无用
;RPT #0FFh ;无用
NOP
ORM #0010h,TCR ;#0010h逻辑或TCR ,结果给TCR,定时器0控制寄存器
ST #19999,PRD ;PRD,定时器0周期寄存器送数19999
ORM #0009h,TCR ;#0009h逻辑或TCR ,结果给TCR,
ORM #0020h,TCR ;#0020h逻辑或TCR ,结果给TCR,
ST #0FFFFh,IFR ;IFR清零,清除挂起的中断申请
ORM #0008h,IMR ;TINT0位=1,允许定时器0中断
RSBX INTM ;所有非屏蔽中断使能
ST #0,PERSEC ;1/100秒个数的初始值为0
ST #50,SEC ;秒初始值为0
ST #59,MIN ;分初始值为57
ST #23,HOUS ;小时初始值为10
ST #1,STATUS ;初始状态标志为1状态
ANDM #0FFEFh,TCR ;#FFEFh逻辑与TCR ,结果给TCR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -