;********************
;Ver. 1.0			*
;ATTINY2313 20PU	*
;4 MHz				*
;********************

.device attiny2313
.nolist
.include "tn2313def.inc"
.list

	.def	Temp1=R16
	.def	Temp2=R17
	.def	Temp3=R18
	.def	Temp4=R19
	.def	Temp=R20

.dseg

Digit:   .byte 4
Input:    .byte 2
Status:   .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,0b11111111
              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,2
              sts Digit+3,Temp


;*********************************************************
;MAIN
;*********************************************************

IndicCycle:   rcall Display        ;цикл индикации
              rjmp IndicCycle

;*********************************************************
Display:
;последовательный вывод на индикацию содержимого
;переменной Digit

              lds Temp1,Digit      ;загружаем 0-ю ячейку
              ldi Temp,0b0001000  ;активируем 0-й разряд
                                   ;индикации
              out PortD,Temp
              rcall Decoder        ;вызываем 7-сегм. декодер
              out PortB,Temp1      ;выводим значение в порт
              rcall Delay1         ;ждем

              lds Temp1,Digit+1    ;и .т.д
              ldi Temp,0b0010000
              out PortD,Temp
              rcall Decoder
              out PortB,Temp1
              rcall Delay1

              lds Temp1,Digit+2
              ldi Temp,0b0100000
              out PortD,Temp
              rcall Decoder
              out PortB,Temp1
              rcall Delay1

              lds Temp1,Digit+3
              ldi Temp,0b1000000
              out PortD,Temp
              rcall Decoder
              out PortB,Temp1
              rcall Delay1

              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:
;массив - таблица истинности декодера
              	;     edHcgfba   edHcgfba
             	.db 0b00101000,0b11101101	;0,1
              	.db 0b00110100,0b10100100	;2,3
              	.db 0b11100001,0b10100010	;4,5
              	.db 0b00100010,0b11101100	;6,7
              	.db 0b00100000,0b10100000	;8,9
				.db 0b11110111,0b11110000	;-,градус 10 11
				.db 0b11111111,0b11110000	;пусто,градус 12 11






;*********************************************************
Delay1:
;цикл задержки

              push Temp1
              push Temp2


              ldi Temp1,0
              ldi Temp2,10

d11:          dec Temp1
              brne d11
              dec Temp2
              brne d11

              pop Temp2
              pop Temp1

              ret

