ORG 0000H
LJMP START
ORG 0100H
START:
MOV SP,#50H
MOV R7,#11111110B
MOV A,R7
MOV P2,A
SETB C
LOOP:
MOV A,R7
RLC A
MOV P2,A
MOV R7,A
LCALL DELAY
SJMP LOOP
DELAY:
MOV R0,#0FFH
LP1:
MOV R1,#0FFH
LP0: DJNZ R1,LP0
DJNZ R0,LP1
RET
END
能帮我翻译下这个单片机汇编语言吗?
帮我翻一下好吗?比如说第一句是程序起始地址,从0开始存放,后面我就不懂了
答案:2 悬赏:40 手机版
解决时间 2021-02-05 10:01
- 提问者网友:遮云壑
- 2021-02-05 03:33
最佳答案
- 五星知识达人网友:执傲
- 2021-02-05 04:09
这貌似是个跑马灯
LJMP Start 让程序跳到真正的存放代码的地方,即 0100H
然后做了一些初始化工作,比如
MOV SP,#50H 把栈顶指针指向了 50H
MOV R7,#11111110H
MOV A,R7
MOV P2,A
这三句其实就是利用 A 做了个二传手把 11111110 送到了 P2 口,如果 P2 口连着灯的话,一般是低电平把灯点亮,所以最后一根线 P2.0 连着的等就会亮,其他灭,因为 P2.0 是 0,其他都是 1
SETB C 把Cy 置为1,用于和后边的RLC 配合
RLC A 带Cy循环左移(Rotate Left With Cy),你就可以想象成 P2 口和 Cy 位构成的 9 个二进制位构成了一个圈, 0 在圈中依次左移,本来是 P2.0 ,然后是 P2.1 。。。这样,亮着的灯就会出现左移的现象,但由于特别快,所以由于有视觉残留效应就会看起来都是亮的,怎么解决呢?亮起来延时一小会就好了,这时候其他灯就会灭了,所以后边的
LCALL DELAY 就是调用了一段延时子程序
DELAY 子程序其实也很简单,就是一个嵌套的循环,外层循环 FF 次,内层也是 FF 次,利用执行 DJNZ 指令耗费的时间配合循环来延长总的时间。
DJNZ 指令可以这样理解: Decrease Jump While Not Zero ,就是先减一,然后判断是否为 0 ,不为 0 则 JUMP 跳转。
LJMP Start 让程序跳到真正的存放代码的地方,即 0100H
然后做了一些初始化工作,比如
MOV SP,#50H 把栈顶指针指向了 50H
MOV R7,#11111110H
MOV A,R7
MOV P2,A
这三句其实就是利用 A 做了个二传手把 11111110 送到了 P2 口,如果 P2 口连着灯的话,一般是低电平把灯点亮,所以最后一根线 P2.0 连着的等就会亮,其他灭,因为 P2.0 是 0,其他都是 1
SETB C 把Cy 置为1,用于和后边的RLC 配合
RLC A 带Cy循环左移(Rotate Left With Cy),你就可以想象成 P2 口和 Cy 位构成的 9 个二进制位构成了一个圈, 0 在圈中依次左移,本来是 P2.0 ,然后是 P2.1 。。。这样,亮着的灯就会出现左移的现象,但由于特别快,所以由于有视觉残留效应就会看起来都是亮的,怎么解决呢?亮起来延时一小会就好了,这时候其他灯就会灭了,所以后边的
LCALL DELAY 就是调用了一段延时子程序
DELAY 子程序其实也很简单,就是一个嵌套的循环,外层循环 FF 次,内层也是 FF 次,利用执行 DJNZ 指令耗费的时间配合循环来延长总的时间。
DJNZ 指令可以这样理解: Decrease Jump While Not Zero ,就是先减一,然后判断是否为 0 ,不为 0 则 JUMP 跳转。
全部回答
- 1楼网友:封刀令
- 2021-02-05 05:09
还行
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯