单片机 跑马灯 代码详解
解决时间 2021-04-22 17:25
- 提问者网友:萌卜娃娃
- 2021-04-21 22:00
最近刚刚接触单片机
能否请高手指导下,这些代码的具体意义是什么 ..
越清楚越好....
ORG 0000H
AJMP START
ORG 0030H
START: MOV A, #0FFH
CLR C
MOV R2, #08H
LOOP: RLC A
MOV P2, A
CALL DELAY
DJNZ R2, LOOP
MOV R2,#07H
LOOP1: RRC A
MOV P2, A
CALL DELAY
DJNZ R2, LOOP1
JMP START
DELAY: MOV R3, #20
D1: MOV R4, #200
D2: MOV R5, #248
DJNZ R5, $
DJNZ R4, D2
RET
END
最佳答案
- 五星知识达人网友:迟山
- 2021-04-21 23:39
FFH的时候灯是一个都不会亮的,00H的时候灯就会全亮,也就是1灭,0亮,这个记住,
ORG 0000H下面的指令地址是0000H
AJMP STAR;跳到STAR处
ORG 0030H下面的指令地址是0030H(0003-002B之间是中断用的,所以主程序要从0030H开始)
START: MOV A, #0FFH;给A(累加器)FFH
CLR C;CY清零,CY程序状态字里的进位标志位,这个以后会把这个0给灯,也就是P2口
MOV R2, #08H;给R2一个8的值,这是以后移位的次数
LOOP: RLC A;左移,刚好把CY移到A的最高位,也就是A的最高位是0
MOV P2, A;把A给了P2,这时最边上的灯亮了
CALL DELAY;调用时间程序;也就是让灯亮一会儿
DJNZ R2, LOOP;R2自减1,不等于0,跳到LOOP,就是又移位,边上的第二灯亮了,就这样循环7次
MOV R2,#07H重新给R2一个值
LOOP1: RRC A;右移A,带CY移位
MOV P2, A把A给P2,这时灯会换个方身移位
CALL DELAY延迟一下
DJNZ R2, LOOP1自减1不等0跳LOOP1,就这样循环到R2=0为止
JMP START跳到程序开始,重新执行程序
DELAY: MOV R3, #20;给R3一个20
D1: MOV R4, #200给R4一个200
D2: MOV R5, #248给R5一个248
DJNZ R5, $;R5自减一,不等0,就在这一条指跳,也就是在这里跳动248次
DJNZ R4, D2,R4自减一,不等0跳到D2
RET子程序返回
END程序结序
全部回答
- 1楼网友:青灯有味
- 2021-04-22 02:05
我纠正一下,下面有一行,我搞错了,不要误导了你,
FFH的时候灯是一个都不会亮的,00H的时候灯就会全亮,也就是1灭,0亮,这个记住,
ORG 0000H下面的指令地址是0000H
AJMP STAR;跳到STAR处
ORG 0030H下面的指令地址是0030H(0003-002B之间是中断用的,所以主程序要从0030H开始)
START: MOV A, #0FFH;给A(累加器)FFH
CLR C;CY清零,CY程序状态字里的进位标志位,这个以后会把这个0给灯,也就是P2口
MOV R2, #08H;给R2一个8的值,这是以后移位的次数
LOOP: RLC A;左移,刚好把CY移到A的最高位,也就是A的最高位是0
MOV P2, A;把A给了P2,这时最边上的灯亮了
CALL DELAY;调用时间程序;也就是让灯亮一会儿
DJNZ R2, LOOP;R2自减1,不等于0,跳到LOOP,就是又移位,边上的第二灯亮了,就这样循环7次
MOV R2,#07H重新给R2一个值
LOOP1: RRC A;右移A,带CY移位
MOV P2, A把A给P2,这时灯会换个方身移位
CALL DELAY延迟一下
DJNZ R2, LOOP1自减1不等0跳LOOP1,就这样循环到R2=0为止
JMP START跳到程序开始,重新执行程序
DELAY: MOV R3, #20;给R3一个20
D1: MOV R4, #200给R4一个200
D2: MOV R5, #248给R5一个248
DJNZ R5, $;R5自减一,不等0,就在这一条指跳,也就是在这里跳动248次
DJNZ R4, D2,R4自减一,不等0跳到D2
RET子程序返回
END程序结序
*******************************************************************下面的这句要改下.
LOOP: RLC A;左移,刚好把CY移到A的最高位,也就是A的最高位是0.
上面的搞错了,
应该是把CY移到A的最低位,就是就是A的最低位是0
- 2楼网友:白昼之月
- 2021-04-22 00:48
最好自己找找有关书籍来看看,说了估计你也不是会很明白的
ORG 0000H
AJMP START
ORG 0030H
START: MOV A, #0FFH
CLR C;进位位清零
MOV R2, #08H;r2寄存器赋值为8,亦即要循环8次
LOOP: RLC A;逻辑左移a,亦即A中0FFH变为0FEH
MOV P2, A;点亮LED
CALL DELAY;延时
DJNZ R2, LOOP;循环
MOV R2,#07H;略
LOOP1: RRC A;逻辑右移
MOV P2, A
CALL DELAY
DJNZ R2, LOOP1
JMP START
DELAY: MOV R3, #20;延时函数,时间约为【5+(248*2+3)*200】us=0.1s,不过从代码看估计你弄错了吧,R3没用上,哪copy来的程序啊
D1: MOV R4, #200
D2: MOV R5, #248
DJNZ R5, $
DJNZ R4, D2
RET
END
我要举报
大家都在看
推荐资讯