Electromag1 Circuits électroniques et Picaxes

Petit site pour ceux qui bricolent en électronique en général et sur les PICAXES en particulier.
Les PICAXES sont des microprocesseurs (PIC de Microship) programmables en BASIC. Pleins de qualités, pas chers, ultra faciles à programmer.
Tout (ou presque) est sur le site du distributeur Gotronic (voir les liens).
Les pages  seront ajoutées ou modifiées petit à petit.
Dans le but d'améliorer ce blog, communiquez moi vos remarques et les erreurs que vous pouvez constater.
Pour me contacter: Envoyez un mail à l'adresse : mag1mic@free.fr .  Tout message reçoit une réponse
Pour retourner au menu, Cliquer sur "LISTE DES PAGES", ici ou en haut de la colonne de gauche
Pour laisser un message, allez dans le "LIVRE D'OR"
Bonne visite
 
 

LCD alphanumériques Hitachi HD44780 et picaxes

 

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

 

  test LCD et picaxe14M2

 

Deux composants extérieures seulement .

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 sur le schéma:
RS =0 : c'est une commande ; RS = 1 : c'est un caractère.

Les données 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 un 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 soit (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) , Et la première moitié est envoyée au LCD 

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 . Et 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: le DEM16209

   

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 potentiomètre. 

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

Se trouve sur internet à un prix dérisoire.
La connexion est standard, pas de 2,54.
Plus facile à intégrer dans une facade.

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.

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


Afficher la suite de cette page



Créé avec Créer un site
Créer un site