Modulo display de 4 x 7 segmentos utilizando o 74HC164

//Modulo display de 4 x 7 segmentos utilizando o 74HC164
//Com base do código extraido do site:
//http://www.instructables.com/id/The-74HC164-Shift-Register-and-your-Arduino/
//pedroluand@gmail.com
//versão:1.1 controle dos quatro digitos do display
//16-11-2018
//versao:1.0 controle de apenas 1 digito do display
//08-11-2017

/*
//ligação do display no ci 74hc164
       _a_         
     f|   |b       
      |-g-|         
     e|___|c       
        d           
       
byte sup   = B01000000; //pino 4  do 74hc164 segimento a (ligar no pino 14 do display)   
byte dsup  = B00000010; //pino 12 do 74hc164 segimento b (ligar no pino 08 do display)
byte dinf  = B00000100; //pino 11 do 74hc164 segimento c (ligar no pino 06 do display)
byte inf   = B00010000; //pino 6  do 74hc164 segimento d (ligar no pino 07 do display)
byte einf  = B00001000; //pino 10 do 74hc164 segimento e (ligar no pino 04 do display)
byte esup  = B00100000; //pino 5  do 74hc164 segimento f (ligar no pino 13 do display)
byte menos = B10000000; //pino 3  do 74hc164 segimento g (ligar no pino 10 do display)
byte pd    = B00000001; //pino 13 do 74hc164 div. hora   (ligar no pino 11 do display)
byte x     = B00000000; //todos apagados

ligaca do 74hc164

14 13 12 11 10 09 08      pino 01= Vcc     pino 06= Q3      pino 11= Q5         Obs.
.  .  .  .  .  .  .       pino 02= data    pino 07= GND     pino 12= Q6         pino 02= data a
     CI 74HC164           pino 03= Q0      pino 08= clock   pino 13= Q7         pino 02= data b (manter no nivel alto para funcionar)
.  .  .  .  .  .  .       pino 04= Q1      pino 09= Vcc     pino 14= VCC        pino 09= reset (manter no nivel alto para funcionar)
01 02 03 04 05 06 07      pino 05= Q2      pino 10= Q4

//descrição dos pinos do display
     14 13 12 11 10 09 08             
     .  .  .  .  .  .  .           
      display mod.ULH4RC                 
     .  .  .  .  .  .  .               
     01 02 03 04 05 06 07         

pino 01= GND1
pino 02= (seg. d)
pino 03= nc
pino 04= seg. e
pino 05= GND3
pino 06= seg. c
pino 07= seg. d
pino 08= seg. b
pino 09= GND4
pino 10= seg. g 
pino 11= divisor de horas
pino 12= GND2
pino 13= seg. f
pino 14= seg. a
*/

//Olhe para a pinagem de seu display de 7 segmentos (eu só tive uma dupla, mas apenas usando metade)
//e use o desenho abaixo para conectar cada segmento ao bit correto no bit de registro de deslocamento
//bit 1 = pino 3   B10000000
//bit 2 = pino 4   B01000000
//bit 3 = pino 5   B00100000
//bit 4 = pino 6   B00010000
//bit 5 = pino 10  B00001000
//bit 6 = pino 11  B00000100
//bit 7 = pino 12  B00000010
//bit 8 = pino 13  B00000001 ponto decimal

//E o cátodo da tela através do resistor 330ohm e para fonte de alimentação
//agora abre o seven_seg_demo.pde no arduino IDE
//Primeiro, você vê onde definimos os dados e os pinos de clock

int GND1 = 5; //conectado ao pino 01 do display
int GND2 = 6; //conectado ao pino 12 do display
int GND3 = 7; //conectado ao pino 05 do display
int GND4 = 8; //conectado ao pino 09 do display

int dig1=0;
int dig2=9;
int dig3=3;
int dig4=0;
int ss;
int mm;

int DTime = 4;

int repita;
int conv;
int x;
int y;

#define data 2  //conectado aos pinos 1 e 2 do ci 74hc164
#define clock 3 //conectado ao pino 8 do ci 74hc164

//Em seguida, estabelecemos todos os padrões de charater em binário, isso é bastante fácil,
//veja o desenho abaixo, se você precisar do tipo de segmento do meio em um, depois você precisa do segmento superior,
//se assim for, digite outro, continue fazendo até que você cubra todos os 8 segmentos, observe que o meu bit mais à direita (bit 8) é sempre 0,
//é por isso que eu nunca liga o ponto decimal.

byte zero  = B01111110;
byte one   = B00000110;
byte two   = B11011010;
byte three = B11010110;
byte four  = B10100110;
byte five  = B11110100;
byte six   = B11111100;
byte seven = B01000110;
byte eight = B11111110;
byte nine  = B11110110;
byte dec   = B00000001; //ponto decimal

//Em seguida, em void setup, estabelecemos nossos dados e pinos de relógio para as saídas,

void setup()
{
  Serial.begin(9600);
  pinMode(9,INPUT_PULLUP);
  pinMode(GND1, OUTPUT);
  pinMode(GND2, OUTPUT);
  pinMode(GND3, OUTPUT);
  pinMode(GND4, OUTPUT);
  pinMode(clock, OUTPUT); // clock ligado ao pino2
  pinMode(data , OUTPUT); // dados ligado ao pino3
}

//então, no void loop, usamos shiftOut para exibir cada padrão (número) espere meio segundo e exiba o próximo, 0 a 9,
//uma vez que está sendo feito na função de loop vazio que irá contar 0-9 e repita para sempre.

void loop()

   //x=967;

   funcao();
   saida();
   }


void funcao(){
    ss+=1;   
    repita+=1;
    Serial.println(ss);
   // while(repita==x+1); //até que
    }

   
void pickNumber(int x){
   switch(x){
     case 1: shiftOut(data, clock, LSBFIRST, one); break;
     case 2: shiftOut(data, clock, LSBFIRST, two); break;
     case 3: shiftOut(data, clock, LSBFIRST, three); break;
     case 4: shiftOut(data, clock, LSBFIRST, four); break;
     case 5: shiftOut(data, clock, LSBFIRST, five); break;
     case 6: shiftOut(data, clock, LSBFIRST, six); break;
     case 7: shiftOut(data, clock, LSBFIRST, seven); break;
     case 8: shiftOut(data, clock, LSBFIRST, eight); break;
     case 9: shiftOut(data, clock, LSBFIRST, nine); break;
     default: shiftOut(data, clock, LSBFIRST, zero); break;
   }
   }

   void saida()
   {
//incremento das casas decimais do display
   if(ss==60)
   {
    ss=0;
    mm+=1;
    }
   if(mm==60)
   {
    mm=0;
    dig4+=1;
    }
   
   if(dig4==10)
   {
    dig4=0;
    dig3+=1;
   }

   if(dig3==6)
   {
    dig3=0;
    dig2+=1;
   }

   if(dig2==10)
   {
    dig2=0;
    dig1+=1;
   }

   if(dig1==1 && dig2==2)
   {
    dig1=0;
    dig2=0;
    dig3=0;
    dig4=0;
   }

 
  digitalWrite( GND1, LOW);   //digit 1
  pickNumber(dig1);
  delay(DTime);
  digitalWrite( GND1, HIGH);
 
  digitalWrite( GND2, LOW);   //digit 2
  pickNumber(dig2);
  delay(DTime);
  digitalWrite( GND2, HIGH);
 
  digitalWrite( GND3, LOW);    //digit 3
  pickNumber(dig3);
  delay(DTime);
  digitalWrite( GND3, HIGH);
 
  digitalWrite( GND4, LOW);    //digit 4
  pickNumber(dig4);
  delay(DTime);
  digitalWrite( GND4, HIGH);
  }

Comentários

Postagens mais visitadas deste blog

Amplificador de 6W para módulos PLL FM, usando transistores C1970 e C1971 - Versão final 04-04-2022

Amplificador de RF 350mW com BD135 para modulos pll

Antena dipolo para transmissores FM