
;*********************************************************************************************************
;**													**
;**				Header Information							**
;**													**
;*********************************************************************************************************
 
		list		p=16F887, r=hex, w=-302
		include		<P16F887.INC>
		__config	_CONFIG1,b'1110000011100100'
		__config	_CONFIG2,b'1111100011111111'
 
;config word 1_____                                  ___   __         _____
;|  -  |  -  |DEBUG|FCMEN|IESO | LVP |BOREN1|BOREN0| CPD | CP  |MCLRE|PWRTE|WDTE |FOSC2|FOSC1|FOSC0|
;|  1  |  1  |  1  |  0  |  0  |  0  |  0   |  0   |  1  |  1  |  1  |  0  |  0  |  1  |  0  |  0  |
 
;config word 2
;|  -  |  -  |  -  |  -  |  -  |WRT0 | WRT1 |BOR4V |  -  |  -  |  -  |  -  |  -  |  -  |  -  |  -  |
;|  1  |  1  |  1  |  1  |  1  |  0  |  0   |  0   |  1  |  1  |  1  |  1  |  1  |  1  |  1  |  1  |
 
;Processor is PIC16F887 (p=16F887)
;Default Radix is Decimal (r=dec)
;Suppress all bank select assembler messages (w=-302)
 
;In Circuit Debug Mode Off (DEBUG)
;Fail Safe Clock Monitor Bit Off (FCMEN)
;Internal External Switchover Bit Off (IESO)
;Low Voltage Programming Off (LVP)
;Brown Out Reset Off (BOREN1-BOREN0)
;Data Code Protection Off (CPD)
;Program Code Protection Off (CP)
;RE3 is External Master Clear (MCLRE)
;Power Up Timer On (PWRTE)
;Watchdog Timer Off (WDTE)
;Internal Oscillator RA6-RA7 digital I/O

;-----------[NAMING]-----------
;HARDWARE CONNECTION
;	PORTA 0 : LCD_ENABLE
;	PORTA 1 : LCD_RS
;	PORTC4-7: LCD DATA (DC4-DC7)
#DEFINE	LCD_ENABLE	PORTA,0
#DEFINE	LCD_RS		PORTA,2

; TIMING:
; ITCLK (4MHZ)
; WAIT_12u rout. 12 uSec 
; WAIT_107u rout. 107uSec
; WAIT  routine: 1.279 mSec
; WAIT_10m rout. 10 mSec
; WAIT_45m rout. 45 mSec
; WAIT_320m routine: 328.19 mSec


;TEMP STORAGES
LCD_DATA 	EQU	0x20 ;TEMP for the LCD data byte
LCD_DATA2 	EQU	0x21 ;TEMP for the LCD data byte
LCDCMD		EQU	0x22 ;TEMP for the LCD command byte

S_TIMER1	EQU	0x23
S_TIMER2	EQU	0x24
S_TIMER3	EQU	0x25

;*********************************************************************************************************
;**													**
;**				Initialization Routine							**
;**													**
;*********************************************************************************************************
 
START	clrf		INTCON		;disable interrupts
	banksel		OSCCON		;bank 1
	movlw		b'01110000'	;8MHz Internal Oscillator
	movwf		OSCCON
	btfss		OSCCON,HTS	;is oscillator stable?
	goto		$-1		;no, check again
	banksel		ANSEL		;yes, bank 3
	movlw		b'00000000'	;all ports digital I/O
	movwf		ANSEL
	movwf		ANSELH
	banksel		PORTA		;bank 0
	clrf		PORTA		;initialize all ports
	clrf		PORTB
	clrf		PORTC
	clrf		PORTD
	banksel		TRISA		;bank 1
	movlw		b'00000000'	;ports A OUTPUTS=0 INPUST=1
	movwf		TRISA
	movlw		b'00000001'	;ports B OUTPUTS=0 INPUST=1
	movwf		TRISB
	movlw		b'00000000'	;ports C OUTPUTS=0 INPUST=1
	movwf		TRISC
	movlw		b'00000000'	;ports D OUTPUTS=0 INPUST=1
	movwf		TRISD
	banksel		PORTA		;bank 0

;RESET PROGRAM VARIABLES

	banksel	LCD_DATA
	clrf	LCD_DATA
	
	clrf	S_TIMER1
	clrf	S_TIMER2
	clrf	S_TIMER3
	
	bcf	LCD_ENABLE
	bcf	LCD_RS

;-LCD initialization starts-

	call	WAIT_320m
	call	WAIT_10m
				
	movlw	b'00100000' 	;FUNCTION SET
	call	LCD_CMD
	movlw	b'00100000'
	call	LCD_CMD
	movlw	b'10000000' 
	call	LCD_CMD

	movlw	b'00000000'	;DISPLAY ON/OFF CONTROL	 
	call	LCD_CMD
	movlw	b'11100000' 
	call	LCD_CMD
	
	movlw	b'00000000' 	;ENTRY MODE SERT
	call	LCD_CMD
	movlw	b'01100000' 
	call	LCD_CMD

	
;-INIT OK. 4bit data transfer
	CALL WAIT_320m
	GOTO 	MAIN	

;*********************************************************************************************************
;**													**
;**				      MAIN PROGRAM							**
;**													**
;*********************************************************************************************************
MAIN

	movlw	b'10000000' 
	call	LCD_CMD
	movlw	b'00000000' 
	call	LCD_CMD

	MOVLW	'H'
	CALL LCD_PUTCHAR
	MOVLW	'E'
	CALL LCD_PUTCHAR
	MOVLW	'L'
	CALL LCD_PUTCHAR
	MOVLW	'L'
	CALL LCD_PUTCHAR
	MOVLW	'O'
	CALL LCD_PUTCHAR
	CALL WAIT_10m

	movlw	b'11000000' 
	call	LCD_CMD
	movlw	b'00000000' 
	call	LCD_CMD


	CALL WAIT_10m
	MOVLW	'U'
	CALL LCD_PUTCHAR
	MOVLW	'S'
	CALL LCD_PUTCHAR
	MOVLW	'E'
	CALL LCD_PUTCHAR
	MOVLW	'R'
	CALL LCD_PUTCHAR
	MOVLW	'!'
	
	CALL WAIT_320m
	CALL WAIT_320m
	CALL WAIT_320m
	CALL WAIT_320m
	CALL LCD_HOME
	CALL WAIT_320m

GOTO MAIN
;*********************************************************************************************************
;**													**
;**				      SUBROUTINES							**
;**													**
;*********************************************************************************************************
BACK
	call	WAIT_10m
	decf	LCD_DATA,w
	movwf	LCD_DATA
	call	LCD_PUTCHAR
	call	LCD_CUR_BACK
RETURN

NEXT
	call	WAIT_10m
	incf	LCD_DATA,w
	movwf	LCD_DATA
	call	LCD_PUTCHAR
	call	LCD_CUR_BACK
RETURN

LCD_PUTCHAR
	banksel	PORTC
	bsf	LCD_RS
	movwf	LCD_DATA
	andlw	b'11110000'
	movwf	PORTC
	bsf	LCD_ENABLE
	nop
	nop
	bcf	LCD_ENABLE
	call	WAIT_10m
	swapf	LCD_DATA,w
	andlw	b'11110000'
	movwf	PORTC
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
RETURN

LCD_CMD
	banksel	PORTC
	bcf	LCD_RS
	movwf	PORTC
	bsf	LCD_ENABLE
	nop
	nop
	nop
	bcf	LCD_ENABLE
	call	WAIT_10m
RETURN

LCD_CLEAR
	banksel	PORTC
	bcf	LCD_RS
	movlw	b'00000000'
	movwf	PORTC
	bsf	LCD_ENABLE
	nop
	nop
	bcf	LCD_ENABLE
	call	WAIT_10m
	movlw	b'00010000'
	movwf	PORTC
	bsf	LCD_ENABLE
	nop
	nop
	bcf	LCD_ENABLE
	call	WAIT_10m
RETURN


LCD_HOME
	movlw	b'00000000'
	CALL 	LCD_CMD
	movlw	b'00100000'
	CALL 	LCD_CMD	
RETURN

LCD_CUR_BACK
	banksel	PORTC
	bcf	LCD_RS
	movlw	b'00010000'
	movwf	PORTC
	bsf	LCD_ENABLE
	nop
	nop
	bcf	LCD_ENABLE
	call	WAIT_10m
	movlw	b'00000000'
	movwf	PORTC
	bsf	LCD_ENABLE
	nop
	nop
	bcf	LCD_ENABLE
	call	WAIT_10m
RETURN


WAIT_12u
	movlw	d'255'
	movwf	S_TIMER1
	call	WAIT
RETURN

	
WAIT_107u
	movlw	d'236'
	movwf	S_TIMER1
	call	WAIT
RETURN

WAIT_10m
	movlw	d'247'
	movwf	S_TIMER1
	movwf	S_TIMER2
	call	WAIT_320m
RETURN
	
WAIT_45m
	movlw	d'220'
	movwf	S_TIMER1
	movwf	S_TIMER2
	call	WAIT_320m
	RETURN

WAIT
	banksel S_TIMER1
	incfsz	S_TIMER1
	GOTO	WAIT
RETURN

WAIT_320m
	banksel S_TIMER1
	incfsz	S_TIMER1
	GOTO	WAIT_320m
	incfsz	S_TIMER2
	GOTO	WAIT_320m
	clrf	S_TIMER1
	clrf	S_TIMER2
RETURN

END
