Кнопка на 68K
Я хочу написать программу для считывания значения с кнопок и отображения этого значения на светодиодах. Программа должна работать непрерывно, и при смене кнопок изображение меняется. Я пробовал много способов, но это ничего не говорит о том, может ли кто-нибудь помочь мне понять, в чем проблема.
LEDS EQU $E00010 ;LEDS adress
BUTTON EQU $E00014 ;BUTTON address
ORG $400 ;start of program area
START
Loop MOVE.B #2,D0
MOVE.B BUTTON,D1 ;move the value of button to D1
MOVE.B D2,LEDS
NOT.B D1 ;take NOT to flip the value in order to present it in LEDS
MOVE.B D1,D2 ;move the value to LEDS
SUB.B #2,D0 ; if D0 =0 then loop again
BEQ Loop
SIMHALT
END START
1 ответ
Несколько вещей не хватает из этого.
Кнопка, как правило, представляет собой один бит, а не целый байт, поэтому к кнопке ввода должна быть применена некоторая форма маски. Точно так же установка светодиода обычно включает установку одного бита, а не байта, если это не какая-то разновидность многоцветного светодиода. Я предполагаю, что у вас есть 8 кнопок и 8 соответствующих светодиодов
Код, который вы иллюстрировали, будет работать непрерывно, потому что вы загружаете D0 с 2 после метки LOOP, и в конце цикла вы вычитаете 2 из D0 (который имеет значение 2), а затем зацикливаетесь, если этот результат равен нулю, то есть всегда, Если вам действительно нужен непрерывный цикл, нет смысла использовать D0 вообще.
LEDS EQU $E00010 ;LEDS address BUTTON EQU $E00014 ;BUTTON address ORG $400 ;start of program area START LOOP MOVE.B BUTTON,D1 ; Read buttons NOT.B D1 ; LEDs are inverse of button MOVE.B D1,LEDS ; write to LEDs BRA.S LOOP ; do continously SIMHALT ; doesn't get here but still END START