Uživatel:Stepada2

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] Samostatná práce

Třída funkcí pro ovládání znakového LCD displeje.

[editovat] Zadání

Třída funkcí pro ovládání znakového LCD displeje
Počet řádků a sloupců by byl konfigurovatelný, i když třeba ne úplně obecný - podle vyráběných typů.

[editovat] postup návrhu

Jedná se o řízení LCD displeje se dvěma řádky po šestnácti znacích. Tento displej je řízený obvodem "HD44780" od firmy Hitachi.
Displej má 16 vývodů jejichž funkce jsou následující:
Soubor:vyvody.jpg
Data/příkazy se mohou přenášet po všech osmi bitových linkách a nebo pouze po čtyřech (čtyřbitová komunikace). V případě čtyřbitové komunikace se nejdříve odešle horní polovina bajtu a následně dolní polovina. Abychom mohli displej řídit pouze pomocí jednoho portu mikrokontroléru, použijeme 4 bitovou komunikaci. Z této úvahy vychází i propojení displeje s mikrokontorlérem:
Soubor:zapojeni displeje.jpg
Vývody D0 až D7 jsou připojeny k pinům PB0 až PB7
V samotném začátku, než začneme na displej zapisovat, je důležité provést tzv. inicializační sekvenci. Displej je po startu implicitně nastaven na 8 bitovou komunikaci, proto je v sekvenci nejprve nutné přenastavit tuto komunikaci na 4 bitovou. Po tomto přenastavení můžeme libovolně zapisovat další inicializační příkazy.
Seznam možných inicializačních příkazů:
Soubor:inicializacni sekvence.jpg
Soubor:legenda.jpg
V našem případě bude inicializační sekvence obsahovat následující příkazy:
1) 4 bitová komunikace,
2) počet řádků = 2,
3) smazání displeje,
4) vypnutí kurzoru,
5) zapnutí displeje,
6) režim inkrementace
Po této sekvenci je konečně možné začít zapisovat data, tedy znaky, které se mají na displeji zobrazovat (viz. Vojtěch Ondráček).

[editovat] program

    .NOLIST
    .INCLUDE "m88def.inc"  ;definice registru
    .LIST


    .DEF REG=R16	              ;pracovní registr
    .DEF CNT1=R17	;čítače průchodů
    .DEF CNT2=R18	;pro čekací
    .DEF CNT3=R19	;rutiny
    .EQU E=2	              ;signály
    .EQU RS=1	              ;pro řízení
    .EQU NAP=0	              ;LCD
    .EQU DDR=DDRB          ;řízení směru
    .EQU PORT=PORTB         ;port
	
	
HLAVNI:
    LDI REG,LOW(RAMEND)
    OUT SPL,REG        
    LDI REG,HIGH(RAMEND)
    OUT SPH,REG                        ;nastavení SP
	RCALL LCDINI                     ;inicializace LCD
    LDI R30,LOW(ADRTXT)      ;adresa textu
    LDI R31,HIGH(ADRTXT)     ;pro výpis do ukazatele Z
	
SMYCKA:
    LPM
	MOV REG,R0
	CPI REG,$A0
	BREQ KONEC
	CPI REG,$FE
	BREQ KURZOR
	RCALL ZAPISDATA

POKRACUJ:
        ADIW R30,1
	BRNE SMYCKA	

KONEC:
        RJMP PC
	
KURZOR:
        ADIW R30,1
	LPM
	MOV REG,R0
	RCALL ZAPISPRIKAZ
	RJMP POKRACUJ		
		
		
		
		;inicializace LCD:
LCDINI:	
              LDI REG,$00	
	OUT PORT,REG	;výchozí hodnoty
	LDI REG,$7F	
	OUT DDR,REG	               ;výstup režim
	RCALL CEK15M	;čekej 15ms
	CBI PORT,RS	              ;RS=0
	SBI PORT,E	              ;E=1
	LDI REG,$1B	              ;DATA=$30
	OUT PORT,REG	
	CBI PORT,E	              ;E=0
	RCALL CEK4M1	;počkej 4,1ms
	SBI PORT,E	              ;E=1
	CBI PORT,E	              ;E=0
	RCALL CEK100	              ;počkej 100us
	SBI PORT,E	              ;E=1
	CBI PORT,E	              ;E=0
	RCALL CEK40	              ;čekej 40us
	LDI REG,$20	              ;4bitová komunikace
	RCALL ZAPISPRIKAZ
	LDI REG,$28	              ;nastavanení funkce
	RCALL ZAPISPRIKAZ
	LDI REG,$01	             ;smazání displeje
	RCALL ZAPISPRIKAZ	
	LDI REG,$08	             ;vypnutí kurzoru
	RCALL ZAPISPRIKAZ	
	LDI REG,$0C	             ;zapnutí displeje
	RCALL ZAPISPRIKAZ	
	LDI REG,$06	             ;režim inkrementace
	RCALL ZAPISPRIKAZ	
	RET	

Nejdříve jsou definovány registry, následně je pak definován port B jako výstupní. V hlavním programu se nastaví pointer na konec RAM a provede se výše zmiňovaná inicializační sekvence (LCDINI). V další části programu je přečten znak uložený v paměti programu, je nahrán do registru REG, a testuje se, zda se nejedná o znak určující konec vypisování nebo změnu pozice kurzoru (viz. Vojtěch Ondráček). Pokud oba testy vyjdou negativně, znak se vypíše, pointer se nastaví na další znak a ten je opět testován.

Osobní nástroje