私は8個のLEDと2個のボタンを持っています。最初は最初のLEDが点灯し、最初のLEDが点灯し、最初のLEDは右にシフトします。リードシフトが残った。 2つのライトが「合っている」場合は、互いをずらして消灯させます。アセンブラの2つのレジスタを移動(シフト)する
私は、ボタンを押した後に1行でLEDを更新する方法を知らなかったので、各ボタンに対して2行のP1とP2を作成しました。最初の行は正しくシフトしているようですが、2番目の行は本当に乱れています。私は間違って何をしていますか?
以下が私のコードです:
$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
"messed up"と定義されています。それは何ですか?また、それがどのように反応するかを見るためにいくつかのコード行をコメントアウトしてみましたか? –
便利な答えが必要な場合は、より多くのコンテキストを提供する必要があります。どのような種類のCPUとどのようにleds /ボタンが少なくとも接続されていますか? –
sim535プログラムでテストすると、10000000(0はLEDが消灯し、1 aが点灯)は「00000001」(一度に1つずつシフトします)から「きれいに」シフトします)、ボタンの最初のプッシュで2番目の行は00000010の代わりに11111100を表示し、2番目のプッシュでは00000100の代わりに01111010を表示し、次に別の奇妙な値 – user573382