LIST P=16F883, R=DEC
#include "P16F883.inc"
;
OSCFREQ = 4		; 1,2,4,8 MHz
;
	__CONFIG	_CONFIG1, _CP_OFF & _DEBUG_OFF & _PWRTE_OFF & _CPD_OFF & _LVP_OFF & _BOR_ON & _PWRTE_ON & _WDT_ON  & _INTRC_OSC_NOCLKOUT & _IESO_OFF & _FCMEN_OFF & _MCLRE_OFF
	__CONFIG	_CONFIG2, _WRT_OFF & _BOR21V
;
cblock 0x20
 temp1,temp2,temp3,temp4,temp5
endc
;
trisamask 		EQU b'00001111'
trisbmask		EQU b'11111111'
triscmask 		EQU b'11110000'
;
commandport		EQU PORTA
dataport		EQU PORTC
RS				EQU .7
EN				EQU .6
D4				EQU .0
D5				EQU .1
D6				EQU .2
D7				EQU .3
;
IF OSCFREQ == 1
oscmask			EQU b'01000101'	; 1 MHz
ENDIF
;
IF OSCFREQ == 2
oscmask			EQU b'01010101'	; 2 MHz
ENDIF
;
IF OSCFREQ == 4
oscmask			EQU b'01100101'	; 4 MHz
ENDIF
;
IF OSCFREQ == 8
oscmask			EQU b'01110101'	; 8 MHz
ENDIF
;
org 0x00
	goto settings
org 0x04
	goto interrupt
settings
	banksel TRISA
			movlw trisamask
			movwf TRISA
			movlw trisbmask
			movwf TRISB
			movlw triscmask
			movwf TRISC
			movlw 0xFF
			movwf TRISE
	banksel ANSEL
			clrf ANSEL
	banksel ADCON1
			movlw b'10000000'
			movwf ADCON1
	banksel ADCON0
			clrf ADCON0
	banksel OSCCON
			movlw oscmask
			movwf OSCCON
	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




;
init_lcd
; var 15 millisec
movlw .15
movwf temp3
		movlw .250
		movwf temp4
			decfsz temp4,F
			goto $-1
goto $-4
nop
;
movlw b'00110011'
call lcdcommand
; var 5 millisec
movlw .5
movwf temp3
		movlw .250
		movwf temp4
			decfsz temp4,F
			goto $-1
goto $-4
nop
;
movlw b'00110011'
call lcdcommand
;
; var 100 mikrosec
		movlw .50
		movwf temp4
			decfsz temp4,F
			goto $-1
;
movlw b'00110010'
call lcdcommand
movlw b'00110011'
call lcdcommand
movlw b'00101000'
call lcdcommand
movlw b'00001000'
call lcdcommand
movlw b'00000001'
call lcdcommand
movlw b'00000110'
call lcdcommand
movlw b'00001111'
call lcdcommand

return
;
lcdcommand
movwf temp1
	bcf commandport,RS
; var 140 nanosec=0,14 mikrosec
nop
nop
nop
		bsf commandport,EN
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
			swapf temp1,F			; swap register, to put down MSB	
			movf temp1,0
			andlw b'00001111'		; filter lower 4 bits (MSB)
bcf dataport,D4
bcf dataport,D5
bcf dataport,D6
bcf dataport,D7
			movwf temp2				; only MSB in lower 4 bits
				btfsc temp2,0
					bsf dataport,D4
				btfsc temp2,1
					bsf dataport,D5
				btfsc temp2,2
					bsf dataport,D6
				btfsc temp2,3
					bsf dataport,D7
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
		bcf commandport,EN
; var 10 nanosec=0,01 mikrosec
nop
	bcf commandport,RS
nop
;
	bcf commandport,RS
; var 140 nanosec=0,14 mikrosec
nop
nop
nop
		bsf commandport,EN
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
			swapf temp1,F			; swap register, to put down LSB	
			movf temp1,0
			andlw b'00001111'		; filter lower 4 bits (LSB)
bcf dataport,D4
bcf dataport,D5
bcf dataport,D6
bcf dataport,D7
			movwf temp2				; only LSB in lower 4 bits
				btfsc temp2,0
					bsf dataport,D4
				btfsc temp2,1
					bsf dataport,D5
				btfsc temp2,2
					bsf dataport,D6
				btfsc temp2,3
					bsf dataport,D7
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
		bcf commandport,EN
; var 10 nanosec=0,01 mikrosec
nop
	bcf commandport,RS
nop
return
;
lcddata
movwf temp1
	bsf commandport,RS
; var 140 nanosec=0,14 mikrosec
nop
nop
nop
		bsf commandport,EN
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
			swapf temp1,F			; swap register, to put down MSB	
			movf temp1,0
			andlw b'00001111'		; filter lower 4 bits (MSB)
bcf dataport,D4
bcf dataport,D5
bcf dataport,D6
bcf dataport,D7
			movwf temp2				; only MSB in lower 4 bits
				btfsc temp2,0
					bsf dataport,D4
				btfsc temp2,1
					bsf dataport,D5
				btfsc temp2,2
					bsf dataport,D6
				btfsc temp2,3
					bsf dataport,D7
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
		bcf commandport,EN
; var 10 nanosec=0,01 mikrosec
nop
	bcf commandport,RS
nop
;
	bsf commandport,RS
; var 140 nanosec=0,14 mikrosec
nop
nop
nop
		bsf commandport,EN
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
			swapf temp1,F			; swap register, to put down LSB	
			movf temp1,0
			andlw b'00001111'		; filter lower 4 bits (LSB)
bcf dataport,D4
bcf dataport,D5
bcf dataport,D6
bcf dataport,D7
			movwf temp2				; only LSB in lower 4 bits
				btfsc temp2,0
					bsf dataport,D4
				btfsc temp2,1
					bsf dataport,D5
				btfsc temp2,2
					bsf dataport,D6
				btfsc temp2,3
					bsf dataport,D7
; var 250 nanosec=0,25 mikrosec
nop
nop
nop
		bcf commandport,EN
; var 10 nanosec=0,01 mikrosec
nop
	bcf commandport,RS
nop
return
;
main

call init_lcd


movlw 0x80
call lcdcommand


movlw 'A'
call lcddata



nop
nop
nop
goto $-2



end