Professional Documents
Culture Documents
Захист Assembler
Захист Assembler
Init:
ldi temp, low (RAMEND)
out SPL, temp
ldi temp, high (RAMEND)
out SPH, temp ;установка SP на останню адресу в SRAM
sbi ACSR, 7 ;відключення живлення аналогового компаратора
cp next_encoder_state, last_encoder_state
breq Next_iterate ;якщо стан енкодера не змінився - продовжуємо його читати
Decr_counter1:
inc counter2; додаємо 1 до лічильника імпульсів енкодера
cpi counter2, 0x04 ;якщо зроблено 4 тіки за годинникової стрілки
brne Next_iterate; лічильник != 4
rjmp Click_count1
Decr_counter2:
inc counter1; додаємо 1 до лічильника імпульсів енкодера
cpi counter1, 0x03
brne Next_iterate;лічильник != 3
rjmp Click_count2
Click_count1:
in temp, PINB ;читаємо поточний стан каналів енкодера
;Отримуємо стан біта порту, що відповідає за натискання енкодера як кнопки
andi temp, 0x20
tst temp ;якщо енкодер натиснуто як кнопку, то скидаємо значення
знакомісць
brne Click_count_add_1
cpi counter3, 0x03
brne Click_count1 ;лічильник != 3
rjmp Count_add_1
Click_count2:
in temp, PINB ;читаємо поточний стан каналів енкодера
;Отримуємо стан біта порту, що відповідає за натискання енкодера як кнопки
andi temp, 0x20
tst temp ;якщо енкодер натиснуто як кнопку, то скидаємо значення
знакомісць
brne Click_count_add_2
cpi counter3, 0x04
brne Click_count2 ;лічильник != 4
rjmp Count_add_2
Click_count_add_1:
inc counter3
rjmp Click_count1
Click_count_add_2:
inc counter3
rjmp Click_count2
Count_add_1:
subi digr, 0x10 ;віднімаємо 1 від старшого розряду регістра
clr counter1; обнуляємо регістр
clr counter3; обнуляємо регістр
rjmp Next_iterate ;переходимо до подальших дій
Count_add_2:
subi digl, 0x01 ;віднімаємо 1 від молодшого розряду регістра
clr counter2; обнуляємо регістр
clr counter3; обнуляємо регістр
rjmp Next_iterate ;переходимо до подальших дій
End_of_iteration:
st X, digl ;видаємо на ліве знакомісце
st Y, digr ;видаємо на праве знакомісце
mov last_encoder_state, next_encoder_state ;підготовка до наступної
ітерації опитування стану енкодера
;Присвоюємо попереднього стану енкодера його поточний стан
clr is_permission_to_read_encoder ;очищення прапора дозволу на читання
енкодера
rjmp Infinite_loop