;PICD2_C.ASM   1.0.0                                      2006.05.30.
;********************************************************************
 
;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 leírása: http://www.t-es-t.hu/elokep/pic/picd02.htm
 
;a program egy PWM fényerővezérlést mutat be, egy változó fényerejű
;fényminta a nyomógomb által kiválasztott irányba mozog 
;a program bemutatása: http://www.t-es-t.hu/elokep/pic/picd02c.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: 4MHz
;utasítás ciklus: 1000ns
;programmemória: 335 sor
;adatmemória: 12 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.05.30. 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
BUTTON	 	equ 	0x07 	;Nyomógomb késleltető regiszter
DIRECTION 	equ 	0x08 	;Iránykijelölő regiszter
COUNTER 	equ 	0x09 	;Számláló/mintakijelölő regiszter
CNT 		equ 	0x0A 	;PWM ütem-számláló regiszter
CKL 		equ 	0x0B 	;PWM ciklus-számláló regiszter
ON1		equ	0x0C	;Az LED1 fényerő regisztere
ON2		equ	0x0D	;Az LED2 fényerő regisztere
ON3		equ	0x0E	;Az LED3 fényerő regisztere
ON4		equ	0x0F	;Az LED4 fényerő regisztere
ON5		equ	0x10	;Az LED5 fényerő regisztere
S1		equ	0x11	;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	GPIO		;A kimenetek nullázása 
  	clrf 	BUTTON 		;BUTTON = 0 
  	clrf 	DIRECTION 	;DIRECTION = 0 
  	clrf 	COUNTER 	;COUNTER = 0 
  	clrf 	ON1 		;ON1 = 0 
  	clrf 	ON2 		;ON2 = 0 
  	clrf 	ON3 		;ON3 = 0 
  	clrf 	ON4 		;ON4 = 0 
  	clrf 	ON5 		;ON5 = 0
	goto    A1		;ugrás a főprogramra

;Szubrutinok---------------------------------------------------------

WAIT 	movlw 	H'42' 		;W = 66 
  	movwf 	S1 		;S1 = 66 
REPEAT 	decfsz 	S1,1 		;S1 = S1 - 1 
  	goto 	REPEAT 		;Visszaugrik, ha az eredmény nem nulla 
  	retlw 	H'0' 		;Visszatérés a szubrutinból 
 
;Főprogram-----------------------------------------------------------

A1 	btfsc 	GPIO,3 		;A GP3 bemenet tesztelése 
  	goto 	C1 		;ugrás, ha GP3=1 (nincs megnyomva) 
  	incf 	BUTTON,1 	;BUTTON = BUTTON + 1 
  	movlw 	H'4' 		;A 04h érték betöltése a W munkaregiszterbe 
  	subwf 	BUTTON,0 	;W = BUTTON - 4, a BUTTON nem változik 
  	btfss 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	C1 		;ugrik, ha BUTTON = 0..3 
  	comf 	DIRECTION,1 	;DIRECTION negációja 
  	clrf 	COUNTER 	;COUNTER = 0 
  	clrf 	BUTTON 		;BUTTON = 0 
C1 	clrf 	CKL 		;CKL = 0 
A2 	clrf 	CNT 		;CNT = 0 
  	incf 	CNT,1 		;CNT = 1 
  	movf 	ON1,1 		;ON1 kiolvasása tesztelése 
  	btfss 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bsf 	GPIO,0 		;ha ON1 > 0, akkor GP0 = 1; a kimenet bekapcsolása 
  	movf 	ON2,1 		;ON2 kiolvasása tesztelése 
  	btfss 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bsf 	GPIO,1 		;ha ON2 > 0, akkor GP1 = 1; a kimenet bekapcsolása 
  	movf 	ON3,1 		;ON3 kiolvasása tesztelése 
  	btfss 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bsf 	GPIO,2 		;ha ON3 > 0, akkor GP2 = 1; a kimenet bekapcsolása 
  	movf 	ON4,1 		;ON4 kiolvasása tesztelése 
  	btfss 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bsf 	GPIO,4 		;ha ON4 > 0, akkor GP4 = 1; a kimenet bekapcsolása 
  	movf 	ON5,1 		;ON5 kiolvasása tesztelése 
  	btfss 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bsf 	GPIO,5 		;ha ON5 > 0, akkor GP5 = 1; a kimenet bekapcsolása 
A3 	call 	WAIT 		;0,3 ms késleltetés 
  	movf 	CNT,0 		;W = CNT 
  	subwf 	ON1,0 		;W = ON1 - CNT 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bcf 	GPIO,0 		;ha ON1 = CNT, akkor GP0 = 0; a kimenet kikapcsolása 
  	movf 	CNT,0 		;W = CNT 
  	subwf 	ON2,0 		;W = ON2 - CNT 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bcf 	GPIO,1 		;ha ON2 = CNT, akkor GP1 = 0; a kimenet kikapcsolása 
  	movf 	CNT,0 		;W = CNT 
  	subwf 	ON3,0 		;W = ON3 - CNT 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bcf 	GPIO,2 		;ha ON3 = CNT, akkor GP2 = 0; a kimenet kikapcsolása 
  	movf 	CNT,0 		;W = CNT 
  	subwf 	ON4,0 		;W = ON4 - CNT 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bcf 	GPIO,4 		;ha ON4 = CNT, akkor GP4 = 0; a kimenet kikapcsolása 
  	movf 	CNT,0 		;W = CNT 
  	subwf 	ON5,0 		;W = ON5 - CNT
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	bcf 	GPIO,5 		;ha ON5 = CNT, akkor GP5 = 0; a kimenet kikapcsolása 
  	movlw 	H'1E' 		;W = 30 
  	subwf 	CNT,0 		;W = CNT - 30 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	C2 		;ugrik, ha CNT = 30 
  	incf 	CNT,1 		;CNT = CNT + 1 
  	goto 	A3 		;vissza a PWM ciklus következő ütemére 
C2 	movlw 	H'F' 		;W = 15 
  	subwf 	CKL,0 		;W = CKL - 15 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	C3 		;ugrik, ha CKL = 15 
  	incf 	CKL,1 		;CKL = CKL + 1 
  	goto 	A2 		;vissza a PWM ciklus elejére 
C3 	movf 	COUNTER,0 	;W = COUNTER 
  	movwf 	S1 		;S1 = COUNTER 
  	btfss 	DIRECTION,0 	;DIRECTION tesztelése 
  	goto 	C4 		;ugrik, ha DIRECTION = 0000 0000 
  	movlw 	H'A' 		;W = 10 
  	addwf 	S1,1 		;S1 = COUNTER + 10 
C4 	incf 	S1,0 		;W = S1 + 1 
  	ADDWF 	PCL,1 		;PCL = PCL + (S1 + 1)
   	goto 	RIGHT0 		;ugrás az értékbeállításra 
  	goto 	RIGHT1 		;ugrás az értékbeállításra 
  	goto 	RIGHT2 		;ugrás az értékbeállításra 
  	goto 	RIGHT3 		;ugrás az értékbeállításra 
  	goto 	RIGHT4 		;ugrás az értékbeállításra 
  	goto 	RIGHT5 		;ugrás az értékbeállításra 
  	goto 	RIGHT6 		;ugrás az értékbeállításra 
  	goto 	RIGHT7 		;ugrás az értékbeállításra 
  	goto 	RIGHT8 		;ugrás az értékbeállításra 
  	goto 	RIGHT9 		;ugrás az értékbeállításra
  	goto 	LEFT0 		;ugrás az értékbeállításra 
  	goto 	LEFT1 		;ugrás az értékbeállításra 
  	goto 	LEFT2 		;ugrás az értékbeállításra 
  	goto 	LEFT3 		;ugrás az értékbeállításra 
  	goto 	LEFT4 		;ugrás az értékbeállításra 
  	goto 	LEFT5 		;ugrás az értékbeállításra 
  	goto 	LEFT6 		;ugrás az értékbeállításra 
  	goto 	LEFT7 		;ugrás az értékbeállításra 
  	goto 	LEFT8 		;ugrás az értékbeállításra 
  	goto 	LEFT9 		;ugrás az értékbeállításra  
LEFT0 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0
  	movwf 	ON2 		;ON2 = 0  
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0  
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre 
LEFT1 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON5 		;ON5 = 30 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT2 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON4 		;ON4 = 30 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON5 		;ON5 = 6 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT3 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON3 		;ON3 = 30 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON4 		;ON4 = 6 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON5 		;ON5 = 2 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT4 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON2 		;ON2 = 30 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON3 		;ON3 = 6 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON4 		;ON4 = 2 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON5 		;ON5 = 1 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT5 	movlw 	H'1E' 		;W = 30 
  	movwf 	ON1 		;ON1 = 30 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON2 		;ON2 = 6 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON3 		;ON3 = 2 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON4 		;ON4 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON5 		;ON5 = 1 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT6 	movlw 	H'6' 		;W = 6 
  	movwf 	ON1 		;ON1 = 6 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON2 		;ON2 = 2 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON3 		;ON3 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON4 		;ON4 = 1 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT7 	movlw 	H'2' 		;W = 2 
  	movwf 	ON1 		;ON1 = 2 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON2 		;ON2 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON3 		;ON3 = 1 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT8 	movlw 	H'1' 		;W = 1 
  	movwf 	ON1 		;ON1 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON2 		;ON2 = 1 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
LEFT9 	movlw 	H'1' 		;W = 1 
  	movwf 	ON1 		;ON1 = 1 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT0 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT1 	movlw 	H'1E' 		;W = 30 
  	movwf 	ON1 		;ON1 = 30 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT2 	movlw 	H'6' 		;W = 6 
  	movwf 	ON1 		;ON1 = 6 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON2 		;ON2 = 30 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT3 	movlw 	H'2' 		;W = 2 
  	movwf 	ON1 		;ON1 = 2 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON2 		;ON2 = 6 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON3 		;ON3 = 30 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT4 	movlw 	H'1' 		;W = 1 
  	movwf 	ON1 		;ON1 = 1 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON2 		;ON2 = 2 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON3 		;ON3 = 6 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON4 		;ON4 = 30 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON5 		;ON5 = 0 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT5 	movlw 	H'1' 		;W = 1 
  	movwf 	ON1 		;ON1 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON2 		;ON2 = 1 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON3 		;ON3 = 2 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON4 		;ON4 = 6 
  	movlw 	H'1E' 		;W = 30 
  	movwf 	ON5 		;ON5 = 30 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT6 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON2 		;ON2 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON3 		;ON3 = 1 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON4 		;ON4 = 2 
  	movlw 	H'6' 		;W = 6 
  	movwf 	ON5 		;ON5 = 6 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT7 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON3 		;ON3 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON4 		;ON4 = 1 
  	movlw 	H'2' 		;W = 2 
  	movwf 	ON5 		;ON5 = 2 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT8 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON4 		;ON4 = 1 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON5 		;ON5 = 1 
  	goto 	OUT 		;ugrás a számláló kezelésre
RIGHT9 	movlw 	H'0' 		;W = 0 
  	movwf 	ON1 		;ON1 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON2 		;ON2 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON3 		;ON3 = 0 
  	movlw 	H'0' 		;W = 0 
  	movwf 	ON4 		;ON4 = 0 
  	movlw 	H'1' 		;W = 1 
  	movwf 	ON5 		;ON5 = 1 
OUT 	movlw 	H'9' 		;W = 9 
  	subwf 	COUNTER,0 	;W = COUNTER - 9, a COUNTER nem változik 
  	btfsc 	STATUS,2 	;A zérusjelző bit tesztelése 
  	goto 	CLEAR 		;ugrik, ha COUNTER=9 
  	incf 	COUNTER 	;A COUNTER növelése 1-gyel 
  	goto 	A1 		;vissza a program elejére 
CLEAR 	clrf 	COUNTER 	;A COUNTER regiszter nullázása 
  	goto 	A1 		;vissza a program elejére 

	end 
