;P1 口的 8 个灯循环亮,按 P32 后全部闪烁 5 次后继续循环亮, 中断程序的典型应用。
;***************************************************************************
;* (程序转载请著明出处 ,未声明可适应本站腾龙/isp 开发套件/倚天版开发套件 *
*
;* Create by :石学军 www.51c51.com www.8951.com 更多例程请登陆网站
*
;***************************************************************************
org 00h ;开始
jmp start
org 03h ;int0 中断入口(p32)
jmp ext0 ;到中断子程序
start: mov ie,#10000001b ;中断使能
mov ip,#00000001b ;中断优先
mov tcon,#0000000b ;中断为电平触发
mov sp,#70h ;堆栈指针
loop:mov a,#0ffh ;左移动初值
clr c ; C=0
mov r2,#08 ;左移动 8 次
loop1:rlc a ;含 c 左移动一位
mov p1,a ;输出到 P1 口
call delay ;延时
djnz r2,loop1 ;左移动 8 次了吗?
mov r2,#07 ;设定右移 7 次
loop2:rrc a
mov p1,a
call delay
djnz r2,loop2 ;右移动 7 次了吗?
jmp loop
ext0: push acc ;把 a 压入堆栈
push psw ;保存现场
setb rs0 ;设定工作寄存器 1
clr rs1
mov a,#00 ;使 P1 全亮一次
mov r2,#10 ;闪烁 5 次(亮灭共 10 次,小心了)
loop3:mov p1,a ;输出到 P1
call delay
cpl a
djnz r2,loop3 ;10 次到了么?没有继续否则完成
pop psw ;恢复现场
pop acc
reti
delay: mov r5,#20 ;延时 200MS