Stránka 1 z 2

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

Napsal: 10 pro 2014, 23:33
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.

Napsal: 11 pro 2014, 00:34
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. :-)

Napsal: 11 pro 2014, 00:44
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....

Napsal: 11 pro 2014, 00:54
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.

Napsal: 11 pro 2014, 01:04
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.

Napsal: 11 pro 2014, 01:06
od ZdenekHQ
Pošlu to sem, ale musíš vydržet, hned to nebude.

Napsal: 11 pro 2014, 01:37
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

Napsal: 11 pro 2014, 06:43
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).

Napsal: 11 pro 2014, 07:54
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/2009/mikroc_pro_8051_examples.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();
}
}
}

Napsal: 11 pro 2014, 09:00
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

Napsal: 11 pro 2014, 11:26
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.

Napsal: 11 pro 2014, 15:06
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


Napsal: 11 pro 2014, 15:46
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

Napsal: 11 pro 2014, 16:56
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.

Napsal: 11 pro 2014, 17:19
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.