Go Down

Topic: Limite de 8 caracteres spéciaux sur ecran LCD type 1602 ou 2004 (Read 1 time) previous topic - next topic

Fabriziooo

Bonjour

je fais une appli Processing qui me permet de "dessiner" sur un écran virtuel, et qui envoi ensuite ce dessin a Arduino, sur lequel un vrai écran est branché, de ce type :



(écran LCD qui se compose de "caractères" (5 pixel en largeur, et 8 en hauteur), sachant que l'écran entier est constitué de 16 caractère en longueurs, et 2 en hauteurs par exemple, pour un total de 32, ce qui donne un total de 1280 pixels, largement de quoi faire des dessins :D).

il est possible sur ces écrans d'afficher du texte avec un simple :

Code: [Select]
lcd.print("hello");

et il est aussi possible d'afficher d'autres choses que des lettres/chiffres, via la création de caractère spéciaux. On déclare un byte qui va contenir les pixels allumés et éteint des 8 lignes que composent un caractere, puis on affiche ce caractère spécial.

dans mon cas, mon programme Processing envoie 32 caractère a Arduino, et une boucle s'occupe de les transformer en caractères spéciaux, puis les afficher. jusque la, je ne comprenais pas, l'écran n'affichais que les 8 derniers caractères envoyés... et je viens de trouver la raison :

Une limitation matérielle sur ces écrans fait qu'il n'est possible d'avoir que 8 caractère spéciaux a la fois (apparemment c'est la RAM de l'écran qui est de 8 octet seulement..).
j'ai cherché un moyen de contourner ce problème, en réaffectant un caractère spécial déjà crée et déjà affiché, par un nouveau, mais ça va remplacer celui déjà affiché par le nouveau...

auriez vous une solution face a cela ? un moyen d'afficher autant de caractères spéciaux sur ce type d'écran, qu'il y a de caractère sur l'écran ? j'ai passé des journées entières sur ces 2 programmes, alors abandonner pour un problème aussi con, ça me ferait mal !

j'ai aussi lu que cela dépendais des écrans, les plus anciens ont cette limitation de 8 octet, mais apparemment il se pourrait que certains écrans de ce type possèdent plus de mémoire ... est ce véridique ? avez vous un lien pour en acheter ?

de plus, il existe des modules I2C de ce type que l'on peut brancher sur l'écran :



qui permettent de contrôler le contraste grâce a la petite vis, et d'avoir moins de branchements a faire. Je me demandais si ce composant pouvait aussi permettre d'augmenter le nombre de caractère spéciaux que l'on peut créer ?

merci

kamill

Bonjour,

Les 1602 n'ont que 8 caractères spéciaux.

L'interface I2C est simplement une interface de communication. Elle n'intervient pas du tout sur l'affichage lui même, donc pas de solution de ce coté.

Remarque: un caractère spécial ce n'est pas 1 octet, mais 8 octets, du moins pour l'arduino, peut être un peu moins (8 fois 5 bis) dans la mémoire de l'afficheur.

Fabriziooo

je declare mes byte non pas avec des 0 et des 1, mais avec un nombre entier pour chaque ligne de pixel du caractere, par exemple :

Code: [Select]
byte p1[8] = {1,2,3,4,5,6,7,8};

un byte, c'est un octet constitué de 8 bit. Ici, les 8 bit sont les 8 valeurs, et le tout donne un caractere, donc un caractere est defini par un octet Oo

quand on affiche ça, il décode de lui même ça en binaire et donne le bon affichage.

ça affichera ça :


kamill

Ton tableu c'est 8 bytes ou 8 octets
byte=octet
bit= 1/8eme d'octet

Fabriziooo

@kamill

dans ce cas c'est bête, pourquoi prendre 1 octet par "ligne de pixel", alors qu'il y a que 5 pixel en largeur ?
5*8bit suffiraient en théorie, donc 5 octet :/

@_pepe

oui je sais bien, mais je ne le fais pas manuellement, donc pas besoin que ce soit visuellement parlant. comme dis, c'est mon programme Processing qui calcule ces valeurs selon ce que j'ai dessiné, et justement je déclare ça comme ça car, lors de la liaison Serial entre Processing et Arduino, ça évite d'envoyer je ne sais combien de 0 et de 1, mais simplement 32 chaine de 8 nombres entiers, car au final le byte se déclare très bien ainsi et ça évite des opérations supplémentaires

---

du coup, si 1 caractère = 8 octet, pour un écran 1602, il faudrait un écran avec une mémoire de 256 octet pour pouvoir "dessiner" sur tout l'écran :/

bref mais il existe donc pas certains écrans 1602 avec plus de mémoire ? ou des 2004 qui ont plus de mémoire ?

kamill

dans ce cas c'est bete, pourquoi prendre 1 octet par "ligne de pixel", alors qu'il y a que 5 pixel en largeur ?
5*8bit suffiraient en theorie, donc 5 octet :/
Parce que la mémoire des processeurs est (en général) organisée en octet ou multiple.
Tu peux effectivement coder ton caractère sur 5 octets, mais tu vas vite t'apercevoir que c'est beaucoup plus compliqué.

Fabriziooo

ah et aussi, comment ça se fait que si, admettons on fait un caractere special, puis on l'affiche, et on passe au suivant, on l'affiche, etc 8 fois.

comment ça se fait que lorsqu'on fera le 9eme, et qu'on l'affiche, au lieu de se mettre a la suite il va remplacer le 1er caractere special meme si on rafraichis pas l'ecran ?

quand on affiche du texte avec des lcd.print() il a bel et bien la capacité d'afficher 32 caractere, et pourtant ça fait plus que 8 octet *8 caractere...

al1fch

Bonjour
Quote
comment ça se fait que lorsqu'on fera le 9eme, et qu'on l'affiche, au lieu de se mettre a la suite il va remplacer le 1er caractere special meme si on rafraichis pas l'ecran ?
En fait , avec ces afficheurs alphanumériques la matrice de pixels est rafraichie automatiquement en permanence en appliquant aux données envoyées en mémoire d'affichage (CGRAM)  les motifs prédéfinis dans 2 générateurs de caractères (motifs figés  ou 'utilisateur', les premiers en CGROM, les seconds dans une petite CGRAM. (CG pour Character genarator)

Il semble que les divers circuits intégrés utilisés, compatibles  avec le circuit intégré Hitachi HD44780 initial, reprennent la même taille de CGRAM n'autorisant que 8 'motifs' utilisateur.  L'adresse des motifs étanbt codée sur 3 bits , le 9ème devient le nouveau premier.

Cependant en technologie il ne faut jamais dire jamais !!! un compatible HD44780 étendu peut exister, autorisant la definition de plus de 8 motifs persos.


Fabriziooo

Merci pour vos réponses.

je dois bien avouer que quand j'ai vu qu'il était possible de définir un caractère spécial, je n'ai pas cherché plus loin, j'ai eu cette idée de faire un petit soft pour dessiner dessus, sans penser a un seul instant qu'il y aurait une quelconque limite matérielle...

voila le soft Processing que j'ai fait, il m'a pris beaucoup de temps et c'est pourquoi j'espère vraiment trouver un écran qui puisse accomplir a peu prés ce que je veux, comme vous le dites, il y a peut être des variantes, ou alors je me tournerais effectivement vers des afficheurs plus grands



le truc que je me demande, c'est pourquoi le standard n'a pas changé quand la mémoire a commencé a couter moins cher ? passer de 64 octet a 256 c'est pas non plus la lune, permettre de creer autant de caractere speciaux qu'il y a de caractere sur l'ecran, ça parait etre le minimum

fdufnews

Le standard comme tous les standard ne change pas pour des raisons de compatibilité.
Maintenant, étendre la RAM pour les gens qui veulent faire du graphique n'ouvrirait pas vraiment de nouveaux marchés dans la mesure où  il y a des écrans graphiques ce qui est quand même plus simple à utiliser dans ce cas.
Il faut bien voir que les afficheurs LCD basse résolution monochrome en 128x64 sont quasiment au même prix que les afficheurs alphanumériques.

Fabriziooo

_pepe_ parlait d'afficheurs graphiques de type 96*xx pour 16 caracteres, ou 120*xx pour 20 caracteres.

celui dont tu parles (128*64) est un ecran du meme genre ou c'est quelque chose de different ? car je trouve ça etonnant que ce soit juste 8 pixel de plus en largeur..

d'ailleurs quand _pepe_ parle de "16 caracteres" pour ce type d'ecran, je ne comprend pas trop car d'apres ce que j'ai compris, ces afficheurs ne sont plus sous forme de "caracteres", car tout les pixels sont collés entre eux, exact ?

si 120 pixel ça fait 20 caractere, alors 128 pixel, ça fait... 21,33 caracteres Oo je pige pas x)

Fabriziooo

Ah, ces écrans la utilisent eux aussi un système de "caractère", séparés par des pixels inutilisables ? ou c'est juste pour faire un exemple, de simuler un écran comme les 1602 et 2004 ?

et j'ai trouvé 2 types d'écrans après une brève recherche :

https://www.wish.com/c/58db65ed89f7bb53697812ed

https://www.wish.com/c/57dcac86a6c8ba1454d16bcf

les deux sont en 128x64 (autant prendre le plus grand parmi ceux que vous m'avez cité)

quelle est la différence entre les 2 ? lequel est "le mieux" ?

sont ils facilement utilisables avec Arduino ?

j'ai vu qu'il y avait 20 pin, est ce toutefois utilisable avec un module I2C dont je parlais en 1ere page ?

Go Up