Faire défiler un texte

Yex2

Member
Bonjour à tous,

Je suis nouveau sur ce forum et aussi nouveau dans la programmation des PICAXE. Je viens de terminer deux projets de lecteur de niveau d'eau en utilisant la fonction "touch16" des PICAXE. Ce fût très intéressant comme projet.

J'ai de nouveau projet qui vont demander un peu plus d'expertise...

Pour aujourd’hui, j'aimerais savoir s'il est possible de faire défiler des texte sur un LCD qui sont plus long que la longueur de colonne du LCD choisi ?

Évidement j'aimerais savoir s'il existe une commande simple ou s'il faut faire des prouesses d'informatiques.

Merci d'avance,

Yex2
 

ddaweb

New Member
Bonjour,
Oui chaque caractère peut être placé à une position déterminée sur le LCD.

Si je prend le cas du LCD AXE 133Y que j'utilise (2 lignes de 16 caractères, liaison série) :
- hserout LCD,(254,128,"Hello World") : placera le texte sur la 1ère ligne à partir du 1er caractère
- hserout LCD,(254,130,"Hello") : placera le texte sur la 1ère ligne à partir du 3me caractère ... donc décalé de 2 caractères
- hserout LCD,(254,192,"Hello World") : placera le texte sur la 2me ligne à partir du 1er caractère
- hserout LCD,(254,193,"World") : placera le texte sur la 2me ligne à partir du 2me caractère ... donc décalé de caractère
- hserout LCD,(254,1) : efface tout l'afficheur
- LCD est un symbol déterminant la sortie du picaxe : symbol LCD=C.6 (pour mon picaxe 28x2).
- ATTENTION : l'affichage reste jusqu'à une nouvelle programmation sur la position ... si vous voulez effacer un caractère, il faut le remplacer par un espace.

Chaque type d'afficheur aura sa propre ligne de programmation.
 

Yex2

Member
Bonjour ddaweb,

J'utilise un interface IC2. Les broches C.1 pour le SCL et C.2 pour le SDA.

Est-ce que ton code vas fonctionner automatiquement ou pas ?

Merci,

Yves

PS: je pratiquement nul à ce stade ci. Je comprends vite mais il faut 'expliquer longtemps... ;)
PPS: je sais pas si c'est important de mentionner mais présentement je travail sur un 08M2. Je sais que certaine commande ne seront disponible pour celui là.
 
Last edited:

ddaweb

New Member
Il existe des afficheurs i2c directement ... il faudra voir le manuel de ce type d'afficheur, mais les commandes seront donc i2c depuis le picaxe, le principe restera le même : donner l'emplacement de début (ligne et emplacement de début) et le texte ou variable à afficher.
Un exemple : https://www.gotronic.fr/art-afficheur-lcd-i2c-4x20-caracteres-25649.htm.

Pour le bus i2c, je passe la main à @PieM , je n'ai que quelques notions très basiques.

NB : il faudra voir si le 08m2 permet cela.

Vous êtes canadien ?
 

BESQUEUT

Senior Member
Bonjour et bienvenue sur le forum.
Le mieux serait de publier votre code avec un petit texte qui ne défile pas encore.
Comme cela on pourra montrer par l'exemple comment le faire défiler.
On peut effectivement ré-écrire le texte à une position différente,
Mais il me semble qu'au moins certains LCD permettent un shift sans tout ré-écrire... à approfondir...
Cordialement,
 

Yex2

Member
Bonjour et bienvenue sur le forum.
Le mieux serait de publier votre code avec un petit texte qui ne défile pas encore.
Comme cela on pourra montrer par l'exemple comment le faire défiler.
On peut effectivement ré-écrire le texte à une position différente,
Mais il me semble qu'au moins certains LCD permettent un shift sans tout ré-écrire... à approfondir...
Cordialement,
Ça c'est fait. Mon projet est de construire un moniteur de consommation d'eau. Présentement la routine d'affichage fonctionne et la simulation de la consommation d'eau fonctionne aussi.

Fonctionnement en gros :

Sous routine "pseudo" aléatoire génère une simulation de consommation quotidienne.
À la fin du cycle de consommation, je compare aux valeurs minimal et maximal et je remplace au besoin.

Lorsque je serai entièrement satisfait avec l'affichage, je remplacerai la sous-routine "aleatoire" par un débitmètre. C'est la suite...

Code:
;    SCL sur C.1

;    SDA sur C.2

#picaxe 08M2    ;directive picaxe utilisé (pour erreur de commandes)

dirsC =%000111


setfreq M16        ;fréquence 16MHz   

;****** Nominations constantes ********

symbol baud= N2400_16              ;vitesse liaison RS232


 ;******* noms variables bit sur b0 ***********

symbol rsbit=bit0                ;bit commande/data afficheur

symbol calibr=bit1            ;memo phase calibration


;***** noms variables bytes ****************

 ; b1,b2,b3,b4,b5 utilisés dans bintoascii

 symbol posi        =b6            ;position curseur

 symbol car            =b7            ;caractère à afficher

 symbol dat            =b8

 symbol cpt2        =b9            ; comteur temporaire

 symbol cpt3        =b10


;****** noms variables word ********* 

symbol varw              =w13        ;variable tempotaire

symbol deb              =w12        ;debut texte

symbol cpt            =w11        ;compteur

symbol total        =w10        ;consomation total depuis dernier reset

symbol today        =w9        ;consomation journalière

symbol mini            =w8        ;consomaion miminum depuis dernier reset

symbol maxi            =w7        ;consomaion miminum depuis dernier reset

symbol nombre        =w6        ;nombre aléatoire


;******* Nominations ports ***********

;symbol switch      = pinC.5    ;valeur poussoir de validation


; Initialisation I2C 4 bits , etc ********

    hi2csetup i2cmaster,%01001110, i2cslow_32, i2cbyte

    

; Initialisation LCD *********

    for cpt=0 to 5

        lookup cpt,($33,$32,$28,$c,$6,$01),car

        gosub EnvoiByteCommInit

    next

    pause 100    ;temps init du LCD

    

    

;  Affichage texte initial ***********************           

    car= 128    'curseur début ligne 1

    gosub EnvoiByteComm   

    for cpt=0 to 19

    lookup cpt,("Conso Total en LITRE"),car

    GOSUB EnvoiByteData   

    next   


    car= 192    'curseur  début ligne 2

    gosub EnvoiByteComm   

    for cpt=0 to 19

    lookup cpt,("Conso Quotidienne  L"),car

    GOSUB EnvoiByteData   

    next


    car= 148    'curseur  début ligne 3

    gosub EnvoiByteComm   

    for cpt=0 to 19

    lookup cpt,("Maximum Enregistre L"),car

    GOSUB EnvoiByteData   

    next


    car=212        'curseur début ligne 4

    gosub EnvoiByteComm

    for cpt=0 to 19

    lookup cpt,("Minimum Enregistre L"),car

    GOSUB EnvoiByteData

    next

    pause 6000 


; Initialisation temporaire

    total        =000

    today        =000

    maxi        =000   

    mini        =100            ; Nécessaire au démarrage sinon la valeur sera toujours 0

    cpt3        =0

    gosub AfficheCourant

    gosub AfficheRecord

    pause 6000

do

    gosub aleatoire            ; sous-routine temporaire pour simuler une consomation d'eau.

    gosub record                ; cette routine devra être appeler une fois par jour seulement   

loop


; les sousroutines **********************


; donne une valeur aléatoire pour simuler une consomation d'eau journalière. Sera éventuellement remplacé par le "flow meter"

aleatoire:

    today =0            ; compteur journalier remis à zéro.

    random nombre        ; fonction aléatoire mon cul oui ! :-(

    for cpt2=1 to nombre           

        today    =today+1    ;produit une consommation artificielle avec incrément de 1/10ème de litre.

            total    =total+1    ;donne la somme de la consomation   

            gosub AfficheCourant

;        pause 100

            if cpt2> 200 then        ; arrêtes la consomation si celle-ci dépasse 20 litres/session       

                nombre= cpt3    ; pour redémarrer la fonction "random" plus loin.

                cpt3=cpt3+1

                    pause 6000

                exit

            endif

    next

    pause 3000

return


;calcule les minimums et maxiums

record:

    if mini > today then

        mini= today

    endif

    if maxi < today then

        maxi=today

    endif

    gosub AfficheRecord

    pause 6000

    return


; Affichage les valeurs Total et courantes

AfficheCourant:   

     car= 139    'curseur  ligne 1, position 12

      gosub EnvoiByteComm   

    if total> 999 then

        bintoascii total,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,("  ",b4,b3,b2,",",b1," L"),car    ;on a besoin que de 4 chiffres

            GOSUB EnvoiByteData

      next

      else if total> 99 then

         bintoascii total,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,("   ",b3,b2,",",b1," L"),car    ;on a besoin que de 3 chiffres

            GOSUB EnvoiByteData

      next

    else

        bintoascii total,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,("    ",b2,",",b1," L"),car    ;on a besoin que de 2 chiffres

            GOSUB EnvoiByteData

      next

    endif

    

        car= 203    'curseur  ligne 2, position 12

        gosub EnvoiByteComm       

      if today> 99 then

         bintoascii today,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,(".  ",b3,b2,",",b1," L"),car    ;on a besoin que de 3 chiffres

            GOSUB EnvoiByteData

      next

    else

        bintoascii today,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,(".   ",b2,",",b1," L"),car    ;on a besoin que de 2 chiffres

            GOSUB EnvoiByteData

      next

    endif

return


AfficheRecord:

    car= 159    'curseur  ligne 3, position 12

      gosub EnvoiByteComm

    if maxi <> today then

         bintoascii maxi,b5,b4,b3,b2,b1         

       for cpt=0 to 8

            lookup cpt,(".  ",b3,b2,",",b1," L"),car     ;on enlève les symboles ">>"

            GOSUB EnvoiByteData

      next

    else if maxi> 99 then

         bintoascii maxi,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,(">> ",b3,b2,",",b1," L"),car    ;on a besoin que de 3 chiffres

            GOSUB EnvoiByteData

      next

    else

        bintoascii maxi,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,(">>  ",b2,",",b1," L"),car    ;on a besoin que de 2 chiffres

            GOSUB EnvoiByteData

      next   

      endif


    car= 223    'curseur  ligne 4, position 12

      gosub EnvoiByteComm

    if mini <> today then

         bintoascii mini,b5,b4,b3,b2,b1         

       for cpt=0 to 8

            lookup cpt,(".  ",b3,b2,",",b1," L"),car     ;on enlève les symboles ">>"

            GOSUB EnvoiByteData

      next

    else if mini> 99 then

         bintoascii mini,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,(">> ",b3,b2,",",b1," L"),car    ;on a besoin que de 3 chiffres

            GOSUB EnvoiByteData

      next

    else

        bintoascii mini,b5,b4,b3,b2,b1   

        for cpt=0 to 8

            lookup cpt,(">>  ",b2,",",b1," L"),car    ;on a besoin que de 2 chiffres

            GOSUB EnvoiByteData

      next

endif

return 



; Sub envoi vers LCD via I2C *************

EnvoiByteCommInit:

    pause 15

EnvoiByteComm:

    rsbit=0

EnvoiByteData:

;1ére moitié

    dat=car & $F0 | %1000 | rsbit ;%1000 pour l'éclairage

    hi2cout (dat)

    pause 1       

    dat=dat | %1100

    hi2cout (dat)    ;pulse sur E cad P2

    pause 1

    dat=dat | %1000 & %1011   ;fin pulse

    hi2cout (dat)

    pause 1   

;2éme moitié

    dat=car & $0F * 16 | %1000 | rsbit

    hi2cout (dat)

    pause 1   

    dat=dat | %1100

    hi2cout (dat)

    pause 1

    dat=dat | %1000 & %1011

    hi2cout (dat)   

    rsbit=1

    return
 

Yex2

Member
Oui, il y a un mot qui vous a trahi : présentement :LOL: :giggle: ... cela ne se dit pas en France ou en Belgique, en Suisse je ne sais pas.
Et pourtant ça se dit très bien en Français. L'important c'est de se comprendre.
Les Suisses ont souvent des expressions qui ressemblent au Québec. Sans doute dû à leur isolement comme nous.
 

BESQUEUT

Senior Member
Et pourtant ça se dit très bien en Français. L'important c'est de se comprendre.
Les Suisses ont souvent des expressions qui ressemblent au Québec. Sans doute dû à leur isolement comme nous.
Oui, présentement les jeunes n'utilisent plus ce mot. Mais ça fait parti de la richesse de la langue et j'aime bien m'en servir...
 

PieM

Senior Member
Bonjour,
A priori, si c'est en I2C, c'est certainement un afficheur avec un expandeur du type PCF7594, qui ne fait que traduire les commandes depuis l'I2C vers une commande 4 bits ou 8 bits // sur l'afficheur. Le problème est de savoir si cet afficheur accepte une commande de display shift.
Si non il faut soit même gérer le défilement via une incrémentation du curseur.
Quel est la référence de l'afficheur ? (pas du module de commande I2C)
Je crois que Michel avait travaillé la dessus (??) (voir MGU son site )
 

BESQUEUT

Senior Member
Bonjour,
A priori, si c'est en I2C, c'est certainement un afficheur avec un expandeur du type PCF7594, qui ne fait que traduire les commandes depuis l'I2C vers une commande 4 bits ou 8 bits // sur l'afficheur. Le problème est de savoir si cet afficheur accepte une commande de display shift.
Si non il faut soit même gérer le défilement via une incrémentation du curseur.
Quel est la référence de l'afficheur ? (pas du module de commande I2C)
Je crois que Michel avait travaillé la dessus (??) (voir MGU son site )
A priori vu le code c'est un LCD 20 x 4 interfacé en I2C sur 4 bits, genre Systronix 2004
SI c'est bien ce controleur, il y a effectivement une fonction pour faire le shift.
 

BESQUEUT

Senior Member
Rien concernant le défilement,...
mais une proposition de code qui fait exactement la même chose
en plus lisible et moins verbeux :
Code:
#define no_data
;    SCL sur C.1
;    SDA sur C.2

#picaxe 08M2    ;directive picaxe utilis? (pour erreur de commandes)

dirsC =%000111


setfreq M16        ;fr?quence 16MHz   


symbol baud= N2400_16              ;vitesse liaison RS232

symbol rsbit=bit0             ;bit commande/data afficheur
symbol calibr=bit1            ;memo phase calibration


 ; b1,b2,b3,b4,b5 utilis?s dans bintoascii

 symbol posi        =b6            ;position curseur
 symbol car            =b7         ;caract?re ? afficher
 symbol dat            =b8
 symbol cpt2        =b9            ; comteur temporaire
 symbol cpt3        =b10


symbol varw         =w13        ;variable tempotaire
symbol deb          =w12        ;debut texte
symbol cpt          =w11        ;compteur
symbol total        =w10        ;consomation total depuis dernier reset
symbol today        =w9        ;consomation journali?re
symbol mini         =w8        ;consomaion miminum depuis dernier reset
symbol maxi         =w7        ;consomaion miminum depuis dernier reset
symbol nombre       =w6        ;nombre al?atoire

Symbol Ligne1=128
Symbol Ligne2=192
Symbol Ligne3=148
Symbol Ligne4=212

#macro Ecrire(Ou, Quoi, Combien)
   car= Ou
    gosub EnvoiByteComm   

    for cpt=0 to Combien
        lookup cpt,(Quoi),car
        GOSUB EnvoiByteData   
    next   
#endmacro

#macro EcrireNbre(Nombre,Texte,n4,n3,n2,n1)
        bintoascii Nombre,b5,b4,b3,b2,b1   
        for cpt=0 to 8
            lookup cpt,(Texte,n4,n3,n2,",",n1," L"),car
            GOSUB EnvoiByteData
        next
#endmacro



;symbol switch      = pinC.5    ;valeur poussoir de validation

  hi2csetup i2cmaster,%01001110, i2cslow_32, i2cbyte

    

; Initialisation LCD *********

    for cpt=0 to 5
        lookup cpt,($33,$32,$28,$c,$6,$01),car
        gosub EnvoiByteCommInit
    next
    pause 100    ;temps init du LCD


;  Affichage texte initial ***********************           

    Ecrire(Ligne1,"Conso Total en LITRE",19)
    Ecrire(Ligne2,"Conso Quotidienne  L",19)
    Ecrire(Ligne3,"Maximum Enregistre L",19)
    Ecrire(Ligne4,"Minimum Enregistre L",19)
    pause 6000 


; Initialisation temporaire

    total        =000
    today        =000
    maxi        =000   
    mini        =100            ; N?cessaire au d?marrage sinon la valeur sera toujours 0
    cpt3        =0

    gosub AfficheCourant
    gosub AfficheRecord
    pause 6000

do
    gosub aleatoire            ; sous-routine temporaire pour simuler une consomation d'eau.
    gosub record                ; cette routine devra ?tre appeler une fois par jour seulement   
loop


; les sousroutines **********************


; donne une valeur al?atoire pour simuler une consomation d'eau journali?re. Sera ?ventuellement remplac? par le "flow meter"

aleatoire:
    today =0            ; compteur journalier remis ? z?ro.
    random nombre        ; fonction al?atoire mon cul oui ! :-(

    for cpt2=1 to nombre           
        today    =today+1    ;produit une consommation artificielle avec incr?ment de 1/10?me de litre.
            total    =total+1    ;donne la somme de la consomation   
            gosub AfficheCourant

;        pause 100

            if cpt2> 200 then        ; arr?tes la consomation si celle-ci d?passe 20 litres/session       
                nombre= cpt3    ; pour red?marrer la fonction "random" plus loin.
                cpt3=cpt3+1
                pause 6000
                exit
            endif
    next

    pause 3000

return


;calcule les minimums et maxiums

record:
    if mini > today then
        mini= today
    endif

    if maxi < today then
        maxi=today
    endif

    gosub AfficheRecord

    pause 6000
    return


; Affichage les valeurs Total et courantes

AfficheCourant:   

    car= 139    'curseur  ligne 1, position 12
      gosub EnvoiByteComm   

    if total> 999 then
        EcrireNbre(total,"  ",b4,b3,b2,b1)

    else if total> 99 then
          EcrireNbre(total,"  "," ",b3,b2,b1)

    else
        EcrireNbre(total,"  "," "," ",b2,b1)
    endif

    

    car= 203    'curseur  ligne 2, position 12
        gosub EnvoiByteComm       

    if today> 99 then
         EcrireNbre(today,". "," ",b3,b2,b1)

    else
         EcrireNbre(today,". "," "," ",b2,b1)
    endif

return


AfficheRecord:

    car= 159    'curseur  ligne 3, position 12
      gosub EnvoiByteComm

    if maxi <> today then
       EcrireNbre(maxi,". "," ",b3,b2,b1)

    else if maxi> 99 then
       EcrireNbre(maxi,">>"," ",b3,b2,b1)

    else
       EcrireNbre(maxi,">>"," "," ",b2,b1)
    endif


    car= 223    'curseur  ligne 4, position 12
      gosub EnvoiByteComm

    if mini <> today then
       EcrireNbre(mini,". "," ",b3,b2,b1)

    else if mini> 99 then
       EcrireNbre(mini,">>"," ",b3,b2,b1)

    else
       EcrireNbre(mini,">>"," "," ",b2,b1)
    endif

return 



; Sub envoi vers LCD via I2C *************

EnvoiByteCommInit:
    pause 15

EnvoiByteComm:
    rsbit=0

EnvoiByteData:

;1?re moiti?

    dat=car & $F0 | %1000 | rsbit ;%1000 pour l'?clairage
    hi2cout (dat)

    pause 1       
    dat=dat | %1100
    hi2cout (dat)    ;pulse sur E cad P2

    pause 1
    dat=dat | %1000 & %1011   ;fin pulse

    hi2cout (dat)
    pause 1   

;2?me moiti?

    dat=car & $0F * 16 | %1000 | rsbit

    hi2cout (dat)
    pause 1   

    dat=dat | %1100

    hi2cout (dat)
    pause 1

    dat=dat | %1000 & %1011
    hi2cout (dat)   

    rsbit=1
    return
 

MGU

Senior Member
Pour aujourd’hui, j'aimerais savoir s'il est possible de faire défiler des texte sur un LCD qui sont plus long que la longueur de colonne du LCD choisi ?
Évidement j'aimerais savoir s'il existe une commande simple ou s'il faut faire des prouesses d'informatiques.
Bonjour,

Pour répondre à cette question, voici un bout de code d'essai à simuler avec PE6. Les broches C.3 et C.4 sont positionnées à 1 avant le lancement.
On clique ensuite sur C.3 ou C.4, suivant le sens voulu.
On peut faire la même chose en I2C

Code:
#picaxe 08M2
symbol LCD=C.0
symbol baud = T2400
symbol pousG=pinC.3
symbol pousD=PINC.4
    serout LCD,baud,(254,1,254,128,"Ceci est le texte a faire defiler dans un sens ou dans l'autre",254,128)
    Do
        Do while pousG=0
            serout LCD,baud,(254,24)
            pause 200
        loop

        Do while pousD=0
            serout LCD,baud,(254,28)
            pause 200
        loop
    loop
MM
 
Last edited:
Top