2012-01-04 11 views
1

私は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 
+0

"messed up"と定義されています。それは何ですか?また、それがどのように反応するかを見るためにいくつかのコード行をコメントアウトしてみましたか? –

+0

便利な答えが必要な場合は、より多くのコンテキストを提供する必要があります。どのような種類のCPUとどのようにleds /ボタンが少なくとも接続されていますか? –

+0

sim535プログラムでテストすると、10000000(0はLEDが消灯し、1 aが点灯)は「00000001」(一度に1つずつシフトします)から「きれいに」シフトします)、ボタンの最初のプッシュで2番目の行は00000010の代わりに11111100を表示し、2番目のプッシュでは00000100の代わりに01111010を表示し、次に別の奇妙な値 – user573382

答えて

2

これは署名/署名のない問題のような非常に多くの音。あなたの署名は追加されていませんか、それとも上位ビットが符号ビットであると想定して、2の補数をあなたに与えますか?残っているキャリービットも注意しないと、物事に影響を与える可能性があります。あなたはaddを使うのではなく、まっすぐなシフト命令を持っていますか?

実際にオンラインで見て、あなたの周りのビットを移動するために使用できるSHL/SHRの指示を持って参照してください参照してください。次に、一致する場合にビットをオフにするために、自分の位置をxorにします。

+0

を返します。 00000001と10000000を初期値とし、SHR/SHLを使用してビットを移動します。ちょうどもう1つの質問:これらの2つのレジスタからビットをどのように "マージ"できますか?私は00001000と1000000を持っていて、私は10001000に "マージ"したいのですが – user573382

+0

私は8x51アーキテクチャを使用していますので、SHR/SHLの代わりにRRCとRLCを持っています – user573382

+0

xorを使用してください。ビットが同じであれば、0を返します。dhl r0、r1とxor、r2に置くようなものです。 r2を表示します。他の方法、shr r1、xorとr0、placeとr2の表示と同じです。それはあなたが望む結果を与えるはずです。 BTWでは、RRCとRLCを使用して(左から左に回転し、右から左に回転することを意味すると仮定します)、設定されたビットをいずれかの方向にライトを通って持ち運び、持ち運びに移動し、回転する。きちんとした。 –

関連する問題