Go Down

Topic: contador de 4 digitos (Read 6863 times) previous topic - next topic

Hcorniel



Code: [Select]
const int dataPin  = A0;
const int latchPin = A1;
const int clockPin = A2; ///// shift register 74HC595

int botonUp = 3;   ///// boton acender
int botonDown = 2; ////  boton bajar
int cambio = 0;
int botonPress ;
int boton_No_Press ;
int botonPress2 ;
int boton_No_Press2 ;

const int energisarTiempo = 10;

boolean energisar ( int pin ){
boolean contador = 0;
boolean Press;
boolean NoPress;

do {
Press =digitalRead ( pin);
if ( Press != NoPress) {
  contador = 0;
 NoPress = Press;
}
else
{
contador = contador + 1;
}
delay (1);
}
while ( contador < energisarTiempo);

return Press;
}

 void actualizar ()
{
switch ( cambio ) {
 
   case 10:     ////////////////// ( 50 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
 
  case 9:     ////////////////// ( 45 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
 
  case 8:     ////////////////// ( 40 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
 
  case 7:    ////////////////// ( 35 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10011110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 6:     ////////////////// ( 30 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10011110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 5:     ////////////////// ( 25 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10110110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
 break;

case 4:     ////////////////// ( 20 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b10110110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 3:    ////////////////// ( 15 )/////////////////
 
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b00001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 2:     ////////////////// ( 10 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b00001100 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;

case 1:    ////////////////// ( 05 )/////////////////
digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11011010 );
     digitalWrite ( latchPin,LOW);
     delay (10);
 
break;

case 0:     ////////////////// ( 00 )/////////////////
 digitalWrite ( latchPin, HIGH );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
   
     digitalWrite ( latchPin, HIGH);
     shiftOut ( dataPin,clockPin,MSBFIRST,0b11101111 );
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );
     digitalWrite ( latchPin,LOW);
     delay (10);
break;
  }
}
 
void setup ()
{
  Serial.begin ( 9600);
pinMode ( botonUp, INPUT);
pinMode ( botonDown, INPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

void loop ()
{
botonPress = digitalRead ( botonUp );
if ( botonPress != boton_No_Press) {
if ( energisar ( botonUp) ){
cambio ++;
if ( cambio > 10 ) {
  cambio = 10;
}
}
}
boton_No_Press  = botonPress;
////////////////////////////////////////////////
botonPress2 = digitalRead ( botonDown );
if ( botonPress2 != boton_No_Press2) {
if ( energisar ( botonDown) ){
cambio --;
if ( cambio < 0 ) {
  cambio = 0;
}
}
}
boton_No_Press2  = botonPress2;

actualizar ();

}

Hcorniel

ya lo pude hacer con 2 shift register y solo use los 3 pines , no se si esta muy organizado, quizas si se pueda acortar seria perfecto pero al menos funciona bien..si pueden limpiarlo mejor seria perfecto...

NOTA

muy importante  no se porque, si me pueden explicar... por alguna razon que desconozco .. si se fijan en esto para shiftOut los digitos tuve que cambiarlo a como si fueran de anodo, osea tuve que poner que encendieran cuando estaban en  ( 0 ) y apagado en  ( 1 ).. no se porque me di cuenta experimentando que  al ponerlo en 1 no hacia nada y no se porque lo puse en 0 y  funciono jejejeee como dice por errores se descubren cosas..

Code: [Select]
shiftOut ( dataPin,clockPin,MSBFIRST,0b11110111 ); // digitos
     shiftOut ( dataPin,clockPin,MSBFIRST,0b01111110 );  // numeros

surbyte

Y lo que te pase yo que?

Hcorniel

Gracias Survyte.

Pero no eh podido abrir  el codigo le eh cambiado el nombre y nada no me deja hacer nada. Si pudieras poner el codigo  seria perfecto ..



surbyte

Acabo de bajarlos y les cambie el nombre a 595 .ino y .pdsprj y funcionan perfectos.
No entiendo que problema tienes.

Los subo de nuevo.

Code: [Select]

#include <SPI.h>

const byte LATCH = 10; // latch Pin

const byte MAX_DIGITS = 4;
const byte TIME_BETWEEN_DIGITS = 8;  // Periodo de blanqueo entre digitos en mseg

// Mascara de cada pin para que el LED se ponga ON

const unsigned int DIG1  = 0x0200;  // Q1 de segundo IC
const unsigned int DIG2  = 0x1000;  // Q4 de segundo IC
const unsigned int DIG3  = 0x2000;  // Q5 de segundo IC
const unsigned int DIG4  = 0x0002;  // Q1 de primer IC

const unsigned int SEGA  = 0x0400;  // Q2 de segundo IC
const unsigned int SEGB  = 0x4000;  // Q6 de segundo IC
const unsigned int SEGC  = 0x0008;  // Q3 de primer IC
const unsigned int SEGD  = 0x0020;  // Q5 de primer IC
const unsigned int SEGE  = 0x0040;  // Q6 de primer IC
const unsigned int SEGF  = 0x0800;  // Q3 de segundo IC
const unsigned int SEGG  = 0x0004;  // Q2 de primer IC
const unsigned int SEGDP = 0x0010;  // Q4 de primer IC
         
// que segmento se ilumina de cada digito
const unsigned int digitPatterns [15] = {
 SEGA | SEGB | SEGC | SEGD | SEGE | SEGF,  // 0
 SEGB | SEGC,  // 1
 SEGA | SEGB | SEGD | SEGE | SEGG,  // 2
 SEGA | SEGB | SEGC | SEGD | SEGG,  // 3
 SEGB | SEGC | SEGF | SEGG,  // 4
 SEGA | SEGC | SEGD | SEGF | SEGG,  // 5
 SEGA | SEGC | SEGD | SEGE | SEGF | SEGG,  // 6
 SEGA | SEGB | SEGC,  // 7
 SEGA | SEGB | SEGC | SEGD | SEGE | SEGF | SEGG,  // 8
 SEGA | SEGB | SEGC | SEGD | SEGF | SEGG,  // 9
 0,  // space
 SEGG,  // hyphen
 SEGA | SEGB | SEGC| SEGE | SEGF | SEGG,  // A
 SEGA | SEGE | SEGF | SEGG,  // F
 SEGD | SEGE | SEGF,  // L
};
// cuanto tiempo dejo el dígito ON
const byte digitOnTimes [15] = { 3, 1, 3, 3, 2, 3, 3, 2, 3, 3, 0, 0, 3, 3, 2 };
// index into digits
const unsigned int digits [4] = { DIG1, DIG2, DIG3, DIG4 };

// 0 to 9 are themselves in the patterns array
//  there are the other entries:
#define PAT_SPACE 10
#define PAT_HYPHEN 11
#define PAT_A 12
#define PAT_F 13
#define PAT_L 14

// que voy a mostrar (0 ao 15, mas  0x10 para encender el punto decimal)
// mirar arriba (ej. 1 muestra 1)
volatile byte ledOutput [MAX_DIGITS];

// variables globales usadas por la interrupcion ISR
unsigned int countdown;
byte digit;

//******************************************************************
//  Timer2 Interrupt Service es invocada por el hardware cada 1ms = 1000 Hz
//  16Mhz / 128 / 125 = 1000 Hz
//  prescaler 128
//  OCR2A  = 124; recordar que es 0 relativo o sea si quiero 125 comparo con 124+0=125

ISR (TIMER2_COMPA_vect)
{
   
  // sigo haciendo lo que estaba haciendo antes
  if (countdown-- > 0)
    return;
   
  if (digit >= MAX_DIGITS)  {
    digit = 0;
    countdown = TIME_BETWEEN_DIGITS;
    // período de blanqueo para permitir que el chip y los LED se apaguen
    digitalWrite (LATCH, LOW);
    SPI.transfer (0);
    SPI.transfer (0);
    digitalWrite (LATCH, HIGH);
    return;
    } // terminé con todos los dígitos
 
  // Pongo todo los dígitos en 1
  unsigned int output = DIG1 | DIG2 | DIG3 | DIG4;

  // Pongo en LOW el digito deseado.
  output &= ~digits [digit];

  // Activo los segmentos deseados
  output |=  digitPatterns [ledOutput [digit] & 0xF];
   
  // agrego el punto decimal si es necesario
  if (ledOutput [digit] & 0x10)
    output |= SEGDP;
     
  // envio el resultado a los 595 1 y 2
  digitalWrite (LATCH, LOW);
  SPI.transfer (highByte (output));
  SPI.transfer (lowByte (output));
  digitalWrite (LATCH, HIGH);
     
  // ajusto el tiempo para permitir los diferentes números de segmentos
  countdown = digitOnTimes [ledOutput [digit] & 0xF] ;
 
  // paso al próximo digito
  digit++;
 
}  // fin del vector TIMER2_COMPA_vect


void setup ()   {
 
  SPI.begin ();
 
  // configuro Timer 2
  // Timer 2 - nos da 1 mS de intervalo de conteo
  // 16 MHz clock (62.5 nS per tick) - presescalado por 128
  // incremento del contador cada 8 uS = 62.5nseg x 128 = 8000 nseg = 8 useg
  // si contamos 125 veces 8 us nos da exactamente 1000 uS (1 mS)

  TCCR2A = 0;              // paro el timer 2
  TCCR2B = 0;
  TCCR2A = _BV (WGM21) ;   // CTC mode
  OCR2A  = 124;            // cuenta ascendente hasta 125  (cero relativo!)
  TIMSK2 = _BV (OCIE2A);   // habilito la interrupción Timer2 Interrupt (cada 1 mS)
  TCNT2 = 0;               // reseteo contador
  TCCR2B =  _BV (CS20) | _BV (CS22) ;  // arranco el timer con un prescaler de 128

} // fin del setup


void loop ()
{

  unsigned long now = millis () / 100;
 
  noInterrupts ();

  for (int i = 0; i < 4; i++)   {
    ledOutput [3 - i] = now % 10;
    now /= 10;   
  }

  // turn leading zeroes into spaces   
  for (int i = 0; i < 4; i++)   {
    if (ledOutput [i] == 0)
      ledOutput [i] = PAT_SPACE;
    else
      break;
  }
 
  // punto decimal cada 1 decima de segundo
  ledOutput [2] |= 0x10;
  interrupts ();
 
  delay (10);
}   // end of loop


Aca te pongo el codigo pero en el .zip estan el código y el proyecto en Proteus

Hcorniel

holaa lo termine de esta forma

Go Up