

.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

