Всем привет, изучаю подключение 7сег индикаторов через сдвиговые регистры, помогите с кодом, он вырезан из библиотеки и работает, но я не могу понять зачем нужны строки:
и
вот сам код
Код: Выделить всё
push r18
lds r19,digits+6
push r19
push r17
push r16
push r15
push r14
push r18Код: Выделить всё
pop r18
pop r14
pop r15
pop r16
pop r17
pop r19
sts digits+6,r19
pop r18Спойлер
Код: Выделить всё
.dseg
Digits: .byte 7
.cseg
.org 0
;==========
; Инициализация и проверка шкалы
;==========
Display_init:
;Инициализация пинов дисплея. Просто вызовите эту процедуру в начале проги
sbi DDRA,PA0 ;данные
sbi DDRA,PA1; Вход тактировки 74hc595
sbi DDRA,PA2; Защёлка
cbi PORTA,PA0
cbi PORTA,PA1
cbi PORTA,PA2
ldi Temp1,RamEnd ;????????????? ?????
out SPL,Temp1
ldi r16,1;Загружем цифорки в соответствующие ячейки памяти.
sts digits,r16
ldi r16,2
sts digits+1,r16
ldi r16,3
sts digits+2,r16
ldi r16,4
sts digits+3,r16
ldi r16,5
sts digits+4,r16
ldi r16,6
sts digits+5,r16
push r18
lds r19,digits+6
push r19
push r17
push r16
push r15
push r14
push r18
lds r17,Digits+5; Значение из первой ячейки -> R17
rcall digit_out
lds r17,Digits+4; Значение из первой ячейки -> R17
rcall digit_out
lds r17,Digits+3; Значение из первой ячейки -> R17
rcall digit_out
lds r17,Digits+2; Значение из первой ячейки -> R17
rcall digit_out
lds r17,Digits+1; Значение из первой ячейки -> R17
rcall digit_out
lds r17,Digits; Значение из первой ячейки -> R17
rcall digit_out
sbi PORTA,PA2;Защёлкнем данные, дрыгнув ножкой
cbi PORTA,PA2
pop r18
pop r14
pop r15
pop r16
pop r17
pop r19
sts digits+6,r19
pop r18
main: rjmp main
digit_out:
rcall Decoder; Преобразуем его в код сегм. индикатора
mov r16,r17
rcall sr_out;Выводим
ret
Decoder:
ldi ZL,Low(Digits_Table*2) ;Инициализация массива, в котором хранятся коды
ldi ZH,High(Digits_Table*2);Индикатора
add ZL,r17;Прибавления нашего числа к адресу массива
lpm; Загрузка значения
mov r17,r0; Копируем значение в temp1
ret
sr_out:
push r17;Сохр. R17 - его придётся затереть.
clr r17; Затираем
;Приготовления окончены
sr_code:
Cpi r17,8;Если переданы 8 бит - готово.
BREQ sr_complete
;Ну а если нет...
lsr r16;Сдвигаем данные, если в 0 бите была 1 - выскочит флаг С.
BRLO sr_one;Тогда мы выведем 1 в регистр
CBI PORTA,PA0;Если флаг не выскочил - бит был равен 0. выводим 0
rjmp togge
sr_one:;Вывод 1 в регистр
SBI PORTA,PA0
;-------------------------------------------------------------------------
togge:
SBI PORTA,PA1;Дрыгнем тактовой ножкой, чтобы пихнуть данные в регистр
CBI PORTA,PA1
inc r17;Увеличим счётчик битов
rjmp sr_code;Ещё раз
sr_complete:;Сюда мы попадём после завершения передачи 8-и бит
pop r17; Вернём затёртый регистр обратно
ret; Всем спасибо, все свободны
Digits_Table:
.db 0b00010000, 0b11010110;0,1
.db 0b01001000, 0b01000100;2,3
.db 0b10000110, 0b00100100;4,5
.db 0b00100000, 0b01010110;6,7
.db 0b00000000, 0b00000100;8,9
.db 0b11101110, 0b11111110;Знак "-",Знак "градуса"
.db 0b11111111, 0b00000000;Пустота, полнота =))
