;\\\\\\\\
;PC_MODUL	V 0.1b
;////////
;////////////////////////////////////
;Written by BuDDy aka. Crayon @ 2007
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
	LIST	P=16F628
#include	<p16f628.inc>

	__CONFIG  _MCLRE_ON & _LVP_OFF & _BODEN_OFF  & _CP_OFF & _WDT_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT

;-----------[NAMING]-----------
;HARDWARE CONNECTION
;	PORTA 0 : LCD_ENABLE
;	PORTA 1 : LCD_REGISTER_SELECT
;	PORTA 2 : gomb1(on Vpp with 1k, pressing pulls to ground)
;	PORTA 3 : gomb2
;	PORTA 4 : gomb3
;	PORTB 3 : LED(active when 1)
;	PORTB4-7: LCD DATA (DB4-DB7)
#DEFINE	LCD_ENABLE	PORTA,0
#DEFINE	LCD_RS		PORTA,1
#DEFINE	LED			PORTB,3

#DEFINE	BUTTON1		PORTA,2
#DEFINE	BUTTON2		PORTA,3
#DEFINE	BUTTON3		PORTA,4
; 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

	org	0
	GOTO INIT
;-------[INITIALIZATION]--------

INIT
	banksel	TRISA
	movlw	b'00011100'	
	movwf	TRISA
	
	movlw	b'00000000'
	movwf	TRISB
	
	banksel	LCD_DATA
	clrf	LCD_DATA
	
	clrf	S_TIMER1
	clrf	S_TIMER2
	clrf	S_TIMER3
	
	banksel PORTB
	clrf	PORTB
	clrf	PORTA
	
	movlw 0x07 			;Turn comparators off
	movwf CMCON


	bcf		LCD_ENABLE
	bcf		LCD_RS
						;-LCD initialization starts-

	call	WAIT_320m
	call	WAIT_10m

	movlw	b'00100000' 
	call	LCD_CMD
	call	LCD_CMD

	movlw	b'10000000' 
	call	LCD_CMD
	
	movlw	b'00000000' 
	call	LCD_CMD
	
	movlw	b'11000000' 
	call	LCD_CMD
						;-INIT OK. 4bit data transfer

	GOTO 	MAIN	

;-----[MAIN]----------------
MAIN
	banksel	PORTB
	btfss	BUTTON1
	call	LCD_CLEAR
	btfss	BUTTON2
	call	BACK
	btfss	BUTTON3
	call	NEXT
	call	WAIT_320m
	GOTO MAIN
	

;-----[MAIN/SUBROUTIINES]---
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	PORTB
	bsf		LCD_RS
	movwf	LCD_DATA
	andlw	b'11110000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
	swapf	LCD_DATA,w
	andlw	b'11110000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
	RETURN

LCD_CMD
	banksel	PORTB
	bcf		LCD_RS
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
	RETURN

LCD_CLEAR
	banksel	PORTB
	bcf		LCD_RS
	movlw	b'00000000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
	movlw	b'00010000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
	RETURN

LCD_CUR_BACK
	banksel	PORTB
	bcf		LCD_RS
	movlw	b'00010000'
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	nop
	bcf		LCD_ENABLE
	call	WAIT_10m
	movlw	b'00000000'
	movwf	PORTB
	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
