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);
}
//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
Postar um comentário