Bonjour,
Voilà mon problème. Je voudrai afficher, sur un afficheur LCD 2*16, des chaînes de caractères prédéfinies dans mon programme et voilà comment j'ai fait :
Ce premier sous programme vient lire une chaîne, composé comme suit : "L'illuminé est\ndans le noir !\0"
A l'écran cela donne :
L'illuminé est
dans le noir !
La gestion des \n et \0 se fait toute seule, j'étais prêt à gerer les \t mais sur un LCD 2*16 c'est trop petit.
(désolé pour les fautes d'orthographes mais mon éditeur ne supporte pas les accents)
Code:; *********************************************************************** ; Sous programme d'affichage des phrases ; *********************************************************************** ; Les fonctions send_cmd et tempo_start sont sans importances. ; ; ex : ; movlw 0x02 ; index ; movwf phrase ; phrase 2 dans cet exemple ; call affiche ; affichage ; ; affiche a besoin, juste avant son appel, de savoir a quelle phrase il doit aller puis ; il efface l'ecran, initialise un pointeur de caractere a 0 et il saute en page 1 pour ; pointer sur la phrase X et sur la caractere 0. Le caractere est analyser pour ; savoir si ce n'est pas un \n ou un \0. Dans le premier cas le sous programme affiche ; un retour chariot et dans le second il sait que c'est la fin de la phrase. Et si ; le caractere analyse n'est pas \n ou \0 alors c'est un caracter a afficher. Il ; incremente le pointeur caractere et recommence l'analyse ce dessus, jusqu'a tomber ; sur \0 marquant la fin de la chaine. !! ATTENTION !! TOUTES PHRASES DOIT FINIR PAR \0 ; affiche movlw 0x01 ; Display clear call send_cmd call tempo_start ; Atendre 15ms apres un clear clrf caractere ; pointeur de caractere a 0 movlw 0x04 movwf PCLATH ; on saute en page 1 adresse 0x0400 loop_affichage call TXT movwf car ; caractere a analyser rc_car movlw '\n' ; peut etre un retour chariot ? subwf car, w btfss STATUS, Z ; si car = retour chariot alors afficher un retour chariot goto null_car ; sinon alors peut etre caractere null movlw 0xC0 ; call send_cmd ; envoyer et attendre la fin du flag busy du LCD incf caractere, f ; incrementer : caractere suivant goto loop_affichage null_car movlw '\0' ; peut etre un caractere NULL de fin de chaine ? subwf car, w btfss STATUS, Z ; si caractere null alors on quit, c'est la fin de la chaine goto affichage ; sinon alors c'est un caractere a afficher return ; on quit, fin de la phrase movf car, w ; donc c'est un caractere a afficher ! affichage call send_data ; envoyer incf caractere, f ; incrementer : caractere suivant goto loop_affichageJe pense avoir cerné le problème mais je ne sais pas comment y remédier. Lorsque je compile mon programme, dans le listing je vois ceci :Code:org 0x0400 TXT movf phrase, w addwf PCL, f ; Ajouter W a PCL goto p0 goto p1 goto p2 goto p3 goto p4 goto p5 goto p6 goto p7 goto p8 goto p9 goto p10 p0 movf caractere, w addwf PCL, f dt "- CHOIX VERRIN -\0" p1 movf caractere, w addwf PCL, f dt "1) BEQUILLE\nAVANT DROITE\0" p2 movf caractere, w addwf PCL, f dt "2) BEQUILLE\nAVANT GAUCHE\0" p3 movf caractere, w addwf PCL, f dt "3) BEQUILLE\nARRIERE DROITE\0" p4 movf caractere, w addwf PCL, f dt "4) BEQUILLE\nARRIERE GAUCHE\0" p5 movf caractere, w addwf PCL, f dt "5) GRILLAGE\nAVANT DROITE\0" p6 movf caractere, w addwf PCL, f dt "6) PANNEAU HAUT\0" p7 movf caractere, w addwf PCL, f dt "7) PANNEAU BAS\0" p8 movf caractere, w addwf PCL, f dt "8) DEPLOYMENT DU\nBRAS CENTRAL\0" p9 movf caractere, w addwf PCL, f dt "9) xxxxxxxxxxxxx\nxxxxxxxxxxxxxx\0" ; Probleme !!! p10 movf caractere, w addwf PCL, f dt "10) xxxxxxxxxxxx\nxxxxxxxxxxxxxx\0" ; La aussi !!! end
Code:04EE 0826 00452 p9 movf caractere, w 04EF 0782 00453 addwf PCL, f 04F0 3439 3429 3420 00454 dt "9) xxxxxxxxxxxxx\nxxxxxxxxxxxxxx\0" 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 340A 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3478 3400
En regardant bien, on voit que 340A (le retour chariot) se trouve en 0500 et c'est précisément à cette endroit que mon affichage déraille. Je pense que c'est du au fait que je modifie deux fois PCL en 0x0400 !
Bref ce programme avait l'avantage de pouvoir lire telle ou telle phrase sans difficulté :
Auriez vous un autre moyen de stockage des phrases ?Code:movlw 0x04 ; movwf phrase ; phrase 4 call affiche ; affichage
Ou de lire aussi simplement ?
Ou un algorithme radicalement différent ?
Merci d'avance pour vos réponses
L'illuminé
-----