Работа с ЦАП-ами с паралельным вводом данных уже малоактуально, поэтому привожу пример для SPI- ЦАПа
MAX504:
;//////////////////////////////////////////////////////////
; Иницилизация DAC MAX504
; Входные данные: ----
; Выходные данные: иницилизация
; Изменяемые регистры: temp
; Изменяемая память: dacport,dacddr
;//////////////////////////////////////////////////////////
.equ dacport =portb ;регистр данных
.equ dacddr =ddrb ;и направления DAC
.equ d_sclk =pb7 ;синхронизация
.equ d_din =pb6 ;данные
.equ d_cs =pb5 ;выбор кристалла
dacinit: in temp,dacddr
sbr temp,(1‹‹d_sclk)+(1‹‹d_din)+(1‹‹d_cs)
out dacddr,temp ;все линии-выходы
sbi dacport,d_cs ;cs=1
cbi dacport,d_sclk ;sclk=0
cbi dacport,d_din ;din=0
ret
;//////////////////////////////////////////////////////////
; Подпрограмма вывода в DAC MAX504
; Bходные данные: 10-битное слово в регистре XH:XL
; Выходные данные: вывод в ЦАП
; Изменяемые регистры: ---
; Изменяемая память: ---
;//////////////////////////////////////////////////////////
dacout: push temp
push xl
push xh
andi xh,0b00000011 ;очистить ненужные биты
lsl xl ;сдвинуть влево актуальную
rol xh ;часть 16-слова
cbi dacport,d_sclk ;sclk=0
cbi dacport,d_cs ;cs=0
ldi temp,16 ;считаем до 16
dacout1: lsl xl ;сдвигаем влево
rol xh ;16 бит с переносом
cbi dacport,d_din ;сбрасываем бит данных
sbrc xh,7 ;если крайний левый бит =1
sbi dacport,d_din ;тогда данные выставляем 1
sbi dacport,d_sclk ;начало импульса sclk
cbi dacport,d_sclk ;конец импульса sclk
dec temp ;уменьшаем счетчик
brne dacout1 ;не нулевой- возврат
sbi dacport,d_cs ;cs=1
pop xh
pop xl
pop temp
ret
Тысячу извинений за нарушенное форматирование текста.
С ув.Ret.
-- Прилагается рисунок: --