【小雨的成长】简单东西复杂玩之流水灯
功能要求: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 $。所以在中断程序中要②这条指令。。
下一篇:玩转CEPARK51实验板DS18B20之二:在数码管上显示温度(C版本^_^)[ 01-08 ]





