;\\\\\\\\
;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_REG_SEL	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
LCDCMD		EQU	0x21 ;TEMP for the LCD command byte

S_TIMER1	EQU	0x23
S_TIMER2	EQU	0x24
S_TIMER3	EQU	0x25

	org 0
	GOTO START
;-------[INITIALIZATION]--------

INIT
	banksel	TRISA
	movlw	b'00011100'	
	movwf	TRISA
	
	movlw	b'00000000'
	movwf	TRISB

	banksel	PORTB
	bcf		PORTB,3
	
	banksel	LCD_DATA
	clrf	LCD_DATA
	
	clrf	S_TIMER1
	clrf	S_TIMER2
	clrf	S_TIMER3
	
	banksel PORTB
	clrf	PORTB
	clrf	PORTA

	bcf		LCD_ENABLE
	bcf		LCD_REG_SEL
						;-LCD initialization starts-

	call	WAIT_320m
	movlw	b'00100000' 
	call	LCD_CMD		;0010->
	
	call	LCD_CMD		;0010->
	movlw	b'00000000' ;0000->
	call	LCD_CMD

	movlw	b'00000000' ;0000->
	call	LCD_CMD
	movlw	b'11100000' ;1110->
	call	LCD_CMD
	
	movlw	b'00000000' ;0000->
	call	LCD_CMD
	movlw	b'01100000' ;0110->
	call	LCD_CMD
						;-INIT OK. 4bit data transfer-
						;-PUT A TESTCHAR "H"
	
	movlw	b'01001000' 
	call	LCD_PUTCHAR

	RETURN
	
START
	call	INIT
	GOTO 	MAIN	

;-----[MAIN]----------------
MAIN
	banksel	PORTB
	bsf		PORTB,3
	call	WAIT_320m
	bcf		PORTB,3
	call	WAIT_320m
	GOTO MAIN
	

;-----[MAIN/SUBROUTIINES]---
NEXT
	banksel	PORTB
	NOP
	RETURN

LCD_PUTCHAR
	bsf		LCD_REG_SEL
	banksel	PORTB
	movwf	LCD_DATA
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	bcf		LCD_ENABLE
	call	WAIT_320m
	
	movf	LCD_DATA,w
	rlf		LCD_DATA,f
	rlf		LCD_DATA,f
	rlf		LCD_DATA,f
	rlf		LCD_DATA,f
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	bcf		LCD_ENABLE
	RETURN

LCD_CMD
	bcf	LCD_REG_SEL
	banksel	PORTB
	movwf	PORTB
	bsf		LCD_ENABLE
	nop
	bcf		LCD_ENABLE
	call	WAIT_320m
	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
	RETURN

	END
