HD 44780 alapú LCD alapprogram

Az alábbi program a PIC16F873 felhasználásával az LCD kijelzőre ír. A vezérlő vonalak a PORTC-n lettek kialakítva, hogy szabadok maradjanak az analóg csatornák. Az adatok a PORTB-n keresztül kapcsolódnak az LCD-hez.

A program kezdetén van egy várakozó ciklus, ami az LCD elindulását várja, mert a BF (BusyFlag) csak akkor vehető, ha az LCD is működik már. Ezután már minden írás-olvasás előtt meghívható az LCD-re várakozó rutin. Az LCDCHAR (karakter küldés) és az LCDCMD (parancs küldés) már eleve így működik.

A program kihasználja az LCD cursor jobbra shiftelő tulajdonságát, ami azt jelenti, hogy az AC (AddressCounter/CímSzámláló) automatikusan jobbra lép a kiírt karakter után, így folyamatosan küldhetjük a karakterkódokat.

Lásd még: [Katalógus] - HD 44780 alapú LCD


 
; PIC16F873 4MHz
; HD44780 alapú LCD alapprogram
; ADATBUS = PORTB
; VEZÉLÉS = PORTC (RC0 = RS, RC1 = RW, RC2 = EN) 
; JErvin © 2005

LIST P=16F873
#include "P16F873.INC" 

TEMPW		EQU	0x020		; TEMPW
LO		EQU	0x021		; DELAY LO
HI		EQU	0x022		; DELAY HI

LCDBUSTRIS	EQU	TRISB		; ADATBUSZ TRIS
LCDCTRLTRIS	EQU	TRISC		; VEZÉRLŐ TRIS
LCDBUS		EQU 	PORTB		; AZ LCD ARATBUSZA
LCDCTRL		EQU	PORTC		; AZ LCD VEZÉRLŐ VONALAI 

RS		EQU	0		; PARANCS/ADAT VONAL 
RW		EQU	1		; READ/WRITE VONAL
EN		EQU	2		; ENGEDÉLYEZŐVONAL

LINE0		EQU	0x00		; LCD 1 SOR CÍME
LINE1		EQU	0x40		; LCD 2 SOR CÍME

BANK0:		MACRO
		BCF	STATUS, RP0
		ENDM

BANK1:		MACRO
		BSF	STATUS, RP0
		ENDM		


		ORG	0x0000
		GOTO	INIT
		;
		; INIT
		;
INIT:		BANK1
		CLRF	LCDBUSTRIS	; LCDBUS KIMENET
		CLRF	LCDCTRLTRIS	; LCDCTRL KIMENET	
		BANK0			;
		CLRF	LCDBUS		; LCDBUS = 0
		CLRF	LCDCTRL		; LCDCTRL = 0
		CALL	DELAYLCD	; VÁRAKOZÁS MÍG LCD 'FELÁLL'
		CALL	LCDWAIT		; VÁRAKOZÁS AZ LCD-re
		CALL	LCDINIT		; LCD BEÁLLÍTÁS
		;
		; 'HELLO' AZ LCD-re
		;
		MOVLW	'H'
		CALL	LCDCHAR
		MOVLW	'E'
		CALL	LCDCHAR
		MOVLW	'L'
		CALL	LCDCHAR
		MOVLW	'L'
		CALL	LCDCHAR
		MOVLW	'O'
		CALL	LCDCHAR
		;
		; MAIN
		;
MAIN:		GOTO	MAIN




;-------------------------------------------------------------------
; LCD RUTINOK
;	
; LCDCHAR:	A W-BEN LEVŐ ADATOT AZ LCD AKTUÁLIS POZÍCIÓJÁBA ÍRJA
; LCDCMD:	A W-BEN LEVŐ UTASÍTÁS KÜLDÉSE AZ LCD-NEK
; LCDWAIT: 	VÁRAKOZÁS AMÍG AZ LCD FOGLALT
; LCDINIT: 	LCD BEÁLLÍTÁS 8BIT, 2SOR, 5×8DOTS, INCREMENT, DISPLAY SHIFT OFF, 
;		LCDCLR, LCDHOME0, LCDCRSON
; LCDCLR: 	KIJELZŐ TÖLÉSE
; LCDHOME0: 	CURSOR LINE0 HOME
; LCDHOME1: 	CURSOR LINE1 HOME
; LCDCRSON: 	DISPLAY ON, CURSOR ON, BLINK ON, CURSOR RIGHT SHIFT
; LCDCRSOFF: 	DISPLAY ON, CURSOR OFF, BLINK OFF
;-------------------------------------------------------------------

		;
		; LCDCHAR: A W-BEN LEVŐ ADATOT AZ LCD AKTUÁLIS POZÍCIÓJÁBA ÍRJA
		;
LCDCHAR:	MOVWF	TEMPW		; TEMPW = W
		CALL	LCDWAIT		; VÁRAKOZÁS AZ LCD-re
		MOVFW	TEMPW		; W = TEMPW
		MOVWF	LCDBUS		; LCDBUS = W
		BSF	LCDCTRL, RS	; RS = 1 (PARANCS/ADAT)
		BCF	LCDCTRL, RW	; RW = 0 (ÍRÁS/OLVASÁS)
		BSF	LCDCTRL, EN	; EN = 1 (ADÁS KEZD)		
		NOP			;
		BCF	LCDCTRL, EN	; EN = 0 (ADÁS VÉGE)
		RETURN			;
		; 
		; LCDCMD: A W-BEN LEVŐ UTASÍTÁS KÜLDÉSE AZ LCD-NEK
		;
LCDCMD:		MOVWF	TEMPW		; TEMPW = W
		CALL	LCDWAIT		; VÁRAKOZÁS AZ LCD-re
		MOVFW	TEMPW		; W = TEMPW
		MOVWF	LCDBUS		; LCDBUS = W
		BCF	LCDCTRL, RS	; RS = 0 (PARANCS/ADAT)
		BCF	LCDCTRL, RW	; RW = 0 (ÍRÁS/OLVASÁS)
		BSF	LCDCTRL, EN	; EN = 1 (ADÁS KEZD)
		NOP			;			
		BCF	LCDCTRL, EN	; EN = 0 (ADÁS VÉGE)
		RETURN			;
		;
		; LCDWAIT: VÁRAKOZÁS AMÍG AZ LCD FOGLALT
		;
LCDWAIT:	BANK1
		MOVLW	0xFF		; LCDBUS OLVASÁSRA
		MOVWF	LCDBUSTRIS	; .
		BANK0			;
		BCF	LCDCTRL, RS   	; RS = 0 (PARANCS/ADAT)
		BSF	LCDCTRL, RW	; RW = 1 (ÍRÁS/OLVASÁS)
		BSF	LCDCTRL, EN	; EN = 1 (ADÁS KEZD)	
		MOVFW	LCDBUS		; W = BUSYFLAG ÉS ADDRESS
		BCF	LCDCTRL, EN    	; EN = 0 (ADÁS VÉGE)
		ANDLW	0x80		; BUSYFLAG == 1 AKKOR VISSZA 
		BTFSS	STATUS, Z	; .
		GOTO	LCDWAIT		; .	
		BCF	LCDCTRL, RW	; RW = 0 (ÍRÁS/OLVASÁS)
		BANK1        		; 
		CLRF	LCDBUSTRIS	; LCDBUS ÍRÁSRA
		BANK0				
		RETURN
		;
		; LCDINIT: LCD BEÁLLÍTÁS
		;
LCDINIT:	MOVLW	B'00111000'	; 8-BIT, 2-SOR, 5×8 DOTS 
		CALL	LCDCMD		; FUNCTION SET
		MOVLW	B'00001000'	; DISPLAY OFF
		CALL	LCDCMD		; DISPLAY CONTROL
		MOVLW	B'00000110'	; INCREMENT, DISPLAY SHIFT OFF
		CALL	LCDCMD		; ENTRY MODE SET
		CALL	LCDCLR		; DISPLAY CLEAR
		CALL	LCDHOME0	; HOME
		CALL	LCDCRSON	; DISPLAY ON, CURSOR ON, BLINK ON
		;
		; LCDCLR: KIJELZŐ TÖLÉSE
		;
LCDCLR:		MOVLW	B'00000001'
		CALL	LCDCMD
		RETURN
		;
		; LCDHOME0: CURSOR LINE0 HOME
		;
LCDHOME0:	MOVLW	B'00000010'
		CALL	LCDCMD
		RETURN
		;
		; LCDHOME1: CURSOR LINE1 HOME
		;
LCDHOME1:	MOVLW	LINE1		; 2-SOR CÍME
		IORLW	0x80		; OR DDRAM ADDRESS UTASÍTÁS	
		CALL	LCDCMD		;
		RETURN
		;
		; LCDCRSON: DISPLAY ON, CURSOR ON, BLINK ON, CURSOR RIGHT SHIFT
		;
LCDCRSON:	MOVLW	B'00001111'	; DISPLAY ON, CURSOR OFF
		CALL	LCDCMD		; DISPLAY CONTROL
		MOVLW	B'00011100'	; CURSOR SHIFT, SHIFT RIGHT
		CALL	LCDCMD		;
		RETURN
		;
		; LCDCRSOFF: DISPLAY ON, CURSOR OFF, BLINK OFF
		;
LCDCRSOFF:	MOVLW	B'00001100'	; DISPLAY ON, CURSOR OFF, BLINK OFF
		CALL	LCDCMD		; DISPLAY CONTROL
		RETURN			;
		;
		; DELAYLCD: SZÜNET AMÍG AZ LCD 'FELÁLL'
		;
DELAYLCD:	CLRF	LO
		CLRF	HI
		DECFSZ 	LO
		GOTO	$-1
		DECFSZ	HI
		GOTO	$-3
		RETURN                         

END