LIST P=16F1936, R=DEC
#include "P16F1936.inc"
;
OSCFREQ = 4		; 1,2,4,8,16 MHz
;
 __CONFIG _CONFIG1, 0x09A4
 __CONFIG _CONFIG2, 0x1433
; 
cblock 0x20
 temp1,temp2,temp3,temp6,temp7
endc
;
trisamask 		EQU b'00001111'
trisbmask		EQU b'11111111'
triscmask 		EQU b'11110000'
;
commandport		EQU PORTA
PORTC		EQU PORTC
RS				EQU .7
EN				EQU .6
D0				EQU .0
D1				EQU .1
D2				EQU .2
D3				EQU .3
;
IF OSCFREQ == 1
adctimerefmask	EQU b'10000000'	; 1 MHz
oscmask			EQU b'01011010'	; 1 MHz
ENDIF
;
IF OSCFREQ == 2
adctimerefmask	EQU b'10010000'	; 2 MHz
oscmask			EQU b'01100010'	; 2 MHz
ENDIF
;
IF OSCFREQ == 4
adctimerefmask	EQU b'10010000'	; 4 MHz
oscmask			EQU b'01101010'	; 4 MHz
ENDIF
;
IF OSCFREQ == 8
adctimerefmask	EQU b'11010000'	; 8 MHz
oscmask			EQU b'01110010'	; 8 MHz
ENDIF
;
IF OSCFREQ == 16
adctimerefmask	EQU b'10100000'	; 16 MHz
oscmask			EQU b'01111010'	; 16 MHz
ENDIF
;
org 0x00
	goto settings
org 0x04
	goto interrupt
settings
	banksel LATA
			clrf LATA
			clrf LATB
			clrf LATC
	banksel ANSELA
			clrf ANSELA
			clrf ANSELB
	banksel TRISA
			movlw trisamask
			movwf TRISA
			movlw trisbmask
			movwf TRISB
			movlw triscmask
			movwf TRISC
			movlw 0xFF
			movwf TRISE
	banksel OSCCON
			movlw oscmask
			movwf OSCCON
	banksel LCDCON
			clrf LCDCON
	banksel ADCON0
			clrf ADCON0
	banksel ADCON1
			movlw adctimerefmask
			movwf ADCON1
	banksel SSPMSK
			clrf SSPMSK
	banksel PORTA
			clrf PORTA
			clrf PORTB
			clrf PORTC
			clrf PORTE
goto main
;
interrupt
; now it must examine which type interrupt had happened?
banksel INTCON
	btfsc INTCON,2				; is it TMR0 overflow?
	call tmr0over
banksel PIR1
	btfsc PIR1,0				; is it TMR1 overflow?
	call tmr1over
banksel PORTA
;
retfie
;
; *******************************************************************
;
tmr0over
return
;
tmr1over
return
;
delay
movlw .15
movwf temp1
movlw .250
movwf temp2
decfsz temp2,F
goto $-1
goto $-4
return
;
send_lcd_data
movwf temp6
		movlw .20
		movwf temp7
		decfsz temp7,F
		goto $-1
swapf temp6,F
movf temp6,0
andlw .15
		bsf PORTA,7
			movwf PORTC
		bsf PORTA,6
		bcf PORTA,6
swapf temp6,F
movf temp6,0
andlw .15
		bsf PORTA,7
			movwf PORTC
		bsf PORTA,6
		bcf PORTA,6
return
;
send_lcd_cmd
movwf temp6
		movlw .20
		movwf temp7
		decfsz temp7,F
		goto $-1
swapf temp6,F
movf temp6,0
andlw .15
		bcf PORTA,7
			movwf PORTC
		bsf PORTA,6
		bcf PORTA,6
swapf temp6,F
movf temp6,0
andlw .15
		bcf PORTA,7
			movwf PORTC
		bsf PORTA,6
		bcf PORTA,6
return
;
init_lcd

call delay


movlw b'00110011'       ;initialise lcd - first byte
call send_lcd_cmd
movlw b'00110011'       ;2nd byte (repeat of first)
call send_lcd_cmd
movlw b'00110010'       ;set for 4-bit operation
call send_lcd_cmd
movlw b'00100000'       ;set for 1 line
call send_lcd_cmd
movlw b'00000110'       ;set entry mode to increment each address
call send_lcd_cmd
movlw b'00001100'       ;set display on, cursor off, blink off
call send_lcd_cmd
movlw b'00000001'       ;clear display
call send_lcd_cmd
movlw b'00000010'       ;return home, cursor & RAM to zero
call send_lcd_cmd



return


main

call init_lcd

movlw 0x80
call send_lcd_cmd

movlw 'A'
call send_lcd_data

nop
nop
nop
nop
goto $-2


end