/*
 * Shim1.asm
 *
 *  Created: 27.01.2014 12:24:36
 *   Author: SVShishkin
 */ 


 ;Программа для ШИМна базе микроконтроллера ATTINY2313

;Назначение флагов регистра flo
;0 разряд - флаг одной минуты
;1 разряд - флаг для кнопки №1 "больше"
;2 разряд - флаг для кнопки №2 "меньше"
;3 разряд - флаг для кнопки №3 "Старт/стоп"
;4 разряд - флаг увеличения значения для кнопки "больше"
;5 разряд - флаг увеличения значения для кнопки "меньше"
;6 разряд - флаг разрешения счета (обратный отсчет времени)
;7 разряд - флаг разрешающий включение точки h в разряде
;единиц минут

;Назначение флагов регистра flo1
;0 разряд - флаг выключения звуковой сигнализации
;1 разряд - флаг разрешающий быстрое увеличение времени (ZNAK)
;2 разряд - флаг разрешающий быстрое уменьшение времени 
;3 разряд - флаг запускаюший счетчик времени KKNR1 (PUSK2)
;4 разряд - флаг запускаюший счетчик времени KKNR2

;.INCLUDE	"2313def.inc"

.DEF	KKNR1=r0
.DEF	KKNR2=r1
.DEF	KKNR3=r2
.DEF	KKNR4=r3
.DEF	t2=r16
.DEF	t1=r17
.DEF	tec=r18
.DEF	SSREG=r19
.DEF	shim=r20
.DEF	shim1=r21
.DEF	catod=r22
.DEF	cod=r23
.DEF	flo=r24
.DEF	flo1=r25
.equ RAM=$060

.CSEG

.ORG	0
		rjmp	INIT

.ORG	OVF0addr

;Обработка прерывания от таймера Т/С0
S0:		in	SSREG,SREG
			
		dec	 KKNR1
		brne EMOK3
		ldi  t1,10
		mov	 KKNR1,t1

		sbrc flo1,1		;ZNAK
		rjmp EMOK2
		sbrc flo,1
		rjmp MIL1
		SBR  flo,0b00000010
		rjmp EMOK2
MIL1:	CBR  flo,0b00000010	

EMOK2:	sbrs flo1,3	   ;PUSK2
		rjmp EMOK1
		dec	 KKNR2
		brne EMOK3
		ldi  t1,10
		mov	 KKNR2,t1
		CBR  flo1,0b00000010
		rjmp EMOK3
EMOK1:	SBR  flo1,0b00000010	

EMOK3:	dec	 KKNR3
		brne SL0
		ldi  t1,10
		mov	 KKNR3,t1

		sbrc flo1,2		;ZNAK
		rjmp EMOK21
		sbrc flo,2
		rjmp MIL11
		SBR  flo,0b00000100
		rjmp EMOK21
MIL11:	CBR  flo,0b00000100	

EMOK21:	sbrs flo1,4	   ;PUSK2
		rjmp EMOK11
		dec	 KKNR4
		brne SL0
		ldi  t1,10
		mov	 KKNR4,t1
		CBR  flo1,0b00000100
		rjmp SL0
EMOK11:	SBR  flo1,0b00000100	

SL0:	ldi  t2,0b11111110;кнопка № 1
		out  PORTB,t2
		nop
		nop
		nop
		sbic PIND,2
		rjmp S1
		sbrc flo,1
		rjmp MS1
		cpi  shim,99		
		breq MS1


		cbi  PORTD,6
		inc	 shim
		mov  shim1,shim
		lsl  shim1
		mov  t1,shim1
		mov  shim1,shim
		lsr	 shim1
		adc  shim1,t1
		ldi	 t1,0
		out	 OCR1AH,t1	
		out	 OCR1AL,shim1			
		SBR  flo,0b00010010		;бит увеличения времени
		SBR  flo1,0b00001000	;PUSK2
		rjmp ms1

S1:     CBR  flo,0b000000010
		CBR  flo1,0b00001000

		ldi  t2,0b11111101		;кнопка № 2
		out  PORTB,t2
		nop
		nop
		nop
		sbic PIND,2
		rjmp S2
		sbrc flo,2
		rjmp ms1
		cpi  shim,0		
		breq MOS1

		cbi  PORTD,6
		dec	 shim
		mov  shim1,shim
		lsl  shim1
		mov  t1,shim1
		mov  shim1,shim
		lsr	 shim1
		adc  shim1,t1
		ldi	 t1,0
		out	 OCR1AH,t1	
		out	 OCR1AL,shim1

		SBR  flo,0b00100100; бит уменьшения времени
		SBR  flo1,0b00010000
		rjmp ms1
mos1:   sbi  PORTD,6
		rjmp ms1
S2:     CBR  flo,0b000000100
		CBR  flo1,0b00010000
		
	    ldi  t2,0b11111011		;кнопка № 3
		out  PORTB,t2
		nop
		nop
		nop
		sbic PIND,2
		rjmp S3
		sbrc flo,3
		rjmp ms1
		SBR  flo,0b000001000
		ldi	 t1,0
		out	 OCR1AH,t1	
		out	 OCR1AL,t1
		
	;	sbis PORTD,6
	;	rjmp ML1		
	;	cbi  PORTD,6
	;	rjmp MS1
ML1:	sbi  PORTD,6
		rjmp ms1

S3:     CBR  flo,0b000001000
	
ms1:	sbi PORTD,0
		sbi PORTD,1
		lsl catod
		sbrs catod,3

		brne	m1
		ldi	catod, 1
m1:		ldi	YL,low(RAM)
		ldi	YH,high(RAM)

		sbrs catod,1
		rjmp  m2
		adiw YL,0
		cbi PORTD,1
		rjmp  m3
				
m2:		sbrs catod,2
		rjmp  m3
		adiw YL,1
		cbi PORTD,0
						
m3:		ld cod,Y

		CPI  cod,0
		brne m10
		cbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		cbi PORTB,4
		cbi PORTB,5
		cbi PORTB,6
		sbi PORTB,7			;0
		;ldi  t1,0b11000000
m10:	CPI  cod,1
		brne m11
		sbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		sbi PORTB,4
		sbi PORTB,5
		sbi PORTB,6
		sbi PORTB,7			;1
		;ldi  t1,0b11111001
m11:	CPI  cod,2
		brne m12
		cbi PORTB,0
		cbi PORTB,1		
		sbi PORTB,2
		cbi PORTB,4
		cbi PORTB,5
		sbi PORTB,6
		cbi PORTB,7			;2
		;ldi  t1,0b10100100
m12:	CPI  cod,3
		brne m13
		cbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		cbi PORTB,4
		sbi PORTB,5
		sbi PORTB,6
		cbi PORTB,7			;3
		;ldi  t1,0b10110000
m13:	CPI  cod,4
		brne m14
		sbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		sbi PORTB,4
		sbi PORTB,5
		cbi PORTB,6
		cbi PORTB,7			;4
	    ;ldi  t1,0b10011001
m14:	CPI  cod,5
		brne m15
		cbi PORTB,0
		sbi PORTB,1		
		cbi PORTB,2
		cbi PORTB,4
		sbi PORTB,5
		cbi PORTB,6
		cbi PORTB,7			;5
		;ldi  t1,0b10010010
m15:	CPI  cod,6
		brne m16
		cbi PORTB,0
		sbi PORTB,1		
		cbi PORTB,2
		cbi PORTB,4
		cbi PORTB,5
		cbi PORTB,6
		cbi PORTB,7			;6
		;ldi  t1,0b10000010
m16:	CPI  cod,7
		brne m17
		cbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		sbi PORTB,4
		sbi PORTB,5
		sbi PORTB,6
		sbi PORTB,7			;7
		;ldi  t1,0b11111000
m17:	CPI  cod,8
		brne m18
		cbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		cbi PORTB,4
		cbi PORTB,5
		cbi PORTB,6
		cbi PORTB,7			;8
		;ldi  t1,0b10000000
m18:	CPI  cod,9
		brne m19
		cbi PORTB,0
		cbi PORTB,1		
		cbi PORTB,2
		cbi PORTB,4
		sbi PORTB,5
		cbi PORTB,6
		cbi PORTB,7			;9
		;ldi  t1,0b10010000
m19:	;out  PORTB,t1

m201:	;sbi PORTB,7
	
m20:	out	SREG,SSREG
		reti

INIT:	ldi shim,0
		ldi shim1,0
		clr	flo	
		SBR flo,0b01000001;ldi flag,1
		SBR  flo1,0b00000001

		ldi  t1,10
		mov	 KKNR1,t1
		mov	 KKNR3,t1
		ldi  t1,10
		mov	 KKNR2,t1
		mov	 KKNR4,t1

		ldi catod,1
		ldi	r30,$DF
        out	SPL,r30
						
		ldi	r30,$FF		; настройка направления работы линий порта B и D
		out	DDRB,r30
		out	PORTB,r30
		ldi	r30,0b11111111	
		out PORTD,r30
		ldi	r30,0b11111011	
		out DDRD,r30
		sbi PORTD,6

		ldi	r30,$02		; режим работы таймера 0 с максимальным предварительным делением
		out	TCCR0B,r30

		ldi	r30,0b11000001		
		out	TCCR1A,r30

		ldi	r30,0b00000001		; режим работы таймера/счетчика 1 - ШИМ
		out	TCCR1B,r30
		ldi	r30,0
		out	OCR1AH,r30
		ldi	r30,0
		out	OCR1AL,r30
						
		ldi	r30,$02
		out	TIMSK,r30

		ldi	YL,low(RAM)
		ldi	YH,high(RAM)		
		ldi cod,0		;0
		st	Y+,cod
		ldi cod,0		;0
		st	Y+,cod	
		sei

SE1:    sbrc flo,6
		rjmp MIN11
		
SS1:	sbrc flo,0;
		rjmp MIN11
		SBR  flo,0b00000001;ldi  flag,1
		cbi  PORTD,3

EMMN1:	ldi	 YL,low(RAM)
		ldi	 YH,high(RAM)			
		ld   tec,Y+
		CPI  tec,0
		brne SOK1
		ld   tec,Y+
		CPI  tec,0
		brne SOK1

		sbi  PORTD,6
		rjmp MIN11

SOK1:	;dec	 shim1
		ldi	 YL,low(RAM)
		ldi	 YH,high(RAM)			
		ld   tec,Y
		dec	 tec
		CPI  tec,255
		brne SOK11
		ldi  tec,9
		st	 Y+,tec
		rjmp SOK2
SOK11:  st   Y,tec
		rjmp MIN11

SOK2:   ld   tec,Y
		dec	 tec
		CPI  tec,255
		brne SOK21
		ldi  tec,9
		st	 Y+,tec
		rjmp MIN11;SOK3
SOK21:	st   Y,tec
		rjmp MIN11

EMBN1:	ldi	 YL,low(RAM)
		ldi	 YH,high(RAM)			
		ld   tec,Y+
		CPI  tec,9
		brne SOV1
		ld   tec,Y+
		CPI  tec,9
		brne SOV1
		;ld   tec,Y+
		;CPI  tec,9
		;brne SOV1
		rjmp MIN11

SOV1:	;inc	 shim1
		ldi	 YL,low(RAM)
		ldi	 YH,high(RAM)			
		ld   tec,Y
		inc	 tec
		CPI  tec,10
		brne SOL1
		ldi  tec,0
		rjmp SOL11
SOL1:   st   Y,tec
		rjmp MIN11

SOL11:  st   Y+,tec
		ld   tec,Y
		inc	 tec
		CPI  tec,10
		brne SOL2
		ldi  tec,0
		rjmp MIN11;SOL21
SOL2:   st  Y,tec
		rjmp MIN11


			
MIN11:  ldi	 YL,low(RAM)
		ldi	 YH,high(RAM)			
		ld   tec,Y+
		CPI  tec,0
		brne MIN101
		ld   tec,Y+
		CPI  tec,0
		brne MIN101
		cpi  shim,0		
		brne MIN101
		sbi  PORTD,6
				
MIN101:	sbrs flo,4;		
		rjmp SLED1
		CBR  flo,0b00010000
		rjmp EMBN1
SLED1:	sbrs flo,5;		
		rjmp SE1
		CBR  flo,0b00100000
		rjmp EMMN1	
											
.EXIT
