lunes, 15 de julio de 2013

Tres Multiplexores 74HC595 y dos displays 4x7

Descripción de la práctica

La siguiente practica consiste en utilizar una placa Arduino UNO, tres multiplexores 74HC595 y dos displays de 7 segmentos con cuatro dígitos.

Una vez montado todo y cargado el código, con un display se contara de cero a 9999 y con el otro, se hará justo lo contrario, de 9999 a cero.

Con un multiplexor se seleccionara la posición de cada display, y con los otros dos multiplexores se marcara el dígito correspondiente en cada display.

Material

- Placa Arduino
- Cables (aprox. 60).
- 3 multiplexores digitales 74HC595
- 2 displays de 7 segmentos con 4 dígitos. (3461BS para esta practica).
- 8 resistencias de 200 ohmios.

Esquema a montar




Los displays del diagrama se han pintado tal y como los que se han utilizado para el montaje (en este caso de ánodo común). Cada display depende de su datasheet.

Código del proyecto


//Pin connected to ST_CP of 74HC595
int latchPin = 8; //cable verde
//Pin connected to SH_CP of 74HC595
int clockPin = 12; //cable azul
////Pin connected to DS of 74HC595
int dataPin = 11;  //cable amarillo

//DEfinicion de numeros
#define cero    B00010100
#define uno     B10110111
#define dos     B00101100
#define tres    B00100101
#define cuatro  B10000111
#define cinco   B01000101
#define seis    B01000100
#define siete   B00110111
#define ocho    B00000100
#define nueve   B00000101

//Definicion digito

#define displayPos1  B00010001
#define displayPos2  B00100010
#define displayPos3  B01000100
#define displayPos4  B10001000

//definicion de valores

int val_1_1=-1;
int val_1_2=0;
int val_1_3=0;
int val_1_4=0;
int val_2_1=10;
int val_2_2=9;
int val_2_3=9;
int val_2_4=9;

void setup() {
  
  Serial.begin(9600);
  pinMode(latchPin, OUTPUT);
}

void loop() {
  iniciaDisplays();  
}
void iniciaDisplays(){
  updateValues();
  for(int i=0;i<40;i++){
    writeDigit(1);
    writeDigit(2);
    writeDigit(3);
    writeDigit(4);
  }
}
void writeDigit(int posicion){
  
  digitalWrite(latchPin, 0);
  switch (posicion) {
    case 1:
      sendNumber(displayPos1,val_1_1,val_2_1);
      break;
    case 2:
      sendNumber(displayPos2,val_1_2,val_2_2);
      break;
    case 3:
      sendNumber(displayPos3,val_1_3,val_2_3);
      break;
    case 4:
      sendNumber(displayPos4,val_1_4,val_2_4);
      break;    
  }
  digitalWrite(latchPin, 1);
}
void sendNumber(byte posicion,int valor_1,int valor_2){
  switch (valor_2) {
    case 0:
      shiftOut(dataPin, clockPin, cero);
      break; 
    case 1:
      shiftOut(dataPin, clockPin, uno);
      break;
    case 2:
      shiftOut(dataPin, clockPin, dos);
      break;
    case 3:
      shiftOut(dataPin, clockPin, tres);
      break;
    case 4:
      shiftOut(dataPin, clockPin, cuatro);
      break; 
   case 5:
      shiftOut(dataPin, clockPin, cinco);
      break; 
   case 6:
      shiftOut(dataPin, clockPin, seis);
      break; 
   case 7:
      shiftOut(dataPin, clockPin, siete);
      break; 
   case 8:
      shiftOut(dataPin, clockPin, ocho);
      break;  
    case 9:
      shiftOut(dataPin, clockPin, nueve);
      break;   
  }
  switch (valor_1) {
    case 0:
      shiftOut(dataPin, clockPin, cero);
      break; 
    case 1:
      shiftOut(dataPin, clockPin, uno);
      break;
    case 2:
      shiftOut(dataPin, clockPin, dos);
      break;
    case 3:
      shiftOut(dataPin, clockPin, tres);
      break;
    case 4:
      shiftOut(dataPin, clockPin, cuatro);
      break; 
   case 5:
      shiftOut(dataPin, clockPin, cinco);
      break; 
   case 6:
      shiftOut(dataPin, clockPin, seis);
      break; 
   case 7:
      shiftOut(dataPin, clockPin, siete);
      break; 
   case 8:
      shiftOut(dataPin, clockPin, ocho);
      break;  
    case 9:
      shiftOut(dataPin, clockPin, nueve);
      break;   
  }
  shiftOut(dataPin, clockPin, posicion);
}
void updateValues(){
  //primer display
    val_1_1++;
    if(val_1_1==10){
       val_1_1=-1;
       val_1_2++;
        if(val_1_2==10){
           val_1_2=0;
           val_1_3++;
           if(val_1_3==10){
              val_1_3=0;
              val_1_4++;
              if(val_1_4==10){
                 val_1_4=0;
                 updateValues();
              } 
           }
        } 
    }
    if(val_1_1<0){
     val_1_1=0; 
    }
    //segundo display
    val_2_1--;
    if(val_2_1==-1){
       val_2_1=10;
       val_2_2--;
        if(val_2_2==-1){
           val_2_2=9;
           val_2_3--;
           if(val_2_3==-1){
              val_2_3=9;
              val_2_4--;
              if(val_2_4==-1){
                 val_2_4=9;
                 updateValues();
              } 
           }
        } 
    }
    if(val_2_1==10){
     val_2_1=9; 
    }
}

void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {

  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {
      pinState= 0;
    }

    digitalWrite(myDataPin, pinState);
    digitalWrite(myClockPin, 1);
    digitalWrite(myDataPin, 0);
  }

  digitalWrite(myClockPin, 0);
}

El método shiftOut esta copiado de la pagina de Arduino y su ejemplo de como utilizar varios multiplexores 595.

Ejecución de la practica


Referencias



No hay comentarios:

Publicar un comentario