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