[Risolto] Shift Registers 31 bit? spiegazioni

Salve ho tra le mani un display numerico (6 cifre), ecco–> http://www.flickr.com/photos/76797921@N02/6888976329/in/photostream
l’lcd è pilotato da due registri 31 bit http://www.ti.com/lit/ds/symlink/mm5483.pdf

ma io non capisco perchè ci sono 31 bit invece di 32 (dovrebbe essere cosi) cmq la sequenza di bit da inviare la devo fare di 31 bit?
tipo shiftOut(dataPin,clockPin,MSBFIRST, 0x7FFFFFFF);
io ci provo a farlo ma non caisco come si pilota quel display( una volta sono riuscito a far comparire una cifra ma non so manko come ho fatto) qualcuno sa che tipo di display è?

EDIT: scusate le solite domande sui registri :cold_sweat:

You may need someone to translate this from English to Italian,
I have a function that will allow shifting any amount of bits (also have the shiftIn version ) :

  void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val, uint16_t &bitsRemaining )
    {
      uint16_t u_BitsTihsRun = ( bitsRemaining > 0x8 ) ? 0x8 : bitsRemaining;

      for ( uint8_t u_Index = 0 ; u_Index < u_BitsTihsRun ; ++u_Index ){
        
        if (bitOrder == LSBFIRST)
          digitalWrite( dataPin, !!( val & ( 1 << u_Index ) ) );
        else	
          digitalWrite( dataPin, !!( val & ( 1 << ( 7 - u_Index ) ) ) );
          		
        digitalWrite( clockPin, HIGH );
        digitalWrite( clockPin, LOW );		
      }
      bitsRemaining -= u_BitsTihsRun;
      return;
    }

Then to use it:

  unsigned int u_Bits = 31;

  union UDATA{
    long l_Data;
    char c_Data[4];
  };

  UDATA u_Data;

  u_Data.l_Data = 0x7FFFFFFF;

  for( int i_Index = 0 ; i_Index < 4 ; ++i_Index ){
  
    shiftOut( dataPin, clockPin, MSBFIRST, u_Data.c_Data[ i_Index ], u_Bits );
  }

  digitalWrite( latchPin, HIGH );
  digitalWrite( latchPin, LOW );

shiftIn & shiftOut only shift 1 byte at a time.

many thanks, will try it soon;)

ok funziona ma continuo a non capire la logica di funzionamento del display D:

english version: ok it works but I still do not understand the logic of the display D:

It appears the screen may have more than 1 register cascaded, each one does 31 segments. 6 digits should be 48 segments if each digit has a decimal point.

this shows how to control 8 segments, http://www.sweeting.org/mark/blog/2011/11/27/arduino-74hc595-shift-register-and-a-7-segment-led-display

you will need to shift all 48 bits ( or however many segments ) before pulsing the latch pin high->low. Just like using cascaded 74hc595 registers.

This is how I think the datasheet says to do it, could be wrong.

The display has 6 digits with 7 segments plus a period and a comma for each digit except for the last

That would be 52 bits, I would try shifting 9 bits per digit.
Could try this. Hopefully the screen shows ‘444444’ maybe swap the MSBFIRST for LSBFIRST if it looks wrong.

for( int i_Index = 0 ; i_Index < 6 ; ++i_Index ){
  unsigned int u_Bits = 9;
  shiftOut( dataPin, clockPin, MSBFIRST, B01100110, u_Bits );
  shiftOut( dataPin, clockPin, MSBFIRST, B00000000, u_Bits );
}
digitalWrite( latchPin, HIGH );
digitalWrite( latchPin, LOW );

L' integrato ha 40 piedini. Togliendo i piedini per l'alimentazione e per il pilotaggio restano 31 piedini per i segmenti. Se leggi il datasheet é scritto che puó pilotare un display a 4½-digit a 7-segmenti che sono 28 segmanti per i 4 numeri, 1 per il mezzo digit e un punto decimale o un altro simbolo. L' integrato sará uno di concezione di 30-40 anni fa dove non usavi ancora componenti nei involucri smd che offrono piú piedini.

Visto che l' integrato non é organizzato per pilotare una cifra a 7 segmenti con relativo convertitore numero o BCD a segmenti ma puó pilotare solo segmenti ogni numero di uscite é valido.

Puoi usare per 2 integrati in cascata anche un normale shiftOut() ma i primi 2 Bit dei 8 Byte (64 Bit) trasmessi saranno persi.

Il calcolo quale bit settare per avere i segmenti da visualizzare un mumero devi calcoolarti Tu.

Ciao Uwe

Il calcolo quale bit settare per avere i segmenti da visualizzare un mumero devi calcoolarti Tu.

Be si uwe è normale ke lo debba fare io ;) al limite volevo sapere se avevi mai visto quel display (recuperato presso un benzinaio :grin:) cmq appena posso provo il codice di pYro_65 e se nn va bene mi metterò a smenettare un bel po ]:D

Miracolo xD ho capito come funziona, allora i primi 7 bit servono x i segmenti e l'ultimo per il punto perciò il codice che mi aveva dato pYro_65 va bene ma ormai non c'è bisogno del suo convertitore

mi basta mandare 6 byte uno dopo l'altro per controllarlo..Bene ora mi scrivo la libreria ]:)

grzie x l'aiuto ;)