[ Accueil ] [ CONTACT ] [ PLAN du Site ] [ RCNV ] [ Publications ] [ Chantiers Bateaux ] [ Technique Modélisme ] [ Electronique ] [ Radios Vintage ] [ Multi-Switch ] [ Vrac ] [ Astuces ] [ Liens ] [ Base ] [ Compteur ]
 

        ... rgl

 

Serial LCD / OLED

Driver universel

2x 16#
4x 20#

(c)  Rg.LEGAT 

 

SOMMAIRE:

01 -  Introduction - Présentation - Généralités

02 - LCD ou OLED ?

03 - Conception d'un Driver Serie Universel LCD / OLED

04 - Le firmware  
En test

05 - Les codes de programmation

06 - Programme de démonstration sur module AXE134 et OLED 4x20# (caractères graphiques personnalisés et gestion des sorties T/R)

07 - Programme d'affichage de tous les caractères des 4 tables de l'OLED WS0010

  

      Introduction - Présentation - Généralités

 L'utilisation d'un Driver Serie pour un afficheur LCD ou OLED est particulièrement intéressant dans la mesure où il ne faudra plus utiliser qu'un seul port de votre µC pour piloter un afficheur.

A défaut, si vous chargez votre µC de cette tâche, il faudra lui consacrer 6 ports  si vous le pilotez en  4 bits, ou 10 ports si vous le pilotez en 8 bits !

On comprends, dès lors, très vite, l'intérêt d'un tel driver !

Adepte des µC Picaxe, j'avais fait l'acquisition de leur driver AXE133 destiné à piloter un afficheur LCD 2x16 caractères.

Ils disposent également du modèle AXE134 pour des afficheurs OLED 4x20 caractères.

Ils sont tout deux contrôlés par un Picaxe 18M2, programmés suivant l'un ou l'autre modèle précités.

Et Picaxe met gracieusement le code source de ces deux firmwares à notre disposition.

En les analysant j'ai fini par me construire mon propre driver qui reprend l'ensemble des fonctionnalités suivantes :

  - Pilotage d'un 2x16 ou d'un 4 x20 par jumper de sélection
  - Gestion de 3 sorties "Tout ou Rien" (Led, relais, ...)
  - Gestion du retro-éclairage (pour les LCD)
  - Révision des notices: ajouts de codes de pilotage (Gestion des 4 tables de caractères de l'OLED, caractères graphiques personnalisés, ...) 
  - Possibilté de personnaliser et reprogrammer le firmware à volonté

      LCD ou OLED ?

LCD. (Liquid Crystal Display)
Les afficheurs LCD sont facilement disponibles pour des prix dérisoires.
Les modèles les plus connus intègrent le (ou les) contrôleur(s) Hitachi HD44780 et sont constitués d'un affichage noir sur fond grisâtre dont le contraste peut être ajusté en sus d'un rétro éclairage.
Pour améliorer la lisibilité, il existe maintenat des afficheurs plus agréables dont les caractères apparaissent en blanc sur fond bleu.
Un rétro-éclairage est toujours intégré à l'afficheur.

OLED. (Organic Light-Emitting Diodes)
Les avantages de cette technologie sont multiples : les écrans sont plus brillants, plus contrastés, plus fins et plus légers que les écrans LCD.
Ils ont aussi le grand avantage de nécessiter beaucoup moins d'énergie.
Si les écrans Oled sont plus fins, c'est parce qu'ils ne nécessitent pas de dispositif de rétroéclairage.
En effet, avec la technologie Oled, chaque pixel se transforme en une source de lumière. De fait, les contrastes sont souvent plus marqués.
Le noir se traduit simplement par l'extinction des pixels, chose impossible avec un écran LCD qui doit disposer d'un rétroéclairage pour lecture dans la pénombre.
Son prix est cependant plus élevé que le LCD

Ils existent en diverses couleurs (blanc, jaune, bleu, vert ou rouge) sur fond noir.
Picaxe utilisent les afficheurs WINSTAR pour ses modules.
En outre, leur WS0010 propose 4 tables différentes de caractères : West European Table1 et 2, English-Japonese, English-Russian.

     Conception d'un driver LCD/OLED Serie Universel 

Le schéma de principe:

Comme toujours, lorsqu'on utilise un µC, ici un Picaxe 20X2, le schéma de câblage est très succinct.
En fait, tout résidera dans la programmation de ce MicroContrôleur !

La tension d'alimentation générale est celle du Picaxe, soit 4,5 à 5V.

  

Sur ce schéma, on voit que l'afficheur sera contrôlé en 8 bits par le Port B.

Le port C est utilisé comme suit:
  C.0: Enable de l'afficheur
  C.1: RS de l'afficheur
  C.2: Jumper de configuration (Choix de l'afficheur LCD 2x16 ou OLED 4x20)
  C.3: Sortie T/R 01
  C.4: Sortie T/R 02
  C.5: Sortie T/R 03
  C.6: Entrée Serial IN
  C.7: Retro-éclairage (Un rétroéclairage "hors programmation" est possible par le jumper placé entre E-C du transitor de commutation) 
                                       (Le tansistor NPN pourrait être remplacé par un N-Channel MosFet, type BS170.)
           Pour un afficheur OLED, cette sortie pourra être utilisée comme une sortie Tout ou Rien supplémentaire puisque le rétro-éclairage est inexistant.

En outre le Picaxe 20X2 dispose de son slot de programmation et communication console, pour révision éventuelle de son firmware que nous allons voir plus bas.

Le circuit imprimé:

Pour une optimisation du circuit imprimé, je l'ai concu en double face mais en utilisant une technique qui ne nécessite pas de vias métallisés.
Il est donc à la portée de l'amateur averti.
Ces vias sont réalisés en placant des chutes de queues de composants qui traversent le circuit et qui sont soudées des deux côtés.
Parfois, un composant peut même jouer ce rôle de connexion entre les deux faces du circuit.  (voir technique sur cette page)

 

     Le Firmware 

x

    En test ... 

 

     Les codes de programmation 

     

 

  

Adresses des caractères d'un afficheur

  

  

  Caractères graphiques personnalisés

  

 

                   
 Téléchargez le calculateur de code d'un Caractère Graphique:  

 

     Programme de démonstration AXE134 - OLED 20x4# 

' ---------------------------------------------------------------------

'  Fichier: PILOTAGE ORIGINAL.bas

'  Date: 24/03/2020

'  Version du fichier: V1.0

'  Ecrit par: Rg LEGAT

'  Fonction: Test du module AXE134 et OLED 4x20#

'            Creation des caracteres graphiques personnalises (CGRAM)

'            Programmation des 3 sorties Tout ou Rien

'  Type de PICAXE: 28X2  (Aussi testé avec succes sur un 08M2)

' *********************************************************************

 

 #Picaxe 28X2

'#Picaxe 08M2

 #Terminal 4800

 Symbol Display = C.4 'In Serial OLED Display 28X2

'Symbol Display = C.2 'In Serial OLED Display 08M2

 Symbol BAUD = N2400_8 '28X2

'Symbol Baud = N2400_4 '08M2

 

Symbol Pos = b0 ' Adress char.

Symbol i = b1  ' Indice variable

 

Sertxd (cr,lf," Pilotage original.bas",cr,lf) 'Debug console (Prg identification)

Sertxd (" Test module AXE134 avec firmware Picaxe non modifie",cr,lf)

Sertxd ("        Display: OLED 4x20 #",cr,lf)

 

Pause 4000 'Stabilize Serial Display

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Pause 1000

 

Serout Display,Baud,(254,128)'L1 C1

Serout Display,Baud,("   FirmWare AXE134 ")

Serout Display,Baud,(254,192)'L2 C1

Serout Display,Baud,("Original Non modifie")

Serout Display,Baud,(254,148)'L3 C1

Serout Display,Baud,("  Pour OLED 4x20#")

Serout Display,Baud,(254,212)'L4 C1

Serout Display,Baud,("Prg de Demonstration")

Pause 4000

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,128)'L1 C1

Serout Display,Baud,("Creation caracteres")

Serout Display,Baud,(254,192)'L2 C1

Serout Display,Baud,("personnalises CGRAM")

Serout Display,Baud,(254,148)'L3 C1

Serout Display,Baud,("+Controle des 3 LEDs")

Serout Display,Baud,(254,212)'L4 C1

Serout Display,Baud,("--------------------")

Pause 4000

 

'    TESTING 255 COMMAND

'+++++++++++++++++++++++++++++++

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,128)'L1 C1

Serout Display,Baud,("--- Control LEDs ---")

 

Serout Display,Baud,(254,152)'L3 C4

Serout Display,Baud,("bit0 = 1")

Serout Display,Baud,(255,%00000001) '$1 OUT1

Pause 1500

 

'Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,152)'L3 C4

Serout Display,Baud,("bit1 = 1")

Serout Display,Baud,(255,%00000010) '$2 OUT2

Pause 1500

 

'Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,152)'L3 C4

Serout Display,Baud,("bit2 = 1")

Serout Display,Baud,(255,%00000100) '$4 OUT3

Pause 1500

 

Serout Display,Baud,(255,%00000000) '$0 All OUT OFF

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,195)'L2 C4

Serout Display,Baud,("Scrolling LEDs")

 

For i = 1 to 6

  Serout Display,Baud,(255,%00000001) '$1 OUT1

  Pause 150

  Serout Display,Baud,(255,%00000010) '$2 OUT2

  Pause 150

  Serout Display,Baud,(255,%00000100) '$4 OUT3

  Pause 150

Next

 

Serout Display,Baud,(254,195)'L2 C4

Serout Display,Baud,("Blinking LEDs ")

 

For i = 1 to 4

  Serout Display,Baud,(255,%00000111) '$7 All OUT ON

  Pause 350

  Serout Display,Baud,(255,%00000000) '$0 All OUT OFF

  Pause 350

Next

 

 

Serout Display,Baud,(255,%00000111) '$7 All OUT ON

Pause 1500

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,192)'L2 C1

serout Display,Baud,("----- LEDs OFF -----")

Serout Display,Baud,(255,%00000000)  '$0 All OUT OFF

Pause 2000

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,192)'L2 C1

Serout Display,Baud,("----- Writing -----")

Pause 2000

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,15) 'Cursor ON

Serout Display,Baud,(254,128)'L1 C1

Serout Display,Baud,("12345 --  ",125,127,126)

Pause 1000

 

'Serout Display,Baud,(COMD,15) 'Cursor ON

Serout Display,Baud,(254,192)'L2 C1

Serout Display,Baud,("ABCDE --  ",126,127,179)

Pause 1000

 

'Serout Display,Baud,(COMD,15) : Pause 30 'Cursor ON

Serout Display,Baud,(254,148)'L3 C1

Serout Display,Baud,("FGHIJ --  ",222,244,180)

Pause 1000

 

'Serout Display,Baud,(COMD,15) 'Cursor ON

Serout Display,Baud,(254,212)'L4 C1

Serout Display,Baud,("KLMNO --  ",210,181)

Pause 3000

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

 

Serout Display,Baud,(254,12) 'No Cursor

 

 

' Creation Graphic Character

'++++++++++++++++++++++++++++++++

 

'GG0

Serout Display,Baud,(254,$40)

Serout Display,Baud,($0E,$1B,$11,$11,$11,$11,$11,$1F)' : Battery Level 0 in CG0

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG1

Serout Display,Baud,(254,$48)

Serout Display,Baud,($0E,$1B,$11,$11,$11,$11,$1F,$1F)' : Battery Level 1 in CG1

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG2

Serout Display,Baud,(254,$50)

Serout Display,Baud,($0E,$1B,$11,$11,$11,$1F,$1F,$1F)' : Battery Level 2 in CG2

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG3

Serout Display,Baud,(254,$58)

Serout Display,Baud,($0E,$1B,$11,$11,$1F,$1F,$1F,$1F)' : Battery Level 3 in CG3

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG4

Serout Display,Baud,(254,$60)

Serout Display,Baud,($0E,$1B,$11,$1F,$1F,$1F,$1F,$1F)' : Battery Level 4 in CG4

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG5

Serout Display,Baud,(254,$68)

Serout Display,Baud,($0E,$1B,$1F,$1F,$1F,$1F,$1F,$1F)' : Battery Level 5 in CG5

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG6

Serout Display,Baud,(254,$70)

Serout Display,Baud,($0E,$1F,$1F,$1F,$1F,$1F,$1F,$1F)' : Battery Level 6 in CG6

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG7

Serout Display,Baud,(254,$78)

Serout Display,Baud,($01,$1B,$00,$04,$01,$12,$0C,$00)' : Smile in CG7

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

 

 

' Call CG

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,192)'L2 C1

Serout Display,Baud,(" Custom Characters")

Serout Display,Baud,(254,212)'L4 C1

Serout Display,Baud,("  (Battery Level)")

Pause 3000

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

 

 

Serout Display,Baud,(254,128)'L1 C1

Serout Display,Baud,("CG 0/7  = ",0,1,2,3,4,5,6,7)

Serout Display,Baud,(254,148)'L3 C1

Serout Display,Baud,("CG 8/15 = ",8,9,10,11,12,13,14,15)

 

Pause 4000

 

Serout Display,Baud,(254,1) : Pause 30 'Clear Display

Serout Display,Baud,(254,128) 'L1 C1

Serout Display,Baud,("->Change CGRAM Char.")

Serout Display,Baud,(254,192) 'L2 C1

Serout Display,Baud,("--------------------")

 

' CHANGE CG RAM

'++++++++++++++++++++++++++++++++

 

'GG0

Serout Display,Baud,(254,$40)

Serout Display,Baud,($0E,$11,$15,$11,$0E,$04,$0A,$11)' : in CG0

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG1

Serout Display,Baud,(254,$48)

Serout Display,Baud,($0E,$15,$0A,$15,$0A,$15,$0A,$15)' :  in CG1

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG2

Serout Display,Baud,(254,$50)

Serout Display,Baud,($1B,$1B,$00,$1B,$1B,$00,$1B,$1B)' :  in CG2

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG3

Serout Display,Baud,(254,$58)

Serout Display,Baud,($12,$09,$04,$12,$09,$04,$12,$09)' :  in CG3

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG4

Serout Display,Baud,(254,$60)

Serout Display,Baud,($09,$12,$04,$09,$12,$04,$09,$12)' :  in CG4

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG5

Serout Display,Baud,(254,$68)

Serout Display,Baud,($1F,$04,$15,$15,$1F,$15,$04,$1F)' :  in CG5

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG6

Serout Display,Baud,(254,$70)

Serout Display,Baud,($0F,$1E,$1C,$10,$1C,$1E,$0F,$00)' : PacMan Open in CG6

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

'GG7

Serout Display,Baud,(254,$78)

Serout Display,Baud,($0E,$1F,$1F,$1E,$1F,$1F,$0E,$00)' : PacMan Close in CG7

Serout Display,Baud,(254,128)' : Reinit Address DDRAM

 

Pause 3000

 

Serout Display,Baud,(254,148)'L3 C1

Serout Display,Baud,("CG 0/7  = ",0,1,2,3,4,5,6,7)

Serout Display,Baud,(254,212)'L4 C2

Serout Display,Baud,("CG 8/15 = ",8,9,10,11,12,13,14,15)

 

Pause 4000

 

 For Pos = 128 to 147

  Gosub PacMan

 Next

 

 For Pos = 192 to 211

  Gosub PacMan

 Next

 

 For Pos = 148 to 167

  Gosub PacMan

 Next

 

 For Pos = 212 to 231

  Gosub PacMan

 Next

 

Pause 1000

 

Serout Display,Baud,(254,192)'L2 C1

Serout Display,Baud,(" --- End of TEST ---")

Serout Display,Baud,(254,212)'L4 C1

Serout Display,Baud,("       Have Fun ...")

 

'Blinking

For i = 1 to 4

  Serout Display,Baud,(255,%00000111)' $7 

  Pause 100

  Serout Display,Baud,(255,%00000000)' $0 

  Pause 100

Next

 

End

' ------------------------------------------------------

' -----------------

'    SUB ROUTINE

' -----------------

PacMan:

Serout Display,Baud,(254,Pos)'L2 C19

 Serout Display,Baud,(6)

 Pause 50

 Serout Display,Baud,(254,Pos)'L2 C19

 Serout Display,Baud,(7)

 Pause 50

 Serout Display,Baud,(254,Pos)

 Serout Display,Baud,(" ")

return

 

'=============================================================

 

     Affichage de tous les caractères des 4 tables de l'OLED WS0010

'---------------------------------------------------------------------
Fichier: Test Character Table OLED 2 et 4 lignes .bas
'  Date: 24/03/2020
'  Version du fichier: V1.0
'  Ecrit par: Rg LEGAT
'  Fonction: Test du module AXE134 et OLED 4x20#
'            Visualisation complète des 4 tables de caractères du WS0010
'  Type de PICAXE: 28X2 (essayé aussi avec succes sur 08M2)
'  Testé sur AXE134 + OLED 4x20

' ********************************************************************* 

#Picaxe 28x2

 

   Variables:

'-----------------

{         

Symbol Display = C.4 'In Serial OLED Display

Symbol BAUD = N2400_8 '28X2

'Symbol Baud = N2400_4 ' 08M2

 

Symbol i = b2 'Variable de travail

Symbol Delai = 500

Symbol Char = 252 'Ne pas dépasser 252!?

'Les 3 derniers char. (253 a 255)posent probleme: Clear Screen non effectue, ... !

}

Pause 2000         'Init Serial interface                           

 

Serout Display,Baud,(254,1) : Pause 30    ' Clear Display

Serout Display,Baud,(254,128)             ' Lin1, Col1

Serout Display,Baud,("ENGLISH-JAPAN") : Pause 1000

Serout Display,Baud,(254,%00111000) ' $38 

  Gosub Affichage

 

Serout Display,Baud,(254,1) : Pause 200'30 ' Clear Display

Serout Display,Baud,(254,128)             ' Lin1, Col1

Serout Display,Baud,("WESTERN-EUROP_01") : Pause 1000

Serout Display,Baud,(254,%00111001)  ' $39 

  Gosub Affichage

 

Serout Display,Baud,(254,1) : Pause 200'30 ' Clear Display

Serout Display,Baud,(254,128)             ' Lin1, Col1

Serout Display,Baud,("ENGLISH-RUSSIAN") : Pause 1000

Serout Display,Baud,(254,%00111010)   ' $3A 

  Gosub Affichage

 

Serout Display,Baud,(254,1) : Pause 200'30 ' Clear Display

Serout Display,Baud,(254,128)             ' Lin1, Col1

Serout Display,Baud,("WESTERN-EUROP_02") : Pause 1000

Serout Display,Baud,(254,%00111011 ' $3B  

  Gosub Affichage

 

Serout Display,Baud,(254,1) : Pause 200'30 ' Clear Display

Serout Display,Baud,(254,128)             ' Lin1, Col1

Serout Display,Baud,("FIN DU TEST CHAR") : Pause 1000

'Serout Display,Baud,(254,1) : Pause 30   ' Clear Display

 

End

' ------------------------------------------------------

' -----------------

'    SUB ROUTINE

' -----------------

 

Affichage:

For i = 16 to Char '0 a 15 = CGRAM

 'Serout Display,Baud,(254,1) : Pause 30  ' Clear Display

 Serout Display,Baud,(254,192)            ' Lin2, Col1

 Serout Display,Baud,(#i)

 Serout Display,Baud,(254,148)            ' Lin3, Col1

 Serout Display,Baud,(i)

 Pause Delai

 Next

return

'============================================================= 

 

 

xxx

 

 

 

 

 

 http://extremetracking.com/open?login=rglalpmn

 
[ Electronique ]
Copyright © Roger LEGAT - 2008 - Tous Droits réservés - (Thds V2)