Написати програму для роботи з енкодером. При повертані ручки за годинниковою стрілкою збільшувати значення і значення виводити у двійковому вигляді на світлодіодну лінійку, при повертанні прити годинникової стрілки зменшувати значення.
$include (mod841)
DAT equ R7
ADDR equ R6
State data 9
org 0
JMP BEGIN
ORG 030H
BEGIN:
mov SP, #2fh
mov State, #0
loop:
call ReadEnc
mov a, State
add a, R7
mov State, a
mov DAT, a
mov ADDR, #7
call write
call Zatr
jmp loop
ZATR:
MOV R7, #0H
DJNZ R7, $
RET
encA bit 0
encB bit 1
ReadEnc:
mov a, #0
mov c, encA
rlc a
mov c, P3. 4
mov encA, c
rlc a
cjne a, #1, ReadEnc_NotFirst
; first
mov c, P3. 5
mov encB, c
ReadEnc_NotFirst:
cjne a, #2, ReadEnc_NotSecond
; second
mov a, #0
mov c, encB
rlc a
mov c, P3. 5
rlc a
cjne a, #1, ReadEnc_NotCW
; CW
mov R7, #1
ret
ReadEnc_NotCW:
; CCW
cjne a, #2, ReadEnc_NotCCW
mov R7, #255
ret
ReadEnc_NotCCW:
ReadEnc_NotSecond:
mov R7, #0
ret
; ===**END**===
write: setb P3. 6 //Set Data bus buffer to TX
mov P0, DAT //moving data to bus buffer
mov P2, ADDR //set periferals address
nop //wait
nop
mov P2, #0x00 //clock pulse for device latch
ret //exit from subroutine
end
Варіанти індивідуальних завдань
№
Текст індивідуального завдання
При натисканні кнопки на енкодері інкрементувати змінну і виводити на молодший розряд статичного індикатора. Змінна приймає значеня 0…99, прогарма не повинна реагувати на тривале натискання на кнопку. Початковий стан на статичному індикаторі засвічено 00 на молодшому розряді, старший розряд погашено, при досягненні значення 100 на індикаторі засвічується 00.
При натисканні кнопки на енкодері декрементувати змінну, яка відображається на старшому розряді статичного індикатора, при натисканні кнопки на джойстику декрементується змінна, яка відображається на старшому розряді статичного індикатора. Змінні приймають значеня 99…00, при досягненні значення –1 засвічується 99, прогарма не повинна реагувати на тривале натискання на кнопки. Початковий стан на статичному індикаторі засвічено 00 на старшому розряді, молодший розряд погашено.
При обертанні ручки енкодера в напрямку за годинниковою стрілкою переміщати на свілодіодній лінійці засвічену точку вверх, при обертанні ручки енкодера в напрямку проти годинникової стрілки переміщати точку на світлодіодній лінійці вниз, при досягненні крайного положення точка переводиться на протилежний край.
При обертанні ручки енкодера в напрямку за годинниковою стрілкою переміщати на свілодіодній лінійці погашену точку вниз, при обертанні ручки енкодера в напрямку проти годинникової стрілки переміщати погашену точку вверх, при досягненні крайного положення точка переводиться на протилежний край.
При натисканні кнопки на енкодері переміщувати засвічену точку на матричному світлодіодному індикаторі, початковий стан: засвічена точка знаходить в лівому нижньому куті. При натисканні на кнопку енкодера точка переміщується по стовпці вверх, при досягненні верхнього положення точка переміщається на нижній рядок і на один стовпець вправо, при закінченні останього стовпця, точка повертається в початкове положення
При натисканні кнопки на джойстику переміщувати загашену точку на матричному світлодіодному індикаторі, початковий стан: загашена точка знаходить в правому верхньому куті. При натисканні на кнопку джойстика точка переміщується по стовпці вниз, при досягненні нижнього положення точка переміщається на верхній рядок і на один стовпець вліво, при закінченні останього стовпця, точка повертається в початкове положення.
На світлодіодному індикаторі запустити “біжучу точку”, напрямок знизу вгору, швидкість переміщення задавати обертанням ручки енкодера, максимальна швидкість 8 сегментів за 1с., мінімальна швидкість 1 сегмент за 8с., при обертанні ручки енкодера за годинниковою стрілкю швидкість збільшується в двічі відносно встановленої, при обертанні ручки проти годинникової стрілки швидкість зменшується вдвічі відносно встановленої. При досягненні мінімального або максимального значення швидкість у відповідному напрям не міняється.
На світлодіодному індикаторі запустити погашену “біжучу точку”, напрямок зверху вниз, швидкість переміщення задавати обертанням ручки енкодера, максимальна швидкість 16 сегментів за 1с., мінімальна швидкість 1 сегмент за 4с., при обертанні ручки енкодера за годинниковою стрілкю швидкість збільшується в двічі відносно встановленої, при обертанні ручки проти годинникової стрілки швидкість зменшується вдвічі відносно встановленої. При досягненні мінімального або максимального значення швидкість у відповідному напрям не міняється.
Засвічувати світлодіодии на індикаторі за допомогою дискретних кнопок. При натисканні кнопки на енкодері збільшувати число засвічених індикаторів на один, при натисканні кнопки на джойстику зменшувати число засвічених індикаторів на один. При засвіченні всіх індикаторів програма ігнорує натискання кнопки енкодера, при погашенні всіх індикаторі програма ігнорує натискання кнопки джойстика. Початковий стан: світлодіодна лінійка погашена.
При обертанні ручки енкодера за годинниковою стрілкою інкрементувати значення змінної, яка виводиться на молодший розряд семигегментного індикатора, при обертанні ручки енкодера проти годинникової стрілки декрементувати значення змінної. При досягнення значення 100 змівнна приймає значення 00, при досягненні значення –1 змінна приймає азначення 99.