
	list		p=16F874A,	R=DEC
	include		"p16f874a.inc"

	__config _BODEN_OFF & _CP_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _DEBUG_OFF & _CPD_OFF & _LVP_OFF
	errorlevel 1, -306

	cblock 0x20

	RAM		; první adresa paměti RAM pro PIC16F84 - 68bajtů (0C-2F)
	TMP_W			; temp preruseni
	TMP_S			; temp preruseni
	TMP_PCL			; temp preruseni

	TMP0			; cekaci smycka
	TMP1			; cekaci smycka
	TMP2			; cekaci smycka
	TMP3			; cekaci smycka, stisk tlacitka

	TEXT			; zobrazeni textu na LCD
	ZNAK			; zobrazeni znaku na LCD
	ADRESA			; inicializace cestiny, adresa pro misto znaku
	CISLO			; pomocne cislo

#define	E	PORTB,7		;	
#define	RS	PORTB,6		;

;*************************************************************
LINE1	movlw	0x80		; 1 radek, 0 znak displeje
	goto	WR_CMD
;-------------------------------
LINE2	movlw	0xC0		; 2 radek, 0 znak displeje
	goto	WR_CMD
;-------------------------------
C_LCD	movlw	0x01		; smaz LCD a vrat se na pozici 0
	goto	WR_CMD
;-------------------------------
WR_CMD	bcf	RS		; RS=0, zápis instrukcí do LCD
	goto	WR_LCD
;-------------------------------
WR_DATA	bsf	RS		; RS=1, zápis dat do LCD
	goto	WR_LCD
;-------------------------------
WR_LCD	movwf	ZNAK		; přepsat W do ZNAK	!!! data v registru W !!!

	bsf	E		; nastav Enable
	movf	PORTB,W		; stav portu do W
	iorlw	0x0F		; zamaskuje dolni bity portu
	movwf	TMP1
;-------------------------------
;	swapf	ZNAK,W		; !!! poslat na PORTB 0-3 !!!
;	iorlw	0xF0		; zamaskuje horní bity (vysledek je 1111xxxx)

	movf	ZNAK,W		; !!! poslat na PORTB 4-7 !!!
	iorlw	0x0F		; zamaskuje dolní bity (vysledek je xxxx1111)

	andwf	TMP1,W		; pošle vyšší 4 bity na PORTB
	movwf	PORTB
	bcf	E		; zapíše do LCD
;-------------------------------
	bsf	E		; nastav Enable

;	movf	ZNAK,W		; !!! poslat na PORTB 0-3 !!!
;	iorlw	0xF0		; zamaskuje horní bity (vysledek je 1111xxxx)

	swapf	ZNAK,W		; !!! poslat na PORTB 4-7 !!!
	iorlw	0x0F		; zamaskuje dolní bity (vysledek je xxxx1111)

	andwf	TMP1,W		; pošle nižší 4 bity na PORTB
	movwf	PORTB
	bcf	E		; zapíše do LCD
;-------------------------------
	btfsc	RS
	goto	CEK40		; RS=1, zápis dat - čekej 40 us
;       ------------------------
	movlw	0x04		; instrukce 1, 2 a 3 - čekej 1,64 ms
	subwf	ZNAK,W
	btfss	STATUS,C
	goto	CEK1m6		; C=0, instrukce CLEAR - čekej 1,64 ms
	goto	CEK40		; C=1, zápis dat - čekej 40 us
;*************************************************************
INI_LCD	call	CEK15m		; 4-bitová inicializace displeje LCD
;	call	CEK15m
	bcf	RS		; RS=0, zápis instrukcí do LCD
;       ------------------------
	movlw	03h
	movwf	PORTB
	bsf	E
	bcf	E		; zapiše do LCD
;	call	CEK4m		; čekej 4 ms
	call	CEK15m		; !! pro zjednoduseni dano 15ms !!
;       ------------------------
	bsf	E
	bcf	E		; zapiše do LCD
	call	CEK100		; čekej 100 us
;       ------------------------
	bsf	E
	bcf	E		; zapiše do LCD
	call	CEK1m6		; čekej 1,6 ms
;-------------------------------
	movlw	02h
	movwf	PORTB
	bsf	E
	bcf	E		; zapiše do LCD
	call	CEK1m6		; čekej 1,6 ms
;-------------------------------
	movlw	28h		; 00101000 - počet bitů, 2 řádky, 5x7 znak
	call	WR_CMD
	movlw	0Ch		; 00001100 - display ON, kurzor OFF, blikání OFF
	call	WR_CMD
	movlw	01h		; 00000001 - smaže displej
	call	WR_CMD
	movlw	06h		; 00000110 - směr kurzoru, posunu displeje
	call	WR_CMD
	return


;**************************************************************************
; časy pro frekvenci krystalu 20,00Mhz
; časy jsou spočítané od call CEKxxm do návratu na volání CEKxxm
; celkový výpočet  = 2+6+(2+(TMP0-1)*3+2)+3)*TMP1-1+2
; zkrácený výpočet = 8+((TMP0-1)*3+7)*TMP1+1
; malá smyčka = (TMP2-1)*3+2
;-------------------------------
CEK2s	movlw	.200		; TMP2 = 20  cekej 2 sekundu
	movwf	TMP3
	goto	SMYCKA2
;-------------------------------
CEK1s	movlw	.100		; TMP2 = 10  cekej 1 sekundu
	movwf	TMP3
	goto	SMYCKA2
;-------------------------------
CEK100m	movlw	.10		; cas = 100,009 ms
	movwf	TMP3
	goto	SMYCKA2
;-------------------------------
CEK15m	movlw	0CFh		; cas = 15,002 ms
	movwf	TMP0
	movlw	078h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK10m	movlw	0CFh		; cas = 10,000 ms
	movwf	TMP0
	movlw	050h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK4m	movlw	0cfh		; cas = 4,0018 ms
	movwf	TMP0
	movlw	020h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK1m6	movlw	047h		; cas = 1,601 ms
	movwf	TMP0
	movlw	025h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK100	movlw 	01Ah		; cas = 100 mikrosekund
	movwf	TMP0
	movlw	006h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK40	movlw	008h		; cas = 40 mikrosekund
	movwf	TMP0
	movlw	007h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK20	movlw	00Eh		; cas = 20 mikrosekund
	movwf	TMP0
	movlw	002h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
CEK10	movlw	00Dh		; cas = 11 mikrosekund
	movwf	TMP0
	movlw	001h
	movwf	TMP1
	goto	SMYCKA
;-------------------------------
SMYCKA2	call	CEK10m
	decfsz	TMP3,F		; největší smyčka
	goto	SMYCKA2
	retlw	00h
;-------------------------------
SMYCKA	movf	TMP0,W
	movwf	TMP2
;       ------------------------
SMYCKA1	decfsz	TMP2,F		; malá smyčka
	goto	SMYCKA1
;       ------------------------
	decfsz	TMP1,F		; velká smyčka
	goto	SMYCKA
;       ------------------------
	retlw	00h







	end
