Помогите,первая прграмма на ассемблере...
Добавлено: Вс авг 14, 2011 12:48:27
Программа считает секунды,и выводит значение на два семисегментных индикатора,подключенных в динамическом режиме.Проблема в том,что при подаче питания на индикаторах отображается всякая белеберда,но спустя какое-то время все нормально начинает показывать. P.S. Если где-то туплю сильно не пинайте это моя первая программа.
; Начало программы
rjmp Init
; =====================
Init :
ser temp ; Определяем входы и выходы портов
out DDRD,temp ;
out DDRC,temp ;
ldi temp,0b00111111
out DDRB,temp
ldi temp,0b11110110 ;
out PortD,temp ;
ldi temp,0b11111111 ; Включаем подтяжку для входов портов
out PortB,temp ;
ldi temp,0b11111101 ;
out PortC,temp ; и задаем начальные состояния выходов
ldi temp,0b00000101 ; Включаем таймер с частотой деления 1024
out TCCR0,temp
ldi mark125,125 ; Присваеваем mark125 число 125
ldi counter,125 ; Присваеваем counter число 125
ldi R20,0b11110110 ; Код для 0
ldi R21,0b01000010 ; Код для 1
ldi R22,0b10110011 ; 2
ldi R23,0b11010011 ; 3
ldi R24,0b01000111 ; 4
ldi R25,0b11010101 ; 5
ldi R26,0b11110101 ; 6
ldi R27,0b01010010 ; 7
ldi R28,0b11110111 ; 8
ldi R29,0b11010111 ; Код для 9
; =====================
; Основное тело программы
Start:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer4 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Tablo4 ; Если не ноль,переходим к Tablo4
ldi counter,125 ; Присваеваем counter число 125
inc time4 ; Увеличиваем time4 на 1
Minut2:
clr time ; Очищаем time
add time,time4 ; Прибавляем time4 к time
cpi time,10 ; time=10?
brne Tablo4 ; Нет,переходим к Tablo4
clr time4 ; Да,очищаем time4 inc time3 ; Увеличиваем time3 на 1
Tablo4:
cbi PortC,0
sbi PortC,1
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time4 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
Timer3:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer3 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Minut1 ; Если не ноль,переходим к Tablo3
inc time4 ; Увеличиваем time3 на 1
ldi counter,125
Minut1:
clr time
add time,time3 ; Прибавляем time3 к time
cpi time,6 ; time=6?
brne Tablo3 ; Нет,пропускаем команду
clr time3 ; Да,очищаем time
Tablo3:
cbi PortC,1
sbi PortC,0
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time3 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
rjmp Start
; Начало программы
rjmp Init
; =====================
Init :
ser temp ; Определяем входы и выходы портов
out DDRD,temp ;
out DDRC,temp ;
ldi temp,0b00111111
out DDRB,temp
ldi temp,0b11110110 ;
out PortD,temp ;
ldi temp,0b11111111 ; Включаем подтяжку для входов портов
out PortB,temp ;
ldi temp,0b11111101 ;
out PortC,temp ; и задаем начальные состояния выходов
ldi temp,0b00000101 ; Включаем таймер с частотой деления 1024
out TCCR0,temp
ldi mark125,125 ; Присваеваем mark125 число 125
ldi counter,125 ; Присваеваем counter число 125
ldi R20,0b11110110 ; Код для 0
ldi R21,0b01000010 ; Код для 1
ldi R22,0b10110011 ; 2
ldi R23,0b11010011 ; 3
ldi R24,0b01000111 ; 4
ldi R25,0b11010101 ; 5
ldi R26,0b11110101 ; 6
ldi R27,0b01010010 ; 7
ldi R28,0b11110111 ; 8
ldi R29,0b11010111 ; Код для 9
; =====================
; Основное тело программы
Start:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer4 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Tablo4 ; Если не ноль,переходим к Tablo4
ldi counter,125 ; Присваеваем counter число 125
inc time4 ; Увеличиваем time4 на 1
Minut2:
clr time ; Очищаем time
add time,time4 ; Прибавляем time4 к time
cpi time,10 ; time=10?
brne Tablo4 ; Нет,переходим к Tablo4
clr time4 ; Да,очищаем time4 inc time3 ; Увеличиваем time3 на 1
Tablo4:
cbi PortC,0
sbi PortC,1
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time4 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
Timer3:
in temp,TCNT0 ; Считываем состояние таймера и записываем в temp
cp temp,mark125 ; Сравниваем temp с mark125
brne Timer3 ; Если не равны,то переходим к Timer
subi mark125,-125 ; Прибавляем 125 к mark125
dec counter ; Отнимаем от counter 1
brne Minut1 ; Если не ноль,переходим к Tablo3
inc time4 ; Увеличиваем time3 на 1
ldi counter,125
Minut1:
clr time
add time,time3 ; Прибавляем time3 к time
cpi time,6 ; time=6?
brne Tablo3 ; Нет,пропускаем команду
clr time3 ; Да,очищаем time
Tablo3:
cbi PortC,1
sbi PortC,0
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,time3 ; прибавляем time к ZL
clr temp1 ; Очищаем temp1
ld temp1,Z ; Считываем Z в temp
out PortD,temp1 ; Выводим temp в порт D
rjmp Start