Tulla sisään
Kaikki tietokoneen salaisuudet aloittelijoille ja ammattilaisille
  • Reitittimen määrittäminen mobiilimodeemin kautta Reititin toimii 3g-modeemina
  • Suodatin on suunniteltu
  • Kuinka valita kannettava akku (PowerBank)
  • Kuinka valita kannettava akku (PowerBank)
  • Kuinka rekisteröityä ilmaiseksi sosiaalisessa mediassa Odnoklassniki
  • Kuinka tarkastella tilastoja Instagramissa - Kuvien julkaiseminen oikeaan aikaan!
  • Ohjelma PIC16- ja LCD-ilmaisimien vuorovaikutukseen. Työskentely HD44780-ohjaimeen perustuvan LCD-näytön kanssa LCD-näytön asennus ja alustus

    Ohjelma PIC16- ja LCD-ilmaisimien vuorovaikutukseen.  Työskentely HD44780-ohjaimeen perustuvan LCD-näytön kanssa LCD-näytön asennus ja alustus

    Tarkastellaan käyttäjän ja mikrokontrolleripohjaisen laitteen välistä vuorovaikutusta. Hyvin usein käyttäjän on syötettävä tiedot jotenkin ja luettava ne jostain. Näppäimistö ja näyttö () sopivat hyvin näihin tarkoituksiin.. Harkitse käyttäjän ja mikrokontrolleripohjaisen laitteen välistä vuorovaikutusta. Hyvin usein käyttäjän on syötettävä tiedot jotenkin ja luettava ne jostain. Näppäimistö ja näyttö () sopivat hyvin näihin tarkoituksiin. Tässä huomautuksessa tarkastelemme lähemmin tietojen näyttämistä symbolilla LCD merkkisyntetisoinnin kanssa.

    Tällaisia ​​indikaattoreita käytetään usein suunniteltaessa digitaalisia laitteita, joten sinun on tiedettävä, kuinka työskennellä niiden kanssa.
    Tarkastellaanpa merkkisyntetisoinnin tyypillistä sisäistä rakennetta LCD:

    HD44780:n sisäinen rakenne

    LCD-näyttö perustuu nestekidematriisiin, jonka elementtiin kohdistamalla jännite voidaan "sytyttää" piste näytöllä. Meidän tapauksessamme matriisi koostuu tutuista tiloista (useimmiten 8x5 pikseliä), jotka on ryhmitelty useisiin riveihin. Tätä kaikkea hallitsee sisäänrakennettu HD44780 ohjain. Ohjaimessa on yksitavuisia muistisoluja ( DDRAM), jonka sisältö todella näkyy näytöllä tallennetun taulukon mukaisesti CGRAM. Muistisoluja on yleensä enemmän kuin tuttuja LCD, joten sinun on tarkasteltava tuttujen paikkojen osoitteita tietolomakkeessa. Eli meidän tarvitsee vain kirjoittaa halutun merkin koodi haluttuun kohtaan ja kaikki muu HD44780 tekee sen itse.

    Paikan valintaa varten on virtuaalinen kohdistin (nykyisen muistisolun numero, AC), jota voidaan ohjata komennoilla, kohdistin voidaan tehdä näkyväksi. Oletusarvoisesti, kun kirjoitetaan merkkiä soluun, kohdistin siirtyy yhden kohdan eteenpäin. Merkkikoodit kohteelle LCD kyrillinen tuki näkyy taulukossa:

    Koodin korkea tetradi on yhtä suuri kuin valitun symbolin rivi, ja alhainen tetradi on yhtä suuri kuin viiva. Voit luoda oman symbolitaulukon kirjoittamalla sen sisään CGRAM. Jokainen merkki vaatii 5 tavua, joista yksi vastaa "valaistuista" pikseleistä. Esimerkiksi numero "8" on koodattu muodossa 0x6c,0x92.0x92.0x92.0x6c.
    Komentokoodit on annettu taulukossa.

    Hahmotaulukko HD44780


    Lipun merkitykset:


    Kysymys jää avoimeksi: "miten kirjoitetaan vaaditun symbolin koodi vaadittuun kohtaan?" Tätä varten katsotaan, mistä päätelmät ovat vastuussa. LCD. johtopäätöksiä DB0-DB7 ovat vastuussa saapuvista / lähtevistä tiedoista. Korkea taso RS-nastassa antaa ilmaisimen tietää, että signaali nasoissa DB0-DB7 on dataa ja matala on komento. Johtopäätös W/R vastaa tiedon suunnasta, kirjoitetaanko data muistiin vai luetaanko siitä (yleensä lukeminen LCD ei käytetä, voimme turvallisesti soveltaa siihen matalaa tasoa). Lähtöpulssi E(kesto vähintään 500 ns) käytetään signaalina datan kirjoittamiseen/lukemiseen nastoista DB0-DB7, R.S. Ja W/R.

    Johtopäätös V0 käytetään kuvan kontrastin asettamiseen, nastat A, K - taustavalon kytkemiseen (jos mallissasi on sellainen LCD). Loput 2 nastaa ovat todellista virtalähdettä. LCD. Eli hallitsemaan LCD Tarvitaan 8+1+1=10 nastaa. Mutta voit työskennellä 4-bittisessä käyttöliittymätilassa. Tässä tapauksessa nastojen DB4-DB7 korkea komento/data-tetradi lähetetään ensin ja sitten alhainen. Johtopäätökset DB0-DB3 ei käytetä. Ohjaukseen tarvitaan yhteensä 6 mikro-ohjaimen nastaa.
    Katsotaanpa nyt elävää esimerkkiä. Kirjoitetaan ohjelma tekstin tulostamiseksi "verkkosivusto" siihen mitä minulla on varastossa WH1602A(2 riviä 16 merkkiä).

    Muiden LCD-näyttöjen kohdalla sinun tulee tarkistaa kennojen vastaavuus DDRAM tuttavat. Kytkentäkaavio LCD ohjain näyttää tältä.

    Kytkentäkaavio AVR-mikro-ohjaimeen


    Vastus R3- 17 ohmia rajoittaa virtaa taustavalon ja AC:n kautta VR1 asettaa kontrastin (jos kaikki on kytketty ja ohjelmoitu oikein, mutta ilmaisin on äänetön, käännä VR1, jotta kuva tulee näkyviin). Älä myöskään missään olosuhteissa saa sekoittaa napaisuutta. LCD, jännite yli 5,5 V, kokemuksestani voin sanoa, että ne palavat välittömästi. Kaikkien muiden osien tarkoitus on sama kuin kohdassa
    Siirrytään nyt ohjelman kirjoittamiseen. Ilmaisimen ohjaamiseksi kirjoitamme ohjelman, jossa on useita keskeisiä toimintoja LCD: lcd_dat(unsigned char x) – tietojen x kirjoittamiseen, lcd_com(signed char x) – komennon x kirjoittamiseen, lcd_init(void) – ilmaisimen alustamiseen:

      #sisältää //syöttö/tulostuskirjasto

    1. #define RS 2 //RS=PD2 - LCD-ohjaussignaali

      #define E 3 //E=PD3 - LCD-ohjaussignaali

    2. #define TIME 10 //LCD:n aikaviivevakio

      //MK-kellotaajuus - 4 MHz

    3. //Viiveiden luontiohjelma

      tyhjä tauko (allekirjoittamaton in a)

      (allekirjoittamaton int i;

    4. kun (i= a; i> 0; i--);

    5. //Ohjelma komentojen lähettämiseen LCD-näytölle

      void lcd_com (allekirjoittamaton char lcd)

      ( unsigned char temp;

    6. temp= (lcd& ~(1<< RS) ) | (1 << E) ; //RS=0 on komento

      PORTD= lämpötila; //Lähetä komennon merkittävin tetradi, RS, E signaalit porttiin D

      asm("ei") ;

      PORTD= temp& ~(1<< E) ; //Komentoäänityssignaali

    7. temp= ((lcd* 16 ) & ~(1<< RS) ) | (1 << E) ; //RS=0 on komento

      PORTD= lämpötila; //Tulostaa komennon matalan asteen tetradi, signaalit RS, E porttiinD

      asm("ei") ; //Pieni 1 MK-syklin viive stabilointia varten

      PORTD= temp& ~(1<< E) ; //Komentoäänityssignaali

    8. tauko (10 * AIKA) ; //Tauko komennon suorittamiseen

    9. //Ohjelma tietojen kirjoittamiseen nestekidenäyttöön

      void lcd_dat (allekirjoittamaton char lcd)

      ( unsigned char temp;

    10. temp= (lcd| (1<< RS) ) | (1 << E) ; //RS=1 on dataa

      PORTD= lämpötila; //Lähetä tärkeimmät datatetradi, RS, E signaalit porttiin D

      asm("ei") ; //Pieni 1 MK-syklin viive stabilointia varten

      PORTD= temp& ~(1<< E) ; //Tietojen tallennussignaali

    11. lämpötila = ((lcd* 16 ) | (1<< RS) ) | (1 << E) ; //RS=1 on dataa

      PORTD= lämpötila; //Lähetä matalan kertaluokan datatetrad, RS, E signaalit porttiin D

      asm("ei") ; //Pieni 1 MK-syklin viive stabilointia varten

      PORTD= temp& ~(1<< E) ; //Tietojen tallennussignaali

    12. tauko(AIKA) ; //Tauko tietojen tulostamista varten

    13. //LCD-alustusohjelma

      void lcd_init(void)

      lcd_com(0x2c) ; //4-johdinliitäntä, 5x8 merkin koko

      tauko(100 * AIKA) ;

      tauko(100 * AIKA) ;

      tauko (100 * AIKA) ;

    14. //Pääohjelma

      int main(tyhjä)

      DDRD= 0xfc; //Alusta porttiD

      PORTD= 0x00 ;

    15. tauko(1000);

      lcd_init() ; //LCD:n alustus

    16. lcd_dat("w" ) ; //Tulosta "www.sivusto"

      lcd_dat("w" ) ;

      lcd_dat("w" ) ;

      lcd_dat("." ) ;

      lcd_dat("a" ) ;

      lcd_dat("v" );

      lcd_dat("r" ) ;

      lcd_dat("l" ) ;

      lcd_dat("a" ) ;

      lcd_dat("b" ) ;

      lcd_dat("." ) ;

      lcd_dat("c" ) ;

      lcd_dat("o" ) ;

      lcd_dat("m" );

    17. lcd_dat("I" ); //Kirjoita "Se on niin helppoa"

      lcd_dat("t" ) ;

      lcd_dat(""" ) ;

      lcd_dat("s" ) ;

      lcd_dat(" " ) ;

      lcd_dat("s" ) ;

      lcd_dat("o" ) ;

      lcd_dat(" " ) ;

      lcd_dat("e" ) ;

      lcd_dat("a" ) ;

      lcd_dat("s" ) ;

      lcd_dat("y" ) ;

    18. kun (1) //loputon sykli

    19. paluu 1;

    Ohjelma on hyvin yksinkertainen, kenenkään, jolla on ainakin vähän tietoa, ei ole vaikea ymmärtää sitä. C varten AVR. Latinalaiselle ja numeroille ASCII koodit vastaavat merkkigeneraattoriin ohjelmoituja LCD, joten sen käyttö on sallittua lcd_dat('A'). Voit luoda oman kirjaston LCD-näytön käyttöä varten erottamalla funktiot lcd_dat(unsigned char x), lcd_com(unsigned char x), lcd_init(void) erilliseksi moduuliksi LCD.h ja liitä se tarvittaessa.

    Tämä idea säästää paljon aikaa; tarvitset vain kirjoittaa tarvittavat funktiot kerran ja käyttää niitä sitten koko ajan. Voit myös huomata, että pitkän lauseen tulostaminen yksi kirjain kerrallaan on hankalaa; voit tehdä tämän työntämällä tulostemerkkijonomme etumerkittömien merkkien joukkoon ja tulostamalla sen silmukan avulla:

      int main(tyhjä)

      ( unsigned char data [ 14 ] = ( "w" , "w" , "w" , "." , "a" , "v" , "r" , "l" , "a" , "b" , " ." , "c" , "o" , "m" );

      allekirjoittamaton char i;

      DDRD= 0xfc; //Alusta porttiD

      PORTD= 0x00 ;

    1. tauko(1000); //Viive, jotta LCD ehtii käynnistyä

      lcd_init() ; //LCD:n alustus

    2. for (i = 0; i< 14 ; i++ ) //Tulosta syöttö kirjain kirjaimelta

      lcd_dat(data[i] );

    Älä vain unohda, että taulukon numerointi C:ssä alkaa nollasta. Olemassa olevaa ohjelmaa voidaan käyttää yhdessä ohjaimen kanssa ilman merkittäviä muutoksia ATtiny2313, yhdistäminen LCD Vastaanottaja PORTB, kuten PORTD klo ATtiny2313 siinä on vain 7 nastaa, ei 8, kuten ATmega8.

    Suosittelen myös yhdistämistä LCD käyttämällä irrotettavia liitoksia. Se on erittäin kätevää ohjelman virheenkorjauksessa, kun sinun on näytettävä joitain välitietoja. Yhdistin yhden liittimen ja se oli siinä. Tämän huomautuksen jatkona harkitsen lähitulevaisuudessa luettujen tietojen näyttämistä LCD.
    Mukavaa päivää kaikille;)

    tässä esimerkissä on pieni virhe

    Tässä esimerkissä on pieni virhe, ehkä tästä syystä esimerkki ei toimi monille!

    Yleisesti ottaen esimerkki on lakoninen ja yksinkertainen, joten pieni virhe ei tartu silmään (niille, jotka tuntevat "C"-kielen), ja vielä enemmän niille, jotka ovat vasta tutustumassa AVR: iin ja "C" ”kieli, ehkä he ovat jopa hämmentyneitä siitä, miten se tapahtui... .kirjoittavat, tee näin ja se on kuin kuvassa....mutta näin ei ole...

    Yleensä koko ongelma on viivejaksoissa, jotta näyttö pysyy ohjaimen mukana, nimittäin toiminnossa -

    //Viiveiden luontiohjelma

    tyhjä tauko (allekirjoittamaton in a)

    (allekirjoittamaton int i;

    (i=a;i>0;i--);

    kaikki näyttää ensisilmäyksellä oikealta, mutta mikrokontrollerien kääntäjät pyrkivät optimoimaan koodin niin, että ohjelmien flash-muistikuva on mahdollisimman kompakti... eikä näe mitään järkeä tyhjässä silmukassa ja vastaavasti ketjun alempana sen jälkeen. se: kaikki kutsut, vakioiden ilmoitukset ja kaikki siihen liittyvä tämä toiminto on hänen mielestään merkityksetön... se yksinkertaisesti poistaa sen koodista kokoonpanon aikana...

    Tämä pätee ainakin atmel studio 6.1:een, ja voit varmistaa tämän katsomalla projektikansiota, siellä on *.lss-tiedosto, joka sisältää tämän ohjelman kokoonpanokoodin, joka on luotu projektia rakennettaessa. ei vihjettä void tauko -toiminnon toteutuksesta...

    seurauksena, kun ohjaimen laiteohjelmistoa vilkkuu, näyttö päätyy satunnaiseen roskaan tai tyhjyyteen... kun painat reset useita kertoja, roskat voivat kadota ja ilmestyä uudelleen... on ilmeistä, että prosessori ja näyttö ovat poissa synkronoida

    mutta jos teet pienen korjauksen

    tyhjä tauko (allekirjoittamaton in a)

    (allekirjoittamaton int i;

    kohteelle (i=a;i>0;i--)
    asm("ei");

    Sitten kääntäjälle tämä on järkevää, tämän vahvistaa myös funktion toteutuksen ilmeinen esiintyminen kokoonpanokoodissa

    0000006c
    :
    6c:9c 01 movw r18, r24
    6e: 03 c0 rjmp .+6 ; 0x76
    70:00 00 ei
    72: 21 50 subi r18, 0x01 ; 1
    74:31 09 sbc r19, r1
    76: 21 15 cp r18, r1
    78:31 05 cpc r19, r1
    7a: d1 f7 brne .-12 ; 0x70

    ja todennäköisimmin kaikki toimii... ainakin minulle atmega16:lla (sisäinen RC-synkronointi 1Mhz) ja Atmel studio 6.1:llä se oli juuri niin...ehkä muilla taajuuksilla joutuu soittamaan vakiolla #define TIME 10 ja/tai funktiolle void pause välitetyt arvot

    täällä-> tauko(arvo) ...tai tauko(arvo*AIKA) ....

    Onnea AVR:n käytön opettelemiseen!

    Kuvittele, että LCD -

    Kuvittele, että LCD on kirjoituskone, kirjoituskoneen paperi on LCD-muisti, vaunu on kohdistimen osoitin. Lisäksi LCD-näyttö ei näytä koko muistin sisältöä, vaan vain osaa. Se näyttää eräänlaiselta ikkunalta, jonka asetamme paperillemme tekstillä.

    Tässä I/D määrittää, kuinka tulostetaan, oikealta vasemmalle vai vasemmalta oikealle.
    S määrittää, siirretäänkö näyttöikkunaa kirjoittaessamme vai ei.
    S/C - yksinkertaisesti siirtää näkyvää näyttöikkunaa tai kirjoituskoneen vaunua.
    R/L - määrittää minne (vasemmalle tai oikealle) siirrämme näyttöä tai kursseja S/C-lipulla.

    Luulen, että jotain puuttuu!

    Repäsin ohjelmasi ja proteusisi, enkä käynnistä mega8:aa. Näyttö on hiljainen, aloin kaivaa datalehtiä ja tämän löysin:
    Se, mikä puuttuu, on kolmen ensimmäisen alustus!

    0011 - odota 5 ms
    0011 - odota 100 µs
    0011 - odota 2 ms
    0010 - odota 41 µs
    0000 - ja-
    0010 - -ja-
    1000
    0000
    1000
    0000
    0001
    0000
    0100

    Korjaa jos olen väärässä!

    Ei toimi!

    Yritin muuttaa kellotaajuuksia, viiveitä alustuksen aikana ja symbolien (komentojen) ulostuloa, toistaiseksi tuloksetta. Mitä tulee sulakkeisiin, jos aiot konfiguroida portin D nastat DDRB:n avulla, PORTD rekisteröityy pieniksi lokilähtöiksi. tasolla, sitten tein sen.
    Koska minulla ei ollut muuta tekemistä, käänsin yksinkertaisen symbolien tulostusohjelman CodeVisionAVR-työkaluilla, laitoin sen PROTEUS:iin - se toimii!... mutta oikealla LCD-näytöllä se kieltäytyy.

    Ei, puhun siitä

    Ei, puhun siitä, että yrität laittaa vilkkuvan valon esimerkiksi porttiin D tai vain sytyttää koko portin kerralla. Kun ostin vain mikro-ohjaimen, en voinut tehdä tätä. Selailin foorumeita ja kävi ilmi, että sulakkeet on jotenkin ohjelmoitu sinne ja että portti D ja kaikki sen 8 bittiä eivät ole päällä. Tarkista tämä kohta, tai vielä parempaa, yritä siirtää LCD-näyttö toiseen porttiin, esimerkiksi B-porttiin. Se, että ohjelma toimii Proteuksessa, mutta ei todellisen kanssa, johtuu Proteukseen tukossa olevan LCD-näytön parametrien eroista ja todellinen.

    Ei toimi!

    Kokosin ja liitin kaiken kaavion mukaan, vain MK käytti ATmega16:ta ja LCD WH1602M:ää, ja sen mukaisesti käänsin laiteohjelmiston WinAVR:ään. LCD kuitenkin kieltäytyi tulostamasta mitään, keräsin sen myös Proteukseen (ATmega 8:ssa ja LM016L:ssä), MK:n tiedot tulostetaan, mutta LCD: llä ei näy mitään. Mikä voisi olla ongelmana? (Jos tämä on tärkeää, käytä sisäistä RC-oskillaattoria 1 MHz:n kellotaajuudella)

    1. Tarvitset Atmega16:lle

    1. Atmega16:ssa sinun on ensin kytkettävä sulakkeet päälle, jotta portti D toimii.
    2. Yritä muuttaa kellotaajuudeksi 4 MHz ja 8 MHz. Koko LCD-näytön ongelma on, että kaikkia taukoja ei ylläpidetä alustuksen tai komentoa annettaessa. Ja LCD-ohjain on erittäin herkkä tälle.

    Minulla on kysymys:
    Kokosin kronometripiirin Mega 8:aan valmiilla kuusiokoloilla - lukemat näkyvät WH0802:ssa,
    ilmaisin on kolme numeroa, jotka näkyvät koko näytössä, yksi numero koostuu 4 merkistä. Pseudograafinen näyttö. Miten laiteohjelmisto voidaan kirjoittaa??
    Tekijä kieltäytyy kategorisesti antamasta lähdekoodia eikä kommentoi teosta, luultavasti "immateriaalioikeuksiin liittyvistä syistä".
    Vapaa-ajallani haluan yrittää kirjoittaa oman laiteohjelmistoni opetustarkoituksiin.

    Törmäsin tähän

    Törmäsin tähän tilanteeseen.
    LCD 16x2 on kaksi:
    1 - MTC-S16204XFGHSAY
    2 - WH1602A-YGH-CTK

    Käytän ensimmäistä GPS-projektissa.
    Päätin käyttää toista projektissa näppäimistön kanssa. Mutta jostain syystä LCD ei toimi.
    Kontrastia säädetään ja neliöitä tulee näkyviin. Siinä kaikki.
    Ehkä alustusjärjestys on erilainen.
    Auta minua ymmärtämään
    Tässä ovat datalehdet
    filebox.od.ua/?file=24a31fc50d62bfcd658bdadac84088ab

    Näytöt eivät eroa toisistaan.

    Näytöt eivät eroa toisistaan. Pinout on sama. Ajat vaihtelevat hieman. Yritä lisätä viivettä lähetettäessä komentoja LCD-näytölle tai alentaa mikro-ohjaimen taajuutta.

    Kaikissa HD44780:n LCD-näytöissä on identtinen komentojärjestelmä. Mitä käyttöliittymää käytät, 4-bittistä vai 8-bittistä? Yritä myös lisätä viivettä LCD-näytön käynnistämisen ja sen alustuksen välillä noin 0,1 sekuntiin. Eikö LCD-näytön virtalähteen napaisuus ole sekaisin, tarvitseeko ne vähän palaakseen loppuun? Poltin sen typerästi jotenkin ja yritin sitten yhdistää sen. Myös mustia neliöitä näytettiin, dataa näkyi joka toinen kerta, ts. toimi erittäin epävakaasti.

    Käytän ohjelmia artikkeleista

    Käytän ohjelmia GPS-artikkeleista.
    4-bittinen käyttöliittymä

    Kokeilin ohjelmaa täältä
    chipenable.ru/index.php/programming-c/75-chasy-na-mikrokontrollere.html

    se toimi

    Mitä sinun pitäisi muuttaa ohjelmassasi?

    Kiinnitä huomiota viivästyksiin

    Kiinnitä huomiota viiveisiin alustus- ja konfigurointikomentojen antamisen jälkeen, näin voi olla. Minulla oli myös samanlainen tapaus, mutta molemmat ohjaimet olivat samat ja ohjelma toimi vain yhdessä.

    Analogit HD44780

    Törmäsin ongelmaan - en löydä WH1602A LCD:tä kohtuulliseen hintaan. Esimerkiksi
    chipdipissä nämä ovat saatavilla chipdip.ru/product/wh1602a-ygh-ct-k.aspx
    700 puinen. Mikä on YGH nimessä "WH1602A-YGH-CT(K), LCD 16x2, englanti-venäläinen"
    Mitä analogeja HD44780:een perustuvista LCD-näytöistä on olemassa? Löysin sivun micronika.ru/order.phtml?vid=64 - siellä nimi FDCC1602A-FSBFBW-51SR sisältää 1602A,
    Huomasin juuri. Ehkä FDCC1602A-FSBFBW-51S toimii ilman suuria koodimuutoksia?
    Mitä ongelmia voi ilmetä käytettäessä
    ei varsinainen Hitachin HD44780, vaan sen analogit?
    PS Ei olisi huono idea lukea erilaisten LCD-näyttöjen, HD44780:n analogien, käytöstä kuin MELT-näytöt.
    LCD-näytöt ovat huonoja

    Tässä artikkelissa annan esimerkin yhdestä vaihtoehdosta nestekidenäyttöisen alfanumeerisen ilmaisimen alustamiseksi HD44780- tai KS0066-ohjainalustalla aloitteleville ohjelmoijille kokoonpanokielellä suhteessa PIC16-mikro-ohjaimiin.

    Tämä ohjelma on osa artikkelissa "" kuvattua lämpötila- ja kosteusmittarin ohjelmaa. Artikkelin ja ohjelman lähdetiedoston kanssa työskentelyn helpottamiseksi on parempi ladata ensin projekti, tulostaa lähdetiedosto ja laittaa se eteen. Kun kirjoitat ohjelmaa LCD-näytön alustamiseksi, komentojen ja näyttösymbolien kirjoittamiseksi ilmaisimeen, on parempi käyttää tähän tarkoitukseen luotuja makroja. Katsotaanpa näyttöä.

    Tekstinkorvauskäskyjen jälkeen on makroja - pieniä ohjelmia, joihin pääsee pääohjelmasta niin paljon kuin haluat, milloin tahansa. Ensimmäinen makro, impulss_E, varmistaa, että avainnuspulssi vastaanotetaan linjalla E, avainnus- ja synkronointilinjoilla. Rivi 14 – asettaa riville loogisen yhden kahden NOP-pseudo-komennon kautta, rivi 17 – asettaa loogisen nollan. Siten saamme positiivisen pulssin linjalla E, jonka kesto on 2 μs kvartsioskillaattorin taajuudella 4 MHz. Seuraava makro on Load_Znak, jonka avulla voimme ladata symbolikoodin DR-rekisteriin ja näyttää sen indikaattorissa. Huomaat, että tässä makrossa on kutsu toiselle alla kirjoitetulle makrolle. Katsotaanpa send_LCD-makroa. Rivi 26 – lue Write_data -rekisterin sisältö, ts. sen merkin koodi, jonka pitäisi olla siinä. Rivi – 27, vaihda rekisterin korkeat ja matalat nibbles. Rivi – 28, valitsemme merkkikoodin ylänäppäimen, joka on jo matalassa nibblessä, ja tulostamme nämä tiedot porttiin B. Tosiasia on, että tietojen tallennus indikaattoriohjaimen 4-bittisessä toimintatilassa tapahtuu peräkkäin, ensin rekisterin high nibble, sitten junior - linja 31... 33. Napauksen lähettämisen jälkeen täytyy generoida strobopulssi. Tämän näemme, rivit 30 ja 34. Jotta näytönohjain voisi käsitellä informaatiota, makroon lisättiin 200 mikrosekunnin aikaviive. Luomiemme makrojen jälkeen on vakiomenettely mikro-ohjaimen alustamiseksi. Artikkelissa "" puhuin LCD-näyttöjen pääominaisuuksista ja kosketin aihetta omien symbolien luomisesta. Kuten sanoin aiemmin, indikaattoreissani ei ole astesymbolia. Joten lataamme sen indikaattorin merkkigeneraattoriin. Tätä varten kirjoitamme pienen aliohjelman, jonka tulisi sijaita mikrokontrollerin alustusmenettelyn takana ja pääohjelman edellä. Aliohjelma alkaa riviltä 69, jonne syötetään osoitekoodi CGRAM-alueelle, 40h - ensimmäinen käyttäjä osoite tallennetaan tähän osoitteeseen. Katso kuvakaappaus 2.

    Koska jokainen merkki vie kahdeksan muistirekisteriä, seuraava luomamme merkki alkaa osoitteesta 40h + 08h = 48h. Seuraava on 48h + 08h = 50h. Älä unohda, että yhteenlasku tapahtuu heksadesimaalilukujärjestelmässä. Ja niin, rivit 69 ja 70 – symbolin aloitusosoitteen lataus. Seuraavaksi tulee merkkikoodin kahdeksan tavun vaihtoehtoinen tallennus. Otamme tutkintotunnuskoodin LCDCC-ohjelmasta.

    Meidän on toistettava hieman, mitä oli artikkelissa "Nestekiteiden aakkosnumeeriset indikaattorit". Katsotaanpa tämän ohjelman kuvakaappausta. Napsauttamalla matriisin soluja piirrämme halutun symbolin, tässä tapauksessa se on symbolinen astekuvake. Alla ohjelma kirjoittaa välittömästi koodit matriisin valituille pisteille. Nyt meidän on kirjoitettava nämä koodit indikaattoriohjaimeen. Niin me teimme. Nyt olemme saavuttaneet itse indikaattorin alustuksen. Katso kuvakaappaus 3.

    Esimerkiksi ennen alustusta kirjoitamme tiedot rekistereihin arvojen tulostamiseksi indikaattorille. Syötetään esimerkiksi lämpötila-arvo 21,7 astetta. Sitten luomme Proteukseen projektin ja katsomme mitä saamme aikaan. Niin. Kuvakaappaus 3, rivit 88... 93 – numeroiden kirjoittaminen rekistereihin. Alustus alkaa InitLCD-merkinnällä, kuten odotettiin, odotamme vähintään 15 ms. Tauon jälkeen, rivit 98...100, kirjoita numero kolme Reg_3-rekisteriin - tämä on kuinka monta kertaa komento lähetetään 30h = b’0011 0000’ (30h). Ja kirjoitamme kolme portin B rekisteriin, myöhempää kirjoittamista varten indikaattoriohjaimeen, tämä numero kolme on komennon korkeassa puolitavussa. Muodostamme välähdyspulssin, linja 102, tauko 5 ms. Palaamme Setloop-tarraan. Lähetämme komennon, kunnes Reg_3-rekisteri nollataan, ts. kolme kertaa. Tämän komennon lähettämisen jälkeen ilmaisinohjain on käyttövalmis, mutta 8-bittisessä tilassa. Siirrytään nyt 4-bittiseen tilaan. Tätä varten lähetämme komennon 20h. Muista, että komennot kirjoitetaan indikaattoriohjaimeen 4-bittisessä tilassa. Meillä on siis komento 20h tai 0010 0000. Koska 4-bittisessä tilassa komennot välitetään kahdessa vaiheessa, ensin rekisterin merkittävimmän näppäimen tiedot, syötetään ne kaksi portin B rekisteriin ja kirjoitetaan ilmaisinohjain, ja koska alin napa on tyhjä, emme lähetä mitään.

    Kirjoitettuamme 2 porttiin B, vilkutamme riviä E ja keskeytämme 200 us. Nyt ilmaisin toimii 4-numeroisessa tilassa. Seuraava komento on komento asettaa toimintatila - kaksi riviä, fontti - 5x7. Komentokoodi 28h. Seuraavaksi tulee 0C-komento, joka kytkee ilmaisimen päälle. No, luulen, että sinä saat sen selville. Kyllä, vähän enemmän. Proteuksessa luomamme tutkintokuvakkeen symboli ei näy oikein, se näyttää kaksi pistettä, vaikka todellisuudessa kaikki toimii hyvin. Katsotaanpa valokuvaa. Onnea.

    Nykyään symbolisia nestekide-LCD-indikaattoreita käytetään yhä useammin yksinkertaisen symbolisen tiedon näyttämiseen. Puhumme siitä, kuinka työskennellä heidän kanssaan. Tässä artikkelin osassa tarkastelemme yksityiskohtaisesti HITACHI HD44780 -ohjaimeen (tai yhteensopivaan SAMSUNG KS0066:een) perustuvia merkki-LCD-näyttöjä. Artikkeli on yritys systematisoida tietoja, jotka löysin työskennellessäni näiden LCD-näyttöjen kanssa.

    Merkki-LCD ohjaimella HD44780 (KS0066). Käyttöliittymä

    Merkki-LCD on vain pistematriisi, joka on jaettu viivoille ja merkkikenttiin:

    Erikoisohjainta käytetään tämän matriisin ohjaamiseen ja todellisten merkkien tulostamiseen.

    HD44780 (ja sen yhteensopiva KS0066) on de facto standardi yksiväristen LCD-merkkejä syntetisoivien näyttöjen ohjaimille, joissa on rinnakkainen 4- tai 8-bittinen liitäntä. Tämän ohjaimen pohjalta tuotetaan valtava määrä malleja erilaisilla malleilla ja resoluutioilla alkaen 8x1 (kahdeksan merkkiä yhdellä rivillä) ja päättyen 40x4 (sisältää kaksi itsenäistä ohjaussirua). Säätimen tyypillinen toimintataajuus on 270 kHz.

    LCD-ohjain toimii 3 muistilohkolla:

    1. Ohjain käyttää muistia merkin tulostamiseen DDRAM(Display Data RAM), johon on tallennettu niiden merkkien ASCII-koodit, jotka haluamme nähdä LCD-näytössä. Sille on varattu 80 muistisolua. On selvää, että LCD-näytöllä näemme vain osan DDRAM-muistissa olevista merkeistä - jos LCD-näytömme on 1 tai 2 riviä ja näyttää 8 merkkiä riviä kohden, niin näin:

    Näytön työalue, kuten näet, voidaan siirtää DDRAM-soluja pitkin (saat hiipivän viivaefektin).

    2. Ohjain ottaa itse symbolien mallit CGROM(Character Generator ROM) – merkkigeneraattorin muisti. Symbolitaulukko löytyy HD44780:n teknisistä tiedoista.

    3. Muisti on tarkoitettu käyttäjän symbolien (niiden mallien) tallentamiseen. CGRAM(Merkkigeneraattorin RAM).

    Lisäksi rekisterinpitäjä, tietyistä ehdoista riippuen, jakaa siihen vastaanotetut tiedot ohjerekisteri tai tietorekisteri.

    Tyypillinen 14-nastainen HD44780-ohjainliitäntä:

    Maa, yhteinen, GND

    Syöttöjännite, Vcc (+5V)

    Kontrastin säätäminen (Vo)

    Rekisteröintivalinta (R/S HD44780:lle, A0 KS0066:lle)

    Lue/kirjoita (R/W)

    Strobe syksyllä E (käytössä)

    Bitti 0 (pieni 8-bittiselle käyttöliittymälle)

    Datalinja

    DB 4 (vähäinen 4-bittiselle rajapinnalle)

    DB 7 (korkea 8 (4) bitin rajapinnalle)

    Taustavalaistu näyttö

    Taustavalon teho taustavalaistuille näytöille (anodi)

    Taustavalon teho taustavalaistuille näytöille (katodi)

    Tarkastelemme nastan numerointia tietyssä LCD-näytössä tietolomakkeessa.

    LCD-näytön kuvan kontrastia voidaan muuttaa liittämällä ylimääräinen 10 kOhm trimmivastus seuraavan kaavion mukaisesti:

    Mutta sinun tulee katsoa ohjaimesi teknisiä tietoja (esimerkiksi KS0066-sirun Klsn10294v-0 LCD:ssä on 1-Vcc ja 2-GND). Taustavalon virtalähde voi vaihdella malleittain sen tyypistä riippuen. Tyypillisesti taustavalo saa virran 5 voltista; virtaa rajoittava vastus (50-100 ohmia) on yleensä valinnainen.

    Pin-määritys R/S, R/W, E:

    Kun E siirtyy korkeasta logista. tasolta alhaiseen dataan, joka jo "roikkuu" terminaaleissa DB0..DB7, kirjoitetaan LCD-ohjaimen muistiin myöhempää käsittelyä varten.

    Korkealla lokilla. Tasolla R/S (Register Select) LCD-ohjain havaitsee tämän bittijoukon datana (merkkikoodina) ja matalalla tasolla ohjeena ja lähettää ne sopivaan rekisteriin.

    R/W määrittää nastojen DB0..DB7 toimintasuunnan - jos R/W on “0”, voimme kirjoittaa vain DB-porttiin ja jos R/W = “1”, voimme lukea siitä. (esimerkiksi selvittää, onko ohjain varattu tai vapaa vastaanottamaan uusia tietoja). Jos emme lue tietoja LCD-näytöltä, voimme "istuttaa" R/W:n maahan.

    HD44780 ohjesarja

    Tietojen näyttämisen aloittamiseksi LCD-näytöllä sen ohjain on alustettava (ilmoita sille käyttöliittymä, fontti, siirtymät jne.). Ohjain voi hyväksyä yhteensä 11 komentoa:

    Ohjeiden nimi

    Pin-tila

    Valmistumisaika

    f orja = 270 kHz

    Koko LCD-näytön tyhjennys ja DDRAM-osoitteen asettaminen 0:ksi

    Nykyisen DDRAM-osoitteen asettaminen arvoon 0 (kursori - koti) DDRAM-tiedot eivät muutu

    Kohdistimen liikkeen suunnan (I/D) ja näytön poikkeaman (S) asettaminen dataa tulostettaessa

    Näytön päälle/pois ohjaus

    Päällä pois päältä. näyttö (D), kohdistin (C) ja sen välkkyminen (B)

    Kohdistimen tai näytön siirto

    Siirtää kohdistinta ja siirtää näyttöä DDRAM-muistissa

    Käyttöliittymän (DL), rivien määrän (N) ja merkkifontin (F) asettaminen

    Aseta CGRAM-osoite

    CGRAM-osoitelaskurin asettaminen. Tämän jälkeen voit kirjoittaa tietoja CGRAM-muistiin

    Aseta DDRAM-osoite

    DDRAM-osoitelaskurin asettaminen

    Lue varattu lippu ja osoite

    Jos BF = 1, LCD-ohjain suorittaa sisäistä toimintoa (varattu). AC6-AC0 – DDRAM-osoitteen nykyinen arvo

    Kirjoita tiedot RAM-muistiin

    Tietojen kirjoittaminen RAM-muistiin

    Lue tiedot RAM-muistista

    Tietojen lukeminen RAM-muistista

    I/D = 1: DDRAM-osoite kasvaa I/D = 0: pienenee
    S = 1: näytön työalueen siirtäminen DDRAM-muistin kautta on sallittua
    D = 1: näyttö (kuva) päällä
    C = 1: kohdistin käytössä
    B = 1: Kohdistimen vilkkuminen käytössä

    S/C = 1: siirrä näyttöä S/C = 0: siirrä kohdistinta
    R/L = 1: oikea R/L = 0: vasen

    DL = 1:8 bittiä DL = 0:4 bittiä
    N = 1:2 riviä N = 0:1 riviä
    F = 1: 5x10 F = 0: 5x8

    ACG:CGRAM-osoite
    ADD: DDRAM-osoite (kohdistimen osoite)
    AC: Osoitelaskurin DD- ja CGRAM-osoitteet

    LCD-alustus

    LCD-ohjaimen alustamiseen on kaksi tapaa:

    1. Sisäisen palautuspiirin kautta.

    2. Manuaalisessa tilassa (lähettämällä siihen useita komentoja, joilla asetamme LCD-näytön toimintatilan)

    Ohjaimen sisäinen palautuspiiri alkaa toimia heti virran kytkemisen jälkeen. Tässä on yksi haittapuoli - jos tehomme "hiipii" toimintatasolle hitaasti (hitaammin kuin 10 ms), ohjaimen itsealustus ei välttämättä ede oikein. Tällä alustusmenetelmällä ohjain itse suorittaa seuraavat komennot:

    1.Näyttö selkeä

    2. Toimintosarja:
    DL = 1; 8-bittinen käyttöliittymätiedot
    N = 0; 1-rivinen näyttö
    F = 0; 5x8 pisteen kirjasinfontti

    3. Näytön päälle/pois ohjaus:
    D = 0; Näyttö pois päältä
    C = 0; Kursori pois päältä
    B = 0; vilkkuminen pois päältä

    4. Aloitustilan asetus:
    I/D = 1; Kasvata 1
    S = 0; Ei vaihtoa

    Toinen menetelmä eliminoi piirin riippuvuuden virtalähteestä. LCD-ohjaimen alustamiseksi manuaalisessa tilassa sinun on suoritettava seuraava algoritmi:

    Kuten näette, tässä ei ole mitään monimutkaista: lähetämme komennon komennon jälkeen LCD-näytölle ottaen huomioon niiden suoritusajan (noin 40 μs) tai tarkistamalla LCD-ohjaimen varattu lipun (sitten meidän on asetettava RW-nastainen mikro-ohjaimen jalka ja aseta se arvoon "1", kun haluamme selvittää, onko LCD-näyttö varattu vai ei).

    Se on itse asiassa kaikki, mikä koskee teoriaa työskentelystä symbolisten LCD-näyttöjen kanssa. Jos jotain jäi huomaamatta tai teit virheen, lue ohjaimen tekniset tiedot tai .

    Toisessa osassa tarkastellaan PIC-mikrokontrollerin ja LCD-näytön välisen viestinnän laitteisto- ja ohjelmistototeutusta.

    Tämä näyttö oli jonkin aikaa käyttämättömänä.


    Ja nyt on halu liittää se johonkin projektiin; voit tietysti yrittää löytää kirjaston valmiilla toiminnoilla, mutta tässä tapauksessa kuva näytön toiminnasta on epätäydellinen, ja tämä ei sovi meille. Kun ymmärrät LCD-näytön toimintaperiaatteen, ei ole vaikeaa kirjoittaa omaa kirjastoa halutulle näytölle, jos se puuttuu tai ei ole jollain tapaa tyydyttävä.

    Joten aloitetaan.
    Ensimmäinen asia on löytää pinout, eli mikä yhteyshenkilö on vastuussa mistäkin, toinen on etsiä näyttöä ohjaavan ohjaimen nimi, ladata tämän LCD-näytön tietolehti ja avata se ensimmäinen sivu.


    Yhteystiedot lasketaan vasemmalta oikealle, ensimmäinen on merkitty punaisella nuolella. Syöttöjännite on 5 volttia, ohjaussäädin S6A0069 tai vastaavaa esim. ks0066U.

    Miksi etsimme ohjausohjaimen nimeä? Tosiasia on, että näytön tietolomakkeessa on aikaviiveitä (ajoituskaavio), komentojärjestelmä on kuvattu, mutta banaalia alustusta ei ole, eikä ilman sitä ole missään.
    Avaa seuraavaksi toinen sivu ja katso taulukko, jossa kerrotaan, mikä yhteyshenkilö on vastuussa mistäkin.


    DB7…DB0– data/osoiteväylä.

    R/W- määrittää, mitä teemme, luemme (R/W=1) tai kirjoitamme (R/W=0)

    R/S– määrittää, lähetämmekö komennon (RS=0) vai datan (RS=1)

    E– strobo-tulo, muuttamalla tämän tulon signaalia, sallimme näytön lukea/kirjoittaa tietoja.

    LED±- taustavalon ohjaus.

    Minun on sanottava, että saamassani näytössä taustavalo ei vain syty; tätä varten sinun on juotettava vastus, joka on merkitty levylle R7. Mutta toistaiseksi emme tarvitse sitä.

    Lataa ohjausohjaimen tietolehti ja etsi alustusohjeet. Kuvia saa suuremmaksi klikkaamalla niitä.



    Osoittautuu, että tällaisia ​​ohjeita on kaksi, 8- ja 4-bittisille tiloille. Millaisia ​​modeja nämä ovat? Nämä tilat määräävät, kuinka monta johdinta dataa lähetetään: neljä tai kahdeksan. Katsotaanpa lähetystä 4 johtoa, tässä tapauksessa näyttö toimii hitaammin, mutta säästämme 4 mikro-ohjaimen nastaa, ja kahdeksan bitin tilan toteutus ei eroa paljon.

    Tietojen kytkentäkaavio on seuraava.


    Kontrastia voidaan säätää kytkemällä potentiometri tehonastojen väliin.

    Haluan kiinnittää huomionne siihen, että alustuksen aikana R/S Ja R/W ovat aina nolla, eli lähetämme joukkueet.

    Alustuksen aikana voit määrittää:

    • N - näytettyjen rivien määrä
    • C - kursori päälle tai pois päältä
    • B - kursori vilkkuu
    • I/D - lisää tai pienennä osoitelaskurin arvoa
    • SH - siirrä näyttöikkunaa
    Katsotaanpa kahta viimeistä kohtaa tarkemmin.
    Alla olevasta kuvasta näkyy, mihin osoitteeseen meidän on kirjoitettava tiedot, jotta ne näkyvät tietyssä paikassa, esimerkiksi jos haluamme näyttää symbolin toisen rivin ensimmäinen sijainti, meidän on kirjoitettava osoitteeseen 0x40.


    Tämän jälkeen laskurin arvo muuttuu automaattisesti, joko kasvaa tai laskee, ja sen mukana kursorin paikka muuttuu.

    Muuten, muistia, johon kirjoitamme, kutsutaan DDRAM, kaikki, mitä kirjoitamme tähän muistiin, näkyy näytössä, on vielä CGROM, joka tallentaa merkkigeneraattoritaulukon.


    Tätä taulukkoa ei voi muuttaa, mutta siitä voidaan ottaa valmiita symboleja. Toinen muistityyppi on CGRAM, se on myös merkkigeneraattoritaulukko, mutta piirrämme symbolit tähän taulukkoon itse.


    Nyt muutama sana näytön liikkeestä, tosiasia on, että yleensä näytöllä emme näe kaikkea DDRAM-muistia, vaan vain tietyn osan, kuten alla olevassa kuvassa näkyy.


    Voimme kirjoittaa myös näkymätön osaan, mutta kirjoittamamme ei näy ennen kuin siirrämme näyttöikkunan tähän paikkaan.

    Teoria on valmis, siirrytään käytäntöön.
    Kuva viestinnästä LCD-näytön kanssa 4-bittisessä tilassa näyttää tältä.


    Data lähetetään tavuina, mutta koska meillä on 4-bittinen tila, tavun lähettämiseksi sinun on lähetettävä 2 kertaa merkitsevin bitti ensin. Kuvassa ensimmäinen paketti on merkitty D7 (korkea tetrad) ja toinen D3 (matala tetrad). Ennen seuraavaa lähetystä meidän on tarkistettava varattu lippu ja jos sitä ei ole asetettu, voimme lähettää sen uudelleen; jos se on asetettu, odotamme, kunnes LCD-näyttöä ohjaava ohjain lopettaa toimintansa.

    Kun lähetyksestä on yleinen kuva, selvitetään kuinka lähetystoiminto toteutetaan.


    Lähettääksesi sinun on käytettävä 8-bittistä väylää:
    • R/W asetettu arvoon 0
    • anna komentokoodi/data väylään
    • viive 2us
    • alempi vilkkuvalo E

    Lukutoiminto toteutetaan samalla tavalla:

    • varmista, että ohjausohjain on vapaa
    • R/W asetettu arvoon 1
    • nosta strobe E (tällä hetkellä LCD lähettää tiedot väylään)
    • viive 2us
    • luimme mitä LCD antoi
    • alempi vilkkuvalo E
    Mistä 2us:n viive tuli?

    Ajoitusten yläpuolella on taulukko, jossa kerrotaan mitä kaaviossa näkyvät viiveet ovat yhtä suuria, joten välähdyspulssin kesto - tw pitäisi olla 230nS tai 450nS riippuen syöttöjännitteestä, otimme sen hieman marginaali. Miksi otimme vain tämän viivästyksen huomioon? Koska jäljellä olevien viiveiden arvo on hyvin pieni.

    4-bittisen väylän kautta lähettäminen:

    • varmista, että ohjausohjain on vapaa
    • aseta RS arvoon 0 (komento) tai 1 (data) sen mukaan, mitä lähetämme
    • R/W asetettu arvoon 0
    • nosta vilkkuvaloa E (asetettu 1:ksi)
    • myönnämme korkeimman muistikirjan bussille
    • viive 2us
    • alempi vilkkuvalo E
    • viive 1us
    • nosta vilkkuvaloa E (asetettu 1:ksi)
    • annamme matalan tetradin linja-autolle
    • viive 2us
    • alempi vilkkuvalo E

    Lukeminen 4-bittisellä väylällä:

    • varmista, että ohjausohjain on vapaa
    • dataportti syöttöä varten vedolla
    • aseta RS arvoon 0 (komento) tai 1 (data) sen mukaan, mitä luemme
    • R/W asetettu arvoon 1
    • nosta vilkkuvaloa E (asetettu 1:ksi)
    • viive 2us
    • lue vanhempi muistikirja
    • alempi vilkkuvalo E
    • viive 1us
    • nosta vilkkuvaloa E (asetettu 1:ksi)
    • viive 2us
    • luemme alempaa muistikirjaa
    • alempi vilkkuvalo E

    Vilkkuvalon nostaminen ja komennon/tietojen syöttäminen väylään voidaan vaihtaa. Nyt näytön alustaminen ei ole vaikeaa. Alustuksen yksinkertaistamiseksi korvaamme varattu-lipun lukemisen viiveellä ja harkitsemme lipun käyttöä myöhemmin.
    On huomioitava, että alustuksen aikana 4-bittisessä tilassa käytetään 4-bittisiä käskyjä ja alustuksen jälkeen 8-bittistä käskyjärjestelmää, joten alustukseen toteutamme erillisen toiminnon komentojen lähettämistä varten. void Write_Init_Command(uint8_t data).
    //Atmega16:n alustuskoodi #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define RW 1 #define E 2 #include #sisältää void Write_Init_Command(uint8_t data) ( //jalat, joiden kautta komennot/tiedot välitetään LCD_DDR-lähtöön |= DATA_BUS; //lähetämme komennon LCD_PORT &= ~(1<Iloisesti vilkkuva kohdistin osoittaa, että alustus onnistui. SISÄÄN