rjmp СОМР_1 ;иначе на установку мигания ldi temp,0b11000000
ut TCCR1A,temp ;двоеточие включено постоянно
rjmp END_comp ;на выход
СОМР_1:
ldi temp,0b01000000
out TCCR1A,temp ;двоеточие мигает
END_comp:
reti ;выход из процедуры компаратора
;===== процедура Reset ====
RESET:
cli ;запрещаем прерывания на время установки
ldi temp,low(RAMEND) ;загрузка указателя стека
out SPL,temp
ldi temp,0b01110111 ;порт D разряды 0,1,2,4,5,6 на выход
out DDRD,temp
ldi temp, 0b11111100 ;порт В все на выход, кроме 0,1 (компаратор)
out DDRB,temp
;- таймеры —
ldi temp,0Ь00000010 ;запуск Timer0 входная частота 1:8
out TCCR0,temp ;управление разрядами по переполнению,
;частота около 2 кГц (4/8=0,5 МГц/256)
ldi temp,high(62 500);старший байт
out OCR1AH,temp ;вых. частота 1 Гц при вх. частоте 1:64
ldi temp,low(62500) ;младший байт out
OCR1AL,temp
ldi temp,0b01000000
out TCCR1A,temp ;включаем переключающую моду для вывода ОС1 (15)
ldi temp,0b01001011 ;запуск 1/64 timer1 с обнулением при сравнении
out TCCR1B,temp;
;- прерывания —
ldi temp,1< ;разрешаем прерывание INT1
out GIMSK,temp
ldi temp,(1<<<0CIE1A) ;разр. прерываний Tim0 и Tim1
out TIMSK,temp
ldi temp,(1< ;разр. прерывания компаратора при переключении
out ACSR,temp
sei ;разрешаем прерывания
;======= основной цикл ========
G_cycle: ;все время будем отслеживать пропадание внешнего питания
sbrs Flag,0 ;если бит0=1 идет установка
rjmp G_cycle ;если так, то ничего не делаем
sbic PinB,0 ;если напряжение есть
rcall Restore ;вызываем процедуру восстановления выходов
sbis PinB,0 ;если напряжения нет
rcall Disable ;вызываем процедуру отключения выходов
rjmp G_cycle ;зацикливаем программу
;======= конец основного цикла ========
Disable: ;процедура отключения
sbrc Flag,2 ;если бит1=1, то уже все сделали
rjmp END_dis ;выход из процедуры
cli ;запрещаем прерывания на время установок
sbr Flag,2 ;устанавливаем бит1 Flag
;обрываем внешние соединения и обнуляем все порты:
clr temp
out PortD,temp
out PortB,temp
out DDRD,temp
out DDRD,temp
sei ;разрешаем прерывания
END_dis:
ret ;конец процедуры отключения выходов
Restore: ;процедура восстановления
sbrs Flag,2 ;если бит1=0, то уже все остальное сделали
rjmp end_res ;выход из процедуры
;восстановление
cli ;запрещаем прерывания на время установок
cbr Flag,2 ;сбрасываем бит1 Flag
;восстанавливаем внешние соединения:
clr temp
ldi temp,0b01110111 ;порт D разряды 0,1,2,4,5,6 на выход
out DDRD,temp
ldi temp, 0b11111100 ;порт В все на выход, кроме 0,1
out DDRB,temp
sei ;разрешаем прерывания
END_res:
ret ;конец процедуры восстановления выходов
SEG_SET: ;процедура установки сегментов
cpi temp,0 ;ищем число, равное temp
brne ss_0
rcall OUT_0 ;и посылаем на нужную процедуру вывода сегментов
rjmp END_seg
ss_0: cpi temp,1
brne ss_1
rcall OUT_1
rjmp END_seg
ss_1: cpi temp,2
brne ss_2
rcall OUT_2
rjmp END_seg
ss_2: cpi temp,3
brne ss_3
rcall OUT_3
rjmp END_seg
ss_3: cpi temp,4
brne ss_4
rcall OUT_4
rjmp END_seg
ss_4: cpi temp,5
brne ss_5
rcall OUT_5
rjmp END_seg
ss_5: cpi temp,6
brne ss 6
rcall OUT_6
rjmp END_seg
ss_6: cpi temp,7
brne ss_7
rcall OUT_7
rjmp END_seg
ss_7: cpi temp,8
brne ss_8
rcall OUT_8
rjmp END_seg
ss_8: cpi temp,9
rcall OUT_9
END_seg:
jret ;конец процедуры установки сегментов
;процедуры для отображения цифр на семисегментном индикаторе
;ABCDEF(0);ВС(1)/ABDEG(2)/ABCDG(3)/BCFG(4);ACDFG(5)
;ACDEFG(6);ABC(7);ABCDEFG(8);ABCDFG(9)
Out_0:
sbi PortD,segA
sbi PortD,segB
sbi PortB,segC
sbi PortB,segD
sbi PortB,segE
sbi PortB,segF
ret
OUT_1:
sbi PortD,segB
sbi PortB,segC
ret
OUT_2:
sbi PortD,segA
sbi PortD,segB
sbi PortB,segG
sbi PortB,segE
sbi PortB,segD
ret
OUT_3:
Читать дальше
Конец ознакомительного отрывка
Купить книгу