.include "d:\avr\avrasm\appnotes\2313def.inc"

.def Temp1=R16
.def Temp2=R17
.def Temp3=R18 
.def st1=R19 
.def st2=R20 
.def st3=R21
.def st4=R22 
.def st5=R23 
.def st6=R24 
.def sek=R25
.def presskey=R26 
.def hor=R27  
 
 
 
.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,0b00111111
out ddrb, Temp1 ; настройка порта b

ldi Temp1,0b00001111
out ddrd, Temp1 ; настройка порта d

ldi Temp1,0b01000000
out Timsk,Temp1 ;разрешить прерывание компаратора

ldi Temp1,0b00000100
out Tccr1b,Temp1 ;тактовый сигнал /256

ldi Temp1,0x7a
out Ocr1ah,Temp1
ldi Temp1,0x12
out Ocr1al,Temp1 ;запись числа сравнения 31250 (0.4сек. при 8мгц)


ldi Temp1,0b00000000 ; установка нуля 
mov st1,Temp1
mov st2,Temp1
mov st3,Temp1
mov st4,Temp1
mov st5,Temp1
mov st6,Temp1

ldi sek,0; обнуление счетчика секунд

ldi Presskey,0 ; обнуление индикатора кнопок

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

sei ; разрешение глобальных прерываний

;******************** Программа *********************************************************

Cycle:
rcall Display
rcall Press
rjmp Cycle
;*******************Индикация***********************
Display:

ldi Temp1, 0b00011111
out Portb,Temp1
mov Temp1,st1
out Portd,Temp1
rcall Delay ; индикация 1-ого разряда (мл.)

ldi Temp1, 0b00101111
out Portb,Temp1
mov Temp1,st2
out Portd,Temp1
rcall Delay ; индикация 2-ого разряда

ldi Temp1, 0b00110111
out Portb,Temp1
mov Temp1,st3
out Portd,Temp1
rcall Delay ; индикация 3-его разряда

ldi Temp1, 0b00111011
out Portb,Temp1
mov Temp1,st4
out Portd,Temp1
rcall Delay ; индикация 4-ого разряда

ldi Temp1, 0b00111101
out Portb,Temp1
mov Temp1,st5
out Portd,Temp1
rcall Delay ; индикация 5-ого разряда

ldi Temp1, 0b00111110
out Portb,Temp1
mov Temp1,st6
out Portd,Temp1
rcall Delay ; индикация 6-ого разряда
rcall Timer1_comp1



ret
;***********задержка***************************************
Delay:
ldi Temp1,0
ldi Temp2,1
dll: dec Temp1
brne dll
dec Temp2
brne dll
ret
;**********************************************************
Timer1_comp1:

ldi Temp1,0
out Tcnt1h,Temp1
out Tcnt1l,Temp1 ;обнуление счетчика

inc sek ; увелечение секунд
cpi sek,150 ; разность 150*0.4c=60c=1мин
brne Out3 ; если не ноль то выход

;**********
mov temp1,st6
inc temp1
cpi temp1,10
breq test1
mov st6,temp1
rjmp out3

;**********

test1:
ldi temp1,0
mov st6,temp1

mov temp1,st5
inc temp1

cpi temp1,6
breq test2

mov st5,temp1
rjmp out3

;**********

test2:

ldi temp1,0
mov st5,temp1

mov temp1,st4
inc temp1

cpi temp1,10
breq test3

mov st4,temp1
rjmp out2

;**********

test3:

ldi temp1,0
mov st4,temp1

mov temp1,st3
inc temp1

cpi temp1,6
breq test4

mov st3,temp1
rjmp out2

;**********

test4:

ldi temp1,0
mov st3,temp1

mov temp1,st2
inc temp1

cpi temp1,10
breq test5

mov st2,temp1
rjmp out1

;**********

test5:

ldi temp1,0
mov st2,temp1

mov temp1,st1
inc temp1

mov st1,temp1
rjmp out1

;****************************************
out1:

mov temp1,st1
cpi temp1,2
brne out2

mov temp1,st2
cpi temp1,4
brne out2

ldi temp1,0
mov st2,temp1
mov st1,temp1

;**********
out2:

mov temp1,st3
cpi temp1,6
brne out3

mov temp1,st4
cpi temp1,10
brne out3

ldi temp1,0
mov st3,temp1
mov st4,temp1

;**********
out3:
ret
;**********************************************************

;**************************Обработчик конопок**************
Press:
in Temp1,PinD ; чтение порта d
andi Temp1,0b00110000 ; обрезка по маске
cpi Temp1,0b00110000 ;разность
breq Nobut ; если ноль (нет нажатых) выход 

;===================================

cpi Temp1,0b00100000
brne Press_hour ; если не ноль то нажата кнопка ред. часов

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00100000 ; запись индикатора кнопок


mov Temp1,st4 ; чтение 4-ого разряда
inc Temp1 ;увелечение 4-ого разряда

cpi Temp1,10 ;разность
breq Tst2 ;если  ноль тест2

mov st4,Temp1 ;запись числа 4-ого разряда
rjmp Outpress ; выход

;=================================

Tst2:

ldi Temp1,0 ; установка нуля 
mov st4,Temp1 ;запись нуля 4-ого разряда

mov Temp1,st3 ; чтение 3-ого разряда
inc Temp1 ;увелечение 3-ого разряда

cpi Temp1,6 ;разность
breq Tst3 ;если  ноль тест3

mov st3,Temp1 ;запись числа 3-ого разряда
rjmp Outpress ; выход

;=================================

Tst3:
ldi Temp1,0 ; установка нуля 
mov st3,Temp1 ;запись нуля 3-ого разряда
rjmp Outpress ; выход
;******************
Press_hour:

sub Temp1,Presskey ; разность
breq Outpress ; если ноль, нажата та же кнопка то выход
ldi Presskey,0b00010000 ; запись индикатора кнопок

mov Temp1,st2 ; чтение 2-ого разряда
inc Temp1 ;увелечение 2-ого разряда

cpi Temp1,10 ;разность
breq Tst4 ;если  ноль тест4

mov st2,Temp1 ;запись числа 2-ого разряда
rjmp Tst6
rjmp Outpress ; выход

;=================================

Tst4:

ldi Temp1,0 ; установка нуля 
mov st2,Temp1 ;запись нуля 2-ого разряда

mov Temp1,st1 ; чтение 1-ого разряда
inc Temp1 ;увелечение 1-ого разряда

cpi Temp1,3 ;разность
breq Tst5 ;если  ноль тест5

mov st1,Temp1 ;запись числа 1-ого разряда
rjmp Outpress ; выход

;=================================

Tst5:
ldi Temp1,0 ; установка нуля 
mov st1,Temp1 ;запись нуля 1-ого разряда
rjmp Outpress ; выход

Tst6:
mov temp1,st1
cpi temp1,2
brne Outpress

mov temp1,st2
cpi temp1,4
brne Outpress

ldi temp1,0
mov st2,temp1
mov st1,temp1

rjmp Outpress
 

Nobut:
ldi Presskey,0 ; обнуление индикатора кнопок
Outpress:
ret
;**********************************************************











