Перемещение (сдвиг) двух регистров в Ассемблере - PullRequest
1 голос
/ 05 января 2012

У меня есть 8 светодиодов и 2 кнопки, изначально первый и последний светятся, если я нажимаю первую кнопку, первый светодиод смещается вправо, если я нажимаю вторую кнопку, последний светодиод смещается влево.Если два индикатора «встречаются», переключаясь друг на друга, они выключаются.

Я не знал, как обновить светодиоды в одном ряду после нажатия кнопок, поэтому я сделал 2 ряда: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

1 Ответ

2 голосов
/ 05 января 2012

Это звучит очень похоже на подписанную / неподписанную проблему. Является ли ваше добавление неподписанным, или оно предполагает, что старший бит является знаковым битом и делает комплимент 2s для вас. Любые оставшиеся биты переноса могут также повлиять на вещи, если не быть осторожными. У вас есть инструкция прямого сдвига вместо использования add?

Выглядел онлайн очень быстро и увидел, что у вас есть инструкция SHL / SHR, которую вы можете использовать для перемещения по битам. Затем вы просто добавляете xor к своему местоположению, чтобы отключить бит, если они совпадают.

...