在汇编程序中移动(移位)两个寄存器
我有8个LED和2个按钮,最初第一个和最后一个LED点亮,如果我按第一个按钮,第一个LED右移,如果按第二个按钮最后带领左转。如果两个灯“相遇”,通过相互转换,它们就会关闭。在汇编程序中移动(移位)两个寄存器
按下按钮后,我不知道如何更新单行上的LED,所以我为每个按钮做了2行P1和P2。第一行似乎正确转换,但第二行真的搞砸了。我究竟做错了什么?
下面是我的代码:
$TITLE(5)
$MOD51
ORG 100H
START:
; 8 leds, P1.0-P1.7
; 2 buttons, P0.1 P0.2
MOV P1, #00h
MOV P2, #00h
; left LED positions
MOV 30H, #00000001b ; initial position
MOV 31H, #00000010b
MOV 32H, #00000100b
MOV 33H, #00001000b
MOV 34H, #00010000b
MOV 35H, #00100000b
MOV 36H, #01000000b
MOV 37H, #10000000b
MOV 38H, #00000000b ; leds meet
; right led positions
MOV 39H, #10000000b ; initial position
MOV 40H, #01000000b
MOV 41H, #00100000b
MOV 42H, #00010000b
MOV 43H, #00001000b
MOV 44H, #00000100b
MOV 45H, #00000010b
MOV 46H, #00000001b
MOV R1, #0
MOV R2, #0
LOOP:
JNB P0.1, INCREMENT_L ; left button pressed, led shifts right
JNB P0.2, INCREMENT_R ; right button pressed, led shifts left
CALL DISP_L ; display left led
CALL DISP_R ; display right led
JMP LOOP
INCREMENT_L:
SETB P0.1
CJNE R1, #7, INC_L
MOV R1, #0
JMP LOOP
INCREMENT_R:
SETB P0.2
CJNE R2, #7, INC_R
MOV R2, #0
JMP LOOP
INC_L:
MOV A, R2
ADD A, #39H
MOV B, A
MOV A, R1
ADD A, #30H
CJNE A, B, INCL
JMP RESET
JMP LOOP
INC_R:
MOV A, R1
ADD A, #30H
MOV B, A
MOV A, R2
ADD A, #39H
CJNE A, B, INCR
JMP RESET
JMP LOOP
INCL:
INC R1
JMP LOOP
INCR:
INC R2
JMP LOOP
DISP_L:
MOV A, R1
ADD A, #30H
MOV R0, A
MOV P1, @R0
RET
DISP_R:
MOV A, R2
ADD A, #39H
MOV R0, A
MOV P2, @R0
RET
RESET:
MOV R1, #0
MOV R2, #0
JMP LOOP
END
这听起来极像是一个符号/无符号的问题。你的添加是无符号的,还是假定高位是一个符号位,并为你做2s恭维的东西。如果不小心,遗留的任何遗留位也会影响事物。你有没有使用add的直接转换指令?
在线查看真正快速,并看到你有一个SHL/SHR指令,你可以用它来移动你的位置。然后,如果它们相匹配,您只需对抗您的位置即可关闭位置。
哦,所以我只有2个寄存器,一个包含00000001和其他10000000作为初始值,并使用SHR/SHL移动位。还有一个问题:我如何“合并”来自这两个寄存器的位?例如,如果我有00001000和1000000,我想“合并”它们到10001000 – user573382 2012-01-05 00:20:41
我使用8x51架构,所以我有RRC和RLC而不是SHR/SHL – user573382 2012-01-05 00:40:38
使用异或。如果这些位是相同的,它将返回0.如dhl r0,xor对r1和r2。显示r2。同样,rr r1,xor反对r0,放置并显示在r2中。这应该给你你想要的结果。顺便说一句,使用RRC和RLC(假设它意味着左转通过进位和右转通过进位)意味着您可以将设置位一直移动通过任一方向的灯光,进入进位,然后通过反复调用旋转。有点整洁。 – 2012-01-05 00:49:11
定义“搞砸了”。它在做什么?另外,你有没有试过注释几行代码来看看它是如何反应的? – 2012-01-04 23:36:26
如果您期望有用的答案,您需要提供更多的上下文。什么样的cpu以及LED /按钮如何连接起来。 – 2012-01-05 00:00:10
“搞砸了”,因为在使用sim535程序进行测试时,LED的第一行从“10000000”(其中0表示未点亮的LED和1点亮的LED)“干净地”移动到00000001(一次移动1 ),而第二行,在第一次按下按钮显示11111100而不是00000010,并在第二次按下它显示01111010而不是00000100,然后其他奇怪的值 – user573382 2012-01-05 00:07:48