This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:examples:display:segment_display [2015/02/26 14:19] – raivo.sell | et:examples:display:segment_display [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Numberindikaator ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [LIB] [[et: | ||
| + | [PRT] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | 7-segmendiline LED numberindikaator on seitsmest number 8-kujuliselt paigutatud valgusdioodist koosnev näidik. Vastavaid LED-e (segmente) süüdates või kustutades saab nendega kuvada numbreid nullist üheksani ning mõningaid tähti. | ||
| + | |||
| + | Elektriliselt on kõigi LED-ide anoodid ühendatud ühise anoodi viiguga (inglise keeles //common anode//) - //ca//. LED-e süüdatakse nende katoode (//a, b, c...//) lülitades. Olemas on ka vastupidi ühendusi, kus indikaatoritel on ühine katood (inglise keeles //common cathode//) - //cc//. Tavaliselt kasutatakse mitut numberindikaatorit, | ||
| + | [{{ : | ||
| + | [{{ : | ||
| + | LED numberindikaatoreid on lihtne kasutada, sest neid võib juhtida kas või otse mikrokontrolleri viikudelt, kuid on ka spetsiaalseid ajureid (inglisekeeles // | ||
| + | |||
| + | * Lukustussignaal (//latch//) | ||
| + | * Taktsignaal (//clock//) | ||
| + | * Andmesignaal (//data//) | ||
| + | |||
| + | Andmed edastatakse bitthaaval andmeviigu kaudu. Iga kord, kui taktsignaal kõrgeks läheb, nihutatakse nihkeregistri sisu paremale ja kõige vasakpoolsemasse pesasse loetakse andmeviigult tulev bitt. Niiviisi laaditakse nihkeregistrisse 8 bitti. Kui lukustussignaal kõrgeks seada, laetakse nihkeregistri väärtus lukustusregistrisse, | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | Kasutajaliidese moodulil on üks 7-segmendiline LED numberindikaator, | ||
| + | |||
| + | <code c> | ||
| + | // Märgikaart | ||
| + | // Bitid tähistavad segmente, madalaim järk A ja kõrgeim DP | ||
| + | const unsigned char __attribute__ ((weak)) segment_char_map[11] = | ||
| + | { | ||
| + | 0b00111111, | ||
| + | 0b00000110, | ||
| + | 0b01011011, | ||
| + | 0b01001111, | ||
| + | 0b01100110, | ||
| + | 0b01101101, | ||
| + | 0b01111100, | ||
| + | 0b00000111, | ||
| + | 0b01111111, | ||
| + | 0b01100111, | ||
| + | 0b01111001 | ||
| + | }; | ||
| + | |||
| + | // 7-segmendilise indikaatori käivitamine | ||
| + | void segment_display_init(void) | ||
| + | { | ||
| + | // Juhtviikude väljundiks seadmine | ||
| + | pin_setup_output(segment_display_latch); | ||
| + | pin_setup_output(segment_display_data_out); | ||
| + | pin_setup_output(segment_display_clock); | ||
| + | } | ||
| + | |||
| + | // 7-segmendilisel indikaatoril numbri kuvamine | ||
| + | void segment_display_write(unsigned char digit) | ||
| + | { | ||
| + | unsigned char map; | ||
| + | signed char i; | ||
| + | |||
| + | // Numbri kontroll | ||
| + | if (digit > 9) | ||
| + | { | ||
| + | digit = 10; | ||
| + | } | ||
| + | |||
| + | // Numbri segmentide kaardiks teisendamine | ||
| + | map = segment_char_map[digit]; | ||
| + | |||
| + | // Lukustussignaali madalaks muutmine | ||
| + | pin_clear(segment_display_latch); | ||
| + | |||
| + | // Bittide saatmine, kõrgeim järk esimesena | ||
| + | for (i = 7; i >= 0; i--) | ||
| + | { | ||
| + | // Viigu seadmine vastavalt kaardi biti väärtusele | ||
| + | pin_set_to(segment_display_data_out, | ||
| + | |||
| + | |||
| + | // Taktsignaali hetkeks kõrgeks muutmine | ||
| + | pin_set(segment_display_clock); | ||
| + | _delay_us(1); | ||
| + | |||
| + | // Taktsignaali madalaks muutmine | ||
| + | pin_clear(segment_display_clock); | ||
| + | _delay_us(1); | ||
| + | } | ||
| + | |||
| + | // Lukustussignaali kõrgeks muutmine | ||
| + | pin_set(segment_display_latch); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Numbrite ja " | ||
| + | Kui kasutaja defineerib muutuja segment_char_map oma koodis ise, on võimalik luua ekraanile ka muid sümboleid (Nt teksti vmt). | ||
| + | |||
| + | Järgnevalt on toodud konkreetsem numberindikaatori kasutamise näiteprogramm. Programmis kasutatakse teegi eelnevalt kirjeldatud funktsioone. Programm loeb ligikaudu sekundilise intervalliga numbreid nullist üheksani ja seejärel kuvab tähe E, kuna kahekohalisi numbreid ei ole ühekohalisel indikaatoril võimalik näidata. | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabori Kasutajaliidese mooduli 7-segmendilise LED indikaatori näidisprogramm | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | int counter = 0; | ||
| + | |||
| + | // 7-segmendilise indikaatori seadistamine | ||
| + | segment_display_init(); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) | ||
| + | { | ||
| + | // Numbri kuvamine ekraanile | ||
| + | segment_display_write(counter % 10); | ||
| + | |||
| + | // Loenduri suurendamine kuni kümneni | ||
| + | counter++; | ||
| + | if (counter> | ||
| + | |||
| + | // Paus 1 sekund | ||
| + | sw_delay_ms(1000); | ||
| + | } | ||
| + | } | ||
| + | </ | ||