Lai ienāktu
Visi datoru noslēpumi iesācējiem un profesionāļiem
  • Spēles un simulatori par tvertnēm datorā (PC) - apskats un apraksts
  • Iegūstiet: zelta naudu, mutantu nemirstību
  • YAN Yandex Direct - kas tas ir un kā uzlabot atdevi
  • Google Pixel Buds bezvadu austiņas ar tulkotāju - pārskats Google Pixel Buds bezvadu austiņu priekšrocības un trūkumi, cena
  • Kā dažādos veidos izveidot vizītkarti programmā Microsoft Word?
  • Dators pārstartējas pats - mēs saprotam iemeslus, kāpēc dators pastāvīgi pārstartējas, ko darīt
  • Programma mijiedarbībai starp PIC16 un LCD indikatoriem. Darbs ar rakstzīmju LCD, pamatojoties uz HD44780 kontrolieri LCD monitora uzstādīšana un inicializācija

    Programma mijiedarbībai starp PIC16 un LCD indikatoriem.  Darbs ar rakstzīmju LCD, pamatojoties uz HD44780 kontrolieri LCD monitora uzstādīšana un inicializācija

    Apskatīsim mijiedarbību starp lietotāju un ierīci, kuras pamatā ir mikrokontrolleris. Ļoti bieži lietotājam ir nepieciešams kaut kā ievadīt informāciju un no kaut kā to izlasīt. Šiem nolūkiem tastatūra un displejs () ir ļoti piemēroti. Apsveriet mijiedarbību starp lietotāju un ierīci, kuras pamatā ir mikrokontrollers. Ļoti bieži lietotājam ir nepieciešams kaut kā ievadīt informāciju un no kaut kā to izlasīt. Tastatūra un displejs () ir ļoti piemēroti šiem nolūkiem. Šajā piezīmē mēs sīkāk aplūkosim informācijas attēlošanu uz simbolikas LCD ar zīmju sintezēšanu.

    Šādus rādītājus bieži izmanto, izstrādājot digitālās ierīces, tāpēc jums ir jāzina, kā ar tiem strādāt.
    Apskatīsim tipisko zīmju sintezēšanas iekšējo struktūru LCD:

    HD44780 iekšējā struktūra

    LCD pamatā ir šķidro kristālu matrica, kuras elementam pieliekot spriegumu, mēs varam “izgaismot” punktu uz ekrāna. Mūsu gadījumā matrica sastāv no pazīstamām telpām (visbiežāk 8x5 pikseļi), kas sagrupētas vairākās rindās. To visu pārvalda iebūvētais HD44780 kontrolieris. Kontrolierim ir viena baita atmiņas šūnas ( DDRAM), kuras saturs faktiski tiek parādīts ekrānā saskaņā ar tabulu, kas ierakstīta CGRAM. Parasti ir vairāk atmiņas šūnu, nekā ir pazīstamo LCD, tāpēc datu lapā jāskatās pazīstamu vietu adresēšana. Tas ir, mums tikai jāieraksta vēlamās rakstzīmes kods vēlamajā pozīcijā un viss pārējais HD44780 darīs pats.

    Lai izvēlētos pozīciju, ir virtuāls kursors (pašreizējās atmiņas šūnas numurs, AC), kuru var vadīt ar komandām, kursoru var padarīt redzamu. Pēc noklusējuma, rakstot rakstzīmi šūnā, kursors pārvietojas vienu pozīciju uz priekšu. Rakstzīmju kodi priekš LCD atbalsta kirilicu var redzēt tabulā:

    Koda augstā tetrade būs vienāda ar izvēlētā simbola rindu, un zemā tetrade būs vienāda ar līniju. Jūs varat izveidot savu simbolu tabulu, ierakstot to CGRAM. Katrai rakstzīmei nepieciešami 5 baiti, kur tie ir atbildīgi par “izgaismotajiem” pikseļiem. Piemēram, skaitlis "8" ir kodēts kā 0x6c,0x92.0x92.0x92.0x6c.
    Komandu kodi ir norādīti tabulā.

    Rakstzīmju tabula HD44780


    Karoga nozīme:


    Atklāts paliek jautājums: "kā uzrakstīt vajadzīgā simbola kodu vajadzīgajā pozīcijā?" Lai to izdarītu, apskatīsim, par ko ir atbildīgi secinājumi. LCD. secinājumus DB0-DB7 ir atbildīgi par ienākošajiem/izejošajiem datiem. Augsts līmenis RS tapā norāda indikatoram, ka signāls pie tapām DB0-DB7 ir dati, un zems ir komanda. Secinājums W/R atbild par datu virzienu neatkarīgi no tā, vai dati tiek ierakstīti atmiņā vai nolasīti no tās (parasti lasot no LCD netiek izmantots, mēs varam droši piemērot zemu līmeni). Izejas impulss E(ar ilgumu vismaz 500 ns) tiek izmantots kā signāls datu rakstīšanai/nolasīšanai no tapām DB0-DB7, R.S. Un W/R.

    Secinājums V0 izmanto, lai iestatītu attēla kontrastu, tapas A, K - lai darbinātu fona apgaismojumu (ja jūsu modelim tāds ir LCD). Atlikušie 2 kontakti ir faktiskais barošanas avots. LCD. Tas ir, kontrolēt LCD Būs nepieciešami 8+1+1=10 tapas. Bet jūs varat strādāt 4 bitu interfeisa režīmā. Šajā gadījumā vispirms tiks pārsūtīta augstākā komanda/datu tetrada uz tapām DB4-DB7 un pēc tam zemākā. Secinājumi DB0-DB3 netiek izmantoti. Kopumā vadībai ir nepieciešamas 6 mikrokontrollera tapas.
    Tagad apskatīsim dzīvu piemēru. Rakstīsim programmu teksta izvadīšanai "vietne" uz to, kas man ir noliktavā WH1602A(2 rindiņas pa 16 rakstzīmēm).

    Attiecībā uz citiem LCD, jums jāpārbauda šūnu atbilstība DDRAM paziņas. Savienojuma shēma LCD uz kontrolieri izskatās šādi.

    Savienojuma shēma ar AVR mikrokontrolleru


    Rezistors R3- 17 omi ierobežo strāvu caur fona apgaismojumu un maiņstrāvu VR1 iestata kontrastu (ja viss ir savienots un ieprogrammēts pareizi, bet indikators klusē, pagrieziet VR1, lai attēls kļūtu redzams). Tāpat nekādā gadījumā nedrīkst jaukt polaritāti. LCD, baro to virs 5,5V, pēc savas pieredzes varu teikt, ka tie uzreiz sadeg. Visu pārējo daļu mērķis ir tāds pats kā šajā
    Tagad pāriesim pie programmas rakstīšanas. Lai kontrolētu indikatoru, mēs uzrakstīsim programmu ar vairākām galvenajām funkcijām darbam LCD: lcd_dat(unsigned char x) – datu rakstīšanai x, lcd_com(unsigned char x) – komandas x rakstīšanai, lcd_init(void) – indikatora sākotnējai inicializācijai:

      #iekļauts //ievades/izvades bibliotēka

    1. #define RS 2 //RS=PD2 - LCD vadības signāls

      #define E 3 //E=PD3 - LCD vadības signāls

    2. #define TIME 10 //Laika aizkaves konstante LCD

      //MK takts frekvence - 4 MHz

    3. //Aizkaves ģenerēšanas programma

      tukša pauze (neparakstīts a)

      ( unsigned int i;

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

    5. //Programma komandu pārsūtīšanai uz LCD

      void lcd_com (unsigned char lcd)

      ( unsigned char temp;

    6. temp= (LCD& ~(1<< RS) ) | (1 << E) ; //RS=0 ir komanda

      PORTD= temp; //Izvada komandas nozīmīgāko tetradu RS, E signālus uz portuD

      asm("nop");

      PORTD= temp& ~(1<< E) ; //Komandas ierakstīšanas signāls

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

      PORTD= temp; //Izvada komandas zemās kārtas tetradu, signalizē RS, E uz portuD

      asm("nop"); //Neliela 1 MK cikla aizkave, stabilizēšanai

      PORTD= temp& ~(1<< E) ; //Komandas ierakstīšanas signāls

    8. pauze (10 * LAIKS) ; //Pauze komandas izpildei

    9. //Programma datu ierakstīšanai LCD

      void lcd_dat (neparakstīts char lcd)

      ( unsigned char temp;

    10. temp= (lcd| (1<< RS) ) | (1 << E) ; //RS=1 ir dati

      PORTD= temp; //Nozīmīgākos datu tetra, RS, E signālus izvadīt uz portuD

      asm("nop"); //Neliela 1 MK cikla aizkave, stabilizēšanai

      PORTD= temp& ~(1<< E) ; //Datu ierakstīšanas signāls

    11. temp= ((lcd* 16 ) | (1<< RS) ) | (1 << E) ; //RS=1 ir dati

      PORTD= temp; //Izvadīt zemas kārtas datu tetrad, RS, E signālus uz portuD

      asm("nop"); //Neliela 1 MK cikla aizkave, stabilizēšanai

      PORTD= temp& ~(1<< E) ; //Datu ierakstīšanas signāls

    12. pauze(TIME) ; //Pauze datu izvadīšanai

    13. //LCD inicializācijas programma

      void lcd_init(void)

      lcd_com(0x2c) ; //4 vadu interfeiss, 5x8 rakstzīmju izmērs

      pauze(100 * LAIKS);

      pauze(100 * LAIKS);

      pauze (100 * LAIKS) ;

    14. //Galvenā programma

      int galvenais (neesošs)

      DDRD= 0xfc; //Inicializēt portuD

      PORTD= 0x00;

    15. pauze (1000);

      lcd_init() ; //LCD inicializācija

    16. lcd_dat("w") ; //Izvadīt "www.site"

      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" ); //Uzrakstiet "Tas ir tik vienkārši"

      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. kamēr (1) //bezgalīgs cikls

    19. atgriešanās 1 ;

    Programma ir ļoti vienkārša, to nebūs grūti saprast ikvienam, kam ir kaut nedaudz zināšanu. C Priekš AVR. Latīņu valodai un cipariem ASCII kodi atbilst tiem, kas ieprogrammēti rakstzīmju ģeneratorā LCD, tāpēc to ir atļauts izmantot lcd_dat('A'). Varat izveidot savu bibliotēku darbam ar LCD, atdalot funkcijas lcd_dat(unsigned char x), lcd_com(unsigned char x), lcd_init(void) atsevišķā modulī. LCD.h un pievienojiet to pēc vajadzības.

    Šī ideja ietaupa daudz laika; vajadzīgās funkcijas ir jāieraksta tikai vienu reizi un pēc tam tās visu laiku jāizmanto. Varat arī atzīmēt, ka ir neērti izvadīt garu frāzi pa vienam burtam; lai to izdarītu, varat ievietot mūsu izvades virkni neparakstītas rakstzīmes masīvā un izvadīt to, izmantojot cilpu:

      int galvenais (neesošs)

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

      neparakstīts char i;

      DDRD= 0xfc; //Inicializēt portuD

      PORTD= 0x00;

    1. pauze (1000); //Aizkavējiet, lai LCD būtu laiks ieslēgties

      lcd_init() ; //LCD inicializācija

    2. par (i= 0 ; i< 14 ; i++ ) //Izvadiet ierakstu burtu pa burtam

      lcd_dat(data[i] );

    Vienkārši neaizmirstiet, ka masīva numerācija C sākas no nulles. Esošo programmu var izmantot kopā ar kontrolieri bez būtiskām izmaiņām ATtiny2313, savieno LCD Uz PORTB, kā PORTD plkst ATtiny2313 ir tikai 7 tapas, nevis 8, piemēram ATmega8.

    Iesaku arī pieslēgties LCD izmantojot noņemamus savienojumus. Tas ir ļoti ērti, veicot programmas atkļūdošanu, kad nepieciešams parādīt dažus starpposma datus. Es pievienoju vienu savienotāju un viss. Turpinot šo piezīmi, tuvākajā nākotnē es apsvēršu lasītās informācijas parādīšanu LCD.
    Jauku dienu visiem ;)

    šajā piemērā ir neliels trūkums

    Šajā piemērā ir neliels trūkums, iespējams, šī iemesla dēļ piemērs daudziem neder!

    Kopumā piemērs ir lakonisks un vienkāršs, tāpēc mazais trūkums nekrīt acīs (tiem, kas zina “C” valodu), un vēl jo vairāk tiem, kas tikai iepazīstas ar AVR un “C” ” valoda, iespējams, viņi pat ir neizpratnē, kā tas notika... .raksta, dari tā un būs kā bildē....bet tā nav...

    Kopumā visa problēma ir ar aizkaves cikliem, lai displejs sekotu kontrollerim, proti, funkcijā -

    //Aizkaves ģenerēšanas programma

    tukša pauze (neparakstīts a)

    ( unsigned int i;

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

    no pirmā acu uzmetiena šķiet, ka viss ir pareizi, bet kompilatori mikrokontrolleriem cenšas optimizēt kodu, lai iegūtais programmu zibatmiņas attēls būtu maksimāli kompakts... un neredzot jēgu tukšai cilpai un attiecīgi tālāk ķēdē pēc tam tas: visi izsaukumi, konstantu deklarācijas un viss ar to saistītais šī funkcija pēc viņa domām ir bezjēdzīga... montāžas laikā vienkārši noņem no koda...

    vismaz tas attiecas uz atmel studio 6.1, un par to var pārliecināties, apskatot projekta mapi, tur ir *.lss fails, kurā ir šīs programmas montāžas kods, kas ģenerēts, veidojot projektu. nav mājienu par tukšuma pauzes funkcijas ieviešanu...

    rezultātā mirgojot kontrollera programmaparatūrai, displejā parādās nejauši atkritumi vai tukšums... vairākas reizes nospiežot reset, atkritumi var pazust un atkal parādīties... redzams, ka procesors un ekrāns ir ārā no sinhronizēt

    bet ja veicat nelielu labojumu

    tukša pauze (neparakstīts a)

    ( unsigned int i;

    priekš (i=a;i>0;i--)
    asm("nop");

    Tad kompilatoram tas ir loģiski, to apstiprina arī acīmredzamais funkcijas ieviešanas izskats montāžas kodā

    0000006c
    :
    6c:9c 01 movw r18, r24
    6e: 03 c0 rjmp .+6 ; 0x76
    70:00 00 nē
    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

    un visticamāk viss izdosies....vismaz man uz atmega16 (iekšējā RC sinhronizācija 1Mhz) un izmantojot atmel studio 6.1 bija tieši tā...varbūt citās frekvencēs būs jāspēlē ar konstanti #define TIME 10 un/vai vērtības, kas nodotas funkcijai void pause

    šeit-> pauze(vērtība) ...vai pauze(vērtība*TIME) ....

    Veiksmi, mācoties darboties ar AVR!

    Iedomājieties, ka LCD -

    Paskatieties, iedomājieties, ka LCD ir rakstāmmašīna, papīrs rakstāmmašīnā ir LCD atmiņa, kariete ir kursora rādītājs. Turklāt LCD nerāda visu atmiņas saturu, bet tikai daļu. Šķiet, ka tas ir logs, ko mēs uzstādījām uz papīra ar tekstu.

    Šeit I/D nosaka, kā mēs drukāsim, no labās uz kreiso vai no kreisās uz labo.
    S nosaka, vai mēs pārvietosim ekrāna logu rakstīšanas laikā vai nē.
    S/C - vienkārši pārvieto redzamo ekrāna logu vai rakstāmmašīnas karieti.
    R/L - norāda, kur (pa kreisi vai pa labi) mēs pārvietosim ekrānu vai kursus, izmantojot S/C karogu.

    Man liekas, ka kaut kā pietrūkst!

    Es noplēsu jūsu programmu un proteus, un nesākšu ar mega8. Ekrāns ir kluss, es sāku rakties pa datu lapām un atradu šādu:
    Trūkst pirmo trīs inicializācijas!

    0011 — uzgaidiet 5 ms
    0011 — pagaidiet 100 µs
    0011 — pagaidiet 2 ms
    0010 — pagaidiet 41 µs
    0000 - un-
    0010 - un-
    1000
    0000
    1000
    0000
    0001
    0000
    0100

    palabojiet mani, ja kļūdos!

    Nestrādā!

    Mēģināju mainīt pulksteņa frekvences, aizkavi inicializācijas laikā un simbolu (komandu) izvadīšanu, pagaidām bez panākumiem. Attiecībā uz drošinātājiem, ja vēlaties konfigurēt D porta tapas, izmantojot DDRB, PORTD reģistrē kā zemas žurnāla izejas. līmenī, tad es to izdarīju.
    Nekā cita darāmā es, izmantojot CodeVisionAVR rīkus, sastādīju vienkāršu simbolu izvades programmu, ieliku PROTEUS - darbojas!... bet atsakās strādāt ar īstu LCD..

    Nē, es par to runāju

    Nē, es runāju par to, ka mēģiniet, piemēram, uz portu D ievietot mirgojošu gaismu vai vienkārši izgaismot visu portu uzreiz. Kad es nopirku tikai mikrokontrolleri, es to nevarēju izdarīt. Izpētīju forumus un izrādījās, ka drošinātāji tur kaut kā ieprogrammēti un nav ieslēgts D ports un visi tā 8 biti. Pārbaudiet šo punktu vai, vēl labāk, mēģiniet pārvietot LCD uz citu portu, piemēram, uz B. Tas, ka programma darbojas Proteus, bet ne ar reālo, ir atšķirība starp Proteus aizsērējušā LCD parametriem un īsts.

    Nestrādā!

    Es visu saliku un savienoju, kā norādīts diagrammā, tikai MK izmantoja ATmega16 un LCD WH1602M, un attiecīgi kompilēja programmaparatūru tam WinAVR. Taču LCD neko atteicās izvadīt, es arī savācu Proteusā (uz ATmega 8 un LM016L), dati no MK tiek izvadīti, bet uz LCD nekas nav redzams. Kāda varētu būt problēma? (Ja tas ir svarīgi, izmantojiet iekšējo RC oscilatoru, lai pulksteņa frekvence būtu 1 MHz)

    1. Par Atmega16 jums ir nepieciešams

    1. Atmega16 vispirms ir jāieslēdz drošinātāji, lai ports D darbotos.
    2. Mēģiniet mainīt pulksteņa frekvenci uz 4 MHz un 8 MHz. Visa LCD problēma ir tāda, ka visas pauzes netiek uzturētas inicializācijas vai komandas izdošanas laikā. Un LCD kontrolleris ir ļoti jutīgs pret to.

    Man ir jautājums:
    Es saliku Mega 8 hronometra ķēdi ar gatavu sešstūri - rādījumi tiek parādīti WH0802,
    indikācija ir trīs ciparu skaits, kas tiek parādīts visā ekrānā, viens cipars sastāv no 4 rakstzīmēm. Pseidografiskais ekrāns. Kā varētu uzrakstīt programmaparatūru??
    Autors kategoriski atsakās sniegt pirmkodu un nekomentē darbu, iespējams, “intelektuālā īpašuma” apsvērumu dēļ.
    Brīvajā laikā es vēlos mēģināt uzrakstīt savu programmaparatūru izglītības nolūkos.

    Es saskāros ar šo

    Es saskāros ar šo situāciju.
    Ir divi LCD 16x2:
    1 — MTC-S16204XFGHSAY
    2 — WH1602A-YGH-CTK

    Pirmo izmantoju projektā ar GPS.
    Es nolēmu izmantot otro projektā ar tastatūru. Bet kādu iemeslu dēļ LCD nedarbojas.
    Kontrasts tiek noregulēts un parādās kvadrāti. Tas ir viss.
    Iespējams, ir cita inicializācijas secība.
    Palīdziet man saprast
    Šeit ir datu lapas
    filebox.od.ua/?file=24a31fc50d62bfcd658bdadac84088ab

    Displeji neatšķiras.

    Displeji neatšķiras. Pinout ir tāds pats. Laiks nedaudz atšķiras. Mēģiniet palielināt aizkavi, sūtot komandas uz LCD, vai samazināt mikrokontrollera frekvenci.

    Visiem HD44780 LCD ekrāniem ir identiska komandu sistēma. Kādu interfeisu jūs izmantojat, 4 bitu vai 8 bitu? Mēģiniet arī palielināt aizkavi starp LCD ieslēgšanu un tā inicializāciju līdz aptuveni 0,1 s. Vai LCD barošanas bloka polaritāte nav sajaukta, vai viņiem ir nepieciešams nedaudz izdegt? Es muļķīgi to kaut kā sadedzināju un tad mēģināju savienot. Tika parādīti arī melni kvadrāti, dati tika parādīti katru otro reizi, t.i. strādāja ļoti nestabili.

    Es izmantoju programmas no rakstiem

    Es izmantoju programmas no rakstiem par GPS.
    4 bitu interfeiss

    Es izmēģināju programmu no šejienes
    chipenable.ru/index.php/programming-c/75-chasy-na-mikrokontrollere.html

    tas strādāja

    Kas būtu jāmaina savā programmā?

    Pievērsiet uzmanību kavējumiem

    Pievērsiet uzmanību aizkavei pēc inicializācijas un konfigurācijas komandu izdošanas, tā var būt. Man arī bija līdzīgs gadījums, bet abi kontrolieri bija vienādi, un programma darbojās tikai vienā.

    Analogi HD44780

    Man radās problēma — es nevaru atrast WH1602A LCD par saprātīgu cenu. Piemēram
    programmā chipdip tie ir pieejami chipdip.ru/product/wh1602a-ygh-ct-k.aspx
    700 koka. Kas ir YGH nosaukumā "WH1602A-YGH-CT(K), LCD 16x2, angļu-krievu valoda"
    Kādi ir LCD analogi, kuru pamatā ir HD44780? Es atradu lapu micronika.ru/order.phtml?vid=64 - tur nosaukums FDCC1602A-FSBFBW-51SR satur 1602A,
    Es tikko pamanīju. Varbūt FDCC1602A-FSBFBW-51S darbosies bez lielas koda maiņas?
    Kādas problēmas var rasties, lietojot
    nevis patiesais HD44780 no Hitachi, bet gan tā analogi?
    PS Nebūtu slikta doma lasīt par citu LCD, HD44780 analogu izmantošanu nekā MELT.
    LCD ir slikti

    Šajā rakstā es sniegšu piemēru vienai no opcijām šķidro kristālu burtu un ciparu indikatora inicializācijai uz HD44780 vai KS0066 kontrollera platformas iesācējiem programmētājiem montāžas valodā saistībā ar PIC16 mikrokontrolleriem.

    Šī programma ir daļa no temperatūras un mitruma mērītāja programmas, kas aprakstīta rakstā "". Lai ērtāk strādātu ar rakstu un programmas avota failu, labāk vispirms lejupielādēt projektu, izdrukāt avota failu un novietot to sev priekšā. Rakstot programmu LCD displeja inicializācijai, uz indikatora rakstīt komandas un displeja simbolus, labāk izmantot šim nolūkam izveidotos makro. Apskatīsim ekrānu.

    Pēc teksta aizstāšanas direktīvām ir makro - mazas programmas, kurām var piekļūt no galvenās programmas, cik vien vēlaties, jebkurā laikā. Pirmais makro, impuls_E, nodrošina, ka pa taisno līniju E, stingrības un sinhronizācijas līnijām, tiek saņemts stingra impulss. 14. rinda – rindiņā iestata loģisko, caur divām NOP pseidokomandām, 17. rinda – loģisko nulli. Tādējādi mēs saņemam pozitīvu impulsu uz līnijas E ar ilgumu 2 μs pie kvarca oscilatora frekvences 4 MHz. Nākamais makro ir Load_Znak. Ļauj mums ielādēt simbola kodu DR reģistrā, lai to parādītu indikatorā. Jūs ievērosiet, ka šajā makro ir izsaukums uz citu makro, kas rakstīts zemāk. Apskatīsim send_LCD makro. 26. rindiņa – lasīt Write_data reģistra saturu, t.i. rakstzīmes kods, kuram tajā jābūt. Rinda - 27, samainiet reģistra augsto un zemo nibbles. Rinda – 28, mēs izvēlamies rakstzīmju koda augsto nibble, kas jau atrodas zemajā nibble, un izvadām šos datus uz portu B. Fakts ir tāds, ka datu ierakstīšana indikatora kontrollera 4 bitu darbības režīmā notiek secīgi, vispirms reģistra augstais nibls, tad juniors - 31. līnija... 33. Pēc nibla pārraidīšanas jāģenerē stroboskopa impulss. Tas ir tas, ko mēs redzam, 30. un 34. rinda. Lai displeja kontrolleris apstrādātu informāciju, makro tika ieviesta 200 mikrosekundes ilga aizkave. Pēc mūsu izveidotajiem makro ir standarta procedūra mikrokontrollera inicializācijai. Rakstā "" es runāju par LCD displeju galvenajām īpašībām un pieskāros tēmai par savu simbolu izveidi. Kā jau teicu iepriekš, manos rādītājos nav grādu simbola. Tāpēc mēs to ielādēsim indikatora rakstzīmju ģeneratorā. Lai to izdarītu, mēs uzrakstīsim nelielu apakšprogrammu, kurai jāatrodas aiz mikrokontrollera inicializācijas procedūras un pirms galvenās programmas Apakšprogramma sākas 69. rindā, kur ievadām adreses kodu CGRAM apgabalā, 40h - pirmais lietotājs adrese tiks saglabāta zem šīs adreses. Apskatiet 2. ekrānuzņēmumu.

    Tā kā katra rakstzīme aizņem astoņus atmiņas reģistrus, nākamā mūsu izveidotā rakstzīme sāksies ar adresi 40h + 08h = 48h. Nākamais ir 48h + 08h = 50h. Neaizmirstiet, ka saskaitīšana notiek heksadecimālajā skaitļu sistēmā. Un tā, 69. un 70. rinda – simbola sākuma adreses ielāde. Tālāk seko alternatīvs rakstzīmju koda astoņu baitu ieraksts. Mēs ņemsim grādu simbola kodu no LCDCC programmas.

    Mums būs nedaudz jāatkārto tas, kas bija rakstā “Šķidro kristālu burtciparu indikatori”. Apskatīsim šīs programmas ekrānuzņēmumu. Noklikšķinot uz matricas šūnām, mēs uzzīmējam vajadzīgo simbolu, šajā gadījumā tā ir simboliskā pakāpes ikona. Zemāk programma uzreiz ieraksta kodus izvēlētajiem matricas punktiem. Tagad mums ir jāieraksta šie kodi indikatora kontrollerī. Tā mēs arī izdarījām. Tagad esam sasnieguši paša indikatora inicializāciju. Apskatiet 3. ekrānuzņēmumu.

    Piemēram, pirms inicializācijas mēs ierakstīsim datus reģistros, lai indikatoram izvadītu vērtības. Ievadīsim, piemēram, temperatūras vērtību 21,7 grādi. Tad veidosim projektu Proteusā un skatīsimies, ko izdomāsim. Tātad. 3. ekrānuzņēmums, 88... 93. rinda – skaitļu rakstīšana reģistros. Inicializācija sākas ar InitLCD etiķeti, kā paredzēts, mēs gaidām vismaz 15 ms. Pēc pauzes, 98... 100. rindas, ierakstiet skaitli trīs Reg_3 reģistrā - tas būs komandas pārsūtīšanas reižu skaits 30h = b’0011 0000’ (30h). Un mēs ierakstām trīs porta B reģistrā, lai pēc tam rakstītu indikatora kontrollerī, šis skaitlis trīs atrodas komandas augstajā pusbaitā. Mēs veidojam strobe impulsu, 102. līnija, pauze uz 5 ms. Mēs atgriežamies pie Setloop etiķetes. Mēs nosūtām komandu līdz Reg_3 reģistra atiestatīšanai, t.i. trīs reizes. Pēc šīs komandas pārsūtīšanas indikatora kontrolleris būs gatavs darbam, bet 8 bitu režīmā. Tagad pārslēgsim to uz 4 bitu režīmu. Lai to izdarītu, mēs nosūtīsim komandu 20h. Ņemiet vērā, ka komandas tiek rakstītas indikatora kontrollerim 4 bitu režīmā. Tātad, mums ir komanda 20h vai 0010 0000. Tā kā 4 bitu režīmā komandas tiek pārraidītas divos posmos, vispirms reģistra nozīmīgākās niblas datus, ievadām tos B porta reģistrā un ierakstām uz indikatora kontrolieris, un, tā kā zemākā nibble ir tukša, mēs neko nepārraidām.

    Pēc 2 ierakstīšanas pieslēgvietā B, mēs strobojam līniju E un apstājamies 200 us. Tagad indikators darbosies 4 ciparu režīmā. Nākamā komanda ir darba režīma iestatīšanas komanda - divas rindiņas, fonts - 5x7. Komandas kods 28h. Tālāk nāk komanda 0C, lai ieslēgtu indikatoru. Tad es domāju, ka jūs to sapratīsit. Jā, nedaudz vairāk. Programmā Proteus mūsu izveidotā grādu ikonas simbols netiek parādīts pareizi; tas parāda divus punktus, lai gan patiesībā viss darbojas labi. Apskatīsim fotoattēlu. Veiksmi.

    Mūsdienās simboliskos šķidro kristālu LCD indikatorus arvien vairāk izmanto, lai parādītu vienkāršu simbolisku informāciju. Mēs runāsim par to, kā ar viņiem strādāt. Šajā raksta daļā mēs detalizēti aplūkosim rakstzīmju LCD ekrānus, kuru pamatā ir HITACHI HD44780 kontrolleris (vai saderīgais SAMSUNG KS0066). Raksts ir mēģinājums sistematizēt informāciju, ko atradu, strādājot ar šiem LCD.

    Rakstzīmju LCD ar kontrolieri HD44780 (KS0066). Interfeiss

    Rakstzīmju LCD ir nekas vairāk kā punktu matrica, kas sadalīta līnijās un rakstzīmju laukos:

    Lai kontrolētu šo matricu un izvadītu faktiskās rakstzīmes, tiek izmantots īpašs kontrolleris.

    HD44780 (un ar to saderīgais KS0066) ir de facto standarts vienkrāsainu LCD rakstzīmju sintezējošo displeju kontrolleriem ar paralēlu 4 vai 8 bitu interfeisu. Pamatojoties uz šo kontrolieri, tiek ražots milzīgs skaits modeļu ar dažādu dizainu un izšķirtspēju, sākot no 8x1 (astoņas rakstzīmes vienā rindā) un beidzot ar 40x4 (satur divas neatkarīgas vadības mikroshēmas). Regulatora tipiskā darba frekvence ir 270 kHz.

    LCD kontrolleris darbojas ar 3 atmiņas blokiem:

    1. Kontrolieris izmanto atmiņu, lai izvadītu rakstzīmi DDRAM(Display Data RAM), kur tiek glabāti to rakstzīmju ASCII kodi, kuras vēlamies redzēt LCD. Tam ir atvēlētas 80 atmiņas šūnas. Ir skaidrs, ka LCD mēs redzēsim tikai daļu no rakstzīmēm, kas atrodas DDRAM — ja mūsu LCD ir 1 vai 2 rindas un parāda 8 rakstzīmes katrā rindā, tad šādi:

    Displeja darba zonu, kā redzat, var pārvietot pa DDRAM šūnām (jūs iegūstat ložņu līnijas efektu).

    2. Kontrolieris ņem pašu simbolu veidnes no CGROM(Character Generator ROM) – rakstzīmju ģeneratora atmiņa. Simbolu tabulu var atrast HD44780 specifikācijā.

    3. Atmiņa ir paredzēta lietotāja simbolu (to veidņu) glabāšanai CGRAM(Rakstzīmju ģeneratora RAM).

    Tāpat pārzinis, atkarībā no noteiktiem nosacījumiem, izplata tajā saņemtos datus instrukciju reģistrs vai datu reģistrs.

    Tipisks 14 kontaktu HD44780 kontrollera interfeiss:

    Zeme, kopējā, GND

    Barošanas spriegums, Vcc (+5 V)

    Kontrasta pielāgošana (Vo)

    Reģistra atlase (R/S HD44780, A0 KS0066)

    Lasīt/rakstīt (R/W)

    Stroboskops rudenī E (iespējot)

    Bits 0 (mazsvarīgs 8 bitu interfeisam)

    Datu līnija

    DB 4 (mazsvarīgs 4 bitu interfeisam)

    DB 7 (augsts 8 (4) bitu interfeisam)

    Displejam ar aizmugurgaismojumu

    Fona apgaismojuma jauda displejiem ar aizmugurgaismojumu (anods)

    Fona apgaismojuma jauda displejiem ar aizmugurgaismojumu (katods)

    Mēs aplūkojam tapu numerāciju uz konkrēta LCD datu lapā.

    Attēla kontrastu LCD ekrānā var mainīt, pievienojot papildu 10 kOhm apgriešanas rezistoru saskaņā ar šādu diagrammu:

    Bet jums vajadzētu apskatīt kontroliera specifikāciju (piemēram, Klsn10294v-0 LCD uz KS0066 mikroshēmas ir 1-Vcc un 2-GND). Fona apgaismojuma barošanas avots var atšķirties atkarībā no modeļa atkarībā no tā veida. Parasti fona apgaismojumu darbina ar 5 voltiem; strāvas ierobežošanas rezistors (50–100 omi) parasti nav obligāts.

    Pin piešķiršana R/S, R/W, E:

    Kad E pāriet no augsta log. līmenī līdz zemam datiem, kas jau “karājas” terminālos DB0..DB7, tiek ierakstīti LCD kontrollera atmiņā turpmākai apstrādei.

    Pie augsta baļķa. līmenī R/S (Register Select), LCD kontrolleris šo bitu kopu uztver kā datus (rakstzīmju kodu), bet zemā līmenī – kā instrukciju un nosūta tos uz attiecīgo reģistru.

    R/W nosaka tapu DB0..DB7 darbības virzienu - ja R/W ir “0”, tad varam rakstīt tikai uz DB portu, un ja R/W = “1”, tad no tā varam lasīt. (piemēram, noskaidrojiet, vai kontrolieris ir aizņemts vai brīvs, lai saņemtu jaunus datus). Ja mēs nelasām datus no LCD, tad R/W varam “stādīt” zemē.

    HD44780 instrukciju komplekts

    Lai sāktu informācijas attēlošanu LCD, tā kontrolleris ir jāinicializē (informē par interfeisu, fontu, nobīdēm utt.). Kontrolieris kopumā var pieņemt 11 komandas:

    Instrukcijas nosaukums

    Piespraudes statuss

    Pabeigšanas laiks

    f vergs = 270 kHz

    Notīriet visu LCD ekrānu un iestatiet DDRAM adresi uz 0

    Iestatot pašreizējo DDRAM adresi uz 0 (kursors - mājas), DDRAM dati nemainās

    Kursora kustības virziena (I/D) un displeja nobīdes (S) iestatīšana, izvadot datus

    Displeja ieslēgšanas/izslēgšanas vadība

    Ieslēgts Izslēgts. displejs (D), kursors (C) un tā mirgošana (B)

    Kursora vai displeja maiņa

    Pārvieto kursoru un pārvieto displeju pa DDRAM

    Interfeisa (DL), rindu skaita (N) un rakstzīmju fonta (F) iestatīšana

    Iestatiet CGRAM adresi

    CGRAM adrešu skaitītāja iestatīšana. Pēc tam jūs varat ierakstīt datus CGRAM

    Iestatiet DDRAM adresi

    DDRAM adreses skaitītāja iestatīšana

    Lasiet aizņemtības karogu un adresi

    Ja BF = 1, LCD kontrolleris veic iekšēju darbību (aizņemts). AC6-AC0 – pašreizējā DDRAM adreses vērtība

    Ierakstiet datus RAM

    Datu ierakstīšana RAM

    Lasīt datus no RAM

    Datu nolasīšana no RAM

    I/D = 1: DDRAM adrese palielinās I/D = 0: samazinās
    S = 1: ir atļauta displeja darba zonas pārvietošana, izmantojot DDRAM
    D = 1: displejs (attēls) ieslēgts
    C = 1: kursors ir iespējots
    B = 1: Kursora mirgošana ir iespējota

    S/C = 1: pārvietot displeju S/C = 0: pārvietot kursoru
    R/L = 1: pa labi R/L = 0: pa kreisi

    DL=1:8 biti DL=0:4 biti
    N=1:2 rindas N=0:1 rindas
    F = 1: 5x10 F = 0: 5x8

    ACG:CGRAM adrese
    PIEVIENOT: DDRAM adrese (kursora adrese)
    AC: Adrešu skaitītājs DD un CGRAM adreses

    LCD inicializācija

    Ir divi veidi, kā inicializēt LCD kontrolleri:

    1. Izmantojot iekšējo atiestatīšanas ķēdi.

    2. Manuālajā režīmā (nosūtot uz to vairākas komandas, ar kurām iestatām LCD darbības režīmu)

    Kontroliera iekšējā atiestatīšanas ķēde sāk darboties tūlīt pēc strāvas ieslēgšanas. Tam ir viens trūkums - ja mūsu jauda lēnām “līst” līdz darbības līmenim (lēnāk par 10 ms), tad kontroliera pašinicializācija var nenotikt pareizi. Izmantojot šo inicializācijas metodi, kontrolieris pats izpilda šādas komandas:

    1. Displejs ir skaidrs

    2. Funkciju kopa:
    DL = 1; 8 bitu interfeisa dati
    N = 0; 1 rindas displejs
    F = 0; 5x8 punktu rakstzīmju fonts

    3. Displeja ieslēgšanas/izslēgšanas vadība:
    D = 0; Displejs izslēgts
    C = 0; Kursors izslēgts
    B = 0; mirgošana izslēgta

    4. Iestatīts ievades režīms:
    I/D = 1; Palieliniet par 1
    S = 0; Nav maiņas

    Otrā metode novērš ķēdes atkarību no strāvas avota. Lai inicializētu LCD kontrolleri manuālajā režīmā, jums jāveic šāds algoritms:

    Kā redzat, šeit nav nekā sarežģīta: mēs nosūtām komandu pēc komandas uz LCD, ņemot vērā to izpildes laiku (apmēram 40 μs) vai pārbaudot LCD kontrollera aizņemto karogu (tad mums jāievieto RW tapa mikrokontrollera pēdu un iestatiet to uz “1”, kad vēlamies noskaidrot, vai LCD ir vai nav aizņemts).

    Tas patiesībā ir viss, kas attiecas uz teoriju par darbu ar simboliskiem LCD. Ja kaut ko palaidāt garām vai pieļāvāt kļūdu, izlasiet kontroliera specifikāciju vai .

    Otrajā daļā mēs apskatīsim aparatūras un programmatūras ieviešanu komunikācijai starp PIC mikrokontrolleri un LCD.

    Kādu laiku šis displejs bija dīkstāvē.


    Un tagad ir vēlme pievienot kādam no projektiem Var, protams, mēģināt atrast bibliotēku ar gatavām funkcijām, bet šajā gadījumā attēls, kā displejs darbojas, būs nepilnīgs, un mēs esam nav apmierināts ar to. Kad būsiet sapratis LCD displeja darbības principu, nebūs grūti uzrakstīt savu bibliotēku vēlamajam displejam, ja tā trūkst vai tas kaut kādā veidā nav apmierinošs.

    Tātad, sāksim.
    Pirmā lieta, kas jādara, ir atrast kontaktu, tas ir, kurš kontakts ir atbildīgs par ko, otrs ir atrast tā kontrollera nosaukumu, kas kontrolē displeju, lai to izdarītu, lejupielādējiet šī LCD datu lapu un atveriet to pirmā lapa.


    Kontakti tiek skaitīti no kreisās puses uz labo, pirmais ir atzīmēts ar sarkanu bultiņu. Barošanas spriegums ir 5 volti, vadības kontrolieris S6A0069 vai līdzīgi, piemēram, ks0066U.

    Kāpēc mēs meklējām vadības kontroliera nosaukumu? Fakts ir tāds, ka displeja datu lapā ir laika aizkaves (laika diagramma), komandu sistēma ir aprakstīta, taču nav banālas inicializācijas, un bez tās nav nekur.
    Pēc tam atveriet otro lapu un skatiet tabulu, kurā norādīts, kura kontaktpersona par ko ir atbildīga.


    DB7…DB0– datu/adreses kopne.

    R/W- nosaka, ko mēs darīsim, lasīsim (R/W=1) vai rakstīsim (R/W=0)

    R/S– nosaka, vai sūtīsim komandu (RS=0) vai datus (RS=1)

    E– strobo ieeja, mainot signālu pie šīs ieejas, ļaujam displejam nolasīt/rakstīt datus.

    LED±- fona apgaismojuma vadība.

    Man jāsaka, ka displejā, kuru es saņēmu, fona apgaismojums ne tikai ieslēgsies; lai to izdarītu, jums ir nepieciešams pielodēt rezistoru, kas uz tāfeles atzīmēts kā R7. Bet pagaidām mums tas nav vajadzīgs.

    Lejupielādējiet vadības kontrollera datu lapu un atrodiet inicializācijas norādījumus. Attēlus var palielināt, noklikšķinot uz tiem.



    Izrādās, ka ir divas šādas instrukcijas, 8 bitu un 4 bitu režīmiem. Kādi ir šie režīmi? Šie režīmi nosaka, cik vadu dati tiks pārsūtīti: četri vai astoņi. Apskatīsim transmisiju 4 vadi, šajā gadījumā displejs darbosies lēnāk, taču mēs ietaupīsim 4 mikrokontrollera tapas, un astoņu bitu režīma ieviešana daudz neatšķiras.

    Informācijas savienojuma shēma ir šāda.


    Kontrastu var regulēt, pievienojot potenciometru starp barošanas tapām.

    Vēlos vērst jūsu uzmanību uz to, ka inicializācijas laikā R/S Un R/W vienmēr ir vienādi ar nulli, tas ir, mēs nosūtīsim komandas.

    Inicializācijas laikā varat konfigurēt:

    • N - parādīto līniju skaits
    • C - ieslēdziet vai izslēdziet kursoru
    • B - likt kursoram mirgot
    • I/D - palielināt vai samazināt adreses skaitītāja vērtību
    • SH - pārvietot displeja logu
    Apskatīsim pēdējos divus punktus sīkāk.
    Zemāk redzamajā attēlā redzams, uz kuru adresi mums ir jāraksta dati, lai tie tiktu parādīti noteiktā pozīcijā, piemēram, ja mēs vēlamies parādīt simbolu otrās rindas pirmā pozīcija, tad mums jāraksta uz adresi 0x40.


    Pēc tam skaitītāja vērtība automātiski mainīsies, palielināsies vai samazināsies, un līdz ar to mainīsies arī kursora pozīcija.

    Starp citu, atmiņa, kurā mēs rakstām, tiek izsaukta DDRAM, viss, ko mēs ierakstām šajā atmiņā, tiks parādīts displejā, joprojām ir CGROM, kurā tiek saglabāta rakstzīmju ģeneratora tabula.


    Šo tabulu nevar mainīt, bet no tās var paņemt gatavus simbolus. Cits atmiņas veids ir CGRAM, tā ir arī rakstzīmju ģeneratora tabula, bet rakstzīmes šajā tabulā mēs zīmējam paši.


    Tagad daži vārdi par ekrāna kustību, fakts ir tāds, ka parasti displejā mēs neredzam visu DDRAM, bet tikai noteiktu daļu, kā parādīts attēlā zemāk.


    Mēs varam rakstīt arī neredzamajā daļā, bet tas, ko mēs rakstām, nebūs redzams, kamēr nepārvietosim ekrāna logu uz šo vietu.

    Esam pabeiguši ar teoriju, pāriesim pie prakses.
    Saziņas attēls ar LCD displeju 4 bitu režīmā izskatās šādi.


    Dati tiek sūtīti baitos, bet, tā kā mums ir 4 bitu režīms, lai nosūtītu baitu, ir jāveic 2 sūtījumi, vispirms ar nozīmīgāko bitu. Attēlā pirmais zemes gabals ir apzīmēts ar D7 (augsta tetrada), otrais D3 (zema tetrada). Pirms nākamās sūtīšanas mums ir jāpārbauda aizņemts karogs un, ja tas nav iestatīts, mēs varam nosūtīt vēlreiz; ja tas ir iestatīts, mēs gaidām, kamēr kontrolieris, kas kontrolē LCD, pabeidz savu darbību.

    Ņemot vispārēju priekšstatu par nosūtīšanu, izdomāsim, kā īstenot nosūtīšanas darbību.


    Lai nosūtītu, jāizmanto 8 bitu kopne:
    • R/W iestatīts uz 0
    • izdod komandas kodu/datus kopnei
    • kavēšanās 2us
    • apakšējais strobe E

    Lasīšanas darbība tiek īstenota līdzīgi:

    • pārliecinieties, vai vadības kontrolleris ir brīvs
    • R/W iestatīts uz 1
    • paceliet stroboskopu E (šajā brīdī LCD izvadīs datus uz kopni)
    • kavēšanās 2us
    • mēs lasījām, ko LCD deva
    • apakšējais strobe E
    No kurienes radās 2us kavēšanās?

    Virs hronometrāžas ir tabula, kurā norādīts, ar ko ir vienādas grafikā redzamās aizkaves, un tātad stroboskopa impulsa ilgumam - tw jābūt vienādam ar 230nS vai 450nS atkarībā no barošanas sprieguma, mēs to paņēmām nedaudz ar a. starpība. Kāpēc mēs ņēmām vērā tikai šo kavēšanos? Jo atlikušo kavējumu vērtība ir ļoti maza.

    Lai nosūtītu pa 4 bitu kopni:

    • pārliecinieties, vai vadības kontrolleris ir brīvs
    • iestatiet RS uz 0 (komanda) vai 1 (dati), atkarībā no tā, ko mēs nosūtīsim
    • R/W iestatīts uz 0
    • pacelt stroboskopu E (iestatīts uz 1)
    • autobusam izsniedzam augstāko burtnīcu
    • kavēšanās 2us
    • apakšējais strobe E
    • kavēšanās 1us
    • pacelt stroboskopu E (iestatīts uz 1)
    • izsniedzam zemo tetradu autobusam
    • kavēšanās 2us
    • apakšējais strobe E

    Lai lasītu 4 bitu kopnē:

    • pārliecinieties, vai vadības kontrolleris ir brīvs
    • datu ports ievadei ar uzvilkšanu
    • iestatiet RS uz 0 (komanda) vai 1 (dati), atkarībā no tā, ko mēs lasīsim
    • R/W iestatīts uz 1
    • pacelt stroboskopu E (iestatīts uz 1)
    • kavēšanās 2us
    • izlasi vecāko kladi
    • apakšējais strobe E
    • kavēšanās 1us
    • pacelt stroboskopu E (iestatīts uz 1)
    • kavēšanās 2us
    • mēs lasām apakšējo piezīmju grāmatiņu
    • apakšējais strobe E

    Paceļot stroboskopu un izvadot komandu/datus uz kopni, var apmainīt. Tagad displeja inicializācija nebūs grūta. Lai vienkāršotu inicializāciju, aizņemtā karoga nolasīšanu aizstāsim ar aizkavi, un mēs apsvērsim iespēju strādāt ar karogu vēlāk.
    Jāņem vērā, ka inicializācijas laikā 4 bitu režīmā tiek izmantotas 4 bitu instrukcijas, bet pēc inicializācijas tiek izmantota 8 bitu instrukciju sistēma, tāpēc inicializācijai ieviešam atsevišķu funkciju komandu nosūtīšanai spēkā neesošs Write_Init_Command (uint8_t dati).
    //Atmega16 inicializācijas kods #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 #iekļauts void Write_Init_Command(uint8_t data) ( //kājas, caur kurām komandas/dati tiek pārsūtīti uz LCD_DDR izvadi |= DATA_BUS; //mēs nosūtīsim komandu LCD_PORT &= ~(1<Jautri mirgojošs kursors norāda, ka inicializācija bija veiksmīga. IN