;Második programom
;Készítette: én
;2009.12.21.
;------------------------------------------------------------
;A "gomb_regiszter1" bitjei:
;0 -> 1-es gomb
;1 -> 2-es gomb
;2 -> 3-as gomb
;3 -> 4-es gomb
;4 -> 5-ös gomb
;5 -> 6-os gomb
;6 -> 7-es gomb
;7 -> 8-as gomb
;A "gomb_regiszter2" bitjei:
;0 -> 9-es gomb
;1 -> 0-ás gomb
;2 -> * gomb
;3 -> # gomb



	list	P=18F4520
#include	"P18F4520.INC"
;	__CONFIG _HS_OSC&_CP_OFF&_WDT_OFF	;Kvarc oszcillátor, kódvédelem ki, wdt ki
;__config _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC
; MCLR láb sima I/O, kódvédelem ki, watchdog ki, belső RC oszcillátor


;              config CPUDIV = NOCLKDIV
;              config USBDIV = OFF
;              config FOSC   = HS
;              config PLLEN  = ON
              config FCMEN  = OFF
              config IESO   = OFF
;              config PWRTEN = OFF
              config BOREN  = OFF
;              config BORV   = 30
;              config WDTEN  = OFF
              config WDTPS  = 32768
              config MCLRE  = ON      ;ez mos legyen inább ON!
;              config HFOFST = OFF
              config STVREN = ON
              config LVP    = OFF
              config XINST  = OFF
;              config BBSIZ  = OFF
              config CP0    = OFF
              config CP1    = OFF
              config CPB    = OFF
              config WRT0   = OFF
              config WRT1   = OFF
              config WRTB   = OFF
              config WRTC   = OFF
              config EBTR0  = OFF
              config EBTR1  = OFF
              config EBTRB  = OFF 
		config	OSC = INTIO67


#define gomb_sor1	LATD,3
#define gomb_sor2	LATD,2
#define gomb_sor3	LATD,1
#define gomb_sor4	LATD,0
#define gomb_oszlop1	PORTD,4
#define gomb_oszlop2	PORTD,5
#define gomb_oszlop3	PORTD,6
#define lcd_b4	LATD,0
#define lcd_b5	LATD,1
#define lcd_b6	LATD,2
#define lcd_b7	LATD,3
#define lcd_RS	LATD,4
#define lcd_EN	LATD,7

	cblock
	gombok_regiszter1
	gombok_regiszter2
	SZAM1_felso
	SZAM1_also
	SZAM2_felso
	SZAM2_also
	SZAM3_felso
	SZAM3_also
	tizezresek
	ezresek
	szazasok
	tizesek
	egyesek
	ATVITEL
	delay0
	delay1
	delay2
	delay3
	reg1
	reg2
	reg3
	reg4
	reg5
	LCD_REG
	endc
	
	org 0

;	banksel TRISC
	movlw	B'00000000'		;0-át írunk a W-be
	movwf	TRISA			;PORTA minden lába kimenet lesz
	movwf	TRISB			;PORTB minden lába kimenet lesz
	movwf	TRISC			;PORTC minden lába kimenet lesz
	movlw	B'01110000'
	movwf	TRISD			;PORTD alsó négy bitje és a legfelső kimenet, a többi bemenet

	clrf	LATA
	clrf	LATB
	clrf	LATC
	clrf	LATD
	
	goto START2		;melyik program fusson?

;-------------------------------------------------------------------------------
;----------------------START1---------------------------------------------------
;-------------------------------------------------------------------------------
START1

	clrf	gombok_regiszter1
	clrf	gombok_regiszter2

Sor1_lekérdezés
	bsf		gomb_sor1				;tasztatúra legfelső sorára H szintet kapcsolunk
	call	delay1ms
	btfss	gomb_oszlop1			;le van nyomva az 1-es gomb?
	goto	$+8
	bsf		gombok_regiszter1,0		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop2			;le van nyomva az 2-es gomb?
	goto	$+8
	bsf		gombok_regiszter1,1		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop3			;le van nyomva az 3-as gomb?
	goto	$+8
	bsf		gombok_regiszter1,2		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	bcf		gomb_sor1
;	incf	reg1
;	movff	reg1,WREG
;	sublw	d'20'					;hányszor kérdezzük le az adott sor gombjait?
;	decfsz	WREG
;	goto	Sor1_lekérdezés
;	clrf	reg1
Sor2_lekérdezés
	bsf		gomb_sor2				;tasztatúra legfelső sorára H szintet kapcsolunk
	call	delay1ms
	btfss	gomb_oszlop1			;le van nyomva az 1-es gomb?
	goto	$+8
	bsf		gombok_regiszter1,3		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop2			;le van nyomva az 2-es gomb?
	goto	$+8
	bsf		gombok_regiszter1,4		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop3			;le van nyomva az 3-as gomb?
	goto	$+8
	bsf		gombok_regiszter1,5		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	bcf		gomb_sor2
;	incf	reg1
;	movff	reg1,WREG
;	sublw	d'20'					;hányszor kérdezzük le az adott sor gombjait?
;	decfsz	WREG
;	goto	Sor2_lekérdezés
;	clrf	reg1
Sor3_lekérdezés
	bsf		gomb_sor3				;tasztatúra legfelső sorára H szintet kapcsolunk
	call	delay1ms
	btfss	gomb_oszlop1			;le van nyomva az 1-es gomb?
	goto	$+8
	bsf		gombok_regiszter1,6		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop2			;le van nyomva az 2-es gomb?
	goto	$+8
	bsf		gombok_regiszter1,7		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop3			;le van nyomva az 3-as gomb?
	goto	$+8
	bsf		gombok_regiszter2,0		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	bcf		gomb_sor3
;	incf	reg1
;	movff	reg1,WREG
;	sublw	d'20'					;hányszor kérdezzük le az adott sor gombjait?
;	decfsz	WREG
;	goto	Sor3_lekérdezés
;	clrf	reg1
Sor4_lekérdezés
	bsf		gomb_sor4				;tasztatúra legfelső sorára H szintet kapcsolunk
	call	delay1ms
	btfss	gomb_oszlop1			;le van nyomva az 1-es gomb?
	goto	$+8
	bsf		gombok_regiszter2,1		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop2			;le van nyomva az 2-es gomb?
	goto	$+8
	bsf		gombok_regiszter2,2		;ha igen, akkor változtasd meg a regiszter bitjét!
	RETURN
	btfss	gomb_oszlop3			;le van nyomva az 3-as gomb?
	goto	$+8
	bsf		gombok_regiszter2,3		;ha igen, akkor változtasd meg a regiszter bitjét!
	bcf		gomb_sor4
	RETURN

;	incf	reg1
;	movff	reg1,WREG
;	sublw	d'20'					;hányszor kérdezzük le az adott sor gombjait?
;	decfsz	WREG
;	goto	Sor4_lekérdezés
;	clrf	reg1



	movff	gombok_regiszter1,LATC
	movff	gombok_regiszter2,LATA

	goto	START1


;-------------------------------------------------------------------------------
;----------------------START2---------------------------------------------------
;-------------------------------------------------------------------------------
START2
	movlw	B'01100000'
	movwf	TRISD
	clrf	LATD

	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms
	call	delay100ms

	movlw	b'00000010'		;négy bites mód
	movwf	LATD
	call	delay1ms
	bsf		LATD,7
	call	delay1ms
	bcf		LATD,7

	movlw	b'00000000'		;kijelző bekapcs
	movwf	LATD
	call	delay1ms
	bsf		LATD,7
	call	delay1ms
	bcf		LATD,7
	movlw	b'00001111'		;kijelző bekapcs
	movwf	LATD
	call	delay1ms
	bsf		LATD,7
	call	delay1ms
	bcf		LATD,7
	call	delay1ms

;	movlw	b'00010100'		;A-betű
;	movwf	LATD
;	bsf		LATD,7
;	bcf		LATD,7	
;	movlw	b'00010001'		;A-betű
;	movwf	LATD
;	bsf		LATD,7
;	bcf		LATD,7


	movlw	'A'
	call	LCD_kiiratas
	movlw	'd'
	call	LCD_kiiratas
	movlw	'j'
	call	LCD_kiiratas
	movlw	'o'
	call	LCD_kiiratas
	movlw	'n'
	call	LCD_kiiratas
	movlw	' '
	call	LCD_kiiratas
	movlw	'a'
	call	LCD_kiiratas
	movlw	'z'
	call	LCD_kiiratas
	movlw	' '
	call	LCD_kiiratas
	movlw	'I'
	call	LCD_kiiratas
	movlw	's'
	call	LCD_kiiratas
	movlw	't'
	call	LCD_kiiratas
	movlw	'e'
	call	LCD_kiiratas
	movlw	'n'
	call	LCD_kiiratas
	movlw	'!'
	call	LCD_kiiratas


movlw	h'42'
call	LCD_kurzor_mozgatas

	movlw	'S'
	call	LCD_kiiratas
	movlw	'z'
	call	LCD_kiiratas
	movlw	'e'
	call	LCD_kiiratas
	movlw	'b'
	call	LCD_kiiratas
	movlw	'b'
	call	LCD_kiiratas
	movlw	' '
	call	LCD_kiiratas
	movlw	'j'
	call	LCD_kiiratas
	movlw	'o'
	call	LCD_kiiratas
	movlw	'v'
	call	LCD_kiiratas
	movlw	'o'
	call	LCD_kiiratas
	movlw	't'
	call	LCD_kiiratas
	movlw	'!'
	call	LCD_kiiratas

goto$





;------------SZUBRUTINOK--------------------------------------

LCD_kiiratas
	bsf		lcd_RS
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	bcf		lcd_EN
	btfsc	WREG,4
	bsf		lcd_b4
	btfsc	WREG,5
	bsf		lcd_b5
	btfsc	WREG,6
	bsf		lcd_b6
	btfsc	WREG,7
	bsf		lcd_b7
	bsf		lcd_EN
	bcf		lcd_EN
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	btfsc	WREG,0
	bsf		lcd_b4
	btfsc	WREG,1
	bsf		lcd_b5
	btfsc	WREG,2
	bsf		lcd_b6
	btfsc	WREG,3
	bsf		lcd_b7
	bsf		lcd_EN	
	bcf		lcd_EN
RETURN	

LCD_kurzor_mozgatas
	bcf		lcd_RS
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	bcf		lcd_EN
	btfsc	WREG,4
	bsf		lcd_b4
	btfsc	WREG,5
	bsf		lcd_b5
	btfsc	WREG,6
	bsf		lcd_b6
	btfsc	WREG,7
	bsf		lcd_b7
	bsf		lcd_EN
	bcf		lcd_EN
	bcf		lcd_b4
	bcf		lcd_b5
	bcf		lcd_b6
	bcf		lcd_b7
	btfsc	WREG,0
	bsf		lcd_b4
	btfsc	WREG,1
	bsf		lcd_b5
	btfsc	WREG,2
	bsf		lcd_b6
	btfsc	WREG,3
	bsf		lcd_b7
	bsf		lcd_EN	
	bcf		lcd_EN
RETURN	


;delay1000s:
;	movlw   d'100'
;	movwf	delay1
;	movlw	d'100'
;	movwf	delay2
;	movlw	d'100'
;	movwf	delay3
;	goto    d1
;delay100s:
;	movlw   d'100'
;	movwf	delay1
;	movlw	d'100'
;	movwf	delay2
;	movlw	d'10'
;	movwf	delay3
;	goto    d1 
;delay10s:
;	movlw	d'100'
;	movwf	delay2
;	movlw	d'100'
;	movwf	delay3
;	goto    d2 
delay1s:
;	movlw	d'10'
;	movwf	delay2
;	movlw	d'100'
;	movwf	delay3
;	goto    d2 
;delay100ms:
;	movlw   d'100'
;	movwf	delay3
;	goto    d3 
;delay10ms:
;	movlw	d'10'
;	movwf	delay3
;	goto    d3
;delay1ms:
;	movlw	d'1'
;	movwf	delay3
;	goto    d3 	
;d1:	decfsz	delay1,f
;	goto	d1
;d2:	decfsz	delay2,f
;	goto	d2
;d3:	decfsz	delay3,f
;	goto	d3
;d0:	movlw	d'248'	;   d'248'
;	movwf	delay0
;	decfsz	delay0,f
;	goto	$-2
;RETURN



delay100ms:
	movlw	d'100'		;100ms
	goto	d2
delay10ms:
	movlw	d'10'		;10ms
	goto	d2
delay1ms:
	movlw	d'1'		;1ms
d2:	movwf	delay1
d1:	movlw	d'248'	
	movwf	delay0	
d0:	decfsz	delay0,f
	goto	d0
	decfsz	delay1,f
	goto	d1

RETURN



clrf	tizezresek
clrf	ezresek
clrf	szazasok
clrf	tizesek
clrf	egyesek
clrf	ATVITEL
movlw	b'01001101'
movwf	SZAM1_felso
movlw	b'11010011'
movwf	SZAM1_also
; 23876



Osztas_tizezerrel
	movlw	b'00100111'			;eloször felso bájt
	subwf	SZAM1_felso, w		;kivonás
	btfss	STATUS, C			;ha alulcsordulás van, akkor...
	goto	Osztas_ezerrel		;...akkor osszunk tovább ezerrel
	tstfsz	WREG				;de ha nulla, akkor is százzal osszunk tovább!
	goto	$+6
	goto	Osztas_szazzal
	movwf	SZAM1_felso			;eredmény tárolása
	movlw	b'00010000'			;azután alsó 
	subwf	SZAM1_also, w		;kivonás
	movwf	SZAM1_also    		;eredmény tárolás
	btfss	STATUS, C    		;
	decf	SZAM1_felso			;felso bájt dekrementálása
	incf	tizezresek
	goto	Osztas_tizezerrel

Osztas_ezerrel
	movlw	b'00000011'			;eloször felso bájt
	subwf	SZAM1_felso, w		;kivonás
	btfss	STATUS, C			;ha alulcsordulás van, akkor...
	goto	Osztas_szazzal		;...akkor osszunk tovább százzal
	tstfsz	WREG				;de ha nulla, akkor is százzal osszunk tovább!
	goto	$+6
	goto	Osztas_szazzal
	movwf	SZAM1_felso			;eredmény tárolása
	movlw	b'11101000'			;azután alsó 
	subwf	SZAM1_also, w		;kivonás
	movwf	SZAM1_also    		;eredmény tárolás
	btfss	STATUS, C    		;
	decf	SZAM1_felso			;felso bájt dekrementálása
	incf	ezresek
	goto	Osztas_ezerrel

Osztas_szazzal
	movlw	b'01100100'			;írjunk decimálisan 100-at a W-be
	subwf	SZAM1_also, w		;kivonás
	btfsc	STATUS, C    		;ha alulcsordult, akkor ugrik
	goto	$+10				; (b-hez ugorjon)
	tstfsz	SZAM1_felso			;ha a felso bajt nulla, akkor ugrik!
	goto	$+6					; (a-hoz ugorjon) ha alulcsordult, de a felso bájt nem nulla
	goto	Osztas_tizzel
	decf	SZAM1_felso			; (a) felso bájt dekrementálása
	movwf	SZAM1_also    		; (b) eredmény tárolás
	incf	szazasok
	goto	Osztas_szazzal

Osztas_tizzel
	movlw	b'00001010'			;decimálisan 10-et írunk a W-be
	subwf	SZAM1_also, w		;kivonás
	btfss	STATUS, C			;ha alulcsordulás van, akkor...
	goto	$+10
	incf	tizesek
	movwf	SZAM1_also
	goto	Osztas_tizzel
	movff	SZAM1_also,egyesek
	movff	SZAM1_also,egyesek

;	RETURN						;konverzió befejezve!

	movff	tizezresek,LATA
	movff	ezresek,LATB
	movff	szazasok,LATC
	movff	tizesek,LATD


goto$
END
















	