;调用延时子程序
SETBP13
;P13输出高电平,使LED4熄灭
CLRP14
;P14输出低电平,使LED5点亮
ACALLDELAY
;调用延时子程序
SETBP14
;P14输出高电平,使LED5熄灭
CLRP15
;P15输出低电平,使LED6点亮
ACALLDELAY
;调用延时子程序
SETBP15
;P15输出高电平,使LED6熄灭
CLRP16
;P16输出低电平,使LED7点亮
ACALLDELAY
;调用延时子程序
SETBP16
;P16输出高电平,使LED7熄灭
CLRP17
;P17输出低电平,使LED8点亮
ACALLDELAY
;调用延时子程序
SETBP17
;P17输出高电平,使LED8熄灭
ACALLDELAY
;调用延时子程序
AJMPSTART
;8个LED流了一遍后返回到标号START处再循环
DELAY:
;延时子程序
MOV
R0,255;延时一段时间
D1:
MOV
R1,255
DJNZ
R1,
DJNZ
R0,D1
RET
;子程序返回
END
;程序结束
32循环移位法
在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下
面我们利用循环移位指令,采用循环程序结构进行编程。我们在程序一开始就给P1口送一
个数,这个数本身就让P10先低,其他位为高,然后延时一段时间,再让这个数据向高位
移动,然后再输出至P1口,这样就实现“流水”效果啦。由于8051系列单片机的指令中只
有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到
ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”
效果。具体编程如下所示,程序结构确实简单了很多。
ORG
0000H
;单片机上电后从0000H地址执行
fAJMPSTART
;跳转到主程序存放地址处
ORG
0030H
;设置主程序开始地址
START:MOV
SP,60H
;设置堆栈起始地址为60H
MOV
A,0FEH
;ACC中先装入LED1亮的数据(二进制的11111110)
MOVP1,A
;将ACC的数据送P1口
MOVR0,7
;将数据再移动7次就完成一个8位流水过程
LOOP:RL
A
;将ACC中的数据左移一位
MOV
P1,A
;把ACC移动过的数据送p1口显示
ACALLDELAY
;调用延时子程序
DJNZ
R0,LOOP;没有移动够7次继续移动
AJMPSTART
;移动完7次后跳到开始重来,以达到循环流动效果
DELAY:
;延时子程序
MOV
R0,255;延时一段时间
D1:
MOV
R1,255
DJNZ
R1,
DJNZ
R0,D1
RET
;子程序返回
END
;程序结束
33查表法
上面的两个程序都是比较简单的流水灯程序,“流水”花样只能实现单一的“从左到右”
流方式。运用查表法所编写的流水灯程序,能够实现任意方式流水,而且流水花样无限,只
要更改流水花样数据表的流水数据就可以随意添加或改变流水花样,真正实现随心所欲的流
水灯r