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
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.
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
- Kde je možné displej sehnat: Prodejce
- Informace o displeji: Info
- Alfanumerické displeje: Info
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