LCD alphanumérique et picaxes M2
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).
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:
C'est beau....
Et dans le noir:
C'est encore plus beau......
Il y a quand même un truc bizarre sur cet afficheur:
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,
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