;============================={INFORMATION}==================================
;	File:		lcd.asm
;	Project:	PIC/lcd
;	Author:		Tamás Nagy
;	Version:	1.00
;	Used PIC:	PIC16F88A
;****************************************************************************
;============================={DESCRIPTION}==================================
;****************************************************************************
;==========================={SPECIFICATIONS}=================================
;****************************************************************************
;==================={PROCESSOR + INCLUDE + CONFIG}===========================
	#include	<p18f26k80.inc> 
	
;****************************************************************************
;=============================={DEFINITIONS}=================================
;-------------------------------{I/O PORTS}----------------------------------
#define		LCD_E	LATB,1
#define		LCD_RS	LATB,0
#define		LCD_D4	LATB,2
#define		LCD_D5	LATB,3
#define		LCD_D6	LATB,4
#define		LCD_D7	LATB,5
#define		w	0
#define		f	1
;-------------------------------{CONSTANTS}----------------------------------
;-------------------------------{VARIABLES}----------------------------------
	cblock	0x060
		t,t1,t2,LCD_Temp,temp
	endc
;--------------------------------{MACROES}-----------------------------------
;****************************************************************************
;=============================(PROGRAM START)================================
	org	0x00
;****************************************************************************
;//////////////////////////////////{MAIN}\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
;--------------------------{MAIN INITIALIZATIONS}----------------------------
main:	
	movlw	0x50
	movwf	OSCCON
	clrf	ANCON1
	clrf	ADCON0
	clrf	PORTB
	clrf	LATB
	clrf	TRISB
	call	LCD_Init
;****************************************************************************
;==========================={MAIN PROGRAM START}=============================
loop:	
	bcf	LCD_RS
	movlw	b'00001111'
	call	LCD_Data
	movlw	0x8A
	call	LCD_Data
	movlw	b'00001110'
	call	LCD_Data
	bsf	LCD_RS
		movlw	'E'
	call	LCD_Data
		movlw	'z
	call	LCD_Data
		movlw	' '
	call	LCD_Data
		movlw	'm'
	call	LCD_Data
		movlw	'u'
	call	LCD_Data
		movlw	'k'
	call	LCD_Data
		movlw	'o'
	call	LCD_Data
		movlw	'd'
	call	LCD_Data
		movlw	'i'
	call	LCD_Data
		movlw	'k'
	call	LCD_Data
	
	sleep
	

;============================={INFORMATION}==================================
;	File:		lcd.asm
;	Project:	PIC/lcd
;	Author:		Tamás Nagy
;	Version:	1.00
;	Used PIC:	PIC16F88A
;****************************************************************************
;============================={DESCRIPTION}==================================
;LCD functions>
;	LCD_Init 	- initalize LCD display
;	LCD_Data 	- send data to LCD
;	LCD_Instr 	- send instruction to LCD
;	LCD_Clear 	- clear LCD
;	LCD_Goto 	- move cursor to position
;	LCD_ON 		- LCD ON
; 	LCD_OFF		- LCD OFF
;	LCD_Shift_Left	- shift display left
;	LCD_Shift_Right	- shift diplay right
;	LCD_Cursor_ON	- cursor ON
;	LCD_CBlink_ON	- cursor and cursor blink ON
;	LCD_CB_OFF	- cursor and cursor blink OFF
;	LCD_Cursor_Inc	- increment cursor position after writing data
;	LCD_Cursor_Dec	- decrement cursor position after writing data
;	LCD_Home	- return home (position 0)
;****************************************************************************
;	Delay times>
;	delay_100ms:
;		16MHz = 50ms
;		8MHz = 100ms	-> default setting, must change the delay
;		4MHz = 200ms
;		1MHz = 400ms
;	delay_1ms:
;		16MHz = 500us
;		8MHz = 1ms	-> default setting, must change the delay
;		4MHz = 2ms
;		1MHz = 4ms
;****************************************************************************
;------------------------------{DEFINITIONS}---------------------------------

;-------------------------------{VARIABLES}----------------------------------
;	cblock	0x20
;		t,t1,t2,LCD_Temp,temp,count
;	endc
;=================================={LCD}=====================================
LCD_Init:
	bcf	LCD_RS
	movlw	d'50'		;wait more than 15ms power time
	call	delay_1ms
	movlw	b'00110000'	;function set, interface is 8 bit long
	call	LCD_Data
	movlw	d'20'		;wait more than 5ms
	call	delay_1ms
	movlw	b'00110000'	;function set, interface is 8 bit long
	call	LCD_Data
	movlw	d'7'		;wait more than 100us
	call	delay_1ms
	movlw	b'00110000'	;function set, interface is 8 bit long
	call	LCD_Data
	movlw	d'2'		;wait 
	call	delay_1ms
	movlw	b'00100000'	;function set, interface is 4 bit long
	call	LCD_Data
	movlw	d'2'		;wait 
	call	delay_1ms
	movlw	b'00101000'	;0 0 1 DL N F - - 
	call	LCD_Data	;DL=0 (4 bit comunication), N=1 (two lines), F=0 (font= 5x8 dots)
	movlw	d'2'		;wait 
	call	delay_1ms
	movlw	b'00001000'	;0 0 0 0 1 D C B
	call	LCD_Data	;D=0 (display off), C=0 (cursor off), B=0 (cursor blinking off)
	movlw	d'2'		;wait 
	call	delay_1ms
	movlw	b'00000001'	;clear display
	call	LCD_Data	
	movlw	d'15'		;wait 
	call	delay_1ms
	movlw	b'00000110'	;0 0 0 0 0 1 I/D S
	call	LCD_Data	;I/D=1 (increment position), S=1 (display shift)
	movlw	d'2'		;wait 
	call	delay_1ms
	movlw	b'00001111'	;turn on display, cursor and blinking
	call	LCD_Data
	movlw	d'2'		;wait 
	call	delay_1ms
	movlw	0x02
	call	LCD_Data
	bsf	LCD_RS
	return	
;-----------------------------{Send LCD data}--------------------------------
LCD_Data:
	movwf	LCD_Temp
	bcf	LCD_D7		;clear all data pins
	bcf	LCD_D6
	bcf	LCD_D5
	bcf	LCD_D4
	
	btfsc	LCD_Temp,7	;writing upper 4 bits
	bsf	LCD_D7
	btfsc	LCD_Temp,6
	bsf	LCD_D6
	btfsc	LCD_Temp,5
	bsf	LCD_D5
	btfsc	LCD_Temp,4
	bsf	LCD_D4
	
	bsf	LCD_E	
	movlw	d'1'
	call	delay_1ms
	bcf	LCD_E
	
	bcf	LCD_D7		;clear again all data pins
	bcf	LCD_D6
	bcf	LCD_D5
	bcf	LCD_D4
	
	btfsc	LCD_Temp,3	;write lower 4 bits
	bsf	LCD_D7
	btfsc	LCD_Temp,2
	bsf	LCD_D6
	btfsc	LCD_Temp,1
	bsf	LCD_D5
	btfsc	LCD_Temp,0
	bsf	LCD_D4
	
	bsf	LCD_E
	movlw	d'1'
	call	delay_1ms
	bcf	LCD_E
	return
;--------------------------{Send LCD instruction}----------------------------
;--------------------------------{LCD Clear}---------------------------------
;****************************************************************************
;-------------------------------{DELAY 100ms}--------------------------------
delay_100ms:			;default 8MHz clock
	movwf	t		
	clrf	t1		;16MHz = 50ms
	clrf	t2		;8MHz = 100ms
del:	decfsz	t2,f		;4MHz = 200ms
	goto	del		;1MHz = 400ms
	decfsz	t1,f		
	goto	del
	decfsz	t,f
	goto	del		
	return
;--------------------------------{DELAY 1ms}----------------------------------	
delay_1ms:			;default 8MHz clock
	movwf	t
	clrf	t1		;16MHz = 500us
del1:	nop			;8MHz = 1ms
	nop
	nop
	nop
	nop
	nop
	decfsz	t1,f		;4MHz = 2ms
	goto	del1		;1MHz = 4ms
	decfsz	t,f
	goto	del1
	return
;****************************************************************************
	
	end