Overblog
Editer la page Suivre ce blog Administration + Créer mon blog

LCD alphanumérique et picaxes M2

 

Retrouvez cette page
et toutes les mises à jour
sur

 

En même temps que des Picaxes série M2, j'ai trouvé chez Gotronic un petit afficheur alphanumérique 2X 16 caractères, rétroéclairé blanc, ref:DEM 16209 FGH-PW

 

au prix de 6,95 euros! 

Et bien, ils font un heureux mariage. 

 

Voici le shéma du test pour un LCD 1602 standard (cliquez dessus pour agrandir).

 

  test LCD et picaxe14M2

 

Pour un DEM 16209 FGH-PW, il faut inverser le brochage Vo et V+

 

Deux composants extérieures seulement . Oui, mais il faut être un peu radin:

 

Vo est le réglage du contraste de l'afficheur. Avec un potentiomètre, on remarque que la meilleure valeur se situe entre 0.6 et 0.7 volt.

 

C'est la tension aux bornes d'une diode 1n4148 ou 1n4007 dans le sens direct. Il suffit de la placer dans le circuit d'alimentation de la diode d'éclairage. Le contraste obtenu convient à la majorité des afficheurs, une exception pour un 2004 .

 

En fait, ces picaxes pilotent parfaitement les afficheurs de type "Hitachi HD44780".

 

En mode 4 bits, seuls 4 bus de données sont utilisés, + E, + RS, + alim = 8 connexions

 

Sur un 14M2, les ports B pilotent l'afficheur, restent les ports C pour développer une petite application.

Une alternative est l'adaptation en LCD série

 

Principe de l'utilisation d'un afficheur HD44780 en mode 4 bits et picaxe 14M2:

Le mode 4 bits permet de limiter le nombre de sorties et de connexionx utilisées.

 

Les données sont de deux types:

Les commandes pour gérer l'affichage ex: effacer l'écran, positionner le curseur pour écrire où il faut etc.

Les données "data",correspondantes à des caractères à afficher

 

La différentiation  est fournie sur la patte RS de l'afficheur, connecté à B.0 sue le schéma:

RS =0 : c'est une commande ; RS = 1 : c'est un caractère.

 

Les caractères sont codés sur 8 bits. En mode 4 bits, ces 8 bits seront envoyés en deux paquets de 4 bits. La transmission se fait par une brève impulsion sur l'entrée E de l'afficheur connecté à la sortie B.1

Les 4 bits de données DB4 à DB7 sont reliés aux sorties B.2 à B.5 

 

En tête et initialisation:

    dirsB=%1111111 'défini les ports B en sorties

SYMBOL RS = B.0             ; 0 = Command 1 = Data
SYMBOL E = B.1                ; 0 = Idle 1 = Active
SYMBOL DB4 = B.2           ; LCD Data Line 4
SYMBOL DB5 = B.3            ; LCD Data Line 5
SYMBOL DB6 = B.4            ; LCD Data Line 6
SYMBOL DB7 = B.5            ; LCD Data Line 7
SYMBOL RSCMDmask = %00000000    ; Select Command register
SYMBOL RSDATmask = %00000001     ; Select Data register
SYMBOL cpt = b11
SYMBOL char = b12
SYMBOL rsbit = b13

'Nibble commands - To initialise 4-bit mode

DATA 0,( $33 ) ; %0011---- %0011---- 8-bit / 8-bit
DATA 1,( $32 ) ; %0011---- %0010---- 8-bit / 4-bit

'Byte commands - To configure the LCD

DATA 2,( %00101000 ) ; %001LNF00 Display Format
DATA 3,( %00001100 ) ; %00001DCB Display On
DATA 4,( %00000110 ) ; %000001IS Cursor Move
‘ ;                                  L : 0 = 4-bit Mode 1 = 8-bit Mode
‘ ;                                 N : 0 = 1 Line 1 = 2 Lines
‘ ;                                 F : 0 = 5x7 Pixels 1 = N/A
‘ ;                                 D : 0 = Display Off 1 = Display On
‘ ;                                 C : 0 = Cursor Off 1 = Cursor On
‘ ;                                 B : 0 = Cursor Steady 1 = Cursor Flash
‘ ;                                 I : 0 = Dec Cursor 1 = Inc Cursor
‘ ;                                S : 0 = Cursor Move 1 = Display Shift
DATA 5,( $01 ) ; Clear Screen

 

Les données d'initialisation, stokées dans les data sont fournies par la doc constructeur. Elles sont envoyées au picaxe: 

    PowerOnReset:

                    FOR cpt = 0 TO 5
                                  READ cpt,char
                                 GOSUB SendInitCmdByte
                    NEXT

 

Voyons maintenant les sous programmes de gestion:

 

SendInitCmdByte:

PAUSE 15 ; Delay 15mS

SendCmdByte:

rsbit = RSCMDmask ; Send to Command register

SendDataByte:

pins = char & $F0 / 4 | rsbit ; Put MSB out first
PULSOUT E,1 ; Give a 10uS pulse on E

pins = char & $0F * 4 | rsbit ; Put LSB out second
PULSOUT E,1 ; Give a 10uS pulse on E

rsbit = RSDATmask ; Send to Data register next

RETURN 

 

Explications: Il y a trois niveaux d'entrée .

 

Entrée "SendInitCmdByte:"

Ne sert qu'à introduire le delai nécessaire à l'initialisation du LCD.

 

Entrée "SendCmdByte:" utilisée pour initialiser une commande

Ne sert qu'à positionner rsbit à 0 donc RS à 0 dans le cas d'une commande .

 

Entrée "SendDataByte:"   utilisée pour transmettre les données "data".  

pins = char & $F0 / 4 | rsbit  

 

La ligne mérite une explication ex: pour un caractère à afficher.

Nous ne sommes pas passé par "SendCmdByte". rsbit = %0000001 par défaut

 

Dans l'ordre, de gauche à droite:

 

char: c'est le caractère sur 8 bits Ex : %0110 1001

 

$F0 = écriture hexadécimale de  : %1111 0000

 

& est un ET logique.

%0110 1001 & %1111 000   

Le résultat de l'opération est la mise à 0 des 4 derniers bits de char :

 Résultat : % 0110 0000

 

/4, a pour effet de supprimer les deux derniers  bits et de faire rentrer deux 0 à gauche : Résultat : % 00011000

 

| est la notation d'un OU logique.

%00011000 | %0000001  ; place simplement 1 au dernier bit (data)

 

Résultat final:  00011001 (bit7,bit6,   bit1,bit0)

 

La commande pinsB envoie respectivement ces 8 bits de bit7 à bit0 sur les sorties B.7 à B.0 du picaxe. On a donc:

RS sur B.0 à 1 pour l'envoie d'un caractère "data"

E sur B.1 = 0 , il passera à 1 pour le transfert à l'instruction suivante

de B.2 à B.5 , on retrouve 0110, la première moitié de l'octet à transmettre

 

 PULSOUT E,1

Une petite impulsion sur E (nom de B.1) , c'est parti

 

Ensuite: 

    pins = char & $0F * 4 | rsbit

 

$0F = %0000 1111 remplace les 4 premiers bits par 0

Résultat : 0000 1001 

 

*4 : la multiplication décale de deux bits à gauche

Résultat : 00100100

 

|rsbit

rsbit = 1 s'ajoute en bit0

Résultat : 00100101

 

PULSOUT E,1 . La seconde moitié est envoyée au LCD

 

Pour finir:

     rsbit = RSDATmask

 

RSDATmask vaut simplement 1 (ou %00000001)

rsbit =1 par défaut (on envoie plus souvent des "data" que des commandes)

 

C'est fini! 

 

La gestion de l'affichage prend une centaine d'octets, sur les 2048 de la nouvelle série M2, il reste largement de la place.

 

 

Ex: La minuterie pour insoleuse decrite ici  

 

 

 

Petite photo de jour:

   

LCD picaxe 003

 

   C'est beau....

 

 

Et dans le noir:

 

LCD picaxe 002

 

 

C'est encore plus beau......

 

 

Il y a quand même un truc bizarre sur cet afficheur:

 

LCD picaxe 004

 

  C'est la connexion, espacement des pattes : 0,9 mm, un pas de 1,80mm  

Bizarre, bizarre...

 

 

Il y en a d'autres, dénommés 1602 (2 lignes) ou 1604 (4 lignes), que l'on trouve en cherchant un peu, pour un prix tout aussi faible, même si ils viennent de plus loin.

 

En voici un: blanc sur fond bleu,

 

  

  LCD BlancB

 

 

Ici aussi, la tension de polarisation est fixée par une diode 1n4148 dans le circuit de rétroéclairage. On a pas mieux avec un potensiomètre.

 

 

Différences avec l'afficheur précédent:

La connexion est standard, pas de 2,54

Plus facile à intégrer dans une facade.

Vo et V+ sont inversés. C'est le DEM16209 qui n'est pas "standard".

Le fait de laisser les entrées DB0 à DB3 en l'air ou les relier à la masse ne change apparemment pas grand chose. Mais les docs parlent tellement d'électricité statique, les relier à la masse est une précaution. 

 

 

Voici le code de l'affichage:

 

J'ai repris le code en exemple pour afficheur standard HD44780, il sagit probablement du même chip.

Voici le lien avec la source originale de ce code:

 

http://galia.fc.uaslp.mx/~cantocar/microcontroladores/PICAXE/PICAXE_LCD_INTERFACING.HTM

 

 Il n'y aucune modification, sauf quelques lignes de mise en forme pour V1 et V2:

 

Voir aussi le code des autres applications du blog:

Minuterie compteuse décompteuse LCD 2X16c et picaxe 14M2

 

 

 

       'test code Afficheur lcd alpha  pour 14M2

 #picaxe14M2 'directive 14M2
 
 setfreq m4 '4MHz pour respect des temporisations
 
 dirsB=%1111111 'défini les ports B en sorties
 
 SYMBOL  RS        = B.0         ; 0 = Command   1 = Data
 SYMBOL  E         = B.1         ; 0 = Idle      1 = Active
 SYMBOL  DB4       = B.2         ; LCD Data Line 4
 SYMBOL  DB5       = B.3         ; LCD Data Line 5
 SYMBOL  DB6       = B.4         ; LCD Data Line 6
 SYMBOL  DB7       = B.5         ; LCD Data Line 7
 SYMBOL  RSCMDmask = %00000000 ; Select Command register
 SYMBOL  RSDATmask = %00000001 ; Select Data register
 SYMBOL  cpt       = b11
 SYMBOL  char      = b12
 SYMBOL  rsbit     = b13
       
 'Nibble commands - To initialise 4-bit mode
 
 DATA 0,( $33 )    ; %0011---- %0011----   8-bit / 8-bit
 DATA 1,( $32 )    ; %0011---- %0010----   8-bit / 4-bit
 
 'Byte commands - To configure the LCD
 
 DATA 2,( %00101000 )    ;  %001LNF00   Display Format
 DATA 3,( %00001100 )    ;  %00001DCB   Display On
 DATA 4,( %00000110 )    ;  %000001IS   Cursor Move
 ‘                            ; L : 0 = 4-bit Mode    1 = 8-bit Mode
 ‘                            ; N : 0 = 1 Line        1 = 2 Lines
 ‘                            ; F : 0 = 5x7 Pixels    1 = N/A
 ‘                            ; D : 0 = Display Off   1 = Display On
 ‘                            ; C : 0 = Cursor Off    1 = Cursor On
 ‘                            ; B : 0 = Cursor Steady 1 = Cursor Flash
 ‘                            ; I : 0 = Dec Cursor    1 = Inc Cursor
  ‘                           ; S : 0 = Cursor Move   1 = Display Shift
 DATA 5,( $01 )    ; Clear Screen

 

 'Texte dans l'afficheur  
 DATA 6,("V1=")
 DATA 9,("V2=") 
 
PowerOnReset:

 FOR cpt = 0 TO 5
  READ cpt,char
  GOSUB SendInitCmdByte
 NEXT

 


      '************DEBUT PROGRAMME PERSO*************

symbol volt = b0
symbol dvolt = b1
symbol uvolt = b2

symbol cvolt= b3


DisplayTopLine:
 
 char= $80 | $00 'curseur début ligne1
 gosub SendCmdByte
   
 FOR cpt = 6 TO 8 'lecture texte "V1="
  READ cpt,char
  GOSUB SendDataByte
 NEXT
 
 readadc C.4,volt 'lecture valeur V1
 gosub trans
 gosub ecrit
 
 char= $80 | $40 'curseur début ligne2 
 gosub SendCmdByte
 
 FOR cpt = 9 TO 11 'lecture texte "V2="
  READ cpt,char
  GOSUB SendDataByte
 NEXT
 
 readadc C.0,volt 'lecture valeur V2
 gosub trans
 gosub ecrit
 
 goto DisplayTopLine 

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

trans:'Ici, transformation de la valeur lue (0 à 255) en V (0 à 50) puis en 2 caractères ascii


volt= 10*5*volt/255 'mise à l'échelle de 0 à 50


dvolt=volt/10+48 'chiffre des diz + 48 pour valeur ascii correspondante
uvolt=volt//10+48 'idem pour unités

' on peut remplacer ces 2 dernières lignes par:

                           'bintoascii volt,cvolt,dvolt,uvolt

'cvolt est obligatoire, même si il n'est pas utilisé ici

return

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

ecrit: 'on écrit de gauche à droite

 

 char=dvolt 'affichage des dizaines
GOSUB SendDataByte

char="," 'position de la virgule
GOSUB SendDataByte

char=uvolt 'affichage des unités
GOSUB SendDataByte
return  

'***********FIN PROGRAMME PERSO*************************
 
SendInitCmdByte:
 
 PAUSE 15                        ; Delay 15mS
 
SendCmdByte:
 
 rsbit = RSCMDmask               ; Send to Command register
 
SendDataByte:
 
 pins = char & $F0 / 4 | rsbit   ; Put MSB out first
 PULSOUT E,1                     ; Give a 10uS pulse on E
 
 pins = char & $0F * 4 | rsbit   ; Put LSB out second
 PULSOUT E,1                     ; Give a 10uS pulse on E
  
 rsbit = RSDATmask               ; Send to Data register next
 
 RETURN

 

 

 

 

 

Partager cette page
Repost0
Pour être informé des derniers articles, inscrivez vous :