Jak zobrazit znaky a čísla na Display 1x16 2x16 4x16?

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
Korado
Příspěvky: 7
Registrován: 10 pro 2014, 01:00

Jak zobrazit znaky a čísla na Display 1x16 2x16 4x16?

#1 Příspěvek od Korado »

Dobrý den,
začátkem prosince jsem zakoupil z TME vývojový kit Easy8051 v6 pro procesory Atmel na bázi uP 8051. Umí seriově progamovat pomocí On board programovacího interface procesory, které jsou na to vybavené .. např s-ková řada. Kit obsahuje i 1ks AT89s8253. Na boardu je také alfanumerický LCD display 2x16 znaků, zapojený v "nějakém" 4-bitovém modu. Kdysi jsem psal nějaké programy pro přípravky s 89C51 (ty v něm bohužel naprogramovat nelze), ale se zobrazováním na displayi moc zkušenosti nemám a zde použitý 4-bitový mod mi nic neříká. Na internetu jsem našel pouze Datasheet pro alfanum. LCD display LM 162551 firmy Sharp a i tam je to podáno pro mě nezkušeného dosti těžkopádně. Není zde někdo , kdo má se zobrazováním na display, ať již v normálním nebo oním 4-bitovém modu nějaké zkušenosti a mohl by mi poslat návod nebo nějaký DataSheet z kterého je postup snadno pochopitelný i začátečníkovi, případně příklad v assembleru s komentářem, jak se přistupuje po zběrnici na display a jak se docílí zobrazení požadovaného čísla či znaku. Vím, že display má konektoru Datovou sběrnici, řídící signály RS, W/R, En, ovládání jasu a kontrastu a v sobě má znakovou sadu, ze které se dá znak vybrat a zobrazit na pozici , která se musí nějak někam zadat , že se tam dá zadat i pár uživatelských znaků, ale víc toho nevím.
Za vaše odpovědi předem děkuji a nabízím za poštovné možnost naprogramování procesorů, které tento kit zvládne. Jsem z okolí města Ústí nad Orlicí a zájemcům z regionu to mohu naprogramovat na počkání, když mi dají příslušný HEX soubor.

Návod, Datasheet či příklady mi případně můžete poslat na mail: katanykorado@seznam.cz.

Uživatelský avatar
bastlir40
Příspěvky: 463
Registrován: 27 srp 2010, 02:00
Bydliště: Příbram

#2 Příspěvek od bastlir40 »

Na stránkách GME najdeš většinou u každé součástky datasheet. Tam si najdi ten displej, který máš na vývoj. desce. Komunikace ve 4 bitovem modu znamená, že používáš jen vstupy D4 až D7 (piny 11 až 14). Assembler jsem nikdy nepochopil a co se týká Cčka, tak tam musíš mít knihovnu pro LCD. Víc ti určitě poradí nějaký borec v programování, kterých je tu dost ale já mezi ně bohužel nepatřím. :-)
Zdraví vás Mirek

www.mojeelektro.xf.cz

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#3 Příspěvek od ZdenekHQ »

Já ty knihovny pro 8051 mám. Moje, ale snad pochopitelný. Důležitá je inicializace displeje při zapnutí, popř. při hot restartu procesoru, kdy se dá displej krásně zblbnout....
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
Korado
Příspěvky: 7
Registrován: 10 pro 2014, 01:00

#4 Příspěvek od Korado »

Dík za reakci. No, já právě přesně nevím, co je to za typ, je to od firmy MIKROELEKTRONIKA, je na tom kitu zapojený ve 4-bitovém modu a nějaké typové označení neuvádějí a ani není vidět na desce displaye, vím jenom že je 2x16 a že je zapoojený pro 4-bitový režim. Mám kromě toho na tom kitu ještě jeden 2x16 ... jak jsem psal ten od Sharpa a ještě jeden 4x16, ale od toho jsem vyhledávačem žádný Datasheet nenašel ani v GM ani v TME ani jinde :( .Napsat něco v Assembleru mi nedělá problém, ale musím vědět, co mám na tu "svorkovnici .... sběrnici " displaye posílat a jestli musím ty znaky vytahovat adresací z jeho paměti, nebo jestli se to dá posílat i nějak přímo do zobrazovací paměti RAM displaye a jak si mohu nadefinovat uživatelské znaky. Asi budou mít většinou LCD displaye stejný systém, ale potřeboval bych ho mít pro mě přijatelným a pochopitelným způsobem napsaný. Něco málo jsem k tomu našel, ale nic uceleného. Jinak mě zajímá i normální 8-bitový režim. V diskusích ještě píšou něco o nějakém řadiči HD 44780 .. ten asi bude na desce displaye a ten zpracovává posílané instukce.

Uživatelský avatar
Korado
Příspěvky: 7
Registrován: 10 pro 2014, 01:00

#5 Příspěvek od Korado »

Tak to bys byl moc laskav a udělal bys mi velikou radost, kdybys mi je mohl poslat, abych se v tom trochu porochňal, ..protože já to potřebuju pochopit, nechci jenom slepě používat podprogramy, o kterých bych neměl šajnu, jak fungují. Chci po delší pauze zase začít programovat nějaké aplikace v 51 assembleru a chci začít s automatickým otevíráním slepic a k tomu potřebuju i display, kvůli nastavování režimu. Na netu jsem našel poměrně slušný Simulátor s compilérem a programátor s ovladačem jsou v tom kitu. Mám doma i starý emulátor 51-ky, ale bohužel je na počítač s IDE konektorem a já mam už jenom PCI, tak nevím, jestli se na to dá udělat nějaká přechodka, abych ho mohl i nadále používat. Nevím ale bohužel, jaké mají tyto dva konektory zapojení signálů, abych si ji, když to půjde, mohl sám udělat :(.
Potom bych rád udělal prodram pro nastavování úhlu natočení pomocí krového motoru .. např. pro solární panel.

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#6 Příspěvek od ZdenekHQ »

Pošlu to sem, ale musíš vydržet, hned to nebude.
Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
Korado
Příspěvky: 7
Registrován: 10 pro 2014, 01:00

#7 Příspěvek od Korado »

Neboj, vydržím. Teď jsem sice našel popis funkce displayů, o kterých tu jde řeč, ale vnitřní instrukce displaye jsou tam pouze dobře popsané .. co dělají, ale není tam uveden jejich kód, nebo popis, v které pozici posílaného Byte/ čveřice bitů a jaké logické úrovni se jednotlivé bity mají nacházet :(.

Uf, uf, tak teď jsem našel většinu toho, co jsem poteboval:


http://elektronika.kvalitne.cz/ATMEL/ne ... atice.html

Uživatelský avatar
gmike
Příspěvky: 94
Registrován: 26 zář 2009, 02:00

#8 Příspěvek od gmike »

Knihovnu v assembleru pro s8253 mám, můžu kdyžtak odpoledne poslat.
Jinak ten dislej je určitě s řadičem HD44780 nebo kompatibilním, jakmile vyhledáš np. "hd44780 programming" do googlu tak najdeš úplně všechno co potřebuješ. Například toto: http://www.8052.com/tutlcd2.php
Případně koupit toto: http://shop.ben.cz/cz/121169-prace-s-in ... i-lcd.aspx

Pokud to myslíš s programováním vážně, tak jsi zvolil správný postup. U assembleru pochopíš co a jak v uC funguje. Ale do ničeho většího než ten displej a jednoduchý np. teploměr bych už v assembleru nešel. Vyznat se pak ve stovkách až tisících řádků kódu, řešit meziskoky a hledat chyby bych už znovu nechtěl dobrovolně podstupovat. Nainstaluj si Keil (jsou pro něho i simulátory alfanum. displeje), kup si toto
http://shop.ben.cz/cz/121280-c-pro-mikr ... 89s52.aspx
http://shop.ben.cz/cz/121320-programova ... yce-c.aspx
a můžeš začít naplno. Sám jsem si to před časem zažil a byl jsem mile překvapen, jak se snadno, rychle a přehledně se dají psát kódy (v porovnání k ASM).

petrfilipi
Příspěvky: 2551
Registrován: 13 zář 2005, 02:00

#9 Příspěvek od petrfilipi »

Nazdar,

mohu-li Ti poradit, zkus se podívat sem: http://www.mikroe.com/mikroc/8051/specification/

Je to celé kompletní vývojové prostředí, můžeš si vybrat jazyk C, Pascal (ten jsem si vybral já, ale pro PICy) nebo Basic. Jsou u toho příklady, můžeš samozřejmě přepnout i do assembleru. Je k tomu vývojová deska - ta už ale něco stojí, SW je pro malé aplikace do asi 2kB zadarmo.
Má to hotové všechny knihovny, tzn. podle příkladu navolíš připojení datových vodičů k displeji, ovládacích vodičů a pak už je příkazem např. LCDOUT (1, 5, "Ahoj") zobrazíš na 1. řádku a 5. sloupci text Ahoj. Chceš-li poslat něco po RS232, tak buď má brouk fyzický RS232 a jen ho nadefinuješ a jedním příkazem to pošleš, nebo použiješ jejich knihovnu a vytvoříš si SW seriový port. Prostě je to hodně zaměřené na praktičnost. Na webu mají hromadu přídavných modulů (displeje LCD a LED, teploměry 18B20, čidla, komunikace, ...). Na webu taky mají už hotové projekty, např. teploměry apod., stačí je jen stáhnout.
Neříkám že nemají v programu chyby, ale obvykle stačí stáhnout novější verzi a je po problému.

Takhle vypadá příklad pro LCD v C pro Atmely (tady je pak odkaz na tento a další příklady:http://www.mikroe.com/downloads/get/200 ... amples.zip) :

/*
* Project name:
Lcd_Test (Demonstration of the LCD library routines)
* Copyright:
(c) Mikroelektronika, 2009.
* Revision History:
20071210:
- initial release;
* Description:
This code demonstrates how to use LCD 4-bit library. LCD is first
initialized, then some text is written, then the text is moved.
* Test configuration:
MCU: AT89S8253
http://www.atmel.com/dyn/resources/prod ... oc3286.pdf
Dev.Board: Easy8051v6 - ac:LCD
http://www.mikroe.com/easy8051/
Oscillator: External Clock 10.0000 MHz
Ext. Modules: Lcd 2x16
http://www.mikroe.com/store/components/various/#other
SW: mikroC PRO for 8051
http://www.mikroe.com/mikroc/8051/
* NOTES:
- Turn on LCD backlight switch on development board (SW7.6).
*/

// LCD module connections
sbit LCD_RS at P2_0_bit;
sbit LCD_EN at P2_1_bit;

sbit LCD_D4 at P2_2_bit;
sbit LCD_D5 at P2_3_bit;
sbit LCD_D6 at P2_4_bit;
sbit LCD_D7 at P2_5_bit;
// End LCD module connections

char txt1[] = "mikroElektronika";
char txt2[] = "Easy8051v6";
char txt3[] = "Lcd4bit";
char txt4[] = "example";

char i; // Loop variable

void Move_Delay() { // Function used for text moving
Delay_ms(500); // You can change the moving speed here
}

void main(){

Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
LCD_Out(1,6,txt3); // Write text in first row

LCD_Out(2,6,txt4); // Write text in second row
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); // Clear display

LCD_Out(1,1,txt1); // Write text in first row
LCD_Out(2,5,txt2); // Write text in second row

Delay_ms(2000);

// Moving text
for(i=0; i<4; i++) { // Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}

while(1) { // Endless loop
for(i=0; i<8; i++) { // Move text to the left 7 times
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();
}

for(i=0; i<8; i++) { // Move text to the right 7 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
}
}

Uživatelský avatar
monterjirka
Příspěvky: 2761
Registrován: 14 čer 2003, 02:00
Bydliště: Blížejov

#10 Příspěvek od monterjirka »

Korado píše:... Jinak mě zajímá i normální 8-bitový režim. V diskusích ještě píšou něco o nějakém řadiči HD 44780 .. ten asi bude na desce displaye a ten zpracovává posílané instukce.
Ten řadič je jakýsi standard, pro který existuje SW podpora.
Komunikace procesoru s tímto řadičem byla dost pěkně popsaná k KTE magazínu v seriálu o vývojovém modulu Chipon, tady se to dá najít a stahnout:
http://www.jvproject.cz/KTE.htm

Uživatelský avatar
Korado
Příspěvky: 7
Registrován: 10 pro 2014, 01:00

#11 Příspěvek od Korado »

Moc dík za info, časem bych se rád dohrabal i k práci s USB a GSM moduly (seznam AT příkazů pro ně už někde mám (tak 8 roků), jenom ho najít :) .
tzeď ještě koupit laserovou tiskárnu, abych si mohl dělat masky pro výrobu plošných spojů pomocí UV lampy a horkovzdušnou pistoli na práci se SMD součástkami a snad se časem rozhýbu po několikaleté pause.

Uživatelský avatar
ZdenekHQ
Administrátor
Administrátor
Příspěvky: 25593
Registrován: 21 črc 2006, 02:00
Bydliště: skoro Brno
Kontaktovat uživatele:

#12 Příspěvek od ZdenekHQ »

Samozřejmě to není komplet, ale z poznámek se to snad dá pochopit.

Bity 4..7 displeje jsou připojeny na p2.0 až p2.3 , řídící signály jsou Bit_rs (p2.4) a Disp_e (dá se použít libovolný volný pin procesoru)

Kód: Vybrat vše


;============================
;   OVLADANI DISPLEJE
;============================
;
;Bit_rs = 0 ... instrukce
;Bit_rs = 1 ... data
;timeout 40us, 2ms pro smazani a nast. kurzoru

Init_disp:
;*********
;init 4-bitova sbernice, 2 radkovy displej

	;napred horni byte 0010 xxxx - prepne do 4-bit modu
	;potom znovu,ale uz cely 2x4bity
	
	;0000 0001 smaz disp a kurzor na zacatek - 2ms !
	;0000 0010 vrat kurzor na zacatek radku - 2ms !

	;      1kt  Kurzor vlevo/vpravo, posun Text ne/ano 	
	;=================================================
	;0000 0110 posun kurz vpravo, text se neposouva
	;0000 0111 posun textu vlevo

	;     1dcb zapne Diplej Kurzor Blikani
	;=====================================
	;0000 1111 zapnout disp, kurzor a blikani
	;0000 1100 vypni kurzor a jeho blikani
	
	;01aa aaaa - prepnuti na zapis + adresa v CG-ram
	;1aaa aaaa - prepnuti na zapis + adresa v DD-ram
	;dddd dddd + Bit_rs=1 > zapis dat do CG nebo DD ram
	;==================================================
	;1001 0000 nastav pozici v ddram na 16 (10000b)

	;CG ram - 8 vlastnich znaku zzz= 000 .. 111
	;zapis dat do CGRram > 01 zzz sss
	;      	sss je 8 sub-radku znaku po 5 bitech dat
	;	data jsou xxx11111	
	;t.j. 8x cykl rs=0+adresa, rs=1+data 
	;posledni radek je 00000 > misto pro kurzor
	
	;3x znak "sloupec vybuzeni" 1,2,3 carky
	;3x znak "znacka" - jen 1 carka v urovni 1.,2.,3. carky
	;
	
	;DD ram - diplej, pozice kurzoru
	;	1.radek 00h
	;	2.radek 40hff
	;	3.radek 14h
	;	4.radek 54h
	
	;pockam na RESETy
	;****************
	
	mov	a,#0
	setb	acc.4              ;r/s
	mov	p2,a
	clr	Disp_e
	call	Wait_1ms
	
	;prepnuti na 4 bity
	;******************
	mov	a,#0010b	;HORNI byte inicializace displej
	clr	Bit_rs
	call	Posli_d4	;pouziva aku
	
	;call    Wait_1ms
	
	mov	a,#0
	clr	Bit_rs
	call	Posli_d4	;pouziva aku

        call    Wait_1ms

	;znovu init, tentokrat uz 4-bitove
	;*********************************
	mov	Znak,#00101000b	;0010 radky font x x
	clr	Bit_rs
	call	Posli_d8	;pouziva Znak

	;smazu displej,nastavim kurzor na zacatek
	;****************************************
	call	Smaz_disp
	call	Vrat_kz
	call	Kurz_off
	ret

;----------------------------------------------------------------------
Clr_disp:	
Smaz_disp:
Smaz_dp:
;*********
       
	mov	Znak,#00000001b ;smaz disp a kurzor domu - 2ms !
	mov	Radek,#1
	jmp	Pd_ck1
	
Vrat_kz:
;*******
	mov	Znak,#00000010b ;vrat kurzor domu - 2ms !
	mov	Radek,#1
Pd_ck1:
	clr	Bit_rs
	call	Posli_d8	
	call	Wait_1ms
	call	Wait_1ms	
	ret	

Enter_dp:	;skoci na dalsi radek
Dp_enter:
;********
	inc	Radek

	mov	a,Radek
	cjne	a,#5,Edp_2
	mov	Radek,#1	;zpatky na prvni
Edp_2:
	jmp	Radek_dp

Smaz_r234:
;*********
        call    Smaz_rd2
        call    Smaz_rd3
        call    Smaz_rd4
        ret
        	
Smaz_rd1:
;*********
        mov     Radek,#1
        jmp     Smaz_radek
        	
Smaz_rd2:
;*********
        mov     Radek,#2
        jmp     Smaz_radek
        
Smaz_rd3:
;*********
        mov     Radek,#3
        jmp     Smaz_radek
        
Smaz_rd4:
;********
        mov     Radek,#4
        jmp     Smaz_radek        
        
Smaz_radek:
;**********
	mov	Sloupec,#0
	call	Radek_dp
	mov	r2,#20
Smz_1:	
	mov	Znak,#' '
	call	Zapis_dp
	djnz	r2,Smz_1
	ret
Radek_r1:
;*******
        mov     Radek,#1
        ;mov     Sloupec,#0
        jmp     Radek_dp

Radek_r2:
;*******
        mov     Radek,#2
        ;mov     Sloupec,#0
        jmp     Radek_dp
Radek_r3:
;*******
        mov     Radek,#3
        ;mov     Sloupec,#0
        jmp     Radek_dp
        
Radek_r4:
;*******
        mov     Radek,#4
        ;mov     Sloupec,#0
        jmp     Radek_dp        
          
Radek_dp:		;skoci na patricny radek
;*******
	mov	a,Radek		;1..4 	

        cjne    a,#1,Rdp_1
        clr     a
        push    acc
        jmp	Rdp_5
Rdp_1:        
	cjne	a,#2,Rdp_2
	mov	a,#40h   ;00,40,10,50 pro 16x4
	push    acc
	jmp	Rdp_5      ;00,40,14,54 pro 20x4
Rdp_2:
	cjne	a,#3,Rdp_3
	mov	a,#14h
	push    acc
	jmp	Rdp_5
Rdp_3:
	cjne	a,#4,Rdp_5
	mov	a,#54h
	push    acc
	jmp	Rdp_5

Rdp_5:	
        
	;v push acc je adresa
	;*********************
	pop     acc
	add	a,Sloupec
	orl	a,#10000000b	;1aaaaaaa
	mov	Znak,a
	mov	Sloupec,#0
	jmp	Pd_ck2

Shift_l:
	mov	Znak,#00000101b ;posun  vlevo + shift
	jmp	Pd_ck2		; 00000 1 Incr/Decr Shift
		
No_shift:
Posun_dp:	
;********
	mov	Znak,#00000110b ;posun kurzoru vpravo,no shift
	jmp	Pd_ck2		; 00000 1 Incr/Decr Shift

Kurz_off:	
;********
	mov	Znak,#00001100b ;vypne kurzor
	jmp	Pd_ck2

Kurz_on:	
;********
	mov	Znak,#00001111b ;zapne kurzor
	jmp	Pd_ck2

	
Pd_ck2:				;0000 1 D C B 
;======
	clr	Bit_rs		;D = disp on/off, Cursor, Blink
	call	Posli_d8	
	ret

Kp_on:	
;*****
	mov	Znak,#00001110b ;zapne kurzor bey blikani 0000 1 D C B 
	clr	Bit_rs		;D = disp on/off, Cursor, Blink
	call	Posli_d8	
	ret

Zapis_mez:
Posli_mez:
Dp_mez:
;*********
;posle mezeru

        mov     Znak,#' '
        jmp     Zapis_dp

Dp_car:
Dp_carka:
;*********
;posle carku

        mov     Znak,#','
        jmp     Zapis_dp
        
Dp_dvoj:
Posli_dvojt:
;*********
;posle dvojtecku

        mov     Znak,#':'
        jmp     Zapis_dp        

Posli_h:
;*******
;posle h

        mov     Znak,#'h'
        jmp     Zapis_dp  
        
Posli_v:
;*******
;posle h

        mov     Znak,#'V'
        jmp     Zapis_dp  
        
Zapis_dp:
Posli_dp:
Dp_znak:
;********
	;znak je v promenne Znak

        push    acc

	setb	Bit_rs
	call	Posli_d8	

        pop     acc


	ret
	
Dp_text:
;*******
	;posle text na displej, adresa v DPTR, ukonceni ~ nebo $

	mov	Pom,#0
Dpt_1:
	clr	a
	movc	a,@a+dptr
	
        cjne	a,#'~',Dpt_2

	;nacten koncovy znak
	inc	dptr
	ret

Dpt_2:	
        cjne	a,#'$',Dpt_3
        
	;poslat DP_ENTER
	call    Dp_enter
	jmp    Dpt_4

Dpt_3:
	mov	Znak,a
	call	Zapis_dp
	
Dpt_4:	
	inc	Pom
	inc	dptr
	
	;kontrola delky
	mov	a,Pom
	cjne	a,#Poc_znd,Dpt_1          ;MAX pocet znaku displeje	
	
        inc     dptr
	ret

	;=============================
	;=== ZAPIS DAT DO DISPLEJE ===
	;=============================
	
Posli_d8:
;*******
;posle Znak 8 bitu na displej

	;nejprve horni byte
	;******************
	mov	a,Znak
	swap	a
	call	Posli_df

       	;dolni byte
	;**********
	mov	a,Znak
	call	Posli_df

	;cekaci smycka
	;*************
	mov	r7,#Wait_disp	;doba,nez to pochopi
Pdp_w3:
	djnz	r7,Pdp_w3
	ret
		
Posli_d4:
;********
;posle 4 bity dat ulozenych v aku + Bit_rs
;pomalejsi varianta, ceka po kazdem pulbyte
	
	orl	a,#11110000b	;horni 4bity nepouzivam
        ;rl      a
	mov	c,Bit_rs
	mov	acc.4,c
	mov	p2,a
	setb	Disp_e		;max. clk=250khz
				;zapis sestupnou hranou
	call	Wait_5us
	clr	Disp_e
	
	mov	r7,#Wait_disp	;doba,nez to pochopi
Pdp_w:
	djnz	r7,Pdp_w
	mov	p2,#0ffh
	ret

Posli_df:
;********
;posle 4 bity dat ulozenych v aku + Bit_rs
;zrychlena varianta bez cekaci smycky

	orl	a,#11110000b	;horni 4bity nepouzivam
        ;rl      a
	mov	c,Bit_rs
	mov	acc.4,c
	mov	p2,a
	setb	Disp_e		;max. clk=250khz
				;zapis sestupnou hranou
	call	Wait_5us
	clr	Disp_e
	
	;cekaci smycku musi generovat nadrazeny proces !

	mov	p2,#0ffh
	ret

Pro moje oslovení klidně použijte jméno Zdeněk
Správně navržené zapojení je jako recept na dobré jídlo.
Můžete vynechat půlku ingrediencí, nebo přidat jiné,
ale jste si jistí, že vám to bude chutnat[?
]

Uživatelský avatar
Celeron
Příspěvky: 16140
Registrován: 02 dub 2011, 02:00
Bydliště: Nový Bydžov

#13 Příspěvek od Celeron »

Tohle je na začátek asi nejjednodušší (8 bitů). Bez všech kravinek s kurzorem, uzivatelskejma znakama, rolováním a pod.

Kód: Vybrat vše

;**********************************************
;*                                            *
;*                test displeje           *
;*                                            *
;**********************************************

E_LCD          	Bit	P3.1		;vybavovaci vystup pro LCD
RS_LCD         	Bit	P3.0		;data nebo instrukce		
RW_LCD		bit	p3.3

;********************************		
;	Zacatek programu OK
;********************************
	ORG	0H
Start:
	call 	Init		        ;inicializace LCD

	mov	A,#0C0H		;nastaveni 2. radku LCD
	call	LCD_W_INST

	mov	DPTR,#Uvod1	;adresa tabulky Uvod1
rpokr1:
	CLR  A
	movc 	A,@A+DPTR	;nacti byte z tabulky
	cjne	A,#'`',Ok1 	;test znaku konec reklamy
	jmp	TEnd1
Ok1:
	inc	DPTR	                 ;dalsi byte tabulky
	call 	LCD_W_DATA	;zapis A do LCD
	jmp	RPOKR1		;pokracuj

Tend1:	
	mov 	A,#80H		;nastaveni 1. radku LCD 
	call	LCD_W_INST
	mov	DPTR,#Uvod2	;adresa tabulky Uvod1
rpokr2:
	CLR	A
	movc	 A,@A+DPTR	;nacti byte z tabulky
	cjne	A,#'`',Ok1 	;test znaku konec reklamy
	jmp	TEnd2
Ok2:
	inc	DPTR		       ;dalsi byte tabulky
	call 	LCD_W_DATA	;zapis A do LCD
	jmp	RPOKR2		;pokracuj

Tend2:
;********************************
	jmp	$		;cekej	

;********************************


BUSY:
	CLR  	E_LCD		;LCD DISABLE
	MOV 	P1,#0FFH
	CLR 	 RS_LCD		;INSTRUKCE
	SETB 	RW_LCD		;CTI STAV
	NOP
	NOP
	SETB 	E_LCD		;LCD ENABLE
BUSY1:
	JB	P1.7,BUSY1
	CLR	E_LCD		;LCD DISABLE
	CLR	RW_LCD		;VRAT NA ZAPIS
	RET
;--------------------------------
				;LCD KAM CHCI PSAT)
				;1. radek A= #1000XXXXB)
LCD_W_INST:			;2. radek A= #1100XXXXB)
	CLR	RS_LCD		;INSTRUKCE
	CLR	RW_LCD		;ZAPIS
	MOV	P1,A  		;ODESLI INSTRUKCI
	SETB	E_LCD		;LCD ENABLE	
	CALL	BUSY
	RET
;--------------------------------
				  
LCD_W_DATA:
	SETB 	RS_LCD	;DATA	
	CLR   	RW_LCD	;ZAPIS
	MOV  	P1,A		;ODESLI DATA
	SETB 	E_LCD	;LCD ENABLE
	CALL 	BUSY		;VYSTUP NA DISPLEJ	
	RET

;********************************
INIT:
	CALL	PAUSE2    ;cekani po privedeni Ucc
	CLR   	A
	MOV  	B,#5
MODS:
	MOV  	DPTR,#INITBL
	PUSH 	ACC
	MOVC	A,@A+DPTR
	CALL 	LCD_W_INST
	CALL 	PAUSE
	POP   	ACC
	INC   	A
	DJNZ 	B,MODS
	RET
;................................
Pause2:				;zpozdeni asi 390ms
	mov	R4,#255
	mov	R2,#255
	mov	R7,#3
Znovu2:
	djnz	R4,$  		;256 x		
	mov	R4,#255
	djnz	R2,Znovu2 	;256 x 256 x
	mov	R2,#255
	mov	R4,#255
	djnz	R7,Znovu2 	;256 x 256 x 3
	Ret

Pause:				
	mov	R3,#155
	djnz	R3,$  		;zpozdeni asi 310 microsec
	Ret	
;................................
				;inicializacni tabulka
INITBL:
       	DB	00000001b 	;maze displej a vraci kurzor na poz.0	
       	DB	00000010b 	;vypina posun a vraci kurzor na pozici 0.	
       	DB	00000110b 	;smer pohybu kurzoru I/D vpravo, posun 
				        ;displeje SH vypmut.	
       	DB	00001100b 	;displej D zap, kurzor C, blikani B vyp	
       	DB	00111100b 	;8 bitu, 2 radky, font 5x10
	
;********************************
;	 texty
;*******************************

uvod1:	DB	'* TEXT 2 LINE *`'
uvod2:	DB	'* TEXT 1 LINE *`'
;********************************
	END
Omlouvám se za chaos, nějak se poondil tabelátor a mezery.
Počítej s tím, že LCD 2x16 ma řadič pro displej 2x 40, proto je mezi koncem 1 řádku a začátkem 2 řádku pamětová díra ale zapisovat a číst tam jde. Já tu paměť drze používal na jiný účely. Stejný to bude asi i u jednořádku a čtyřřádku, ty jsem nezkoumal.
Pokud chceš jet jen po 4 bitech musí se LCD inicializovat jako při 8 bitech a na konci teprv převrátit na 4 bity
Jirka

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#14 Příspěvek od mtajovsky »

Tyhle knihovny jsou všechny dost podobné a jejich hlavním nedostatkem jsou čekací doby pro odměřování impulsů E a čekání na dokončení operace v HD44780.

Kód: Vybrat vše


   setb   Disp_e      ;max. clk=250khz
            ;zapis sestupnou hranou
   call   Wait_5us
   clr   Disp_e


...

   ;cekaci smycka
   ;*************
   mov   r7,#Wait_disp   ;doba,nez to pochopi
Pdp_w3:
   djnz   r7,Pdp_w3 
Bývá to něco kolem 40 us na jeden zápis a někdy to může vadit. Řešením je odměřovat doby pomocí časovače nebo se zavěsit na přerušení od BUSSY.

Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 02:00
Bydliště: Brno-venkov

#15 Příspěvek od Honza_dy »

Tady je výborný simulátor displeje s řadičem HD44780. Mě dost pomohl když jsem se učil displej ovládat přes PICAXE.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“