Управление 7сег индикатором

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Пт ноя 07, 2014 12:59:37

Сообщение Makslogic »

Всем привет, изучаю подключение 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;Пустота, полнота =))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Вообще говоря, такую конструкцию применяют для сохранения и последующего восстановления данных. Но в вашем случае совершенно беспонтовая хренотень.
Docendo discimus
Контактная информация:
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пт ноя 07, 2014 12:59:37

Сообщение Makslogic »

вот я тоже так думаю, но может там какой то смысл скрытый или я туплю :) потому решил спросить совета
Ответить

Вернуться в «AVR»