📄 灯.asm
字号:
ORG 0000H
LJMP START
ORG 001BH ;T1的中断入口地址
LJMP DELAY
ORG 0030H
START: MOV A,#00H
MOV B,#0AH ;循环次数
MOV TMOD,#10H ;定时器1工作于模式1
MOV TH1,#3CH ;每次中断50ms
MOV TL1,#0B0H
SETB TR1 ;启动定时器1
SETB ET1 ;允许T1中断
SETB EA ;允许CPU中断
MOV P1,A ;输出,对灯初始化
SJMP $ ;等待中断,执行DELAY里的语句
DELAY: MOV TH1,#3CH ;重新装入初值 ;中断服务程序
MOV TL1,#0B0H
DJNZ B,LOOP1 ;中断10次,为0.5s
MOV B,#0AH ;重设B的值
JB F0,ALLOFF ;若已经全亮过一次,则转向全灭
;下面两个标号Loop,Allon都没有用到,Alloff只是因为设定了用户标志位
;才用到.因为每次LJMP LOOP1都要从DELAY开始顺序执行,可见中断服务程序
;还是相当麻烦的。
LOOP: RR A ;对灯的操作,右移首位取反
CPL ACC.7
MOV P1,A
JZ ALLON ;有缺陷,A为全零状态没有输出,可能需要添加一个用户标志位来添加一个状态,这样也需要四个状态
LJMP LOOP1
ALLON: MOV A,#0FFH
MOV P1,A
SETB F0 ;自定义用户标志位,标志灯是否全亮过,全亮过F0=1
SJMP LOOP1
ALLOFF: CLR F0 ;必须靠用用户标志位来添加状态,一旦状态多了,很难控制
MOV A,#00H
MOV P1,A
SJMP LOOP1
LOOP1: RETI ;中断返回,到“SJMP $”
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -