;PICD2_B.ASM   1.0.0                                      2006.06.04.
;********************************************************************
 
;Szerző:  Szabó István  test@t-es-t.hu
;Cég:     Tudomány és Technika
 
;********************************************************************
 
;PICD-2 demonstrációs és fejlesztő áramkör bemutató program
;az áramkör bemutatása: http://www.t-es-t.hu/elokep/pic/picd02.htm
 
;egy futó fényhatást keltő program, amelynél a futási sebességet a
;nyomógombbal lehet változtatni; A program 16 futási sebességet
;biztosít, amelyek során a jelváltási idő 0,05 s-tól 0,8 s-ig
;változhat 0,05 s-onként

;a program bemutatása: http://www.t-es-t.hu/elokep/pic/picd02b.htm
 
;********************************************************************
 
;kapcsolási rajz: http://www.t-es-t.hu/elokep/pic/picd02.htm
;mikrovezérlő: PIC12F508
;oszcillátor típusa: belső RC oszcillátor
;órajel: 4 MHz
;utasítás ciklus: 1000 ns
;programmemória: 84 sor
;adatmemória: 5 bájt
;WDT müködése: tiltva
;MCLR kivezetés: I/O
;kódvédelem: nincs
 
;Kivezetések kiosztása:
;GP0 - kimenet: LED1;
;GP1 - kimenet: LED2;
;GP2 - kimenet: LED3;
;GP3 - bemenet: nyomógomb;
;GP4 - kimenet: LED4;
;GP5 - kimenet: LED5;
 
;Módosítás-történet:
;2006.06.04. 1.0.0 - első verzió;
 
;********************************************************************
;FORDÍTÁSI ADATOK
;********************************************************************
   
  processor 12f508 ;a mikrovezérlő típusa 
 
;********************************************************************
;PROGRAMOZÁSI ADATOK
;********************************************************************
   
  __config H'000A' ;konfigurációs szó: B'0000 0000 1010'  
 
;********************************************************************
;DEKLARÁCIÓK
;********************************************************************
 
;I/O kivezetések azonosítása-----------------------------------------
   
PCL 		equ 	0x02 	;Programszámláló alsó 8-bites rész
STATUS 		equ 	0x03 	;Állapotregiszter
GPIO 		equ 	0x06 	;Kimeneti regiszter
SPEED 		equ 	0x07 	;Sebességvezérlő regiszter
DIRECTION 	equ 	0x08 	;Irányvezérlő regiszter
COUNTER 	equ 	0x09 	;Címző regiszter
S1 		equ 	0x0A 	;Késleltető/számláló regiszter
S2 		equ 	0x0B 	;Késleltető/számláló regiszter

;********************************************************************
;PROGRAM
;********************************************************************

;Alapbeállítások-----------------------------------------------------

	movlw 	B'10000000' 	;A 80h érték betöltése a W munkaregiszterbe 
	option			;A W tartalmának betöltése az OPTION regiszterbe 
	movlw 	B'00001000' 	;A 08h érték betöltése a W munkaregiszterbe 
	tris 	H'6' 		;A W tartalmának betöltése a TRISGPIO regiszterbe 
	clrf 	SPEED 		;SPEED = 0 
	clrf 	DIRECTION 	;DIRECTION = 0 
	clrf 	COUNTER 	;COUNTER = 0 
 
;Főprogram-----------------------------------------------------------

A1 	movf 	SPEED,0 	;W = SPEED 
  	movwf 	S1 		;S1 = SPEED 
  	rrf 	S1,1 		;S1 1.jobbra forgatása 
  	rrf 	S1,1 		;S1 2.jobbra forgatása 
  	rrf 	S1,0 		;W = S1 3.jobbra forgatása 
  	andlw 	B'00001111' 	;a felső négy bit nullázása 
  	movwf 	S1 		;S1 = SPEED/8 
  	movlw 	START 		;W = az elágazás kezdőcíme 
  	addwf 	S1,0 		;W = START + SPEED/8 
  	movwf 	PCL 		;PCL = START + SPEED/8, ugrás a címre 
START 	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (1.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (2.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (3.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (4.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (5.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (6.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (7.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (8.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (9.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (10.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (11.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (12.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (13.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (14.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (15.) 
  	call 	WAIT 		;A nyomógombkezelő és késleltető szubrutin (16.) 
  	movlw 	H'4' 		;A 04h érték betöltése a W munkaregiszterbe 
  	subwf 	COUNTER,0 	;W = COUNTER-4, a COUNTER nem változik 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	CLEAR 		;ugrik, ha COUNTER=2 
  	incf 	COUNTER 	;A COUNTER növelése 1-gyel 
  	goto 	CC 		;Folytatás a CC-től 
CLEAR 	clrf 	COUNTER 	;A COUNTER regiszter nullázása 
CC 	bcf 	STATUS,0 	;A C túlcsordulás-jelzőbit nullázása 
  	movlw 	START2 		;Az első bitminta címének betöltése W-be 
  	movwf 	S1 		;S1 = START2 
  	rlf 	COUNTER,0 	;W = 2 x COUNTER 
  	addwf 	S1,0 		;W = START2 + 2xCOUNTER 
  	movwf 	PCL 		;PCL = START2 + 2xCOUNTER, ugrás a címre 
START2 	movlw 	B'00100001' 	;W = B'0010 0001', 1. minta 
  	goto 	OUT 		;Ugrás a megjelenítés programrészre 
  	movlw 	B'00000011' 	;W = B'0000 0011', 2. minta 
  	goto 	OUT 		;Ugrás a megjelenítés programrészre 
  	movlw 	B'00000110' 	;W = B'0000 0110', 3. minta 
  	goto 	OUT 		;Ugrás a megjelenítés programrészre 
  	movlw 	B'00010100' 	;W = B'0001 0100', 4. minta 
  	goto 	OUT 		;Ugrás a megjelenítés programrészre 
  	movlw 	B'00110000' 	;W = B'0011 0000', 5. minta 
  	goto 	OUT 		;Ugrás a megjelenítés programrészre 
OUT 	movwf 	GPIO 		;GPIO = W, a bitminta megjelenik a kimeneten 
  	goto 	A1 		;visszatérés a program elejére

;Szubrutinok---------------------------------------------------------

WAIT	btfsc 	GPIO,3 		;A GP3 bemenet tesztelése 
  	goto 	C4 		;ugrás, ha GP3=1 (nincs megnyomva) 
  	btfsc 	DIRECTION,0 	;A DIRECTION regiszter 0.bit tesztelése 
  	goto 	C2 		;ugrás, ha DIRECTION=1 (csökkentés) 
  	movlw 	B'01111111' 	;W = B'0111 1111' 
  	subwf 	SPEED,0 	;W = SPEED - B'0111 1111', SPEED nem változik 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	C1 		;ugrik, ha SPEED = B'0111 1111' 
  	incf 	SPEED,1 	;SPEED = SPEED + 1 
  	goto 	C4 		;ugrás a további programrészletekre 
C1 	bsf 	DIRECTION,0 	;A DIRECTION 0.bit "1"-re vált 
  	goto 	C4 		;ugrás a további programrészletekre 
C2 	movf 	SPEED,1 	;A SPEED regiszter tesztkiolvasása 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	C3 		;ugrik, ha SPEED = B'0000 0000' 
  	decf 	SPEED,1 	;SPEED = SPEED - 1 
  	goto 	C4 		;ugrás a további programrészletekre 
C3 	bcf 	DIRECTION,0 	;A DIRECTION 0.bit "0"-ra vált 
C4 	clrf 	S1 		;Az S1 regiszter nullázása 
  	movlw 	H'42' 		;W = 66 
  	movwf 	S2 		;S2 = 66 
REPEAT 	decfsz 	S1,1 		;S1 = S1 - 1 
  	goto 	REPEAT 		;Visszaugrik, ha az eredmény nem nulla 
  	decfsz 	S2,1 		;S2 = S2 - 1 
  	goto 	REPEAT 		;Visszaugrik, ha az eredmény nem nulla 
  	retlw 	H'0' 		;Visszatérés a szubrutinból 

	end 
