====== Mostrador LED de 7 segmentos ======
//Conhecimento necessário:
[HW] [[pt:hardware:homelab:digi]],
[LIB] [[pt:software:homelab:library:module:segment_display]], \\ [LIB] [[pt:software:homelab:library:delay]]
[PRT] [[pt:examples:digi:led]]//
===== Teoria =====
[{{ :examples:display:segment_display:7-seg.jpg?100|7 segmentos}}]
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), é possível exibir os números de 0 a nove, bem como algumas letras.
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, cada indicador tem 8 segmentos, devido ao númerod e segmentos necessários para representar cada dígito.
[{{ :examples:display:segment_display:segment_display_leds.png?300|Posicionamento dos segmentos do indicador LED e esquema eléctrico}}]
[{{ :examples:display:segment_display:segment_display_driver_logic.png?300|O acumulador do índice de shift do driver de LED, com segmentos do indicador correspondente.}}]
Os LEDS indicadores de números são fáceis de usar. Podem ser controlados diretamente a partir dos pins do microcontrolador, mas também há drivers especiais, que permitem controlar os indicadores utilizando menos pinos do microcontrolador. Existem diferentes cores de LEDs indicadores de número, que podem ser muito brilhantes e muito grandes. Para exibir todo o alfabeto latino existem indicadores com segmentos extras. Existem diferentes drivers que utilizam uma interface de série, semelhante ao SPI, onde tanto o sinal de relógio como o sinal de dados são utilizados. Ao contrário do SPI o chip-select não é usado aqui, e é substituído pela função latch. As acima mencionadas três linhas estão ligados aos pins do controlador.
* 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.
// 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 // E like Error
};
// 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, bit_is_set(map, i));
// 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 "E", é criado um array constante "fraco" //segment_char_map//, onde a iluminação de todos os oito segmentos é marcada com bit 1 enquanto que são desligados com o bit 0. Os bits, do menos significativo ao mais significativo (da direita para a esquerda na forma binária) são segmentos de marcação A, B, C, D, E, F, G e DP. A interface de controlo do driver é realizada através do software SPI, ou seja, usando um software para controlar os pins de comunicação de dados no programa. Todos os três pins estão definidas como saída com a função //segment_display_init//. //segment_display_write// serve para exibir a função, a qual encontra o segment-card da marca a partir da matriz e transmite bit a bit todos os valores dos segmentos ao driver. A frequência do sinal de relógio com as esperas de software é agora de aproximadamente 500 kHz. Quando um utilizador define uma variável segment_char_map no seu código, é possível criar outros caracteres no ecrã (por exemplo, texto, etc.)
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.
// The example program of the 7-segment LED indicator of the HomeLab's
#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>19) counter=0;
// Delay for 1 second
sw_delay_ms(1000);
}
}