Код: Выделить всё
; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
.def temp = R16
.def SETX = R17
.def CLIX = R18
.def cnt = R19
.def Dt = R20
.def NopX = R21
.equ HIGHX = 0b11111111 ; Единички в нужных местах для выводв порта управленя светодиодами
.equ LOWX = 0b00000000 ; Нолики в нужных местах для выводв порта управленя светодиодами
.equ PORTX = PORTB ; Порт управления светодиодами, выводы которого используются для передачи данных
;=====================
ВСЕ ОСТАЛЬНОЕ
;===========
; --------- конфигурация портов -----------------------------------------------
Reset: ldi temp, 0b11111111 ; Конфигурируем порт B (направление порта)
out DDRB, temp
ldi temp, 0b00000000 ; Конфигурируем порт В (выводы порта)
out PORTB, temp
ldi SETX, HIGHX ; Загружаем единички выводов для высокого уровня порта вывода
ldi CLIX, LOWX ; Загружаем нолики выводов для низкого уровня порта вывода
ldi temp, RAMEND ; Загрузка указателя стека
out SPL, temp
SBI ACSR,ACD ; Выключаем аналоговый компаратор (для меньшего потребления)
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************
Start:
ldi ZH, high (DATA*2)
ldi ZL, low (DATA*2)
; add ZL, RAZ1 ; Переходим на элемент
ldi Dt, 55
NEXT: dec Dt
breq Rst
ldi cnt, 9
lpm temp, Z+ ; Загружаем элемент (загрузка с пост-инкрементом) 3 такта
BY: dec cnt
breq NEXT
rol temp
brcc T ; 1/2 такта
ldi NopX, 6
out PORTX, SETX ; Установили порты, отправляем высокий уровень
M: dec NopX
brne M
out PORTX, CLIX ; Сбросили порты, отправляем низкий уровень
nop ; 9 тактов ожидания высокого 4500 нс
nop
rjmp BY
T: ldi NopX, 3
out PORTX, SETX ; Установили порты, отправляем высокий уровень
N: dec NopX
brne N
out PORTX, CLIX ; Сбросили порты, отправляем низкий уровень
nop ; 17 тактов ожидания высокого 850 нс
nop
nop
nop
nop
nop
nop
nop
rjmp BY ; 2 такта
Rst: out PORTX, CLIX
; rjmp Rst
rjmp Start ; Конец программы, переход на начало
; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************
;----------------------- ВЫВОД НА СВЕТОДИОДЫ --------------------------------------------------
DATA: .db 0b11111111, 0b11111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111 ; 1,2
.db 0b11111111, 0b00000000, 0b11111111, 0b00000000, 0b11111111, 0b00000000 ; 3,4
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 5,6
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 7,8
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 9,10
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 11,12
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 13,14
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 15,16
.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000 ; 17,18