Rakstzīmju parādīšana LCD ar EFM8 mikrokontrolleru

Week 3 (Jūnijs 2019).

$config[ads_text] not found
Anonim

Rakstzīmju parādīšana LCD ar EFM8 mikrokontrolleru


Uzziniet, kā veidot rakstzīmes, izmantojot attēlu redaktoru, un parādiet tos uz LCD, kuru kontrolē EFM8 mikrokontrolleris.

Ievads

Iepriekšējā rakstā tika apskatīts, kā izmantot EFM8 mikrokontrolleru SPI funkcionalitāti, lai parādītu ritināšanu horizontālu līniju 128 līdz 128 pikseļu LCD ekrānā. Šajā rakstā mēs izmantosim to pašu zemā līmeņa interfeisu, lai atjauninātu LCD displeju ar visiem alfabēta lielajiem burtiem; pat labāk, jūs uzzināsiet metodes, kā efektīvi izstrādāt un attēlot jebkuru rakstzīmi vai simbolu, ko var atbilstoši attēlot ar 10 vertikāliem pikseļiem un 8 horizontāliem pikseļiem.

Iepriekšējie raksti šajā sērijā

  • EFM8 sērija no Silicon Laboratories: spēcīga jauna iegulto attīstības platforma
  • LCD kontrole, izmantojot SPI: Ievads projektu izstrādē ar EFM8 mikrokontrolleru

Nepieciešamais aparatūra / programmatūra

  • SLSTK2000A EFM8 novērtēšanas valde
  • Vienkāršības studija integrēta izstrādes vide
  • Scilab

projekta pārskats

Mērķis ir izstrādāt un attēlot visus lielos burtus uz 128 līdz 128 pikseļu LCD. Teksts tiek drukāts uz LCD ekrānu raksturīgajā tekstapstrādes stila režīmā: kursors izseko pozīciju, kurā tiks parādīts nākamais raksturs, un jūs vienkārši "ievadīsit" jaunu rakstzīmi, izsaucot funkciju ar nosaukumu InsertCharacter ().

Fons ir pielāgota fiksēta platuma (un fiksēta augstuma) rakstzīmju kopa, kas izveidota ar metodēm, kas aprakstītas nākamajā sadaļā. Fiksēto rakstzīmju izmērs ir 10 vertikāli pikseļi ar 8 horizontāliem pikseļiem (lai gan rakstzīme faktiski ir ierobežota līdz 9 uz 7 pikseļiem, jo ​​ir iekļauta tukša rinda un tukša kolonna, lai nodrošinātu blakus esošo rakstzīmju nošķiršanu). Šis lielums tika izvēlēts dažādu iemeslu dēļ. LCD ekrāns ir 128 pikseļu platums, tāpēc 8 horizontālie pikseļi nodrošina to, ka visā ekrānā tiek rādīts vienmērīgs rakstzīmju skaits. Mēs izmantojam 10 vertikālos pikseļus, nevis 8, jo iegūtie plānāki burti ir nedaudz patīkamāki acīm. Šie izmēri arī veido burtus, kas ir pietiekami lieli, lai tie būtu viegli salasāmi, tomēr pietiekami mazi, lai LCD vienlaicīgi varētu parādīt nozīmīgu rakstzīmju skaitu. Varbūt vissvarīgākais iemesls ir šāds: kods pikseļu datu kopēšanai no rakstzīmju masīva uz LCD datu buferi ir daudz vienkāršāks ar 8 pikseļu platumu, jo biti, kas attēlo pikseļu stāvokļus, ir saskaņoti ar baitu robežām. Tas nozīmē, ka mēs varam pareizi atjaunināt LCD datus, izmantojot tīru baitu darbus, nevis neveikli (un mazāk efektīvi) bitu operācijas, kurās no viena baita biti jāpārkopē uz daļu no viena baita un otrā baita.

Veidojot rakstzīmes

Vizuālo simbolu translēšana LCD ar saderīgiem datiem ir nopietni neinventīvs process: kurš, iespējams, varētu izdarīt burtu G, piešķirot virkni heksadecimālo vērtību baitu masīvam "//www.getpaint.net/index.html" target = "_ blank" > Paint.NET, spēcīgs, bet bezmaksas attēls un fotoattēlu rediģēšanas lietojumprogramma.

Cits būtisks programmaparatūras papildinājums ir funkcija, kurā pikseļu dati no Scilab radītajiem masīviem tiek ievietoti divdimensiju masīvā, kas satur visu pikseļu datus visam LCD:

Kods

 void InsertCharacter(unsigned char *LCD_Character) //the input to this function is a pointer to a pixel data array { unsigned char n; unsigned char row_pixel; unsigned char column_byte; //rows are handled on a pixel-by-pixel basis row_pixel = LCDCursor(ROW); //columns are handled on a byte-by-byte basis, because one character width is 8 bits column_byte = LCDCursor(COL); /*each byte from the pixel data array is copied to LCDDisplayData, starting with the current cursor position*/ for(n = 0; n < CHAR_HEIGHT; n++) { LCDDisplayData(row_pixel)(column_byte) = *LCD_Character; LCD_Character++; //point to the next byte in the array row_pixel++; //the next byte corresponds to pixel data for the next line } LCDCursor(COL)++; //move the cursor one character width to the right /*if the cursor has reached the end of the line, return the cursor to the far left and move it down by one character height*/ if(LCDCursor(COL) == NUM_LINE_DATA_BYTES) { LCDCursor(COL) = 0; LCDCursor(ROW) = LCDCursor(ROW) + CHAR_HEIGHT; if(LCDCursor(ROW) == NUM_LINES) //if the cursor has reached the end of the display area, LCDCursor(ROW) = 0; //return the cursor to the top line } while(UPDATE_LCD == FALSE); //wait here until Timer2 initiates an LCD update UPDATE_LCD = FALSE; UpdateAllLCDLines(); } 

Lejupielādes kods

Ja pārbaudīsit iepriekš minēto kodu un izlasīsit komentārus, jums vajadzētu būt iespējai uzzināt, kā tas darbojas. Ņemiet vērā, ka šī kārtība atjaunina LCD pikseļu datu masīvu un pārvalda kursora pozīciju.

Šī projekta vispārējā funkcionalitāte ir atkārtoti drukāt visus lielos burtus, no A līdz Z, tad no A līdz Z, un tā tālāk. Programmas pamatplūsma ir šāda:

  • Mikrokontrolieris notīra LCD.
  • Taimeris2 ir iespējots.
  • Programma ievada bezgalīgu cilpu un izmanto funkciju InsertCharacter (), lai izdrukātu A, pēc tam B, pēc tam C un tā tālāk uz Z, pēc tam atkal atgrieztos pie A.
  • Funkcija InsertCharacter () (sk. Iepriekš minētā koda izvilkumu) atjaunina LCD pikseļu datu masīvu, pārvalda kursoru, gaida, kamēr Timer2 iestatīs karodziņu LCD atjauninājumam, un pēc tam uzsāks atjaunināšanu, izmantojot funkciju UpdateAllLCDLines ().
  • Timer2 ISR nosaka atjaunināšanas karti tikai tad, ja SPI stāvokļa mainīgais norāda, ka SPI saskarne ir dīkstāvē. Tas nodrošina, ka funkcija InsertCharacter () nemēģina uzsākt jaunu SPI pārsūtīšanu pirms iepriekšējās pārsūtīšanas pabeigšanas.

Video

Nākamais raksts sērijā: saziņa ar EFM8 mikrokontrolleru, izmantojot USB

Dodiet šim projektam pašiem sevi! Iegūstiet BOM.