.include "Appnotes\tn2313def.inc"

.def Temp1=R16
.def Temp2=R17
.def Chsec=R18 ;секунды
.def Presskey=R19 ;флаг кнопок
.def Ddp=R20 ;запятая
.def temp3=r21;регистр доп флагов
.dseg
Digit: .byte 4


.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

;Reset: ;сброс по питанию
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1: ;счетчик
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti
;************************************Инициализация****************************************
Reset:

ldi Temp1,RamEnd
out SPL,Temp1 ; инициализация стека

ldi Temp1,0b11111111
out ddrb, Temp1 ; настройка порта b

ldi Temp1,0b01101100
out ddrd, Temp1 ; настройка порта d

ldi Temp1,0b01000000
out Timsk,Temp1 ;разрешить прерывание компаратора

ldi Temp1,0b00000100
out Tccr1b,Temp1 ;тактовый сигнал /256

ldi Temp1,0x3d
out Ocr1ah,Temp1
ldi Temp1,0x09
out Ocr1al,Temp1 ;запись числа сравнения 15625 (0.4сек. при 8мгц)

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1
sts Digit+1,Temp1
sts Digit+2,Temp1

sts Digit+3,Temp1

ldi Chsec,0; обнуление счетчика секунд

ldi Presskey,0 ; обнуление индикатора кнопок

ldi Ddp,0 ;обнуление запятой

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

sei ; разрешение глобальных прерываний


;******************** Программа *********************************************************

Cycle:
rcall Display
rcall Press
rjmp Cycle
;*******************Индикация***********************
Display:

ldi Temp1, 0b01000000
out PortD,Temp1
lds Temp1,Digit
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 1-ого разряда (мл.)
ldi temp1,0
out portb,temp1
rcall Delay1
out portd,temp1

ldi Temp1, 0b00100000
out PortD,Temp1
lds Temp1,Digit+1
rcall Decoder
out PortB,Temp1
rcall Delay ; индикация 2-ого разряда
ldi temp1,0
out portb,temp1
rcall Delay1
out portd,temp1

ldi Temp1, 0b00001000
out PortD,Temp1
lds Temp1,Digit+2
rcall Decoder
andi Ddp,0b00000001 ;обрезка по маске
cpi Ddp,1 ;разность 
breq Indicout ;если ноль то индикация без запятой
ldi Temp2,0b00100000
add Temp1,Temp2 ;добавление сегмента h запятая
Indicout: out PortB,Temp1
rcall Delay ; индикация 3-ого разряда
ldi temp1,0
out portb,temp1
rcall Delay1
out portd,temp1
lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,0 ; разность
breq s12
ldi Temp1, 0b00000100
out PortD,Temp1
lds Temp1,Digit+3
rcall Decoder
out PortB,Temp1
s12:rcall Delay ; индикация 4-ого разряда
ldi temp1,0
out portb,temp1
rcall Delay1
out portd,temp1

ret

;***********************************Подпрограммы*****************************************

;***********дешифратор*********************************
Decoder:

ldi ZL,Low(Matrix*2)
ldi ZH,High(Matrix*2)
ldi Temp2,0
add ZL,Temp1
adc ZH,Temp2
lpm
mov Temp1,r0

ret
;**********************************************************

;***********массив*****************************************
Matrix:
;     edhcgafb   edhcgafb
.db 0b11010111,0b00010001 ;01
.db 0b11001101,0b01011101 ;23
.db 0b00011011,0b01011110 ;45
.db 0b11011110,0b00010101 ;67
.db 0b11011111,0b01011111 ;89
;**********************************************************
Delay1:
ldi Temp1,125
ldi Temp2,1
s11: dec Temp1
brne s11
dec Temp2
brne s11
ret

;***********задержка***************************************
Delay:
ldi Temp1,0
ldi Temp2,2
dll: dec Temp1
brne dll
dec Temp2
brne dll
ret
;**********************************************************

;***************Обработчик прерывания**********************
Timer1_comp1:
push temp1
ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

inc Ddp ; увелечение запятой

inc Chsec ; увелечение секунд
cpi Chsec,60 ; разность 60*1sec=60c=1мин
brne Output2 ; если не ноль то выход

;================================

ldi Chsec,0 ; обнуление счетчика секунд

;================================

lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Test2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Output2 ; выход2

;=================================

Test2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Test3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Output2 ; выход2


;=================================

Test3:

ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда

cpi Temp1,10 ;разность
breq Test4 ;если  ноль тест4

sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Output1 ; выход1

;=================================

Test4:

ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда
clr temp3;разрешить индикацию 4 разряда
sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Output1 ; выход 1

;=================================

Output1:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Output2 ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Output2 ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

Output2:
pop temp1
reti
;**********************************************************

;**************************Обработчик конопок**************
Press:
in Temp1,PinD ; чтение порта d
andi Temp1,0b00000011 ; обрезка по маске
cpi Temp1,0b00000011 ;разность
breq Nobut ; если ноль (нет нажатых) выход 

;===================================

cpi Temp1,0b00000010
brne Press_hour ; если не ноль то нажата кнопка ред. часов

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000010 ; запись индикатора кнопок


lds Temp1,Digit ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,10 ;разность
breq Tst2 ;если  ноль тест2

sts Digit,Temp1 ;запись числа 1-ого разряда
rjmp Outpress ; выход

;=================================

Tst2:

ldi Temp1,0 ; установка нуля 
sts Digit,Temp1 ;запись нуля 1-ого разряда

lds Temp1,Digit+1 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,6 ;разность
breq Tst3 ;если  ноль тест3

sts Digit+1,Temp1 ;запись числа 2-ого разряда
rjmp Outpress ; выход

;=================================

Tst3:
ldi Temp1,0 ; установка нуля 
sts Digit+1,Temp1 ;запись нуля 2-ого разряда
rjmp Outpress ; выход
;******************
Press_hour:

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00000001 ; запись индикатора кнопок

lds Temp1,Digit+2 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда
cpi Temp1,10 ;разность
breq Tst4 ;если  ноль тест4
sts Digit+2,Temp1 ;запись числа 3-ого разряда
rjmp Tst24 ; проверка на 24

;============================

Tst4:
ldi Temp1,0 ; установка нуля 
sts Digit+2,Temp1 ;запись нуля 3-ого разряда

lds Temp1,Digit+3 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда
sts Digit+3,Temp1 ;запись числа 4-ого разряда
rjmp Outpress ;выход

Tst24:

lds Temp1,Digit+3 ;чтение 4-ого разряда
cpi Temp1,2 ; разность
brne Outpress ;если не ноль выход

lds Temp1,Digit+2 ;чтение 4-ого разряда
cpi Temp1,4 ; разность
brne Outpress ;если не ноль выход

ldi Temp1,0
sts Digit+2,Temp1
sts Digit+3,Temp1 ;обнуление 3-ого и 4-ого разрядов

rjmp Outpress ;выход

Nobut:
ldi Presskey,0 ; обнуление индикатора кнопок
Outpress:
ret
;**********************************************************
