.device ATmega8 .nolist .include "D:\Programs\Electronic\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc" .list ; ==================================== ; Объявления: .def Temp =R16 .def Temp1 =R17 .def Temp2 =R18 .def Tmp =R19 .def Second =R20 .def DSecond=R21 .def Minute =R22 .def DMinute=R23 .def Hour =R24 .def DHour =R25 .def Count =R26 .dseg Digit: .byte 6 ; ==================================== .cseg .org 0 rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp EXT_INT1 ; IRQ1 Handler rjmp TIM_CAPT1 ; Timer1 Capture Handler rjmp TIMER1_COMP1 ; Timer1 Compare Handler rjmp TIM_OVF1 ; Timer1 Overflow Handler rjmp TIM_OVF0 ; Timer0 Overflow Handler rjmp UART_RXC ; UART RX Complete Handler rjmp UART_DRE ; UDR Empty Handler rjmp UART_TXC ; UART TX Complete Handler rjmp ANA_COMP ; Analog Comparator Handler EXT_INT0 : ret EXT_INT1 : ret TIM_CAPT1 : ret TIMER1_COMP1: ret TIM_OVF1 : ret UART_RXC : ret UART_DRE : ret UART_TXC : ret ANA_COMP : ret RESET: ldi Temp,low(RamEnd) ; Инициализация стека out SPL,Temp ; -- // -- ldi Temp,high(RamEnd) ; -- // -- out SPH,Temp ; -- // -- ldi Temp,0b11111111 ; настройка портa D out DDRD,Temp ; весь порт - выходы ldi Temp,0b00111111 ; настройка портa B out DDRB,Temp ; PB0-PB5 - выходы, остальные не используются ldi Temp,0b01100000 ; настройка портa C out DDRC,Temp ; PC5-PC6 - выходы, остальные не используются ldi Temp,0b00010000 ; разрешить прерывание компаратора out TIMSK,Temp ldi Temp,0b00000011 ; тактовый сигнал = СК/64 out TCCR1B,Temp ldi Temp,0xF4 ; инициализация компаратора |0xF4 out OCR1AH,Temp ; считать 62500 импульсов |0x24 ldi Temp,0x24 out OCR1AL,Temp ldi Temp,0 ; обнуляем таймер out TCNT1H,Temp out TCNT1L,Temp bset 7 ; устанавливаем 7ой бит регистра SREG ; в 1 (флаг общего разрешения прерываний) ;********************************************************* ldi DHour,2 ; загрузка начальных значений sts Digit ,DHour ldi Hour,3 sts Digit+1,Hour ldi DMinute,5 sts Digit+2,DMinute ldi Minute,9 sts Digit+3,Minute ldi DSecond,5 sts Digit+4,DSecond ldi Second,9 sts Digit+5,Second ;********************************************************* ;MAIN ;********************************************************* IndicCycle: rcall Display ;цикл индикации sts Digit ,DHour ;загрузка начальных сначений sts Digit+1,Hour sts Digit+2,DMinute sts Digit+3,Minute sts Digit+4,DSecond sts Digit+5,Second rjmp IndicCycle ;********************************************************* Display: ;последовательный вывод на индикацию содержимого ;переменной Digit lds Temp1,Digit ldi Temp,0b00111110 out PortB,Temp rcall Decoder out PortD,Temp1 rcall Delay lds Temp1,Digit+1 ldi Temp,0b00111101 out PortB,Temp rcall Decoder out PortD,Temp1 rcall Delay lds Temp1,Digit+2 ldi Temp,0b00111011 out PortB,Temp rcall Decoder out PortD,Temp1 rcall Delay lds Temp1,Digit+3 ldi Temp,0b00110111 out PortB,Temp rcall Decoder out PortD,Temp1 rcall Delay lds Temp1,Digit+4 ldi Temp,0b00101111 out PortB,Temp rcall Decoder out PortD,Temp1 rcall Delay lds Temp1,Digit+5 ldi Temp,0b00011111 out PortB,Temp rcall Decoder out PortD,Temp1 rcall Delay ret ;********************************************************* Decoder: ;преобразование двоичного числа ;в код 7-сегментного индикатора ldi ZL,Low(DcMatrix*2) ;инициализация массива ldi ZH,High(DcMatrix*2) ldi Temp2,0 ;прибавление переменной add ZL,Temp1 ;к 0-му адресу массива adc ZH,Temp2 lpm ;загрузка значения mov Temp1,R0 ret DcMatrix: ;массив - таблица истинности декодера ; hgfedcba hgfedcba .db 0b00111111,0b00000110 ;0,1 .db 0b01011011,0b01001111 ;2,3 .db 0b01100110,0b01101101 ;4,5 .db 0b01111100,0b00000111 ;6,7 .db 0b01111111,0b01100111 ;8,9 ;********************************************************* Delay: ;цикл задержки push Temp1 push Temp2 ldi Temp1,0 ldi Temp2,5 DelayPlus: dec Temp1 brne DelayPlus dec Temp2 brne DelayPlus pop Temp2 pop Temp1 ret ;********************************************************* TIM_OVF0: ; Обработчик прерывания таймера ldi Tmp,0 ; обнуляем счётчик таймера out TCNT1H,Tmp out TCNT1L,Tmp sei dec Second brmi PC+2 rjmp IndicCycle ldi Second,9 dec DSecond brmi PC+2 rjmp IndicCycle ldi DSecond,5 dec Minute brmi PC+2 rjmp IndicCycle ldi Minute,9 dec DMinute brmi PC+2 rjmp IndicCycle ldi DMinute,5 dec Hour brmi PC+2 rjmp IndicCycle ldi Hour,3 dec DHour brmi PC+2 rjmp IndicCycle ldi Hour,2 rjmp IndicCycle ret