Para aproveitar melhor o display, vamos usar caracteres de largura variável. Para isto parti da definição de caracteres em um exemplo de Rick Shear. Coloquei os caracteres na ordem do código ASCII e completei para cobrir a faixa 0x20 a 0x7F. Cada caracter ocupa seis bytes na Flash, o primeiro indica a largura e os seguintes o desenho:
const uint8_t font[] PROGMEM = { 3, 0x00, 0x00, 0x00, 0x00, 0x00, // " " 1, 0xFD, 0x00, 0x00, 0x00, 0x00, // ! 5, 0xE0, 0xC0, 0x00, 0xE0, 0xC0, // " 5, 0x24, 0xFF, 0x24, 0xFF, 0x24, // # 5, 0x12, 0x2A, 0x7F, 0x2A, 0x24, // $ // ... 5, 0x11, 0x13, 0x15, 0x19, 0x11, // z 3, 0x10, 0x6E, 0x81, 0x00, 0x00, // { 1, 0xFF, 0x00, 0x00, 0x00, 0x00, // | 3, 0x81, 0x6E, 0x10, 0x00, 0x00, // } 4, 0x40, 0x80, 0x40, 0x80, 0x00, // ~ 5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF // DEL };Vamos escrever os caracteres uma coluna por vez na margem direita do display, deslocando em seguida toda a tela para a esquerda. O deslocamento é apenas uma questão de mover os bits, a rotina abaixo inclui a opção de apagar a coluna mais à direita ao final do deslocamento.
static void desloca (uint8_t fLimpa) { uint8_t x, y; for (x = 1; x < 32; x++) for (y = 0; y < 8; y++) ht1632c_setLED(x-1, y, ht1632c_getLED(x, y)); if (fLimpa) for (y = 0; y < 8; y++) ht1632c_setLED(31, y, 0); }A escrita de um caracter é semelhante ao que já vimos nas vezes anteriores, exceto que o número de colunas é variável e escrevemos sempre na última coluna e depois deslocamos a tela.
static void display (uint8_t c) { uint8_t x, y, mask, gc, tam; int iFont; iFont = (c - 0x20) * 6; tam = pgm_read_byte(&(font[iFont])); for (x = 0; x < tam; x++) { desloca(FALSE); iFont++; gc = pgm_read_byte(&(font[iFont])); mask = 0x80; for (y = 0; y < 8; y++) { ht1632c_setLED (31, y, gc & mask); mask = mask >> 1; } delay_ticks (2); } desloca (TRUE); delay_ticks (2); }O programa principal apresenta uma vez uma mensagem de teste (com todos os caracteres) e depois rola continuamente a nossa mensagem.
int main(void) { uint8_t fTeste = TRUE; uint8_t msg[97]; uint8_t iMsg; uint8_t *pMsg; ht1632c_init(); // inicia o controlador do display ht1632c_send_screen (); // limpa o display tempo_init(); // inicia a contagem de tempo // Monta a mensagem de teste for (iMsg = 0; iMsg < 96; iMsg++) msg[iMsg] = iMsg + 0x20; msg[96] = 0; pMsg = msg; // Loop perpétuo for (;;) { iMsg = 0; while (pMsg[iMsg]) { display (pMsg[iMsg]); iMsg++; } delay_ticks (32); if (fTeste) { pMsg = (uint8_t *) "DQSoft - Teste do display JY-MCU 3208 "; fTeste = FALSE; } } }O projeto completo está nos arquivos do blog, no arquivo JYMCU3208_Banner.zip.
3 comentários:
Olá DQ,
Você acredita que dá para enviar de um arduino, por uma "rede" 2,4Ghz, um valor de uma variável para este display mostrar? Será que cabe no Mega8?
Pretendo usar os NRF24L01+ como "rede wireless". Tenho uma MCU que tem que exibir diversos valores em até 6 JY-MCU3208.
Ale, em princípio eu acho que sim. Ainda não mexi com o NRF24L01+ mas a interface dele é simples o suficiente para rodar fácil no Mega8.
Já estou te devendo uma cerveja...
Estou "limpando" o exemplo que você fez para deixar só o que preciso. Depois vou começar com o 24L01.
Hora dessas eu apareço no Garoa para mostrar como estão as coisas e pedir ajuda.
Obrigado.
Postar um comentário