; Szitkovits Gábor, 2011-.....
; Marógép, satu fordulat számolás.
; X Y tengely, fordulatainak számítása. A tárcsa 75 beosztású, amivel egy
; teljes fordulat 1,50mm.
; A kijelző tizedes pontosságú, ahol a tized mindíg kettőt ugrik,
; így jön ki az 1,50mm.
; A proci 12MHz-en megy, késöbbi továbbfejlesztések miatt.
;----------------------------------------------------------------------------
     processor 16F628A        ; Processzor típusa
     include P16F628A.INC     ; Alapértelmezett beállítások
	__CONFIG	_PWRTE_ON  & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF & _CP_OFF & _MCLRE_ON
; Proci configok
 
     cblock  0x20            ; Az általános célú regiszterek kezdőcíme
			count1           ; Számlálók a késleltető rutinhoz.
			counta
			countb
			lcdtmp		   	; Átmeneti tároló a 4 bites módhoz.
			lcdtmp2
			szam
			y_egy
			y_tiz
			y_szaz
			y_ezer
			y_tezer
			x_egy
			x_tiz
			x_szaz
			x_ezer
			x_tezer
			w_ment
			s_ment
			stat_ment
     endc

LCD_PORT Equ PORTB
LCD_TRIS Equ TRISB
LCD_RS   Equ 0x04
lcd_e    Equ 0x05

	org 0
	nop
	goto	start
;---------------------Megszakítás--------------------------------------
	org	4
	bcf	INTCON,RBIF			; Flag törlése
	movwf	w_ment			; W mentés
	movf	STATUS,w		; STATUS mozgatás W-be
	movwf	s_ment			; W mentése
	btfss	PORTB,6			; PortB vizsgálata
	goto	x_tor			; ha alacsony ugrunk a törlésre
	btfss	PORTB,7			; ha magas vizsgáljuk a PortB 7-et
	goto	y_tor			; ha alacsony ugrunk a törlésre
	goto	int_v			; ha magas, akkor a megszakítás végéhez megyünk
x_tor
	btfss	PORTB,6			; itt maradunk amíg a PortB 6 alacsony
	goto	x_tor			; vissza
	call	x_null			; ha magas lett a PortB 6, akkor törlőrutin
	goto	int_v			; ha vége a törlésnek, vége a megszakításnak
y_tor
	btfss	PORTB,7			; u.n mint az előzökben
	goto	y_tor
	call	y_null
int_v
	movf	s_ment,w		; visszaírjuk a STATUST
	movwf	STATUS
	movf	w_ment,w		; visszaírjuk W-t
	retfie
;-------------------- Táblák -------------------------------------------
kiir
	addwf	PCL,f
	retlw	'X'
	retlw	0x00
kiir1
	addwf	PCL,f
	retlw	'Y'
	retlw	0x00
logo_text
	addwf	PCL,f
	dt	"   Szitkovits ",0
logo_text_2
	addwf	PCL,f
	dt	"     Gabor    ",0
;------------------- Proci init ----------------------------------------
start
	movlw	0x07			; Kikapcsoljuk a komparátort
	movwf	CMCON
	clrf	PORTA
	clrf	PORTB
ini							; Portok beállítása
	bsf		STATUS,RP0		; Kiválasztjuk a Bank 1-et
	movlw	b'11000000'		; A PORTB kimenet+bemenet
	movwf	LCD_TRIS
	movlw	b'00101111'		; A PORTA ki+bemenet
	movwf	TRISA
	movlw	b'11000000'
	movwf	LCD_PORT
	bcf		STATUS,RP0		; Vissza a Bank 0-ra
	call	delay_85		; Várakozás
	call	LCD_Init		; LCD beállítása.
;----------------------- LOGO -------------------------------------------
		clrf	szam
logo
		movf	szam,w
		call	logo_text
		xorlw	0x00
		btfsc	STATUS,Z
		goto	kov_sor_ini
		call	LCD_kar
		incf	szam,f
		goto	logo
kov_sor_ini
		call	LCD_sor2
		clrf	szam
logo_2sor
		movf	szam,w
		call	logo_text_2
		xorlw	0x00
		btfsc	STATUS, Z
		goto	logo_veg
		call	LCD_kar
		incf	szam,f
		goto	logo_2sor
logo_veg
		clrf	szam
varunk
		movlw	.10
		xorwf	szam,w
		btfsc	STATUS,Z
		goto	torol
		call	delay_85
		incf	szam,f
		goto	varunk
torol							;Az LCD törlése
		call	LCD_Clr			;A törlő szubrutin hívása
		call    delay_2
;----------------------- kiírások ---------------------------------------
uzenetek						; Üzenetek kezelése
		movlw	.4
		call	LCD_sor1W
		call	kiir
		call	LCD_kar
		movlw	.12
		call	LCD_sor1W
		call	kiir1
		call	LCD_kar
	goto	prg					; Főprogram indítása
szamlalo_x
		movlw	d'2'			; A 2. sor 1. oszlopába állítja a kurzort.
		call	LCD_sor2W		; A curzor pozíció szubrutin
		movf	x_tezer,W		; A "tezer" változó betöltése W-be
		call	LCD_karD		; A "tezer" kiírása
		movf	x_ezer,W		; A "ezer" változó betöltése W-be
		call	LCD_karD		; A "ezer" kiírása
		movf	x_szaz,W		; A "szaz" változó betöltése W-be
		call	LCD_karD		; A "szaz" kiírása
		movlw	.46				;Ez a pont kódja
		call	LCD_kar    	; A pont kiírása
		movf	x_tiz,W			; A "tiz" változó betöltése W-be
		call	LCD_karD		; A "tiz" kiírása
		movf	x_egy,W			; A "egy" változó betöltése W-be
		call	LCD_karD		; A "egy" kiírása
 	return
szamlalo_y
		movlw	d'10'			; A 2. sor 10. oszlopába állítja a kurzort.
		call	LCD_sor2W
		movf	y_tezer,W
		call	LCD_karD
		movf	y_ezer,W
		call	LCD_karD
		movf	y_szaz,W
		call	LCD_karD
		movlw	.46
		call	LCD_kar    
		movf	y_tiz,W
		call	LCD_karD
		movf	y_egy,W
		call	LCD_karD
 	return
;----------------------- LCD rutinok kezdete --------------------------
LCD_Init
     movlw   0x20             ; A 4 bites mód beállítása.
     call    LCD_Cmd
     call    puls_e
     movlw   0x28             ; Shift beállítása.
     call    LCD_Cmd
     movlw   0x06             ; Karakter mód beállítása.
     call    LCD_Cmd
     movlw   0x0c             ; Kijelző ki/be és kurzor parancs.
     call    LCD_Cmd
     call    LCD_Clr          ; Kijelző törlése.
     return
;---------------------- Parancs-üzemmód beállítása --------------------
LCD_Cmd
		movwf	lcdtmp
		swapf	lcdtmp,W			; Elküldi a felső nibble-t.
		andlw	0x0f				; Törli a felső 4 bitet a W regiszterből.
		movwf	LCD_PORT
		bcf		LCD_PORT,LCD_RS		; RS vonalat nullára állítja.
		call	puls_e				; Magas impulzust küld az Enable lábra.
		movf	lcdtmp,W			; Elküldi a alsó nibble-t.
		andlw	0x0f				; Törli a felső 4 bitet a W regiszterből.
		movwf	LCD_PORT
		bcf		LCD_PORT,LCD_RS		; RS vonalat nullára állítja.
		call	puls_e				; Magas impulzust küld az Enable lábra.
	return
;---------------------- Karakter-üzemmód beállítása ---------------------
LCD_karD
		addlw	0x30
LCD_kar
		movwf	lcdtmp
		swapf	lcdtmp,W			; Elküldi a felső nibble-t.
		andlw	0x0f				; Törli a felső 4 bitet a W regiszterből.
		movwf	LCD_PORT
		bsf		LCD_PORT,LCD_RS		; RS vonalat egyre állítja.
		call	puls_e				; Magas impulzust küld az Enable lábra.
		movf	lcdtmp,W			; Elküldi a alsó nibble-t.
		andlw	0x0f				; Törli a felső 4 bitet a W regiszterből.
		movwf	LCD_PORT
		bsf		LCD_PORT,LCD_RS		; RS vonalat egyre állítja.
		call	puls_e				; Magas impulzust küld az Enable lábra.
	return
;---------------------- Kurzor pozicionálása ----------------------------
LCD_sor1
     movlw   0x80             ; Az 1. sor 1. oszlopába helyezi a kurzort.
     call    LCD_Cmd
     retlw   0x00
LCD_sor2
     movlw   0xc0             ; A 2. sor 1. oszlopába helyezi a kurzort.
     call    LCD_Cmd
     retlw   0x00
LCD_sor1W
     addlw   0x80             ; Az 1. sor W oszlopába helyezi a kurzort
     call    LCD_Cmd
     retlw   0x00
LCD_sor2W
     addlw   0xc0             ; A 2. sor W oszlopába helyezi a kurzort.
     call    LCD_Cmd
     retlw   0x00
LCD_Clr
     movlw   0x01             ; Törli a kijelzőt.
     call    LCD_Cmd
     retlw   0x00
puls_e
     bsf     LCD_PORT,lcd_e   ; Magasra állítja az LCD Enable bemenetét
     nop
     nop                      ; Két óraciklus idejére magasan tartja
     bcf     LCD_PORT,lcd_e   ; Alacsony szintre az E
     call    delay_1
	return
;---------------------------- Késleltetések szubrutinok ---- (12 MHz)-------------
delay_85
     movlw   0xff				; Késleltetés 85_ms
     goto    del0
delay_2
	 movlw	0x06				; Késleltetés 2_ms
	 goto	del0
delay_1
     movlw   0x02				; Késleltetés 1_ms
del0
     movwf   count1
del1
     movlw   0xC7
     movwf   counta
     movlw   0x01
     movwf   countb
delay_0
     decfsz  counta,f
     goto    tovabb
     decfsz  countb,f
tovabb 
    goto    delay_0
     decfsz  count1,f
     goto    del1
	return
;************************************************************************************
;***                                  Főprogram                                   ***
;************************************************************************************
prg	
	bsf	INTCON,GIE				; Globális megszakítás bekapcsolása
	bsf	INTCON,RBIE				; Port B megszakítások bekapcsolása
	call	x_null				; X értékek nullázása szubrutin
	call	y_null				; Y értékek nullázása szubrutin
	goto	figyel				; Optó figyelése
x_null
	clrf	x_egy				; egyes értékek nullázása
	clrf	x_tiz				; tizes értékek nullázása
	clrf	x_szaz				; százas értékek nullázása
	clrf	x_ezer				; ezres értékek nullázása
	clrf	x_tezer				; tízezres értékek nullázása
	call	szamlalo_x			; Az X tengely nulla értékek LCD-re írása
	return
y_null
	clrf	y_egy				; egyes értékek nullázása
	clrf	y_tiz				; tizes értékek nullázása
	clrf	y_szaz				; százas értékek nullázása
	clrf	y_ezer				; ezres értékek nullázása
	clrf	y_tezer				; tízezres értékek nullázása
	call	szamlalo_y			; Az Y tengely nulla értékek LCD-re írása
	return
;------------------------------------------------------------------------
figyel							; Bemenetek figyelése
		btfss	PORTA,0			; PortA 0 alacsony?
		goto	masodik			; ha igen köv. figyelés
ujra
		btfsc	PORTA,0			; PortA 0 magas?
		goto	ujra			; várunk míg nem lesz alacsony
	call	xfel				; ha alacsony számolunk felfele
		goto	figyel			; Előröl kezdjük az optók figyelését
masodik
		btfss	PORTA,1			; PortA 1 alacsony?
		goto	figyel			; ha igen, előröl kezdjük a figyelést
ujra_1
		btfsc	PORTA,1			; PortA 1 magas?
		goto	ujra_1			; várunk míg nem lesz alacsony
	call	xle					; ha alacsony, lefelé számolunk
		goto	figyel			; Előröl kezdjük az optók figyelését
;------------------------------------------------------------------------
x_egy_ertek
		movlw	d'7'			; A 2. sor 7. oszlopába állítja a kurzort.
		call	LCD_sor2W		; sor + oszlop állítás
		movf	x_egy,w			; Az x_egy értékét a w-be írjuk
		call	LCD_karD		; kiírjuk a karaktert az LCD-re
	return						; vissza
x_tiz_ertek
		movlw	d'6'			; A 2. sor 6. oszlopába állítja a kurzort.
		call	LCD_sor2W
		movf	x_tiz,w
		call	LCD_karD
	return
x_szaz_ertek
		movlw	d'4'			; A 2. sor 4. oszlopába állítja a kurzort.
		call	LCD_sor2W
		movf	x_szaz,w
		call	LCD_karD
	return
x_ezer_ertek
		movlw	d'3'			; A 2. sor 4. oszlopába állítja a kurzort.
		call	LCD_sor2W
		movf	x_ezer,w
		call	LCD_karD
	return
x_tezer_ertek
		movlw	d'2'			; A 2. sor 4. oszlopába állítja a kurzort.
		call	LCD_sor2W
		movf	x_tezer,w
		call	LCD_karD
	return	
xertek
		movf	x_egy,w
		call	szamlalo_x	
		movf	x_tiz,w	
		call	szamlalo_x
		movf	x_szaz,w
		call	szamlalo_x
		movf	x_ezer,w	
	return
yertek
		movf	y_egy,w
		call	szamlalo_y	
		movf	y_tiz,w	
		call	szamlalo_y
		movf	y_szaz,w
		call	szamlalo_y	
	return
;------------------------------------------------------------------
	
;----------------------------- X műveletek ------------------------
xfel
		incf	x_egy,f			; Az x_egy egyel való növelése
		incf	x_egy,f			; u.n. mint előbb
		movlw	.10				; 10 írása W-be
		xorwf	x_egy,w			; összehasolítjuk a w-vel
		btfss	STATUS,Z		; ha több mint 10 akkor Z=1 ha kevesebb Z=0
		goto	x_egy_ertek		; ha Z=0, ugrás az x_egy kiírásához
		clrf	x_egy			; Z = 1, akkor töröljük x_egy-et
		call	x_egy_ertek		; kiíírjuk a törölt értéket
		incf	x_tiz,f			; növeljük egyel az x_tiz értékét
		movlw	.10				; u.n. mint az előzökben....
		xorwf	x_tiz,w
		btfss	STATUS,Z
		goto	x_tiz_ertek
		clrf	x_tiz
		call	x_tiz_ertek
		incf	x_szaz,f
		movlw	.10
		xorwf	x_szaz,w
		btfss	STATUS,Z
		goto	x_szaz_ertek
		clrf	x_szaz
		call	x_szaz_ertek
		incf	x_ezer,f
		movlw	.10
		xorwf	x_ezer,w
		btfss	STATUS,Z
		goto	x_ezer_ertek
		clrf	x_ezer
		call	x_ezer_ertek
		incf	x_tezer,f
		movlw	.10
		xorwf	x_tezer,w
		btfss	STATUS,Z
		goto	x_tezer_ertek
	goto	prg
;----------------------------------------------------------------
xle
		decf	x_egy,f
		decf	x_egy,f
		movlw	.254
		xorwf	x_egy,w
		btfss	STATUS,Z
		goto	x_egy_ertek
		movlw	.8
		movwf	x_egy
		decf	x_tiz,f
		movlw	.255
		xorwf	x_tiz,w
		btfss	STATUS,Z
		goto	x_tiz_le
		movlw	.9
		movwf	x_tiz
		decf	x_szaz,f
		movlw	.255
		xorwf	x_szaz,w
		btfsc	STATUS,Z
		goto	$+4
		call	x_egy_ertek
		call	x_tiz_ertek
		goto	x_szaz_ertek
		clrf	x_szaz						
		clrf	x_tiz
		clrf	x_egy
		goto	xertek
x_tiz_le
	call	x_egy_ertek
	goto	x_tiz_ertek
;-------------------------- Y műveletek --------------------------
yfel
		incf	y_egy,f
		incf	y_egy,f
		movlw	.10
		xorwf	y_egy,w
		btfss	STATUS,Z
		goto	yertek
		clrf	y_egy
		incf	y_tiz,f
		movlw	.10
		xorwf	y_tiz,w
		btfss	STATUS,Z
		goto	yertek
		clrf	y_tiz
		incf	y_szaz,f
		movlw	.10
		xorwf	y_szaz,w
		btfsc	STATUS,Z
		clrf	y_szaz	
		goto	yertek
yle
		decf	y_egy,f
		decf	y_egy,f
		movlw	.254
		xorwf	y_egy,w
		btfss	STATUS,Z
		goto	yertek
		movlw	.8
		movwf	y_egy
		decf	y_tiz,f
		movlw	.255
		xorwf	y_tiz,w
		btfsc	STATUS,Z
		goto	$+2
		goto	yertek						
		clrf	y_tiz
		clrf	y_egy
		goto	yertek
;---------------------------- Program vége --------------------------
     end