; basic configuration

;
        Title "lcd1 for ap0201."
;
        list P = 16F877
;
        include "p16f877.inc"  ; use definition file for 16F877
;
;	__CONFIG b'11111101111001' 



;
; memory - counters and max timing values in memory + rot value list
        CBLOCK 0x20   ; RAM starts at address 20h
var1
var2
count1
count2
count3
count4
datal
datah
addrl
addrh
	ENDC
indf	equ 0x00


	ORG 0x0000 ;reset vector
	clrf 0x3 ;zero status
	movlw 0x00 ;high byte of long jump
	movwf 0xA ;zero PCLATH
	goto start

start   movlw b'00000000'       ; all port pins = low
        movwf PORTA
        movlw b'00000000'
        movwf PORTC
        movlw b'00000000'
        movwf PORTD
        movlw b'00000000'
        movwf PORTE
	bcf STATUS,RP1
        bsf STATUS,RP0  ; set RAM Page 1 for TRIS registers

; INITIALISE PORTS
; binary used to see individual pin IO status

        movlw b'11101111'       ; IO pins
        movwf TRISA
        movlw b'00000000'
        movwf TRISB
        movlw b'00000000'
        movwf TRISC	; ???? serial?
        movlw b'00000000' ;in and out
        movwf TRISD
        movlw b'00000000'
        movwf TRISE
        movlw b'0000010'       ; analog pins
        movwf ADCON1

        bcf STATUS,RP0  ; back to RAM page 0

	movlw 0x00
	movwf addrl
	movwf addrh	
	movlw 0x10
	movwf count3

;lcd test hello
     call blanks
     call del_5
     call initlcd	
loop call self	;self display code and loop here
     call disp16
     movlw 0x10
     movwf count4
loop1	    call del_5
	    decfsz count4,f 
     goto loop1
     goto loop

initlcd	
	bcf PORTE,1
	bcf PORTB,0	;ale low 
	bcf PORTE,2	; en low
	bcf PORTE,0	;rs low for control
	call del_125
	movlw 0x38
	movwf PORTD
	call pulse
	movlw 0x0c
	movwf PORTD
	call pulse
	movlw 0x06
	movwf PORTD
	call pulse
	call del_5
	return

del_125	movlw 0x2a
	movwf count1
repeat	decfsz count1,f
	goto repeat
	return

del_5	movlw 0x29
	movwf count2
delay	call del_125
	decfsz count2,f
	goto delay
	return

pulse	bsf PORTE,2
	nop
	bcf PORTE,2
	call del_125
	return

blanks	movlw 0x10
	movwf count1
	movlw 0x30
	movwf FSR
	movlw 0x20
store	movwf indf
	decfsz count1,f
	goto incfsr
	return
incfsr	incf FSR,f
	goto store

hello	movlw 'H'
	movwf 0x30
	movlw 'E'
	movwf 0x31
	movlw 'L'
 	movwf 0x32
 	movwf 0x33
	movlw '0'
	movwf 0x34
	return

self	; loop through writing 16 bytes to 0x30 +
	movlw 0x08
	movwf count1
	movlw 0x30
	movwf FSR
store2		movf addrl,w
	bsf STATUS,RP1
	bcf STATUS,RP0
	movwf EEADR
	movlw 0x00
	movwf EEADRH
	bsf STATUS,RP0
	bsf EECON1,EEPGD
	bsf EECON1,RD
	nop
	nop
	bcf STATUS,RP0
	movf EEDATA,w
	bcf STATUS,RP1
	movwf datal
	bsf STATUS,RP1
	movf EEDATH,w
	bcf STATUS,RP1
	movwf datah
	movf datal,w
	movwf indf
	incf FSR,f
	movf datah,w
	movwf indf
	incf FSR,f
	incf addrl,f
	decfsz count1,f
	goto store2
	decfsz count3,f
	return
reset1	movlw 0x00
	movwf addrl
	movlw 0x10
	movwf count3
	return

disp16	bcf PORTE,2
	bcf PORTE,0
	movlw 0x80
	movwf PORTD
	call pulse
	bsf PORTE,0
	call del_125
	movlw 0x30
	movwf FSR
getchar	movf 0x00,w
	movwf PORTD
	call pulse
	movlw 0x37
	subwf FSR,w
	btfsc STATUS,Z
	goto half
	movlw 0x3f
	subwf FSR,w
	btfsc STATUS,Z
	return
	incf FSR,f
	goto getchar
half	bcf PORTE,0
	call del_125
	movlw 0xc0
	movwf PORTD
	call pulse
	bsf PORTE,0
	incf FSR,f
	call del_125
	goto getchar

	end

