Max7219 con funcion shiftOut no LedControl. Punto decimal

Saludos a la gran comunidad en español.

El siguiente código que presento, del uso de un MAX7219, la manera mas fácil que halle o que a mi parecer es mas fácil de comprender al momento de encender un dígito con un valor determinado , usando las funciones del shiftOut.

Algo fácil de entender para un novato como yo, "output(0x05, 0x07)" primer dato (0x05)hace referencia al dígito en el cual se va a encender, (0x07) segundo dato hace referencia al valor en entero que mostrara el 7 segmentos.
Aquí la gran pregunta como enciendo el punto decimal para el/los dígitos que yo decida?

Me ha quedado claro q usando la librería---> #include "LedControl.h" declarando los pines y el numero de dispositivos usados--->LedControl dispositivo = LedControl(3,5,4,1); y una declaración ---> dispositivo.setDigit (0, 7, 1, false); ---< siendo 0, "shutdown" 7,"#dígito por izq o der" 1,"numero a mostrar en el 7 seg" y false, "punto decimal apagado" "true para encenderlo"..
No quiero usar esta opción de la librería "LedControl.h". Sera posible con la opción que vengo manejando?

#define MAX7219_DIN 5
#define MAX7219_CS  6
#define MAX7219_CLK 7

void initialise(){
 digitalWrite(MAX7219_CS, HIGH);
 pinMode(MAX7219_DIN, OUTPUT);
 pinMode(MAX7219_CS, OUTPUT);
 pinMode(MAX7219_CLK, OUTPUT);
}

void output(byte address, byte data){
 digitalWrite(MAX7219_CS, LOW);
 shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, address);
 shiftOut(MAX7219_DIN, MAX7219_CLK, MSBFIRST, data);
 digitalWrite(MAX7219_CS, HIGH);
}


void setup() {
 initialise();
 output(0x0f, 0x00); //display test register - test mode off
 output(0x0c, 0x01); //shutdown register - normal operation
 output(0x0b, 0x04); //scan limit register - display digits 0 thru 7
 output(0x0a, 0x07); //intensity register - max brightness
 output(0x09, 0xff); //decode mode register - CodeB decode all digits
}


void loop() {
 unsigned long over, elapsed;
 int um,ds,us,ms;
 
 elapsed = millis();
    over = elapsed % 3600000;
    um = (over / 60000)%10;
    over = over % 60000;
    us = (over / 1000)%10; 
    ds = (over / 10000)%10;
    ms = (over / 100) % 10;
 
 //output(0x08, 0x0c); //digit 7 (leftmost digit) data
 //output(0x07, 0x0b);
 //output(0x06, 0x0d);
 output(0x05, 0x00);
 output(0x04, ms);
 output(0x03, us);
 output(0x02, ds);
 output(0x01, um); //digit 0 (rightmost digit) data
 delay(10);
}

//Posterior a este inconveniente debo manejar los segmentos con leds a 12V 600mA por dígito en cátodo común, total 5 digitos.
solucion 1.-
"bastantes transistores, mas espacio, mas conexiones, mas dinero, pero es posible"

solucion 2.-
"Ahorra espacio conexiones, dinero, En mi país no encuentro todos los integrados"

solucoin 3.-
ustedes dirán :slight_smile:

Lo primero que te diré será que leas las normas del foro. Esta vez lo edité yo para poder entender tu consulta y leerlo apropiadamente.
La próxima no será asi!! Asi que presta atención, mira y lee otros hilos y aprende como se postean códigos, enlaces, fotos/imágenes, etc.

Para controlar el punto decimal solo escribe en el MSB o sea el bit mas significativo
Supongamos que quieres hacerlo en us que ya calculaste

us = (over / 1000)%10;

asi que solo agregas esto

us |= 0b10000000;

y mi respuesta surge de analizar LedControl.h ya que cuando miras

void LedControl::setDigit(int addr, int digit, byte value, boolean dp) {
    int offset;
    byte v;

    if(addr<0 || addr>=maxDevices)
        return;
    if(digit<0 || digit>7 || value>15)
        return;
    offset=addr*8;
    v=pgm_read_byte_near(charTable + value); 
    if(dp)
        v|=B10000000;       // <== CONTROL PUNTO DECIMAL
    status[offset+digit]=v;
    spiTransfer(addr, digit+1,v);
}

Respecto de que montaje electrónico usar, mira cual te resulta mas cómodo y adelante.
La opcion dos parece mas cómoda y menos compleja que disponeter de tantos transistores para la tarea. De alguno modo es mas limpia la 2da.
La 1 de acuerdo a que transitores uses, te permite superar corrientes y tensiones. Tiene sus ventajas pero para 12V 600mA usaría la 2.

Saludos surbyte, mil disculpas fue mi primer post, no sucedera de nuevo (o.o)7
Me has ayudado a solucionar mi problema, para nutrir un poco este post quiero compartir mi experiencia:

  • 1.- Los arduinos chinos o replicas comúnmente dichos no siempre son de fiar, he adquirido dos arduino mega2560 y he tenido muchos dolores de cabeza al trabajar estos con el max7219, aparentemente con otras aplicaciones funciona sin problemas, pero conectado con el max7219 hasta calentó el microprocesador.
  • 2.- La mejor solución para los leds a 12v fueron los integrados al ser la corriente <=600mA, al usar leds de mayor consumo necesariamente se usaría transistores o ver por mejores matrices de leds en el mercado.
  • 3.- El max7219 no necesariamente debe recibir un delay con el propósito de realizar un switcheo por digito