.include "D:\tmp2\for_work\avr\avrasm\APPNOTES\2313def.inc"

; счетчик импульсов, начиная от младшего и заканчивая старшим? есть глюк, по рерыванию промигивает индикатор

	.def	Temp=R22
	.def	Temp1=R16
	.def	Temp2=R17
	.def	Temp3=R18
	.def	Temp4=R19
	.def	Temp5=R20
	.def	Temp6=R21
	.def	Temp7=R23
	.def	Temp8=R24
	.def	Temp9=R25


.dseg

Digit:	.byte 4
Line:	.byte 4
Key:	.byte 1




;******************************************************************************

;******************************************************************************
.cseg
.org 0

              rjmp RESET    ; Reset Handler
              rjmp EXT_INT0 ; IRQ0 Handler
              rjmp EXT_INT1 ; IRQ1 Handler
              rjmp TIM_CAPT1 ; Timer1 Capture Handler
              rjmp TIM_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
TIM_OVF0  :	ret
TIM_OVF1  :   ret
UART_RXC  :   ret
UART_DRE  :   ret
UART_TXC  :   ret
ANA_COMP  :   ret
;TIM_COMP1 :   ret



reset:        ldi Temp1,RamEnd	;инициализация стека
              out SPL,Temp1

              cli

              ldi Temp,0b11111111 ;настройка портов
              out ddrb,Temp

              ldi Temp,0b00001111
              out ddrd,Temp

              ldi Temp,0
              sts Digit  ,Temp      ;загрузка начальных сначений
              ldi Temp,0
              sts Digit+1,Temp
              ldi Temp,0
              sts Digit+2,Temp
              ldi Temp,0
              sts Digit+3,Temp

              ldi Temp3,0 	;обнуление промежуточных регистров
              ldi Temp4,0
              ldi Temp5,0
              ldi Temp6,0
		
          ldi Temp,0b01000000   ;разрешить прерывание компаратора
          out TIMSK,Temp

          ldi Temp,0b00000100   ;тактовый сигнал = CK/64
          out TCCR1B,Temp

          ldi Temp,0xF4         ;инициализация компаратора
          out OCR1AH,Temp
          ldi Temp,0x24
          out OCR1AL,Temp

          ldi Temp1,0           ;инициализация индикатора

          ldi Temp,0            ;обнуление таймера
          out TCNT1H,Temp
          out TCNT1L,Temp

          sei                   ;разрешить прерывания


;*********************************************************
;MAIN
;*********************************************************

IndicCycle:   
              rcall Display        ;цикл индикации
              rjmp IndicCycle

;*********************************************************
;Display:
TIM_COMP1:
		
              lds Temp1,Digit
              inc Temp1	
	      sts Digit  ,Temp1 
	      rcall Timer_clr
;последовательный вывод на индикацию содержимого
;переменной Digit
Display:      
	
	      lds Temp1,Digit 
	      cpi Temp1,0x0A
              breq Null


; точка возврата после обработки подпраграммы Null             
begin:	      sts Digit  ,Temp1          
              lds Temp1,Digit      ;загружаем 0-ю ячейку
              ldi Temp,0b00001110  ;активируем 0-й разряд
                                   ;индикации
              out PortD,Temp
              rcall Decoder        ;вызываем 7-сегм. декодер
              out PortB,Temp1      ;выводим значение в порт
              rcall Delay1         ;ждем

              
              lds Temp1,Digit+1    ;и .т.д            
	      cpi Temp3,0x6
              breq Null_1 
begin1:	      sts Digit+1  ,Temp3          
              lds Temp1,Digit+1   
              
              ldi Temp,0b00001101
              out PortD,Temp
              rcall Decoder
              out PortB,Temp1
              rcall Delay1

              lds Temp1,Digit+2                   
	      cpi Temp4,0x0A
              breq Null_2 
begin2:	      sts Digit+2  ,Temp4          
              lds Temp1,Digit+2   
              ldi Temp,0b00001011
              out PortD,Temp
              rcall Decoder
              out PortB,Temp1
              rcall Delay1

              lds Temp1,Digit+3
	      cpi Temp5,0x6
              breq Null_3 
begin3:	      sts Digit+3  ,Temp5          
              lds Temp1,Digit+3  
              ldi Temp,0b00000111
              out PortD,Temp
              rcall Decoder
              out PortB,Temp1
              rcall Delay1

              ret
Timer_clr:
	      ldi Temp7,0            ;обнуление таймера
              out TCNT1H,Temp7
              out TCNT1L,Temp7
		reti

;*********************************************************

Null:
		ldi Temp1, 0
		inc Temp3
		sts Digit+1  ,Temp3 
              	rjmp begin
Null_1:
		ldi Temp3, 0
		inc Temp4
		sts Digit+2  ,Temp4 
		rjmp begin1
Null_2:
		ldi Temp4, 0
		inc Temp5
		sts Digit+3  ,Temp5 
		rjmp begin2
Null_3:
		ldi Temp5, 0
		inc Temp6
		sts Digit+3  ,Temp6 
		rjmp begin3

;**************************************************
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
	      com Temp1
              ret

DcMatrix:
;массив - таблица истинности декодера
              ;     hgfedcba   hgfedcba
              .db 0b00111111,0b00000110	;0,1
              .db 0b01011011,0b01001111	;2,3
              .db 0b01100110,0b01101101	;4,5
              .db 0b01111101,0b00000111	;6,7
              .db 0b01111111,0b01101111	;8,9


;*********************************************************

Delay1:
;цикл задержки

              push Temp1
              push Temp2


              ldi Temp1,0
              ldi Temp2,5
              
              
d11:          dec Temp1
              brne d11
              dec Temp2
              brne d11

              pop Temp2
              pop Temp1

              ret











































