ПОДПРОГРАММА ВЫВОДА ДАННЫХ ИЗ 32-Х ЭЛЕМЕНТНОГО МАССИВА RAM НА ВХОД 8-М

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
;***********************************************************
; ПОДПРОГРАММА ВЫВОДА ДАННЫХ ИЗ 32-Х ЭЛЕМЕНТНОГО МАССИВА RAM
; НА ВХОД 8-МИ РАЗРЯДНОГО ЦАП
; автор - студент группы РИЗ-280030У Темираев П.Г.
; дата - 11.02.2020
;***********************************************************
.include "m16def.inc" ; подключаем определения для контроллера ATmega16
.equ array = 32 ; размер массива
.def buf = R16 ; регистр буфер
.def data = R17 ; регистр для хранения данных
.def i = R18 ; регистр для счетчика
.dseg ; секия RAM
.org SRAM_START ; смещение в адресное пространство RAM
RAMarray: ; резервирование памяти RAM
.byte array ; для массива данных
.cseg ; секция программ
rjmp Reset ; переход Reset по подаче питания
Reset: ; загрузка RAM данными из памяти программ
ldi buf, 0xff ; запись в буфер 0xFF
out DDRA, buf ; установка PORTA на выход
ldi buf, 0x01 ; запись в буфер 0x01
out DDRB, buf ; установка PB.1 на выход
out PORTB, buf ; установка PB.1 в 1
ldi YL,LOW(RAMarray) ; инициализация Y указателя
ldi YH,HIGH(RAMarray) ; на адрес массива RAM
ldi ZL,LOW(2*RAMdata) ; инициализация Z указателя
ldi ZH,HIGH(2*RAMdata) ; на адрес массива в памяти программ
ldi i, array ; в счетчик загружаем размер массива
LoadtoRAM: ; подпрограмма загрузки в RAM
lpm data, Z+ ; заргужаем в регистр данные из ЕСППЗУ, увеличиваем указатель адреса четния ЕСППЗУ
st Y+, data ; Записываем в RAM и увеличиваем указатель памяти RAM
dec i ; уменьшаем счетчик
brne LoadtoRAM ; если i не 0 переходим в подпрограмму загрузки RAM
Main: ; основная программа
ldi YL,LOW(RAMarray) ; инициализация Y указателя
ldi YH,HIGH(RAMarray) ; на адрес массива RAM
ldi i, array ; в счетчик загружаем размер массива
Output: ; подпрограмма вывода RAM на порт
ld data, Y+ ; заргужаем в регистр данные из RAM, увеличиваем указатель адреса четния RAM
out PORTA, data ; вывод из регистра на порт
ldi buf, 0x00 ; запись в буфер 0x00
out PORTB, buf ; установка "защелки" PB.1 в 0
nop ; простой для защелки
ldi buf, 0x01 ; запись в буфер 0x01
out PORTB, buf ; установка "защелки" PB.1 в 1
dec i ; уменьшаем счетчик
brne Output ; если i не 0 переходим в начало подпрограммы вывода
rjmp main ; переходим на начало основной программы
RAMdata: ; массив для загрузки в RAM
.db 0xFF, 0xAA, 0x55, 0xCC, 0xFF, 0xAA, 0x55, 0xCC, \
0xFF, 0xAA, 0x55, 0xCC, 0xFF, 0xAA, 0x55, 0xCC, \
0xFF, 0xAA, 0x55, 0xCC, 0xFF, 0xAA, 0x55, 0xCC, \
0xFF, 0xAA, 0x55, 0xCC, 0xFF, 0xAA, 0x55, 0xCC
.eseg ; секция ЭСППЗУ