; LCD-LPH7366_1.asm	utolsó módosítás: 2010.02.20.	!!! Működik!!!
;	
; NOKIA 5110 LCD-jének meghajtása PIC-el. LCD típusa: LPH7366  84x48 monochrome, driver IC típusa: PCD8544
; 5x7 -es karakterkészlet, a 32-127 tartomány ASCII karakterei. 6 sorban, soronként 14 karakter, ha a
; karakterek közé 1 pixelnyi szünetet is írok. A sorok 8 pixel magasak, az alsó pixelsorok üresek.
;
; Hardver: látsd az I/O portok definíciójánál!  Max.tápfesz:3,3V !!!
;
;
        PROCESSOR       16F688
        INCLUDE		"P16F688.INC"
	errorlevel -302
	radix	dec
;
;    f=8MHz	0,5usec utasításidő
;
	__CONFIG	_INTOSCIO & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _CP_OFF & _CPD_OFF & _BOD_OFF & _FCMEN_OFF & _IESO_OFF  

;
; I/O portok
;
#DEFINE	RESET	PORTC,1		; RESET aktív L
#DEFINE	CS	PORTC,2		; Chip Select aktív L
#DEFINE DC	PORTC,3		; Data/Command  H=Data  L=Command
#DEFINE SCLK	PORTA,4		; Serial Clock
#DEFINE SDATA	PORTA,5		; Serial Data

;
; Változók:
;
	CBLOCK	32
C1				; 
C2				; 
C3
TEMP
	ENDC
;
;****************************************************************************************
; Program lista:
;
	ORG	0
;-------------------------------------------------------------------------------------
; Inicializálás		A megszakítások alapból tiltva vannak.
;
INIC	MOVLW	B'00000111'	;
	MOVWF	CMCON0		; Komparátorok kikapcsolva,PORTA digital I/O
	BANKSEL	OPTION_REG	; Bank váltás
	MOVLW	B'10001111'	; OPTION_REG regiszter beállítása:PORTA felhúzó ellenállások tiltva
				; TMR0 belső léptetésű, osztás nélkül, osztó a watchdoghoz rendelve 128-as 
	MOVWF	OPTION_REG	;	osztással
	MOVLW	B'01110001'	;
	MOVWF	OSCCON		; 8MHz-es belső oszcillátor bekapcs.
	CLRF	ANSEL		; A/D kikapcsolva, PORTA digital I/O
	MOVLW	B'11001111'	; A-port bitjeinek iránya:
	MOVWF	TRISA		; 0.bit 1.oszlop bemenet és ICD2
				; 1.bit 2.oszlop bemenet és ICD2
				; 2.bit 3.oszlop bemenet
				; 3.bit MASTER RESET
				; 4.bit kimenet LCD órajel
				; 5.bit kimenet LCD adat
	MOVLW	B'11100000'	; C-port bitjeinek iránya:
	MOVWF	TRISC		; 0.bit kimenet, 
				; 1.bit kimenet, LCD RESET
				; 2.bit kimenet, LCD Chip Select
				; 3.bit kimenet, LCD Data/Command
				; 4.bit kimenet, TX
				; 5.bit bemenet, RX
	BANKSEL	PORTA
;--- LCD inicializálása
	BCF	RESET		;---
	NOP			; LCD RESET
	BSF	RESET		;-----
	BCF	CS		; Chip Select engedélyezve
 	MOVLW	B'00100001'	; Function set:extended instruction set
				; 0.bit- H=0 normal instruction set	H=1 extended instruction set
				; 1.bit- V=0 horizontal addressing	V=1 vertical addressing
				; 2.bit- PD=0 chip is activ		PD=1 Power Down mode
	CALL	LCDpara
	MOVLW	B'10111000'	; Vop set:56	előtte H=1
	CALL	LCDpara
	MOVLW	B'00010011'	; Bias set:3	előtte H=1
	CALL	LCDpara
	MOVLW	B'00100000'	; Function set: normal instruction set
	CALL	LCDpara
	MOVLW	B'00001001'	; Display control:all display segments on	előtte H=0
				; 0.bit-E	2.bit-D
				; DE=00 display blank		DE=01 all display segments on
				; DE=10 normal mode		DE=11 inverse video mode
	CALL	LCDpara
	CALL	LCDCLR		; DDRAM törlése
	CALL	PAUSE1
	MOVLW	B'00001000'	; Display control:display blank			előtte H=0
				; 0.bit-E	2.bit-D
				; DE=00 display blank		DE=01 all display segments on
				; DE=10 normal mode		DE=11 inverse video mode
	CALL	LCDpara
	MOVLW	B'00001100'	; Display control:normal mode			előtte H=0
				; 0.bit-E	2.bit-D
				; DE=00 display blank		DE=01 all display segments on
				; DE=10 normal mode		DE=11 inverse video mode
	CALL	LCDpara		;-----
;	
;--------------------------------------------------------------------------------------------------
;  Főprogram
;
INDUL	BCF	CS		; Chip Select engedélyezés
	MOVLW	172
	MOVWF	C3
G1	MOVLW	128		; vagy 139
	SUBWF	C3,W
	CALL	LCDkar
	MOVLW	0		; 1 üres pixel oszlop kiírása
	CALL	LCDadat		;	ez a szünet a karakterek között
	INCFSZ	C3,F
	GOTO	G1
	BSF	CS		; Chip Select tiltása. EZ KELL A SOROS KOMMUNIKÁCIÓ LEZÁRÁSÁHOZ!!!
STOP	GOTO	STOP
;*************************************************************************************************
; SZUBRUTINOK
;*************************************************************************************************
;-----------------------------------------------------------------------------------
; W-ben jövő adat kiküldése az LCD-re.	változók: C1,TEMP
; Belépési pontok:	LCDadat - adatbájt kiküldése
;			LCDpara - parancsbájt kiküldése
;-------------------------------
LCDadat	BSF	DC		; adatot kell kiküldeni
	GOTO	LCD1
LCDpara	BCF	DC		; parancsot kell kiküldeni
LCD1	MOVWF	TEMP		; az adat elmentése
	MOVLW	8		; 8 bitet kell kiküldeni
	MOVWF	C1		; C1 lesz a ciklusszámláló
LCD2	BCF	SCLK		; órajel
	BSF	SDATA		; adatbit 
	BTFSS	TEMP,7		;	kimenet
	BCF	SDATA		;		beállítása
	RLF	TEMP,F		; bitek balra léptetése
	BSF	SCLK		; órajel
	DECFSZ	C1,F		; van még adatbit?
	GOTO	LCD2		; igen
	RETURN
;-----------------------------------------------------------------------------------
; W-ben jövő ASCII karakter kiírása az LCD-re.	változók: C2	és a meghívott szubrutinban: C1,TEMP
;-------------------------------
LCDkar	MOVWF	C2		; elmenti az ASCII kódot
	MOVLW	HIGH TABLA1k	;---
	MOVWF	PCLATH		; PCLATH beállítás
	MOVF	C2,W		; az ugrótábla első lapja az első 51 karaktert tartalmazza (51x5=255)
	SUBLW	82		; itt az utolsó karakter az R, ASCII kódja=82
	BTFSC	STATUS,C	; Ha ettől nagyobb a kód, akkor PCLATH értékét át kell állítani,
	GOTO	LCD6		; mert a karakterkódok az ugrótábla második lapjára esnek.
	INCF	PCLATH,F	;-----	
LCD6	MOVLW	32		; 32-t levon az ASCII kódból
	SUBWF	C2,F		;
	MOVF	C2,W		; majd megszorozza 5-tel,
	ADDWF	C2,F		; így kapja meg a sorszámot
	ADDWF	C2,F
	ADDWF	C2,F
	ADDWF	C2,F
	MOVF	C2,W		; W-be a sorszám
	CALL	TABLA1
	CALL	LCDadat
	INCF	C2,F
	MOVF	C2,W		; W-be a sorszám
	CALL	TABLA1
	CALL	LCDadat
	INCF	C2,F
	MOVF	C2,W		; W-be a sorszám
	CALL	TABLA1
	CALL	LCDadat
	INCF	C2,F
	MOVF	C2,W		; W-be a sorszám
	CALL	TABLA1
	CALL	LCDadat
	INCF	C2,F
	MOVF	C2,W		; W-be a sorszám
	CALL	TABLA1
	CALL	LCDadat
	RETURN
;-----------------------------------------------------------------------------------
; LCD DDRAM törlése.	változók: C1,C2,C3
;-------------------------------
LCDCLR	BCF	SDATA		;
	MOVLW   6
	MOVWF   C3
LCD5	MOVLW   84
	MOVWF   C1
LCD4	MOVLW   8  
	MOVWF   C2
	BSF	DC
LCD3	BCF	SCLK
	BSF	SCLK
	DECFSZ  C2,F	
	GOTO 	LCD3
	DECFSZ  C1,F	
	GOTO 	LCD4		
	DECFSZ  C3,F  
	GOTO	LCD5
	RETURN
;--------------------------------------------------------------------------------------------------
;  Várakozás,  idő: W*100msec 
;	Ha W=1 a késleltetés 200002 utasításciklus=100,001msec (a MOVLW x és a CALL utasítással együtt)
;	változók: C1,C2,C3
;-------------------------------
PAUSE1	MOVLW	10		; 1 másodperc késleltetés
PAUSE	MOVWF	C1		; A bejövő értéket tároljuk
P2	MOVLW	156
	MOVWF	C2
	CLRF	C3
P1	GOTO	$+1		; 2 ciklusidő
	DECFSZ	C3,F		; Lejárt az idő?
	GOTO	P1		; Várakozás tovább
	DECFSZ	C2,F
	GOTO	P1
	DECFSZ	C1,F
	GOTO	P2
	RETURN			; Az idő lejárt, visszatérés
;*******************************************************************	
; Az oszcillátor beállításához használható
; Belső 8MHz esetén 970Hz-es jelet generál. 2060 utasítás ciklus
;
BEMER	BSF	PORTC,0
	CALL	BEMER1
	BCF	PORTC,0
	CALL	BEMER1
	GOTO	BEMER
BEMER1	CLRF	C1
BEMER2	NOP
	DECFSZ	C1,F
	GOTO	BEMER2
	RETURN
;************************************************************************************
; Karakter tábla: 5x7 -es karakterkészlet, a 32-127 tartomány eredeti ASCII karakterei.
;
	ORG	768			; 
TABLA1	ADDWF 	PCL,F			; 
TABLA1k	DT 0x00, 0x00, 0x00, 0x00, 0x00; (space) 
	DT 0x00, 0x00, 0x5F, 0x00, 0x00; ! 
	DT 0x00, 0x07, 0x00, 0x07, 0x00; " 
	DT 0x14, 0x7F, 0x14, 0x7F, 0x14; # 
	DT 0x24, 0x2A, 0x7F, 0x2A, 0x12; $ 
	DT 0x23, 0x13, 0x08, 0x64, 0x62; % 
	DT 0x36, 0x49, 0x55, 0x22, 0x50; & 
	DT 0x00, 0x05, 0x03, 0x00, 0x00; ' 
	DT 0x00, 0x1C, 0x22, 0x41, 0x00; ( 
	DT 0x00, 0x41, 0x22, 0x1C, 0x00; ) 
	DT 0x08, 0x2A, 0x1C, 0x2A, 0x08; * 
	DT 0x08, 0x08, 0x3E, 0x08, 0x08; + 
	DT 0x00, 0x50, 0x30, 0x00, 0x00; , 
	DT 0x08, 0x08, 0x08, 0x08, 0x08; - 
	DT 0x00, 0x30, 0x30, 0x00, 0x00; . 
	DT 0x20, 0x10, 0x08, 0x04, 0x02; / 
	DT 0x3E, 0x51, 0x49, 0x45, 0x3E; 0 
	DT 0x00, 0x42, 0x7F, 0x40, 0x00; 1 
	DT 0x42, 0x61, 0x51, 0x49, 0x46; 2 
	DT 0x21, 0x41, 0x45, 0x4B, 0x31; 3 
	DT 0x18, 0x14, 0x12, 0x7F, 0x10; 4 
	DT 0x27, 0x45, 0x45, 0x45, 0x39; 5 
	DT 0x3C, 0x4A, 0x49, 0x49, 0x30; 6 
	DT 0x01, 0x71, 0x09, 0x05, 0x03; 7 
	DT 0x36, 0x49, 0x49, 0x49, 0x36; 8 
	DT 0x06, 0x49, 0x49, 0x29, 0x1E; 9 
	DT 0x00, 0x36, 0x36, 0x00, 0x00; : 
	DT 0x00, 0x56, 0x36, 0x00, 0x00; ; 
	DT 0x00, 0x08, 0x14, 0x22, 0x41; < 
	DT 0x14, 0x14, 0x14, 0x14, 0x14; = 
	DT 0x41, 0x22, 0x14, 0x08, 0x00; > 
	DT 0x02, 0x01, 0x51, 0x09, 0x06; ? 
	DT 0x32, 0x49, 0x79, 0x41, 0x3E; @ 
	DT 0x7E, 0x11, 0x11, 0x11, 0x7E; A 
	DT 0x7F, 0x49, 0x49, 0x49, 0x36; B 
	DT 0x3E, 0x41, 0x41, 0x41, 0x22; C 
	DT 0x7F, 0x41, 0x41, 0x22, 0x1C; D 
	DT 0x7F, 0x49, 0x49, 0x49, 0x41; E 
	DT 0x7F, 0x09, 0x09, 0x01, 0x01; F 
	DT 0x3E, 0x41, 0x41, 0x51, 0x32; G 
	DT 0x7F, 0x08, 0x08, 0x08, 0x7F; H 
	DT 0x00, 0x41, 0x7F, 0x41, 0x00; I 
	DT 0x20, 0x40, 0x41, 0x3F, 0x01; J 
	DT 0x7F, 0x08, 0x14, 0x22, 0x41; K 
	DT 0x7F, 0x40, 0x40, 0x40, 0x40; L 
	DT 0x7F, 0x02, 0x04, 0x02, 0x7F; M 
	DT 0x7F, 0x04, 0x08, 0x10, 0x7F; N 
	DT 0x3E, 0x41, 0x41, 0x41, 0x3E; O 
	DT 0x7F, 0x09, 0x09, 0x09, 0x06; P 
	DT 0x3E, 0x41, 0x51, 0x21, 0x5E; Q 
	DT 0x7F, 0x09, 0x19, 0x29, 0x46; R 
;
TABLA2k	DT 0x46, 0x49, 0x49, 0x49, 0x31; S 
	DT 0x01, 0x01, 0x7F, 0x01, 0x01; T 
	DT 0x3F, 0x40, 0x40, 0x40, 0x3F; U 
	DT 0x1F, 0x20, 0x40, 0x20, 0x1F; V 
	DT 0x7F, 0x20, 0x18, 0x20, 0x7F; W 
	DT 0x63, 0x14, 0x08, 0x14, 0x63; X 
	DT 0x03, 0x04, 0x78, 0x04, 0x03; Y 
	DT 0x61, 0x51, 0x49, 0x45, 0x43; Z 
	DT 0x00, 0x00, 0x7F, 0x41, 0x41; [ 
	DT 0x02, 0x04, 0x08, 0x10, 0x20; \ 
	DT 0x41, 0x41, 0x7F, 0x00, 0x00; ] 
	DT 0x04, 0x02, 0x01, 0x02, 0x04; ^ 
	DT 0x40, 0x40, 0x40, 0x40, 0x40; _ 
	DT 0x00, 0x01, 0x02, 0x04, 0x00; ` 
	DT 0x20, 0x54, 0x54, 0x54, 0x78; a 
	DT 0x7F, 0x48, 0x44, 0x44, 0x38; b 
	DT 0x38, 0x44, 0x44, 0x44, 0x20; c 
	DT 0x38, 0x44, 0x44, 0x48, 0x7F; d 
	DT 0x38, 0x54, 0x54, 0x54, 0x18; e 
	DT 0x08, 0x7E, 0x09, 0x01, 0x02; f 
	DT 0x08, 0x14, 0x54, 0x54, 0x3C; g 
	DT 0x7F, 0x08, 0x04, 0x04, 0x78; h 
	DT 0x00, 0x44, 0x7D, 0x40, 0x00; i 
	DT 0x20, 0x40, 0x44, 0x3D, 0x00; j 
	DT 0x00, 0x7F, 0x10, 0x28, 0x44; k 
	DT 0x00, 0x41, 0x7F, 0x40, 0x00; l 
	DT 0x7C, 0x04, 0x18, 0x04, 0x78; m 
	DT 0x7C, 0x08, 0x04, 0x04, 0x78; n 
	DT 0x38, 0x44, 0x44, 0x44, 0x38; o 
	DT 0x7C, 0x14, 0x14, 0x14, 0x08; p 
	DT 0x08, 0x14, 0x14, 0x18, 0x7C; q 
	DT 0x7C, 0x08, 0x04, 0x04, 0x08; r 
	DT 0x48, 0x54, 0x54, 0x54, 0x20; s 
	DT 0x04, 0x3F, 0x44, 0x40, 0x20; t 
	DT 0x3C, 0x40, 0x40, 0x20, 0x7C; u 
	DT 0x1C, 0x20, 0x40, 0x20, 0x1C; v 
	DT 0x3C, 0x40, 0x30, 0x40, 0x3C; w 
	DT 0x44, 0x28, 0x10, 0x28, 0x44; x 
	DT 0x0C, 0x50, 0x50, 0x50, 0x3C; y 
	DT 0x44, 0x64, 0x54, 0x4C, 0x44; z 
	DT 0x00, 0x08, 0x36, 0x41, 0x00; DT  
	DT 0x00, 0x00, 0x7F, 0x00, 0x00; | 
	DT 0x00, 0x41, 0x36, 0x08, 0x00; } 
	DT 0x08, 0x08, 0x2A, 0x1C, 0x08; -> 
	DT 0x08, 0x1C, 0x2A, 0x08, 0x08; <- 
;**************************************************************************************************
;
	END
	
