Почему у меня читается только первый элемент массива?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Я только третий день разбираюсь в программирование, поэтому прошу вашей помощи.
Написал программу по аналогии со статьей из обучалки, где переключаются массивы.
Проблемы:
1) Почему у меня читается только первый элемент массива, а второй игнорируется?
2) Как сделать так, чтобы массив читался только один раз и по прочтении останавливался на последнем значении (то есть не зацикливался)
3)как сделать так, чтобы переключение массивов (при нажатии на кнопку) происходило по заднему фронту?

Листинг программы (прошу сильно не пинать, только начал учиться :write: )))

.include "2313def.inc"
.def Temp =r16
.def temp1 =r17
.def temp2 =r18 ;

.def knopka=R21

.cseg
.org 0

RESET:

ser temp
out DDRB, temp ;
out PORTB,temp


yvelichenie:
ldi Temp1,0
ldi Temp2,0

l_res:
dec Temp1
brne l_res

dec Temp2
brne l_res

sbis PIND,0x00
inc knopka


SelectArray:

andi knopka,0b00000111

Tst0: cpi knopka,0
brne Tst1
ldi ZH,High(Array0*2)
ldi ZL,Low(Array0*2)
rjmp ReadArray

Tst1: cpi knopka,1
brne Tst2
ldi ZH,High(Array1*2)
ldi ZL,Low(Array1*2)
rjmp ReadArray

Tst2: cpi knopka,2
brne Tst3
ldi ZH,High(Array2*2)
ldi ZL,Low(Array2*2)
rjmp ReadArray

Tst3: cpi knopka,3
brne Tst4
ldi ZH,High(Array3*2)
ldi ZL,Low(Array3*2)
rjmp ReadArray

Tst4: cpi knopka,4
brne Tst5
ldi ZH,High(Array4*2)
ldi ZL,Low(Array4*2)
rjmp ReadArray

Tst5: cpi knopka,5
brne Tst6
ldi ZH,High(Array5*2)
ldi ZL,Low(Array5*2)
rjmp ReadArray

Tst6: cpi knopka,6
brne Tst7
ldi ZH,High(Array6*2)
ldi ZL,Low(Array6*2)
rjmp ReadArray

Tst7: ldi ZH,High(Array7*2)
ldi ZL,Low(Array7*2)
rjmp ReadArray


ReadArray:

ldi Temp,0
add ZL,Temp1
adc ZH,Temp

lpm

mov Temp,R0

inc Temp1

rjmp Output

Init: ldi Temp1,0
rjmp SelectArray

Output: out PortB,Temp

Array0:
.db 0b01111111,0b01111111

Array1:
.db 0b00111111,0b10111111

Array2:
.db 0b10011111,0b11011111

Array3:
.db 0b11001111,0b11101111

Array4:
.db 0b11100111,0b11110111

Array5:
.db 0b11110011,0b11111011

Array6:
.db 0b11111001,0b11111101

Array7:
.db 0b11111100,0b11111110

rjmp yvelichenie
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Код: Выделить всё

Output: out PortB,Temp

Array0:
.db 0b01111111,0b01111111

Array1:
.db 0b00111111,0b10111111

Array2:
.db 0b10011111,0b11011111

Array3:
.db 0b11001111,0b11101111

Array4:
.db 0b11100111,0b11110111

Array5:
.db 0b11110011,0b11111011

Array6:
.db 0b11111001,0b11111101

Array7:
.db 0b11111100,0b11111110

rjmp yvelichenie ; Это!!!!
Ничего не заметили?
Массивы надо ставить в конце. У Вас получается, что программа лезет исполнять массивы и МК просто перезагружается.
Вот так надо:

Код: Выделить всё

Output: out PortB,Temp

rjmp yvelichenie ;Вот тут оно должно быть. )))

Array0:
.db 0b01111111,0b01111111
Array1:
.db 0b00111111,0b10111111
Array2:
.db 0b10011111,0b11011111
Array3:
.db 0b11001111,0b11101111
Array4:
.db 0b11100111,0b11110111
Array5:
.db 0b11110011,0b11111011
Array6:
.db 0b11111001,0b11111101
Array7:
.db 0b11111100,0b11111110
Скачайте себе AVR Studio 4 и будет Вам проще.
Там хоть симулировать можно программу, то есть выполнять по шагам и следить за регистрами.

Следующее: Вы складываете Temp1 с парой, но в течении всей программы у Вас Temp1 не изменяется. Если задать регистру Temp1 значение 0x01 или 0b00000001, то тогда у Вас будут читаться вторые элементы массивов.
Регистровая пара - это указатель адреса ячейки ПЗУ, с которой надо проделать операцию.
Получается, что Вы указываете адрес начала массива, но не ходите по нему.

Код: Выделить всё

.include "tn2313def.inc"
.def temp0 = r16
.def count = r17
;----------------------------------------------
.cseg
.org 0x0000
ldi temp0, 0xFF
out DDRB, temp0
;----------------------------------------------
MAIN:
ldi ZL, Low(Array*2)
ldi ZH, High(array*2)
ldi count, 0x09
;----------------------------------------------
LOOP:
lpm temp0, Z+  ;Загружаем значение сразу в temp0, и после этого сразу увеличиваем Z на 1
out PORTB, temp0

;Где-то тут можно вставить задержку

dec count
brne LOOP
rjmp MAIN
;----------------------------------------------
Array:
.db 1, 2, 4, 8, 16, 32, 64, 128
В этом образце мы читаем по очереди элементы одного массива и выводим их в PORTB
Этот образец расчитан на ATTINY2313 - почти полный аналог AT90S2313, только более нафаршированный, дешёвый и легче найти. (AT90S2313 давно снят с производства)
I am DX168B and this is my favourite forum on internet!
Реклама
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Спасибо Вам огромное, теперь стало понятнее, сейчас буду пробовать, но думаю вопросы еще появятся ))
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Чтобы достать любой элемент из массива, можно так:

Код: Выделить всё

;.........
;....
.def temp = r16
;..........
..............
ldi ZL, Low(Array*2)
ldi ZH, High(Array*2)
ldi temp, 0x00 ;Вытащим первый элемент (хотя, лучше назвать его нулевым)
;..........
;...............
add ZL, temp
clr temp
adc ZH, temp
lpm temp, Z
;-------------
;-------------
Array:
.db 1, 2, 4, 8, 16, 32, 64, 128
Задавая значение регистру temp от нуля до семи, мы можем достать любое число из массива.
Если будут вопросы, выкладывайте.
I am DX168B and this is my favourite forum on internet!
Реклама
Эиком - электронные компоненты и радиодетали
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Чего-то я торможу, теперь у меня читается только второй элемент массива, не могу сообразить, что с регистрами я делаю не так:
Последний раз редактировалось Xaero Ср май 18, 2011 20:09:16, всего редактировалось 1 раз.
Реклама
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Получается у меня вся проблема с момента ReadArray ?
Кстати как у Вас получается добавлять коментарии в коде без искажения кодировки?
Реклама
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Я вручную писал прямо в странице. :)
Открываете исходник блокнотом и копируете на сайт, тогда кодировка не искажается.
Так, давайте определимся с ТЗ.
Значит нам надо в массивах завести значения для мигалок?
А по нажатию кнопки, переключаться между массивами. Так?
Вам кнопку надо повесить на прерывание, или периодически опрашивать её таймером.
I am DX168B and this is my favourite forum on internet!
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

"Отлаживаю на СТК500 поэтому все значия портов инверсно"
Суть ТЗ такая:
1)При включении устройства срабатывает первое реле (в случае отладки это будет первый светодиод "01111111" чтение 1-ого массива)
2)по приходу первого импульса на PIND 0 должно сработать чтение второго массива, то есть сначала в порт В должно вывестись 00111111, а следом за ним 11011111
3)ждать следующего импульса, если импульса нет, то контроллер должен остановиться на последнем элементе последнего массива.
4)по приходу импульса начать чтение следующего массива по аналогичной схеме.
Ну и так далее
Так вот вроде в моей корявой проге оно и происходит, за исключением того, что когда нажимаю на кнопку (импульс) то у меня читается либо первый, либо второй элемент массива, а не последовательно весь.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

То есть надо прочитать все элементы массива и остановиться до тех пор, пока не проскочит импульс? Как проскочит, прочитать следующий массив, за тем снова ждать импульса?
Так? Ждите исходник.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Вот:

Код: Выделить всё

.include "tn2313def.inc"
.def Temp =r16
.def temp1 =r17
.def temp2 =r18
.def knopka=R21
;---------------------------------------
.cseg
.org 0x0000
rjmp RESET
.org INT_VECTORS_SIZE
;---------------------------------------
RESET:
ldi		temp,		Low(RAMend)
out		SPL,		temp
ldi		temp,		0xFF
out		DDRB,		temp
out		PORTB,		temp
clr		knopka
BT_RQ:
sbis	PIND,		0
rjmp	BT_RQ
BT_RQ1:
sbic	PIND,		0
rjmp	BT_RQ1
ldi		temp1,		0x02
;---------------------------------------
cpi		knopka,		0x00
brne	INIT1
ldi		ZL,			Low(Array0*2)
ldi		ZH,			High(Array0*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT1:
cpi		knopka,		0x01
brne	INIT2
ldi		ZL,			Low(Array1*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT2:
cpi		knopka,		0x02
brne	INIT3
ldi		ZL,			Low(Array2*2)
ldi		ZH,			High(Array2*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT3:
cpi		knopka,		0x03
brne	INIT4
ldi		ZL,			Low(Array3*2)
ldi		ZH,			High(Array3*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT4:
cpi		knopka,		0x04
brne	INIT5
ldi		ZL,			Low(Array4*2)
ldi		ZH,			High(Array4*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT5:
cpi		knopka,		0x05
brne	INIT6
ldi		ZL,			Low(Array5*2)
ldi		ZH,			High(Array5*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT6:
cpi		knopka,		0x06
brne	INIT7
ldi		ZL,			Low(Array6*2)
ldi		ZH,			High(Array6*2)
rjmp	LOAD_ARRAY
;---------------------------------
INIT7:
ldi		ZL,			Low(Array7*2)
ldi		ZH,			High(Array7*2)
;---------------------------------
LOAD_ARRAY:
lpm		temp,		Z+
out		PORTB,		temp
dec		temp1
brne	LOAD_ARRAY
cpi		knopka,		0x07
breq	CLEAR
inc		knopka
rjmp	BT_RQ
CLEAR:
clr		knopka
rjmp	BT_RQ
;---------------------------------------
Array0:
.db  0b01111111,0b01111111

Array1:
.db  0b00111111,0b10111111

Array2:
.db  0b10011111,0b11011111

Array3:
.db  0b11001111,0b11101111

Array4:
.db  0b11100111,0b11110111

Array5:
.db  0b11110011,0b11111011

Array6:
.db  0b11111001,0b11111101

Array7:
.db  0b11111100,0b11111110
;----------------------------------------
Я бы сделал методом табличной адресации, но вам это рано пока.
Последний раз редактировалось DX168B Вс май 15, 2011 15:09:14, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Да так...
Навсякий случай еще раз приведу последовательность.

1)Нажали на кнопку, пошел вывод Array0.
2)Ждем следующего нажатия, в порту вывода находится предыдущее значение
3)Нажали еще раз на кнопку, пошел вывод Array1, сначала 00111111, следом за ним (можно без задержек) 10111111
4)Ждем следующего нажатия, в порту вывода находится последний элемент (10111111)
5)Нажали на кнопку, пошел вывод Array2, сначала 10011111, следом 11011111.
Ну и так далее до последнего массива....

Буду премного благодарен за исходник, мне как для новичка так будет проще(не в том плане,что готовый код) а втом плане, что так проще понять будет, да и в дизасме будет на что посмотреть...вобщем думаю вы меня поняли.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Я так и сделал. Чтение массива начинается по заднему фронту, это если в исходном состоянии на ноге PD0 логический нуль. Если так, то советую резистор на минус питания, во избежание ложняков из-за Z состояния входов.
I am DX168B and this is my favourite forum on internet!
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

У меня чего-то затык получился с инкриментом значения кнопки, то есть прогграмма зависает в разделе INIT2 и дальше ни сместа, хотя значение регистра кнопки уже равно трем, ведь поидеи он должен идти дальше(как делает это в предыдущих двух случаях) а он чего то завис на этих двух строчках

Код: Выделить всё

cpi      knopka,      0x02
brne   INIT2
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Исправь:

Код: Выделить всё

cpi      knopka,      0x02
brne   INIT3
Это я копированием делал и забыл поправить. :)
И тут тоже:

Код: Выделить всё

LOAD_ARRAY:
lpm		temp,		Z+
out		PORTB,		temp
dec		temp1
brne	LOAD_ARRAY
cpi		knopka,		0x07 ;ЭТО ПОПРАВИТЬ
breq	CLEAR
inc		knopka
rjmp	BT_RQ
CLEAR:
clr		knopka
rjmp	BT_RQ
Последний раз редактировалось DX168B Вс май 15, 2011 15:29:13, всего редактировалось 1 раз.
I am DX168B and this is my favourite forum on internet!
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Еще вопрос, почему вы всякого рода числовые значения записываете в 16-ричной системе исчисления? Неужели так проще?
Что значит строчка .org INT_VECTORS_SIZE ?
Почему мы должны очистить регистр clr knopka, в нем изначально что-то записан?
Почему ldi temp, 0xFF, а не 0х00 ?
.
Вот блин, я сам лопух, такого не заметил, кинулся сразу прогу испытывать, спасибо ))
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Повтороюсь, так как я использую стк500, то начальное положение кнопки равно 1, если мне нужно сделать по последнему фронту, то нужно написать так?

Код: Выделить всё

sbis   PIND,      1
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1
Не, чего то не так, оно конечно и переключается по заднему фронту теперь, но зато массивы хаотично переключать стала, щас надо попробовать разобраться, из-за чего так (может из-за дребезга?)
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Привычка просто, да и запись короче получается
0xFF - это тоже самое, что 0b11111111
0x0F - это 0b00001111
0xF0 - это 0b11110000
0x00 - это 0b00000000
Я в основном использую только значения, которые привёл выше
и числа от 0 до 15 (от 0x00 до 0x0F)
Значения выше - в десятичной (16 - 254)
А выборочные единицы пишу так:

Код: Выделить всё

ldi temp, (1<<PB0)|(1<<PB1)|(1<<PB3) ; Получается 0b00001011
out DDRB, temp
На счёт кнопки - нет.
sbis PIND, 0 ; Это проверка ноги PD0
sbis PIND, 1 ; Это проверка ноги PD1
sbis PIND, 2 ; Это проверка ноги PD2

SBIS - Skip next command, if bit in I\O register is set
То есть: Пропустить следующую команду, если на ноге лог. 1
SBIC - тоже самое, но если на ноге лог. 0
А поменять надо так:

Код: Выделить всё

BT_RQ:
sbic   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbis   PIND,      0
rjmp   BT_RQ1
I am DX168B and this is my favourite forum on internet!
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Еще такой вопро, я орагнизовал задержку между переключениями элементов массива таким образом

Код: Выделить всё

LOAD_ARRAY:
lpm      temp,      Z+
out      PORTB,      temp
;---------------------------------
ldi zad1,0           
ldi zad2,0
l_res:
dec zad1
brne l_res
dec zad2
brne l_res
;---------------------------------
dec      temp1
brne   LOAD_ARRAY
cpi      knopka,      0x07
breq   CLEAR
inc      knopka
rjmp   BT_RQ
CLEAR:
clr      knopka
rjmp   BT_RQ
Это всё работает, но я захотел сделать задержку после нажатия кнопки, то есть нажал кнопку, а переключение например спустя пару секунд сработало, так вот я попытался же эту структуру вставить после обработки кнопки

Код: Выделить всё

BT_RQ:
sbis   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1
.............
Вот тут........
.............
ldi      temp1,      0x02
Но почему то у меня даже программа в Авр студио не запускается, соответсвенно в контроллер то же не записывается.
Просто у меня окно диалога куда-то за пределы экрана убежало (второй монитор подрубал), а как вернуть его не знаю, так поэтому и не знаю, что за error он мне выдает, а сам чего то не пойму, почему он ругается.....Может просто ввиде перехода оформить?
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Почему у меня читается только первый элемент массива?

Сообщение DX168B »

Отключите второй экран в свойствах рабочего стола вот тут:

Изображение

Можно оформить в виде вызываемой подпрограммы:

Код: Выделить всё

.cseg
.org 0x0000
rjmp RESET
.org INT_VECTORS_SIZE ;Эта строка организует нашу программу 
       ; после таблицы векторов прерываний
RESET:
ldi R16, Low(RAMend)
out SPL, R16  ;Инициализация стека. 
   ;Без этого не будут работать вызываемые подпрограммы.
............
rcall DELAY ;Вызовем задержку в любом месте программы, после завершения 
  ; задержки, по команде ret в конце неё, мы вернёмся сюда и продолжим дальше.
.........
......
;------------------------------------
DELAY: ;Подпрограмма задержки
......
.....
ret ;Выходим из неё.
Старайтесь задействовать для задержек только свободные регистры, иначе потеряете данные с рабочих регистров.
I am DX168B and this is my favourite forum on internet!
Xaero
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вс дек 27, 2009 01:49:18

Re: Почему у меня читается только первый элемент массива?

Сообщение Xaero »

Ага спасибо за совет...
Слушайте, я попытался вставить задержку по вашему совету, но почему то разницы никакой не заметил, хотя в авр студио должна быть порядочная (по процессорному времени смотрел). Светодиоды с задержкой мигают, а переключение после нажатия происходит сразу же....

Код: Выделить всё

.include "tn2313def.inc"
.def Temp =r16
.def temp1 =r17
.def temp2 =r18
.def knopka=R21
.def zad1  =r19
.def zad2  =r20
;---------------------------------------
.cseg
.org 0x0000
rjmp RESET
.org INT_VECTORS_SIZE
;---------------------------------------
RESET:
ldi      temp,      Low(RAMend)
out      SPL,      temp
ldi      temp,      0xFF
out      DDRB,      temp
out      PORTB,      temp
clr      knopka
BT_RQ:
sbis   PIND,      0
rjmp   BT_RQ
BT_RQ1:
sbic   PIND,      0
rjmp   BT_RQ1
rcall Delay                                   ; Вызов подпрограммы задержки
ldi      temp1,      0x02
;---------------------------------------
cpi      knopka,      0x00
brne   INIT1
ldi      ZL,         Low(Array0*2)
ldi      ZH,         High(Array0*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT1:
cpi      knopka,      0x01
brne   INIT2
ldi      ZL,         Low(Array1*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT2:
cpi      knopka,      0x02
brne   INIT3
ldi      ZL,         Low(Array2*2)
ldi      ZH,         High(Array2*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT3:
cpi      knopka,      0x03
brne   INIT4
ldi      ZL,         Low(Array3*2)
ldi      ZH,         High(Array3*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT4:
cpi      knopka,      0x04
brne   INIT5
ldi      ZL,         Low(Array4*2)
ldi      ZH,         High(Array4*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT5:
cpi      knopka,      0x05
brne   INIT6
ldi      ZL,         Low(Array5*2)
ldi      ZH,         High(Array5*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT6:
cpi      knopka,      0x06
brne   INIT7
ldi      ZL,         Low(Array6*2)
ldi      ZH,         High(Array6*2)
rjmp   LOAD_ARRAY
;---------------------------------
INIT7:
ldi      ZL,         Low(Array7*2)
ldi      ZH,         High(Array7*2)
;---------------------------------
LOAD_ARRAY:
lpm      temp,      Z+
out      PORTB,      temp
;---------------------------------
rcall delay                               ;Еще один вызов подпрограммы
;---------------------------------
dec      temp1
brne   LOAD_ARRAY
cpi      knopka,      0x07
breq   CLEAR
inc      knopka
rjmp   BT_RQ
CLEAR:
clr      knopka
rjmp   BT_RQ
Delay:                                       ;Подпрограмма задержки
ldi zad1,0xff
ldi zad2,0xff
l_res:
dec zad1
brne l_res
dec zad2
brne l_res
ret                                             ;Выход из под программы
;---------------------------------------
Array0:
.db  0b01111111,0b01111111

Array1:
.db  0b00111111,0b10111111

Array2:
.db  0b10011111,0b11011111

Array3:
.db  0b11001111,0b11101111

Array4:
.db  0b11100111,0b11110111

Array5:
.db  0b11110011,0b11111011

Array6:
.db  0b11111001,0b11111101

Array7:
.db  0b11111100,0b11111110
;----------------------------------------
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»