Go Down

Topic: Error en código: display de 7x4 + shift register (Read 69 times) previous topic - next topic

Tom743

Hola!

Estuve intentando controlar un display de 4 dígitos 7 segmentos con un arduino uno y un registro de desplazamiento 74hc595n, con 8 salidas para los 7 segmentos + el punto del display y usando 4 del arduino para prender y apagar los dígitos.
Para eso, primero lo conecté como hice con el de un solo dígito y con el mismo código, e hizo lo que hacía el de un dígito, contar de 0 a 9, pero en cada dígito, porque todos los cátodos estabas conectados a tierra.

Luego escribí este código, lo subí (y conecté el diplay como debía), y en vez de mostrar los milisegundos transcurridos, muestra un 0 en los últimos 2 dígitos, después de unos segundos solo en el ultimo, otros segundos mas y se apaga, y después de el doble de segundos, vuelve a empezar

Yo se que el array con los hexadecimales que corresponden a cada numero esta bien, al igual que la función printInDisplay(), porque ya los utilicé con el otro display.

Algún consejo? (Las conexiones se que están bien, ya las probé con el código del display anterior)

Code: [Select]

/*
 * pin del display a = 0 del IC
 *                 b = 1
 *                 c = 2
 *                 d = 3
 *                 e = 4
 *                 f = 5
 *                 g = 6
 *                 p = 7
 * pinout del display en la carpeta del proyecto
 * pines 2, 3, 4 y 5 del arduino a los digitos del display, en ese orden
 */
const int PIN_LATCH = 11;  // Pin conectado al ST_SP del IC (pin 12)
const int PIN_CLOCK = 12;  // Pin conectado al SH_CP del IC (pin 11)
const int PIN_DATA = 8;  // Pin conectado al DS del IC (pin 14)

const int pin_dig1 = 2;
const int pin_dig2 = 3;
const int pin_dig3 = 4;
const int pin_dig4 = 5;
 
const int numeros[10] =  // pines que hay que conectar para cada numero. 1 es HIGH, 0 es LOW, el de la izquierda es q0 del ic, va aumentando hacia la derecha
  {/*
    11111100,  // 0
    01100000,  // 1
    11011010,  // 2
    11110010,  // 3
    01100110,  // 4
    10110110,  // 5
    10111110,  // 6
    11100100,  // 7
    11111110,  // 8
    11110110,  // 9*/
    0xfc,
    0x60,
    0xda,
    0xf2,
    0x66,
    0xb6,
    0xbe,
    0xe4,
    0xfe,
    0xf6
  };
 
int data;  // datos que se le enviaran al ic

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LATCH, OUTPUT);
  pinMode(PIN_CLOCK, OUTPUT);
  pinMode(PIN_DATA, OUTPUT);
 
  pinMode(pin_dig1, OUTPUT);
  pinMode(pin_dig2, OUTPUT);
  pinMode(pin_dig3, OUTPUT);
  pinMode(pin_dig4, OUTPUT);

  for(int i = 1; i <= 4; i++) {
    digOff(i);
  }
}

void loop() { 
  printInAllDisplay((String) ((int) millis()/10));
  delay(10);
}

void renderDigit(int digit) {
  digOff(1);
  digOff(2);
  digOff(3);
  digOff(4);
  if(digit) {
    delayMicroseconds(100);
 
    digOn(digit);
 
    delayMicroseconds(100);
  }
}

void printInAllDisplay(String completeNumber) {
  int number;
  String str = completeNumber;
  // Le un minimo de digitos igual al del display
  while (str.length() < 4) {
    str = ' ' + str;
  }
  // Lo imprime de a uno
  for(int i = 0; i < 4; i++) {
    printInDisplay((int) completeNumber[i]);
   
    switch (i) {
      case 0:
        renderDigit(1);
      case 1:
        renderDigit(2);
      case 2:
        renderDigit(3);
      case 3:
        renderDigit(4);
    }
  }
}

void printInDisplay(int number) {
  // Se apaga durante el seteo de data
  digitalWrite(PIN_LATCH, LOW);
 
  // Imprime el numero
  data = numeros[number];
 
  shiftOut(PIN_DATA, PIN_CLOCK, LSBFIRST, data);
 
  // Se prende para actualizar el IC
  digitalWrite(PIN_LATCH, HIGH);
}

void digOff(int digit) {
  switch(digit) {
    case 1:
      digitalWrite(pin_dig1, !LOW);
    case 2:
      digitalWrite(pin_dig2, !LOW);
    case 3:
      digitalWrite(pin_dig3, !LOW);
    case 4:
      digitalWrite(pin_dig4, !LOW);
  } 
}

void digOn(int digit) {
  switch(digit) {
    case 1:
      digitalWrite(pin_dig1, !HIGH);
    case 2:
      digitalWrite(pin_dig2, !HIGH);
    case 3:
      digitalWrite(pin_dig3, !HIGH);
    case 4:
      digitalWrite(pin_dig4, !HIGH);
  } 
}

Go Up