;####################################################################################
;##                                                                                ##
;##   Dawid Urbanski                                                               ##
;##   10.2.2010r                                                                   ##
;##                                                                                ##
;##   kontakt: dawid.urb@wp.pl                                                     ##
;##   web: www.dawidurbanski.pl                                                    ##
;##                                                                                ##
;####################################################################################
;##   nazwa:                                                                       ##
;##   swiatlo rowerowe 1 guzik                                                     ##
;####################################################################################
;##   schemat:                                                                     ##
;##   PORTB_1 - switch/guzik                                                       ##
;##                                                                                ##
;##   PORTD_1 - led(red) 1                                                         ##
;##   PORTD_2 - led(red) 2                                                         ##
;##   PORTD_3 - led(red) 3                                                         ##
;##   PORTD_4 - led(red) 4                                                         ##
;##                                                                                ##
;##   PORTD_0 - led(green) 5                                                       ##
;##   PORTD_5 - led(green) 6                                                       ##
;####################################################################################

.nolist
.include "tn2313def.inc"
.list
.listmac


.def tmp     = r16
.def tmp2    = r17
.def tmp3    = r18
.def enable_f= r19
.def clock   = r20
.cseg
.org   0

;=========================================
init:
	cli					; globalna blokada przerwan

	;inicjacja stosu progamowego
	ldi	tmp,LOW(RAMEND)	
	out	SPL,tmp

	;output:
	ldi	tmp,0xFF		; same jedynki
	out	DDRD,tmp		; PORTD - wyjscie w stanie wysokim

	;input:
	ldi	tmp,0x03		; 0000000011
	out	PORTB,tmp		; PORTB - wejscia PULL-UP (w stanie wysokim)

	SEI					; globalna przerwania wlaczone
;=========================================

;####################################################################################
;## petla glówna programu
Main:

	;-----jezeli nacisniesz przycisk
	; wczytaj z pinu
	in	tmp,PINB		;  czy na porcie POTRTB jest przycisniety przycisk [r16 = stan portu KeyPort]
	cpi	tmp,0x01		;  na pinie 1
		breq Nastepna	;przelacz do nastepnej funkcji

	;-----wybor trybu pracy
	CPI  tmp2,0x0	;porownaj natychmiast
		breq Main_0	;takie same: Main_0

	CPI  tmp2,0x1	;porownaj natychmiast
		breq Main_1	;takie same: Main_1

	CPI  tmp2,0x2	;porownaj natychmiast
		breq Main_2	;takie same: Main_2

	CPI  tmp2,0x3	;porownaj natychmiast
		breq Main_3	;takie same: Main_2
	;------------------------

rjmp	Main		;powrot do petli
;####################################################################################

;=========================================
Nastepna:

	INC  tmp2		;  zwieksz (nastepna funkcja)

	CPI  tmp2,0x4	;  jezeli przekroczono zakrez zacznij od zera
	breq Zeruj		;  takie same: Zeruj

	;czekaj		
	ldi clock,7
	rcall Delay

rjmp	Main		;  powrot do petli

Zeruj:
	ldi  tmp2,0xFF	;  zeruj
rjmp	Main		;  powrot do petli
;=========================================


;=========================================
Main_0:

	rcall PORTD_1_OFF
	rcall PORTD_2_OFF
	rcall PORTD_3_OFF
	rcall PORTD_4_OFF

rjmp	Main		;  powrot do petli
;=========================================


;=========================================
Main_1:;czerwone wl

	;zapal
	rcall PORTD_1_ON
	rcall PORTD_2_ON
	rcall PORTD_3_ON
	rcall PORTD_4_ON

	;czekaj		
	ldi clock,2
	rcall Delay

rjmp	Main		;  powrot do petli
;=========================================

;=========================================
Main_2:;czerwone migaja


	;zapal
	rcall PORTD_1_ON
	rcall PORTD_2_ON
	rcall PORTD_3_ON
	rcall PORTD_4_ON

	;czekaj		
	ldi clock,1
	rcall Delay

	;zapal
	rcall PORTD_1_OFF
	rcall PORTD_2_OFF
	rcall PORTD_3_OFF
	rcall PORTD_4_OFF

	;czekaj
	ldi clock,1
	rcall Delay

rjmp	Main		;  powrot do petli
;=========================================

;=========================================
Main_3:;zielone migaja

	rcall PORTD_1_OFF
	rcall PORTD_2_OFF
	rcall PORTD_3_OFF
	rcall PORTD_4_OFF

	rcall PORTD_0_ON;
	rcall PORTD_5_ON;

	;czekaj		
	ldi clock,1
	rcall Delay

	rcall PORTD_0_OFF
	rcall PORTD_5_OFF

	;czekaj
	ldi clock,1
	rcall Delay

rjmp	Main		;  powrot do petli
;=========================================

;####################################################################################
;## PORTD led swieci
PORTD_ON:
	ldi tmp,0xFF
	out	PORTD,tmp		; PORTD - wyjscie w stanie wysokim
ret
PORTD_0_ON:
	sbi PORTD,0
ret
PORTD_1_ON:
	sbi PORTD,1
ret
PORTD_2_ON:
	sbi PORTD,2
ret
PORTd_3_ON:
	sbi PORTD,3
ret
PORTD_4_ON:
	sbi PORTD,4
ret
PORTD_5_ON:
	sbi PORTD,5
ret
PORTD_6_ON:
	sbi PORTD,6
ret
;####################################################################################
;## PORTD led NIE swieci
PORTD_OFF:
	ldi tmp,0x00
	out	PORTD,tmp		; PORTD - wyjscie w stanie wysokim
ret

PORTD_0_OFF:
	cbi PORTD,0
ret
PORTD_1_OFF:
	cbi PORTD,1
ret
PORTD_2_OFF:
	cbi PORTD,2
ret
PORTD_3_OFF:
	cbi PORTD,3
ret
PORTD_4_OFF:
	cbi PORTD,4
ret
PORTD_5_OFF:
	cbi PORTD,5
ret
PORTD_6_OFF:
	cbi PORTD,6
ret
;####################################################################################
;## PORTB led swieci
PORTB_ON:
	ldi tmp,0xFF
	out	PORTB,tmp		; PORTD - wyjscie w stanie wysokim
ret		

PORTB_0_ON:
	sbi PORTB,0
ret
PORTB_1_ON:
	sbi PORTB,1
ret
PORTB_2_ON:
	sbi PORTB,2
ret
PORTB_3_ON:
	sbi PORTB,3
ret
PORTB_4_ON:
	sbi PORTB,4
ret
PORTB_5_ON:
	sbi PORTB,5
ret
PORTB_6_ON:
	sbi PORTB,6
ret

;####################################################################################
;## PORTB led NIE swieci
PORTB_OFF:
	ldi tmp,0x00
	out	PORTB,tmp		; PORTD - wyjscie w stanie wysokim
ret

PORTB_0_OFF:
	cbi PORTB,0
ret
PORTB_1_OFF:
	cbi PORTb,1
ret
PORTB_2_OFF:
	cbi PORTB,2
ret
PORTB_3_OFF:
	cbi PORTB,3
ret
PORTB_4_OFF:
	cbi PORTB,4
ret
PORTB_5_OFF:
	cbi PORTB,5
ret
PORTB_6_OFF:
	cbi PORTB,6
ret
;####################################################################################

;####################################################################################
;## opóznienie
;## ustawiamy rejestrem 19 'clock'
Delay:
	clr r1
	clr r2

delay_loop:
	dec r1
	brne delay_loop
	dec r2
	brne  delay_loop
	dec clock
	brne delay_loop

ret

.exit
;-----------------------------------------------------------------------------
