× Aktuálně z oboru

SHIELD Experience Upgrade 7 – méně hledání a více zábavy [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]
Celá zprávička [ clanek/2018052902-shield-experience-upgrade-7-mene-hledani-a-vice-zabavy/ ]

Ovládání znakového LCD 20×4 znaků

[ http://programujte.com/profil/20356-martin-vagovszky/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/118-zdenek-lehocky/ ]Google [ ?rel=author ]       2. 1. 2007       33 226×

Tento článek je určen jako malý návod, jak komunikovat, zapojit a používat „inteligentní“ znakové displeje. Je zde uveden příklad programu a zapojení pro displej MC 2004B-SYL (20×4 znaky s podsvícením). Článek je určen spíše mírně zkušenějším v oblasti asembleru 8051 (v zapojení je použit 89c2051).

Někdy je potřeba při vývoji nějákého zařízení myslet na to, aby dávalo uživateli informace o svém stavu prostřednictvím textové informace. Takovýmito zařízeními mohou být kupříkladu různé prodejní automaty, čtečky identifikačních karet, zabezpečovací zařízení atd. A zde se nabízí možnost použít právě tyto inteligentní zobrazovače. Jak už z názvu vyplývá, bude tento článek pojednovát o čtyřřádkovém a dvacetisloupcovém zobrazovači MC 2004B-SYL.

Tato standardizovaná řada displejů (obvykle s řadičem HD44780) je vybavena speciální sadou instrukcí, sloužících ke komunikaci s tímto displejem. Displej rovněž obsahuje znakovou paměť (standardní znaky) a je možné i uživatelsky znaky definovat. Velkou výhodou je paměť RAM, umožňující zapamatování textové informace. Displej umožňuje komunikaci po 8-bitové nebo 4-bitové datové sběrnici, přičemž je potřeba ještě dalších řídících signálů (min. dva). Není cílem tohoto článku detailní rozbor komunikace s tímto zařízením (ten můžete nalézt v odkazech k tomuto článku), ale spíše praktické hledisko (příklad zapojení a příklad programu). Obslužný program byl napsán s ohledem na modularitu dalšího použití.

Schéma zapojení

Schéma zapojení je patrné z přiloženého obrázku. Je zde použito procesoru 89c2051, což však není podmínkou. Program lze použít pro většinu procesorů z řady 51. Praktická realizace záleží na každém. Já osobně jsem při testování použil nepájivé kontaktní pole. V zapojení je použito čtyřbitové komunikace, a to hlavně kvůli snaze o ušetření počtu I/O pinů procesoru. K obsluze displeje jsou tudíž potřeba 4 datové vodiče a 2 řídící. Pokud bychom chtěli ještě řídit podsvícení displeje, bylo by zapotřebí dalšího vývodu procesoru. Troufnu si říct, že je zobrazování tímto displejem velmi efektní a účelné. A jeho využití závisí hlavně na fantazii konstruktéra.

Ovládací SW pro 89c2051 – komentář

Ovladač je napsán v assembleru. Myslím, že pro mírně zkušenějšího programátora nebude problém si tyto procedury aplikovat do kódu např. v jazyce C. Snažil jsem se zvládnout alespoň základní procedury práce s tímto displejem. Jsou to zejména tyto:

  • INITLCD – inicializační sekvence displeje
  • WRDATA/WRCMD – zapíše data/příkaz do displeje
  • CLRLCD – smaže displej
  • GOTOXY – ukazatel adresy na pozici X,Y
  • WRSTR – zapíše na displej řetězec
Tyto procedury je možné dále využít, resp. poupravit si je. Program je otestován a pracuje bez dalších komplikací. Díky použití zásobníku by mělo být zaručeno, že program nepřepíše v žádné proceduře jiné registry než ty, přes které jsou předávány parametry. Snažil jsem se psát tyto podprogramy pokudmožno efektivně.

Shrnutí

V dnešní době jsou již tyto displeje natolik dostupné, že nic nebrání jejich použití v menších aplikacích, jako jsou různé terminály, teplotní čidla a podobně. Rovněž jejich ovládání je natolik jednoduché, že nezabere přiliš mnoho paměti programu. Myslím si, že tento prvek najde široké uplatnění ve vašich aplikacích…

Použité součástky

  • 89C2051 – 1 ks
  • MC2004 – 1 ks
  • Res.: 10k – 2 ks, 10k(trimr) – 1 ks
  • Cap.: 33 p – 2 ks, 4u7 (elyt) – 1 ks
  • Crystal: 11,0592 MHz – 1 ks

Ovládací SW pro 89c2051 – Download

Ovládač je k nahlédnutí zde: LCD 20×4 driver [ http://www.automatizace.tym.cz/files/MC2004/DISPLAY.ASM ].

Celkovou funkcí tohoto programu je inicalizovat a otestovat displej a poté na něj zobrazit postupně 4 řádky textu zapsaného v programové paměti CPU.

Odkazy

  • Fotky z praktické realizace: Fotky [ http://www.automatizace.tym.cz/files/board_1_0_0/ ]
  • Kde je možné displej sehnat: Prodejce [ http://www.gme.cz ]
  • Informace o displeji: Info [ http://elektronika.kvalitne.cz/ATMEL/necoteorie/LCDmatice.html ]
  • Alfanumerické displeje: Info [ http://www.cmail.cz/doveda/lcd/ ]

Výpis programu

;********************************************************
;DEMONSTRATION PROGRAM TO USE LCD CHAR DISPLAY
;4 BITS COMMUNICATION USED PROCESSOR - x51 FAMILY MODEL
;CONNECTION BETWEEN DISPLAY AND CPU: 
;	   P1.0 - DIS.D4
;	   ....
;	   P1.3 - DIS.D7
;	   P1.4 - DIS.E
;	   P1.5 - DIS.RS
;CREATED BY VAGOVSZKYM - VAGOVSZKYM[AT]CENTRUM[DOT]CZ
;********************************************************
;DEFINITION:
;........................................................
RS	BIT	95H	;P1.5
E	BIT	94H	;P1.4	
;********************************************************
;MAIN PROCEDURE
;********************************************************
	org	00H
START:	CALL	INITLCD		;INITIALIZE THE DISPLAY
	CALL	TESTLCD		;TEST DISPLAY WRITE 0FFH ALL
	CALL	CEK1S		;WAIT 1 SECOND
	CALL	CLRLCD		;CLEAR DISPLAY
	MOV	A,#4D		;X POS 
	MOV	B,#1D		;Y POS 
	CALL	GOTOXY
	MOV	DPTR,#text	;GET AN ADRESS OF STRING
	CALL	WRSTR		;WRITE STRING ON POSITION
	MOV	A,#3D
	MOV	B,#2D
	CALL	GOTOXY
	MOV	DPTR,#text1
	CALL	WRSTR
	MOV	A,#2D
	MOV	B,#3D
	CALL	GOTOXY
	MOV	DPTR,#text2
	CALL	WRSTR
	MOV	A,#5D
	MOV	B,#4D
	CALL	GOTOXY
	MOV	DPTR,#text3
	CALL	WRSTR
	JMP	$	
;**********************************************************************
;	INITIALIZATION	LCD
;**********************************************************************
INITLCD:
	PUSH	0E0H
	CALL	CEK15M		;WAIT UNTIL POWER IS STABLE
	CLR	RS
	CLR	E
	MOV	A,#30H
	CALL	HELPINIT
	CALL	CEK1M6
	CALL	CEK1M6
	CALL	CEK1M6

	MOV	A,#30H
	CALL	HELPINIT
	CALL	CEK40U
	CALL	CEK40U
	CALL	CEK40U

	MOV	A,#30H
	CALL	HELPINIT
	CALL	CEK40U

	MOV	A,#20H
	CALL	WRCMD
	MOV	A,#28H
	CALL	WRCMD
	MOV	A,#08H
	CALL	WRCMD
	MOV	A,#0CH
	CALL	WRCMD	
	MOV	A,#06H
	CALL	WRCMD
	POP	0E0H
	RET

HELPINIT:
	ANL A,#0F0H			; send high nybble first
	RR A
	RR A
	RR A
	RR A
	ANL P1,#0F0H
	ORL P1,A
	
	SETB E			; give E pulse
	NOP
	NOP
	NOP
	CLR E
	RET

;******************************************************************
;WRDATA - WRITE DATA TO LCD
;WRCMD - WRITE COMMAND TO LCD
;
;DATA OR COMMAND MUST BE IN ACUMULATOR
;******************************************************************
WRDATA:	SETB	RS
	JMP	WR1
WRCMD:	CLR	RS
WR1:	
;.......................................
	PUSH 0D0H
	PUSH 02H
	CLR RS0
	CLR RS1
	MOV R2,A
	ANL A,#0F0H			; send high nybble first
	RR A
	RR A
	RR A
	RR A
	ANL P1,#0F0H
	ORL P1,A
	
	SETB E
	NOP
	NOP
	NOP				; give E pulse
	CLR E
	
	MOV A,R2
	ANL A,#0FH			; send lower nybble
	ANL P1,#0F0H
	ORL P1,A
		
	SETB E				; give E pulse
	NOP
	NOP
	NOP
	CLR E
	POP 02H
	POP 0D0H
;...............................
	JB	RS,WR2		;IF RS=1 GO TO WR2 -DATA
	CJNE	A,#01H,TEST1	;TEST IF CMD IS CLEARDISPLAY	
	JMP	WR3		;IF CMD=CLEARDISPLAY GOTO WR3
TEST1:	CJNE	A,#02H,TEST2	
	JMP	WR3
TEST2:	CJNE	A,#03H,WR2
	JMP	WR3				
WR2:	CALL	CEK40U
	JMP	ED0
WR3:	CALL	CEK1M6
ED0:	RET

;******************************************************************
;	CLRLCD - CLEAR THE DISPLAY
;******************************************************************

CLRLCD:
	MOV	A,#01H
	CALL	WRCMD
	RET

;******************************************************************
;	GOTOXY	- GO TO X,Y POSITION ON DISPLAY
;		- X IN ACC; Y IN B REG.(0F0H)
;	THIS PROCEDURE SET ADRESS ONLY, NOT SEND ANY DATA TO LCD
;------------------------------------------------------------------
;	X=1    X=2    X=3    ...    X=20	
;Y=1   [1;1]  [2;1]  [3,1]   ...   [20,1] 
;Y=2   [1;2]  [2;2]  [3;2]   ...   [20;2]
;Y=3   [1;3]  [2;3]  [3;3]   ...   [20;3]
;Y=4   [1;4]  [2;4]  [3;4]   ...   [20;4]
;******************************************************************

GOTOXY: DEC	A	;A=A-1
	PUSH	0E0H
	MOV	A,B
	CJNE	A,#1H,NEXT1
	JMP	IS1		;IF A=1 JMP TO IS1
NEXT1:	CJNE	A,#2H,NEXT2
	JMP	IS2		;IF A=2 JMP TO IS2
NEXT2:	CJNE	A,#3H,NEXT3	
	JMP	IS3		;IF A=3 JMP TO IS3
NEXT3:	JMP	IS4		;IF A=3 JMP TO IS4
IS1:	POP	0E0H
	ADD	A,#00H
	JMP	DOIT1
IS2:	POP	0E0H
	ADD	A,#40H
	JMP	DOIT1
IS3:	POP	0E0H
	ADD	A,#14H
	JMP	DOIT1
IS4:	POP	0E0H
	ADD	A,#54H
DOIT1:	ORL	A,#10000000B
	CALL	WRCMD
	RET
;*************************************************
;	WRSTR - WRITE STRING TO ACTUAL POSITION
;	STRING ADRESS IS IN DPTR
;	STRING END IS 00H
;*************************************************
WRSTR:	PUSH	0E0H
	MOV	A,#00H
LOOP1:	CLR	A
	MOVC	A,@A+DPTR
	CJNE	A,#00H,ZAPIS1
	JMP	KONEC1
ZAPIS1:	CALL	WRDATA
	INC	DPTR
	JMP	LOOP1
KONEC1:	POP	0E0H
	RET
;******************************************************************
;	WAITING PROCEDURES  XTALL=11,0592MHz
;******************************************************************
;	WAIT 15 MS
;.................................................................
CEK15M:	PUSH	0D0H
	PUSH	00H
	PUSH	01H
	CLR	RS0
	CLR	RS1
	MOV	R0,#0FFH
	MOV	R1,#1EH
WO:	DJNZ	R0,WO
	DJNZ	R1,WO
	POP	01H
	POP	00H
	POP	0D0H
	RET
;.................................................................
;	WAIT	40US
;.................................................................
CEK40U:	PUSH	0D0H
	PUSH	00H
	CLR	RS0
	CLR	RS1
	MOV	R0,#13H
WU:	DJNZ	R0,WU
	POP	00H
	POP	0D0H
	RET
;................................................................
;	WAIT	1,64MS
;................................................................
CEK1M6:	PUSH	0D0H
	PUSH	00H
	PUSH	01H
	CLR	RS0
	CLR	RS1
	MOV	R0,#03H
	MOV	R1,#4H
WT:	DJNZ	R0,WT
	DJNZ	R1,WT
	POP	01H
	POP	00H
	POP	0D0H
	RET
;................................................................
;	WAIT	1S
;................................................................
CEK1S:	PUSH	0D0H
	CLR	RS0
	CLR	RS1
	PUSH	00H
	PUSH	01H
	PUSH	02H
	MOV	R0,#0FFH
	MOV	R1,#0FFH
	MOV	R2,#8H
WE:	DJNZ	R0,WE
	DJNZ	R1,WE
	DJNZ	R2,WE
	POP	02H
	POP	01H
	POP	00H
	POP	0D0H
	RET

;**************************************************************
;	TEST DISPLAY
;**************************************************************
TESTLCD:
	PUSH 0D0H
	PUSH 00H
	CLR RS0
	CLR RS1
	MOV R0,#80D
WRT:	MOV A,#0FFH
	CALL WRDATA
	DJNZ R0,WRT
	POP 00H
	POP 0D0H
	RET

;//////////////////////////////////////////////////////////////
;	DATA TABLES
;//////////////////////////////////////////////////////////////

text:	DB "THIS IS DRIVER",00
text1:	DB "FOR LCD DISPLAY",00
text2:	DB "20 x 4 CH. PROGR.:",00
text3:	DB "VAGOVSZKYM",00

	END

Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006122904-ovladani-znakoveho-lcd-20-4-znaku/ ].