简单问题,“制作移动的广告灯”,请高手指教。
利用外部中断和定时器中断,实现的功能为使P1的8个LED每隔1s左移一次;按INTO时,使与p1相连的8个LED闪烁5次;现在的程序不能达到预期的这两个效果,请大家帮忙修改一下。谢谢了!
ORG 0000H
LJMP MAIN
ORG 0003H ;外中断0其始地址
LJMP EINT0
ORG 000BH ;T0中断其实地址
LJMP TT0 ;设置T0中断子程序TT0
MAIN: MOV SP,#60H ;设堆栈
MOV TMOD,#00000001B ; 设定T0工作在MOED1
MOV TH0,#3CH ;100ms
MOV TL0,#B0H
MOV P1,#11H ;将p1初始化
SETB TR0 ;启动T0
MOV IE,#10000011B ;T0中断使能INTO外部中断
MOV IP,#00000001B
MOV R5,#10 ;设定中断10次既1秒
MOV R1,#0FEH ;左移初值
SJMP $ ;等待
TT0: PUSH ACC ;将A的值暂存于堆栈
PUSH PSW
MOV TH0,#3CH ;重设计数器次数
MOV TL0,#0EFH
DJNZ R5,LOOP ;中断10次?不是则跳转到LOOP
MOV R5,#10 ;是则重设初值R5=10
MOV A,P1 ;读入p1的数据至A
MOV P1,A
RL A ;将A左移一位
MOV R1,A ;存入左移初值
LOOP: POP PSW ;从堆栈中取出PSW的值及A的值
POP ACC
RETI
EINT0:PUSH ACC ;将累加器、PSW的值压入堆栈
PUSH PSW
MOV A, #00 ;使P1全亮
MOV R2,#10 ;闪烁5次
LOOP3: MOV P1,A ;将A的值输入至P1
LCALL DELAY ;延时0.2s
CPL A ;将A的值取反
DJNZ R2,LOOP3 ;闪烁5次
POP PSW ;从堆栈中取回PSW、A的值
POP ACC
RETI
DELAY:MOV R5,#20 ;0.2s
D1: MOV R6,#20 ;10ms
D2: MOV R7,248 ;0.5s
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END