Protocole serie pour afficheur 20 caracteres 14 segments ?

Oui pour tout ça.

Cependant cela nécessiterait quelque modifications du code pour le rendre plus simple dans son utilisation et moins gourmand en mémoire.
Par exemple, actuellement chaque caractère est défini dans un tableau de 20 valeurs qui sont soit 0, soit 1 ce qui du point de vue de l'utilisation mémoire est très inefficace,
La ligne suivante utilise 20 octets pour stocker la description du caractère A

byte literaA[20] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1};

En l'écrivant autrement on pourrait n'utiliser que 4 octets

unsigned long literaA=0b00000000000001111111;

ou

unsigned long literaA = 0x007F;

Cela implique de modifier légèrement la fonction affichcar0() pour qu'elle prenne ce nombre et qu'elle teste les 20 bits utiles pour savoir si elle doit envoyer un 1 ou un 0.
Quelque chose comme ça

void affichcar0 (byte placecar, unsigned long caracter) {
   // first put position of character
    for(int i=0;i<20;i++) {
    if (i == placecar) digitalWrite(din, 1);
    else  digitalWrite(din, 0);
     digitalWrite(clk, HIGH);
     digitalWrite(clk, LOW);
    }
 //   digitalWrite(clk, LOW);

// second put letter/character
  unsigned long car = caracter;
  for(int i=19;i>=0;i--) {
     digitalWrite(din, caracter && 1? HIGH: LOW); 
     car >>= 1;
     digitalWrite(clk, HIGH);
     digitalWrite(clk, LOW);
    }
 //   digitalWrite(clk, LOW);

  // load the changes
    digitalWrite(load, HIGH);
    digitalWrite(load, LOW);
}

Ensuite, pour pouvoir afficher des phrases, il serait pratique de faire un tableau avec les lettres et les chiffres pour que l'on puisse facilement aller chercher la description des caractères à afficher dans ce tableau en utilisant le code ASCII des lettres de la phrase.