Da dove posso partire

Buon Giorno a tutti,
ho acquistato questo display (http://www.canton-electronics.com/arduino-kit-5-digit-7-seg-serial-double-lcd-module-uno-mega2560-example-sketch-p-714.html) perchè avevo la necessità, leggendo una tensione da 0 a 5V, di visualizzare su un display la velocita di avanzamento di un asse comandato da azionamento, e nell'altro i giri di un motore comandato da inverter.
Per il cablaggi, non ci sono problemi, il discorso si complica, perchè non riesco a capire come programmare questo codice.
Qualcuno sa darmi delle dritte o consigliarmi cosa leggere per cercare di capire come fare?
Premessa, sono ASSOLUTAMENTE NEOFITA !!!
questo lo SKETCH di esempio:

//Author: cantone-electonics
//More information welcome to : http://www.canton-electronics.com 
//Arduino 1.0.4
//Arduino uno R3
//2x5 DIGIT 7SEG LCD

/*---Segment Display Screen----
--5--
1---6
--2--
3---7
--4--
8 decimal point
----------------------*/  

#define sbi(x, y)  (x |= (1 << y))   /*set Register x of y*/
#define cbi(x, y)  (x &= ~(1 <<y ))  /*Clear Register x of y*/       
      #define uchar   unsigned char 
      #define uint   unsigned int 
      //Defined HT1621's command  
      #define  ComMode    0x52  //4COM,1/3bias  1000    010 1001  0  
      #define  RCosc      0x30  //on-chip RC oscillator(Power-on default)1000 0011 0000 
      #define  LCD_on     0x06  //Turn on LCD 
      #define  LCD_off    0x04  //Turn off LCD 
      #define  Sys_en     0x02  //Turn on system oscillator 1000   0000 0010 
      #define  CTRl_cmd   0x80  //Write control cmd 
      #define  Data_cmd   0xa0  //Write data cmd   
      
      // //Define port    HT1621 data port
      #define CS   2  //Pin 2 as chip selection output
      #define WR   3  //Pin 3 as read clock  output
      #define DATA 4  //Pin 4 as Serial data output
     
      #define CS1    digitalWrite(CS, HIGH) 
      #define CS0    digitalWrite(CS, LOW)
      #define WR1    digitalWrite(WR, HIGH) 
      #define WR0    digitalWrite(WR, LOW)
      #define DATA1  digitalWrite(DATA, HIGH) 
      #define DATA0  digitalWrite(DATA, LOW)
      
     

char dispnum[6]={0x00,0x00,0x00,0x00,0x00,0x00};

/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/	  
const char num[]={0x7D,0x60,0x3E,0x7A,0x63,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x4F,0x1D,0x0E,0x6E,0x1F,0x17,0x67,0x47,0x0D,0x46,0x75,0x37,0x06,0x0F,0x6D,0x02,0x00,}; 

       /**------------------------------------------------------------------------- 

                        Name: SendBit_1621(send data) 
      ---------------------------------------------------------------------------*/ 

      void SendBit_1621(uchar sdata,uchar cnt) //High bit first
      { 
       uchar i; 
       for(i=0;i<cnt;i++) 
             { 
              WR0;
			  delayMicroseconds(20); 
              if(sdata&0x80) DATA1; 
              else DATA0; 
			  delayMicroseconds(20);
              WR1;
			  delayMicroseconds(20);
              sdata<<=1; 
              } 
		//delay_nus(20); 
      }
      /**------------------------------------------------------------------------- 

                        Name: SendCmd(send cmd) 
                        //Write MODE“100” AND 9 bits command 
      ---------------------------------------------------------------------------*/ 

      void SendCmd_1621(uchar command) 
      { 
      CS0; 
      SendBit_1621(0x80,4);    
      SendBit_1621(command,8);  
      CS1;                    
      } 
      /**------------------------------------------------------------------------- 

                        Name: Write_1621send data and cmd) 
      ---------------------------------------------------------------------------*/ 

      void Write_1621(uchar addr,uchar sdata) 
      { 
       addr<<=2; 
       CS0; 
       SendBit_1621(0xa0,3);     //Write MODE“101” 
       SendBit_1621(addr,6);     //Write addr high 6 bits
       SendBit_1621(sdata,8);    //Write data  8 bits
       CS1; 
      } 
      /**------------------------------------------------------------------------- 

                                Name: all_off(Clear Display) 
      ---------------------------------------------------------------------------*/ 

      void HT1621_all_off(uchar num) 
      { uchar i; 
        uchar addr=0; 
        for(i=0;i<num;i++) 
                       { 
                         Write_1621(addr,0x00); 
                     addr+=2; 
                    } 
      } 
      /**************************************************************************** 

                                Name: all_on(All lit) 
      ****************************************************************************/ 

      void HT1621_all_on(uchar num) 
      { uchar i,j; 
        uchar addr=0; 
        for(i=0;i<num;i++) 
                { Write_1621(addr,0xff); 
                addr+=2; 
                } 
      }      /**************************************************************************** 

                                Name: all_on_num(All lit,Display the same number) 
      ****************************************************************************/ 

      void HT1621_all_on_num(uchar num,uchar xx) 
      { uchar i,j; 
        uchar addr=0; 
        for(i=0;i<num;i++) 
                { Write_1621(addr,xx); 
                addr+=2; 
                } 
      } 

      /**************************************************************************** 

                                Name: Init_1621(initialize 1621) 
      *****************************************************************************/ 

      void Init_1621(void) 
      {
       SendCmd_1621(Sys_en);
       SendCmd_1621(RCosc);    
       SendCmd_1621(ComMode);  
       SendCmd_1621(LCD_on);
      } 
      /**************************************************************************** 

                                Name: LCDoff(off 1621) 
      *****************************************************************************/ 

      void LCDoff(void) 
      {  
       SendCmd_1621(LCD_off);  
      }

Spero di aver utilizzato la procedura corretta....
Rimanenza del codice....
GRAZIE

/**************************************************************************** 

                                Name: LCDon(on 1621) 
      *****************************************************************************/ 

      void LCDon(void) 
      {  
       SendCmd_1621(LCD_on);  
      } 
 

void displayallnum(unsigned int n)       //Display all digital characters
{uchar i,j; 
 uchar addr=0; 
 
        for(i=0;i<n;i++) 
                       { for(j=0;j<29;j++)
					     {
                         Write_1621(addr,num[j]); delay(100) ;
						 }
                         addr+=2; 
                       } 
  
}  


//By-bit display 8 characters and decimal point	
void displayall8(void)
{uchar i;
    HT1621_all_off(6);
	for(i=0;i<6;i++)
	   {
	Write_1621(2*i,0b11111111);
	delay(50) ;
	   }
}


//

 /**************************************************************************** 

   Name: displaydatatop(unsigned long int t,int p) Display  top lcd 
   t : Data to be displayed
   p : Display decimal
   s1,s2 : Left side of the Triangle                             
*****************************************************************************/ 

void displaydatatop(long int t,int p,char s1,char s2)
{uchar i;
dispnum[4]=num[t/10000];
dispnum[3]=num[(t/1000)%10];
dispnum[2]=num[(t/100)%10];
dispnum[1]=num[(t/10)%10];
dispnum[0]=num[t%10];
switch(p)
{case 1:
     sbi(dispnum[0], 7);
     break;
case 2:
     sbi(dispnum[1], 7);
     break;
case 3:
     sbi(dispnum[2], 7);
     break;
default:break;
}

if(s1==1)  sbi(dispnum[3], 7);
if(s2==1)  sbi(dispnum[4], 7);

for(i=0;i<5;i++) 
{Write_1621(i*2,dispnum[i]);
}
}    

 /**************************************************************************** 

   Name: displaydatabotton(unsigned long int t,int p) Display  botton lcd 
   t : Data to be displayed
   p : Display decimal
   s1,s2 : Left side of the Triangle                             
*****************************************************************************/ 
void displaydatabotton(long int t,int p,char s1,char s2)
{uchar i;
dispnum[4]=num[t/10000];
dispnum[3]=num[(t/1000)%10];
dispnum[2]=num[(t/100)%10];
dispnum[1]=num[(t/10)%10];
dispnum[0]=num[t%10];
switch(p)
{case 1:
     sbi(dispnum[0], 7);
     break;
case 2:
     sbi(dispnum[1], 7);
     break;
case 3:
     sbi(dispnum[2], 7);
     break;
default:break;
}

if(s1==1)  sbi(dispnum[3], 7);
if(s2==1)  sbi(dispnum[4], 7);

for(i=0;i<5;i++) 
{
  Write_1621((i+5)*2,dispnum[i]);
}
}    

void setup()
{
   pinMode(CS, OUTPUT); //Pin 2 
   pinMode(WR, OUTPUT); //Pin 3 
   pinMode(DATA, OUTPUT); //Pin 4  
  
}


void loop()
{
long int t=0;
uchar i,j;
delay(50) ;
Init_1621() ;

    HT1621_all_on(16) ;
	delay(300) ;
    HT1621_all_off(16);
	delay(300) ;
    HT1621_all_on(16) ;
	delay(300) ;
    HT1621_all_off(16);
	delay(300) ;

for(i=0;i<27;i++) 
   {
     HT1621_all_on_num(16,num[i]);
     delay(200) ;
   }
	 
    HT1621_all_off(16);
	
while(1)
    { 
   /*   
   for(i=0;i<10;i++) 
  {
     Write_1621(i*2,num[i]);
  }
  */
      
      //HT1621_all_on_num(16,num[8]);
     
    displaydatatop(t,1,1,1);
    displaydatabotton(99999-t,1,1,1);
    t++;
	if(t>99999) t=0;
	delay(100) ;
    

  }
}

Potresti partire dal REGOLAMENTO , punto 7 ... e racchiudere il tuo codice negli appositi tag CODE !!! >:( >:( >:(

Guglielmo

I display....

Cosa significa "programmare questo codice"?
Quello è già un programma, un programma non è programmabile....
La domanda qual'è?

Con il presente codice, dopo un test sui segmenti, parte su uno un conteggio da 0 a 99999 , mentre nell'altro contemporaneamente un countdown da 99999 a 0.
vorrei solo capire come va scritto il codice per questi display, leggendo trovavo solamente info per i classici display con collegamento a 16 pin.
Questi display mi sembrano più leggibili rispetto ai tradizionali 1602, motivo per il quale li avevo preferiti, senza contare il minor numero di pin Arduino necessari.

Ora attendo pazientemente qualche delucidazione/spiegazione da dove incominciare... visto che mi sembra molto complesso da gestire....
Mille grazie.

gpb01:
Potresti partire dal REGOLAMENTO , punto 7 ... e racchiudere il tuo codice negli appositi tag CODE !!! >:( >:( >:(

Guglielmo

scusa..... mi rileggo subito il regolamento

Forse questa e la procedura corretta alla quale ti riferivi?

SegLcd_2x5d_ino.ino (8.37 KB)

pablos:
Cosa significa "programmare questo codice"?
Quello è già un programma, un programma non è programmabile....
La domanda qual'è?

Quello è il programma di esempio fornitomi,
il mio intento e di stampare nel display 1 una velocita compresa tra 0 e 9000 in base alla tensione letta su pin A0, e nel display 2 una velocita da 0 a 18000 , sempre in rapporto alla tensione letta Al pin A1.
Guardando lo scketch di esempio , non sono riuscito a capire la logica...quindi volevo avere delle nozioni per eseguire tali letture...

come usarlo te lo dice qui

Name: displaydatatop(unsigned long int t,int p) Display top lcd
t : Data to be displayed
p : Display decimal
s1,s2 : Left side of the Triangle

Quindi sostanzialmente non e' solo un esempio, ma tutta questa pappardella di roba devi riportarla nel tuo sketch

avevo la necessità, leggendo una tensione da 0 a 5V, di visualizzare su un display la velocita di avanzamento di un asse comandato da azionamento, e nell'altro i giri di un motore comandato da inverter.

il mio intento e di stampare nel display 1 una velocita compresa tra 0 e 9000 in base alla tensione letta su pin A0, e nel display 2 una velocita da 0 a 18000 , sempre in rapporto alla tensione letta Al pin A1.

Non capisco che sensori tu usi, visto che dici escono con una tensione di 0-5V, pero' ricordati che il convertitore AD di Arduino e' un 10 bit, quindi riporta dei valori da 0 a 1023.. Puoi benissimo fare un rapporto moltiplicativo, ma la risoluzione è quella che è

Allora, cerco di spiegare un po meglio:
ho una scheda di controllo, che comanda 3 azionamenti (che comandano i relativi passo passo) ed un inverter che a sua volta comanda un elettromandrino. Volevo dotare il tutto di due potenziometri esterni per variare giri motore e velocità avanzamento, tutto questo fatibile, ma perdo la visualizzazione a monitor dei valori quali RPM mandrino e vel. avanzamento.
L' inverter è pilotato con tensione 0-10V da parte della scheda, mentre x gli avanzamenti, dovrò fornire una tensione variabile 0-5 v. I 10 V veranno gestiti tramite un partitore, in modo da far arrivare massimo 5 v al pin Analogico di arduino.

Ora,dopo ore di letture ed analizzando sketch di esempio , cercando di capire il linguaggio di programmazione sono arrivato a questo sketch (se corretto) al quale dovrei far stampare i risultati nei due display. Purtroppo in questi non funziona la stampa con il "lcd.print("rotazioni"); sbaglio?
Questo quello che ho provato a scrivere, non da errori la verifica, può funzionare?
purtroppo cercando di integrarlo nel programma di esempio, mi genera errori che eventualmente vi citerò, se quello da me scritto non è una castroneria...

[quote]
 [color=#CC6600]int[/color] RPM=A0;       [color=#7E7E7E]//PIN Lettura velocità Mandrino[/color]
 [color=#CC6600]int[/color] F=A1;         [color=#7E7E7E]//PIN Lettura velocità AVANZAMENTO[/color]
 
[color=#CC6600]float[/color] v_ref=5.0;   [color=#7E7E7E]//Tensione di riferimento[/color]
 [color=#CC6600]int[/color] val_rpm=0;
 [color=#CC6600]int[/color] val_f=0;
[color=#CC6600]float[/color] rotazioni;
[color=#CC6600]float[/color] avanzamento;
[color=#CC6600]float[/color] max_rpm=18000; [color=#7E7E7E]//Giri massimi elettromandrino giri/min[/color]
[color=#CC6600]float[/color] max_f=9000;  [color=#7E7E7E]//Massima velocità avanzamento mm/min[/color]

[color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]()
{
  [color=#CC6600]analogRead[/color](RPM); [color=#7E7E7E]//prima lettura analogica giri motore[/color]
  [color=#CC6600]analogRead[/color](F);   [color=#7E7E7E]//prima lettura analogica vel. avanzamento[/color]
                   [color=#7E7E7E]//inizializzare display[/color]
  [color=#CC6600]delay[/color] (10);
}

[color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]()
{
  val_rpm=[color=#CC6600]analogRead[/color](RPM);[color=#7E7E7E]//valore lettura A0[/color]
  rotazioni=(max_rpm/v_ref)*val_rpm;[color=#7E7E7E]//conversione[/color]
  
  val_f=[color=#CC6600]analogRead[/color](F);[color=#7E7E7E]//valore lettura A1[/color]
  avanzamento=(max_f/v_ref)*val_f;[color=#7E7E7E]//conversione[/color]
  
  [color=#CC6600]delay[/color](100);
}

[/quote]

PS: è corretto il modo di inserire nel forum il Code?

chiedo scusa,
nel preview il codice sembrava leggibile, nel post sono state aggiunte voci.....devo aver sbagliato qualcosa nel pubblicare.
portate pazienza per favore...

avevo utilizzato la funzione copia per il forum.... chiedo venia

int RPM=A0;       //PIN Lettura velocità Mandrino
 int F=A1;         //PIN Lettura velocità AVANZAMENTO
 
float v_ref=5.0;   //Tensione di riferimento
 int val_rpm=0;
 int val_f=0;
float rotazioni;
float avanzamento;
float max_rpm=18000; //Giri massimi elettromandrino giri/min
float max_f=9000;  //Massima velocità avanzamento mm/min

void setup()
{
  analogRead(RPM); //prima lettura analogica giri motore
  analogRead(F);   //prima lettura analogica vel. avanzamento
                   //inizializzare display
  delay (10);
}

void loop()
{
  val_rpm=analogRead(RPM);//valore lettura A0
  rotazioni=(max_rpm/v_ref)*val_rpm;//conversione
  
  val_f=analogRead(F);//valore lettura A1
  avanzamento=(max_f/v_ref)*val_f;//conversione
  
  delay(100);
}

innanzi tutto, ricordati che il valore che leggi sui pin analogici non e' direttamente un valore in tensione, quindi devi convertirlo

void loop()
{
  val_rpm=analogRead(RPM);//valore lettura A0
  float volt_a0 = val_rpm * (v_ref / 1023.0); // ottieni il valore di tensione letto
  rotazioni = (max_rpm / v_ref) * volt_a0 ;//conversione
  
  val_f=analogRead(F);//valore lettura A1
  float volt_a1 = val_f * (v_ref / 1023.0) ;
  avanzamento = (max_f / v_ref) * volt_a1;//conversione
  
  delay(100);
}

poi, prova con questo sketch

//Author: cantone-electonics
//More information welcome to : http://www.canton-electronics.com 
//Arduino 1.0.4
//Arduino uno R3
//2x5 DIGIT 7SEG LCD

/*---Segment Display Screen----
 --5--
 1---6
 --2--
 3---7
 --4--
 8 decimal point
 ----------------------*/

#define sbi(x, y)  (x |= (1 << y))   /*set Register x of y*/
#define cbi(x, y)  (x &= ~(1 <<y ))  /*Clear Register x of y*/       
#define uchar   unsigned char 
#define uint   unsigned int 
//Defined HT1621's command  
#define  ComMode    0x52  //4COM,1/3bias  1000    010 1001  0  
#define  RCosc      0x30  //on-chip RC oscillator(Power-on default)1000 0011 0000 
#define  LCD_on     0x06  //Turn on LCD 
#define  LCD_off    0x04  //Turn off LCD 
#define  Sys_en     0x02  //Turn on system oscillator 1000   0000 0010 
#define  CTRl_cmd   0x80  //Write control cmd 
#define  Data_cmd   0xa0  //Write data cmd   

// //Define port    HT1621 data port
#define CS   2  //Pin 2 as chip selection output
#define WR   3  //Pin 3 as read clock  output
#define DATA 4  //Pin 4 as Serial data output

#define CS1    digitalWrite(CS, HIGH) 
#define CS0    digitalWrite(CS, LOW)
#define WR1    digitalWrite(WR, HIGH) 
#define WR0    digitalWrite(WR, LOW)
#define DATA1  digitalWrite(DATA, HIGH) 
#define DATA0  digitalWrite(DATA, LOW)



char dispnum[6]={
  0x00,0x00,0x00,0x00,0x00,0x00};

/*0,1,2,3,4,5,6,7,8,9,A,b,C,c,d,E,F,H,h,L,n,N,o,P,r,t,U,-, ,*/
const char num[]={
  0x7D,0x60,0x3E,0x7A,0x63,0x5B,0x5F,0x70,0x7F,0x7B,0x77,0x4F,0x1D,0x0E,0x6E,0x1F,0x17,0x67,0x47,0x0D,0x46,0x75,0x37,0x06,0x0F,0x6D,0x02,0x00,}; 

int RPM=A0;       //PIN Lettura velocità Mandrino
int F=A1;         //PIN Lettura velocità AVANZAMENTO

float v_ref=5.0;   //Tensione di riferimento
int val_rpm=0;
int val_f=0;
float rotazioni;
float avanzamento;
float max_rpm=18000; //Giri massimi elettromandrino giri/min
float max_f=9000;  //Massima velocità avanzamento mm/min


/**------------------------------------------------------------------------- 
 * 
 * Name: SendBit_1621(send data) 
 ---------------------------------------------------------------------------*/

void SendBit_1621(uchar sdata,uchar cnt) //High bit first
{ 
  uchar i; 
  for(i=0;i<cnt;i++) 
  { 
    WR0;
    delayMicroseconds(20); 
    if(sdata&0x80) DATA1; 
    else DATA0; 
    delayMicroseconds(20);
    WR1;
    delayMicroseconds(20);
    sdata<<=1; 
  } 
  //delay_nus(20); 
}
/**------------------------------------------------------------------------- 
 * 
 * Name: SendCmd(send cmd) 
 * //Write MODE“100” AND 9 bits command 
 ---------------------------------------------------------------------------*/

void SendCmd_1621(uchar command) 
{ 
  CS0; 
  SendBit_1621(0x80,4);    
  SendBit_1621(command,8);  
  CS1;                    
} 
/**------------------------------------------------------------------------- 
 * 
 * Name: Write_1621send data and cmd) 
 ---------------------------------------------------------------------------*/

void Write_1621(uchar addr,uchar sdata) 
{ 
  addr<<=2; 
  CS0; 
  SendBit_1621(0xa0,3);     //Write MODE“101” 
  SendBit_1621(addr,6);     //Write addr high 6 bits
  SendBit_1621(sdata,8);    //Write data  8 bits
  CS1; 
} 
/**------------------------------------------------------------------------- 
 * 
 * Name: all_off(Clear Display) 
 ---------------------------------------------------------------------------*/

void HT1621_all_off(uchar num) 
{ 
  uchar i; 
  uchar addr=0; 
  for(i=0;i<num;i++) 
  { 
    Write_1621(addr,0x00); 
    addr+=2; 
  } 
} 
/**************************************************************************** 
 * 
 * Name: all_on(All lit) 
 ****************************************************************************/

void HT1621_all_on(uchar num) 
{ 
  uchar i,j; 
  uchar addr=0; 
  for(i=0;i<num;i++) 
  { 
    Write_1621(addr,0xff); 
    addr+=2; 
  } 
}      /**************************************************************************** 
 * 
 * Name: all_on_num(All lit,Display the same number) 
 ****************************************************************************/

void HT1621_all_on_num(uchar num,uchar xx) 
{ 
  uchar i,j; 
  uchar addr=0; 
  for(i=0;i<num;i++) 
  { 
    Write_1621(addr,xx); 
    addr+=2; 
  } 
} 

/**************************************************************************** 
 * 
 * Name: Init_1621(initialize 1621) 
 *****************************************************************************/

void Init_1621(void) 
{
  SendCmd_1621(Sys_en);
  SendCmd_1621(RCosc);    
  SendCmd_1621(ComMode);  
  SendCmd_1621(LCD_on);
} 
/**************************************************************************** 
 * 
 * Name: LCDoff(off 1621) 
 *****************************************************************************/

void LCDoff(void) 
{  
  SendCmd_1621(LCD_off);  
} 
/**************************************************************************** 
 * 
 * Name: LCDon(on 1621) 
 *****************************************************************************/

void LCDon(void) 
{  
  SendCmd_1621(LCD_on);  
} 

void displayallnum(unsigned int n)       //Display all digital characters
{
  uchar i,j; 
  uchar addr=0; 

  for(i=0;i<n;i++) 
  { 
    for(j=0;j<29;j++)
    {
      Write_1621(addr,num[j]); 
      delay(100) ;
    }
    addr+=2; 
  } 

}  


//By-bit display 8 characters and decimal point	
void displayall8(void)
{
  uchar i;
  HT1621_all_off(6);
  for(i=0;i<6;i++)
  {
    Write_1621(2*i,0b11111111);
    delay(50) ;
  }
}
//

/**************************************************************************** 
 * 
 * Name: displaydatatop(unsigned long int t,int p) Display  top lcd 
 * t : Data to be displayed
 * p : Display decimal
 * s1,s2 : Left side of the Triangle                             
 *****************************************************************************/

void displaydatatop(long int t,int p,char s1,char s2)
{
  uchar i;
  dispnum[4]=num[t/10000];
  dispnum[3]=num[(t/1000)%10];
  dispnum[2]=num[(t/100)%10];
  dispnum[1]=num[(t/10)%10];
  dispnum[0]=num[t%10];
  switch(p)
  {
  case 1:
    sbi(dispnum[0], 7);
    break;
  case 2:
    sbi(dispnum[1], 7);
    break;
  case 3:
    sbi(dispnum[2], 7);
    break;
  default:
    break;
  }

  if(s1==1)  sbi(dispnum[3], 7);
  if(s2==1)  sbi(dispnum[4], 7);

  for(i=0;i<5;i++) 
  {
    Write_1621(i*2,dispnum[i]);
  }
}    

/**************************************************************************** 
 * 
 * Name: displaydatabotton(unsigned long int t,int p) Display  botton lcd 
 * t : Data to be displayed
 * p : Display decimal
 * s1,s2 : Left side of the Triangle                             
 *****************************************************************************/
void displaydatabotton(long int t,int p,char s1,char s2)
{
  uchar i;
  dispnum[4]=num[t/10000];
  dispnum[3]=num[(t/1000)%10];
  dispnum[2]=num[(t/100)%10];
  dispnum[1]=num[(t/10)%10];
  dispnum[0]=num[t%10];
  switch(p)
  {
  case 1:
    sbi(dispnum[0], 7);
    break;
  case 2:
    sbi(dispnum[1], 7);
    break;
  case 3:
    sbi(dispnum[2], 7);
    break;
  default:
    break;
  }

  if(s1==1)  sbi(dispnum[3], 7);
  if(s2==1)  sbi(dispnum[4], 7);

  for(i=0;i<5;i++) 
  {
    Write_1621((i+5)*2,dispnum[i]);
  }
}    

void setup()
{
  pinMode(CS, OUTPUT); //Pin 2 
  pinMode(WR, OUTPUT); //Pin 3 
  pinMode(DATA, OUTPUT); //Pin 4  
  analogRead( A0 ); //prima lettura analogica giri motore
  analogRead( A1 );   //prima lettura analogica vel. avanzamento

  delay (10);
  uchar i,j;
  delay(50) ;
  Init_1621() ;
  HT1621_all_off(16);
}


void loop()
{
  val_rpm=analogRead( RPM );//valore lettura A0
  float volt_a0 = val_rpm * (v_ref / 1023.0); // ottieni il valore di tensione letto
  rotazioni=(max_rpm/v_ref) * volt_a0 ;//conversione
  displaydatatop(rotazioni,1,1,1);

  val_f=analogRead( F );//valore lettura A1
  float volt_a1 = val_f * (v_ref / 1023.0) ;
  avanzamento=(max_f/v_ref) * volt_a1;//conversione
  displaydatabotton(avanzamento,1,1,1);
}

Grazie Brunello, gentilissimo. Ho provato in pausa prazo (di fretta) il codice, sommariamente funziona, ha solo due problemini, non riesco a togliere la virgola nell'ultimo decimale (quindi la lettura è es. 1750,0 invece che 17500, moltiplicando *10 ilrisultato mi dava errore) e come seconda cosa, c'è una fluttuazione delle cifre, come se cambiassero rapidamente....
Questa sera provo a studiarmi lo sketch con calma...
La prova la ho fatta con un potenziometro ALPS direttamente sulla 5v di arduino

 * Name: displaydatatop(unsigned long int t,int p) Display  top lcd 
 * t : Data to be displayed
 * p : Display decimal
 * s1,s2 : Left side of the Triangle

quindi ad occhio. devi sostituire ( nel loop )

displaydatatop(rotazioni,1,1,1) ;
con
displaydatatop(rotazioni,0,1,1) ;

OTTIMO !!! sono appena arrivato a casa ed ho provato subito quanto da te consigliatomi.
Sparita la virgola, mentre per quanto riguarda le fluttuazioni dei numeri, dipendeva dalla alimentazione della porta USB. Ho tetstato alimentando Arduino per mezzo di una batteria 9V e i numeri ora sono quasi stabili, a parte leggerissime variazioni.
Sarebbe già sufficiente così, temo però, una volta collegato alla scheda controller, che se ci fossero oscillazioni di tensione in mV, queste si ripercuoterebbero sulla stabilità della lettura dei numeri nel display. Cercherò di ottimizzare il partitore di tensione, sperando che non mi crei troppi problemi. Credi eventualmente con un delay si possa attenuare il problema?
E possibile dare una tolleranza entro la quale non far variare la stampa sul display? (che ne so, tipo a passi di 2 unità la prima cifra a DX)?
Se è troppo complicato, lo lascio così, che è già sufficiente allo scopo.

Ora cercherò di capire come funziona questo sketch, la vedo un po dura però, considerando la mia esperienza. Solitamente si dovrebbe partire da cose semplici, lo so, purtroppo per me, questa era una cosa che mi serviva proprio, e quindi ho dovuto saltare a piè pari....

Mille grazie ancora per la tua disponibilità.

metti almeno un condensatore elettrolitico e un'altro ceramico da 0.1µF sull'alimentazione del LCD
Comunque mi pare anche giusto mettere un delay, non credo che tu voglia fare 50-60 letture al secondo,
E' anche per questo che sfarfalla

Mi hai fatto ridere dicendo di visualizzare il valore quando cambia di almeno 2 unità
18, vorrai dire, perche' con quella scala 0-5V 18000 giri 1023 risoluzione AD di arduino, 18 e' il massimo che si ottiene
Se poi si considera che la precisione dell'AD e' di +-1bit, ottieni che hai dei passi da 35

Giusto, a pensarci bene hai perfettamente ragione, si capisce proprio che non sono abituato a ragionare in questi termini....
Oltretutto pensavo di mettere un condensatore da 100 nF tra la massa ed il centrale del potenziometro. Può aiutare?

rende la lettura leggermente piu' stabile. Male non fa'