O primeiro passo para o software são as rotinas para tratamento dos displays. Para o display de 4 dígitos eu já tinha encontrado uma biblioteca adequada (TM1637). Daí que eu resolvi fazer uma biblioteca equivalente para o display de 8 dígitos. O resultado está aqui.
O display de 8 dígitos utiliza um MAX7219, que é bastante simples de utilizar. A única rotina complicada é a escrita de números decimais. Como na rotina equivalente na biblioteca TM1637, ela suporta escrever um número qualquer de dígitos a partir de qualquer posição, com supressão ou não dos zeros à esquerda. Além disso, eu coloquei o tratamento de números negativos (necessário para a velocidade). Eu me atrapalhei um pouco no mapeamento dos dígitos nos registradores, mas após um par de horas cheguei à rotina abaixo:
- void MAX7219Display::showNumberDec(long num, bool leading_zero,
- uint8_t length, uint8_t pos)
- {
- uint8_t prim;
- uint8_t aux[8];
- bool showZero = leading_zero;
- uint8_t i;
- // Valida parâmetros
- if (pos >= m_nDig)
- pos = m_nDig-1;
- if ((pos+length) > m_nDig)
- length = m_nDig - pos;
- // Trata números negativos
- prim = MAX7219_DIG7 - pos;
- if (num < 0)
- {
- num = -num;
- write7219 (prim, SEG_G);
- prim--;
- length--;
- }
- // Gera os dígitos
- for (i = 0; i < length; i++)
- {
- aux[i] = (uint8_t)(num % 10L);
- num = num / 10L;
- }
- // Escreve os dígitos
- for(i = 0; i < length; i++)
- {
- uint8_t dig = aux[length - i - 1];
- if (!showZero && (dig == 0) && (i != (length-1)))
- {
- write7219 (prim - i, 0);
- }
- else
- {
- if (dig != 0)
- showZero = true;
- write7219 (prim - i, digitToSegment[dig]);
- }
- }
- }
Uma vez tendo as rotinas de escrita nos displays, foi só adaptar o código que eu tinha feito para a segunda versão do Lunar Lander. O código final também pode ser baixado do github (aqui).
Ok, chega de conversa. O vídeo abaixo mostra o projeto em funcionamento, com um pouso sendo "habilmente" concluído.
Nenhum comentário:
Postar um comentário