来这逛的我想没有几个没有玩过流水灯的。。其实了,流水灯也有很多种玩法。。。
哈哈。。 说说今天,我怎么玩流水灯的。。。!!
功能要求:1令P2的8个LED每隔一秒左移一次 2 令定时器1在方式1下工作,每隔10000us中断一次,中断一百次也就是一秒 了。。 对。。我们用,定时中断法玩流水灯!!
初学者可不要小看 了他。。(呵呵,我也是调试了好久才弄出来的!) 通过这个弄让大家更加明白中断的工作过程。。
下面我贴出我写的汇编程序。
ORG 0000H
SJMP START
ORG 000BH
LJMP DS0
ORG 0030H
START:
SETB EA ;初始化IE,TMOD,SP,TCON
SETB ET0
MOV TMOD,#01H
MOV TH0,#0D8H
MOV TL0,#0F0H
CLR TF0
MOV SP,#30H
MOV R0,#100
SETB TR0
MOV A,#0FEH
MOV P2,A ;传输到P2口 ①
SJMP $ ;等待中断
DS0:
PUSH ACC ;这里是重点。
MOV TH0,#0D8H ;因为是以方式一所以要重新装载TH0,TL0
MOV TL0,#0F0H
DJNZ R0,LOOP ;看下面注释1
MOV A,P2 ;看下面注释2
RL A MOV P2,A ;②
MOV R0,#100
LOOP:
POP ACC
RETI
END
下面说说我写这个程序的时候体会。。也算是用定时器中断的时候要注意的地方吧!!
注释1:DJNZ R0,LOOP这条指令是判断是否延时1S,当时我写的时候被以前的思想影响了。
将LOOP做了①的标号,这是错误的,应为在跳到中断的时候,会将PC压栈,这样的话直接跳到①的话,PC会出错。
要返回就要用RETI。
注释2:如果你开始没有将ACC压栈的话,这里可以不要。。大家可以试试将A压栈了而不要注释2这条指令,会发现当P2.0口跳到P2.1口后,就在也不会跳了。。因为,A被压栈了。。以后的程序将会始终将FEH左移。所以不会跳了。 这里新手要注意!! 大家会发现当RETI返回后,都是返回到SJMP $。所以在中断程序中要②这条指令。。 我写这类帖子。。主要是针对新手们!!(因为我也是个菜鸟!~~) 希望能给大家一点帮助。。。
也希望,各位老手能给我写的程序提点意见。。 谢谢!!
用户590072 2009-4-19 21:27
用户1467105 2009-4-18 21:00
tengjingshu_112148725 2009-4-17 19:57
daheng 2009-4-17 19:13