O display em si é um velho conhecido dos leitores do blog: um display com quatro dígitos, cada um com 7 segmentos e um ponto decimal. O que pode confundir um pouco é a conexão, feita através de dois integrados 74HC595 em série. O 595 é um shift register de 8 bits; usando dois integrados temos um registrador de 16 bits para o qual você envia os os bits um a um através de um sinal de dados (pino digital 8 do Arduino) e de um sinal de clock (pino digital 7). Um terceiro sinal (latch, pino digital 4) é usado para colocar o valor atual do registrador nos pinos do display. A figura abaixo (adaptada do esquema da placa) mostra a conexão.
O esquema de uso é o tradicional: mostramos rapidamente um dígito de cada vez e a vista é enganada para pensar que todos estão acesos ao mesmo tempo. Abaixo um exemplo simples:
- // Exemplo de uso da Multi Function Shield - Display
- // DQ, dez/2016
- // http://dqsoft.blogspot.com
- #include <TimerOne.h>
- const int pinLatch = 4;
- const int pinClock = 7;
- const int pinDado = 8;
- // Desenho dos numeros
- const uint8_t numero[10] = {
- 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90
- };
- // Selecao dos digitos
- const uint8_t digito[4] = {
- 0x01, 0x02, 0x04, 0x08
- };
- // Valor a apresentar no display
- uint8_t valor[4];
- // Iniciação
- void setup() {
- // Inicia os pinos ligados ao display
- pinMode (pinLatch, OUTPUT);
- pinMode (pinClock, OUTPUT);
- pinMode (pinDado, OUTPUT);
- // Inicia o timer
- Timer1.initialize(2000); // 2 ms
- Timer1.attachInterrupt (timerIsr);
- }
- // Programa principal
- void loop() {
- static uint8_t cont = 0;
- // mudar cada digito do valor com um ritmo diferente
- cli();
- if (++valor[3] > 9) {
- valor[3] = 0;
- }
- if (((cont & 0x03) == 0) && (++valor[2] > 9)) {
- valor[2] = 0;
- }
- if (((cont & 0x0F) == 0) && (++valor[1] > 9)) {
- valor[1] = 0;
- }
- if (((cont & 0x03F) == 0) && (++valor[0] > 9)) {
- valor[0] = 0;
- }
- sei();
- cont++;
- delay (100);
- }
- // Interrupção do timer, atualiza o display a cada 2 ms
- void timerIsr() {
- static uint8_t iDig = 0;
- digitalWrite(pinLatch, LOW);
- shiftOut(pinDado, pinClock, MSBFIRST, numero[valor[iDig]]);
- shiftOut(pinDado, pinClock, MSBFIRST, digito[iDig]);
- digitalWrite(pinLatch, HIGH);
- iDig = (iDig+1) & 3;
- }
Nenhum comentário:
Postar um comentário