This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| pt:examples:display:segment_display [2015/12/14 15:47] – Criação deste novo documento. artica | pt:examples:display:segment_display [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | < | ||
| + | ====== Mostrador LED de 7 segmentos ====== | ||
| + | // | ||
| + | [HW] [[pt: | ||
| + | [LIB] [[pt: | ||
| + | [PRT] [[pt: | ||
| + | |||
| + | ===== Teoria ===== | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | Um mostrador de números LED de 7 segmentos consiste em 7 LEDs posicionados em forma de número 8. Ao ligar ou desligar os LEDs correspondentes (segmentos), | ||
| + | |||
| + | Electricamente todos os ânodos dos LEDs estão ligados a um pin ânodo //ca//. Os LEDs são iluminados ao mudar os seus catodos (//a, b, c...//). Existem também conexões invertidas, onde os indicadores têm um cátodo comum //cc//. Geralmente vários indicadores de números são usados para exibir números com vários dígitos - para este fim os indicadores estão equipados com segmento coma (ponto) //dp//. Apesar da sua designação, | ||
| + | |||
| + | [{{ : | ||
| + | [{{ : | ||
| + | |||
| + | Os LEDS indicadores de números são fáceis de usar. Podem ser controlados diretamente a partir dos pins do microcontrolador, | ||
| + | |||
| + | * Sinal de Latch | ||
| + | * Sinal de Relógio | ||
| + | * Sinal de dados | ||
| + | |||
| + | ===== Prática ===== | ||
| + | |||
| + | Existe umindicador de 7 segmentos no módulo de i/o digitais. Ele é controlado por meio de um condutor com interface serial. Para exibir os números no módulo indicador HomeLabs Digital i/o, a seguinte funcionalidade está escrita na biblioteca do HomeLab. | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // Marking card | ||
| + | // The bits are marking the segments. Lower ranking is A, higher ranking is DP | ||
| + | const unsigned char __attribute__ ((weak)) segment_char_map[11] = | ||
| + | { | ||
| + | 0b00111111, | ||
| + | 0b00000110, | ||
| + | 0b01011011, | ||
| + | 0b01001111, | ||
| + | 0b01100110, | ||
| + | 0b01101101, | ||
| + | 0b01111100, | ||
| + | 0b00000111, | ||
| + | 0b01111111, | ||
| + | 0b01100111, | ||
| + | 0b01111001 | ||
| + | }; | ||
| + | |||
| + | // Start-up of the 7-segment indicator | ||
| + | void segment_display_init(void) | ||
| + | { | ||
| + | // Set latch, data out and clock pins as output | ||
| + | pin_setup_output(segment_display_latch); | ||
| + | pin_setup_output(segment_display_data_out); | ||
| + | pin_setup_output(segment_display_clock); | ||
| + | } | ||
| + | |||
| + | // Displaying number on the 7-segment indicator | ||
| + | void segment_display_write(unsigned char digit) | ||
| + | { | ||
| + | unsigned char map; | ||
| + | signed char i; | ||
| + | |||
| + | // Check-up of the number | ||
| + | if (digit > 9) | ||
| + | { | ||
| + | digit = 10; | ||
| + | } | ||
| + | |||
| + | // Number as the card of the segments | ||
| + | map = segment_char_map[digit]; | ||
| + | |||
| + | // Latch-signal off | ||
| + | pin_clear(segment_display_latch); | ||
| + | |||
| + | // Sending he bits. Higher ranking goes first | ||
| + | for (i = 7; i >= 0; i--) | ||
| + | { | ||
| + | // Setting the pin according to the value of the bit of the card | ||
| + | pin_set_to(segment_display_data_out, | ||
| + | |||
| + | // The clock-signal as high for a moment | ||
| + | pin_set(segment_display_clock); | ||
| + | _delay_us(1); | ||
| + | |||
| + | // The clock-signal as low | ||
| + | pin_clear(segment_display_clock); | ||
| + | _delay_us(1); | ||
| + | } | ||
| + | |||
| + | // Latch-signal on | ||
| + | pin_set(segment_display_latch); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Para exibir números e a letra " | ||
| + | |||
| + | O que se segue é um exemplo mais concreto de um programa para usar o indicador de números. A função previamente descrita da biblioteca é descrita no programa. O programa conta números de 0 a 9, com intervalo aproximado de um segundo e, de seguida, exibe a letra E, pois números de dois dígitos não são possíveis de mostrar no indicador de um dígito. | ||
| + | |||
| + | |||
| + | <code c> | ||
| + | // The example program of the 7-segment LED indicator of the HomeLab' | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Main program | ||
| + | int main(void) | ||
| + | { | ||
| + | int counter = 0; | ||
| + | |||
| + | // Set-up of the 7-segment indicator | ||
| + | segment_display_init(); | ||
| + | |||
| + | // Endless loop | ||
| + | while (true) | ||
| + | { | ||
| + | // Displaying the values of the counter | ||
| + | segment_display_write(counter % 10); | ||
| + | |||
| + | // Counting up to 10 | ||
| + | counter++; | ||
| + | if (counter> | ||
| + | |||
| + | // Delay for 1 second | ||
| + | sw_delay_ms(1000); | ||
| + | } | ||
| + | } | ||
| + | </ | ||