PIC: Gestion de chaîne de caractères.
Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

PIC: Gestion de chaîne de caractères.



  1. #1
    invite4c7a167b

    PIC: Gestion de chaîne de caractères.


    ------

    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_affichage
    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
    Je 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:
    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é :

    Code:
    	movlw	0x04	; 
    	movwf	phrase 	; phrase 4
    	call	affiche	; affichage
    Auriez vous un autre moyen de stockage des phrases ?
    Ou de lire aussi simplement ?
    Ou un algorithme radicalement différent ?

    Merci d'avance pour vos réponses
    L'illuminé

    -----

  2. #2
    invite4c7a167b

    [Resolu] PIC: Gestion de chaîne de caractères.

    J'ai finalement pu résoudre mon problème en mettant 7 phrases par page.
    Ensuite je viens calculer l'intervalle dans lequel se situe la variable phrase pour savoir à quelle page je dois aller.

    Exemple :

    Code:
    	movlw	2	; 
    	movwf	phrase 	; 
    	call	affiche	; affichage
    Sachant que j'ai 7 phrases par page, la phrase numéro 2 se trouve en page 4, dans mon exemple.

    Code:
    	movlw	18	; 
    	movwf	phrase 	; 
    	call	affiche	; affichage
    Sachant que j'ai toujours 7 phrases par page, la phrase numéro 18 se trouve en page 6, dans mon exemple etc....
    Je sais donc à quelle page sauter suivant que je veuille afficher telle ou telle phrase. Je vais garder cette version jusqu'à trouver une optimisation dans la gestion/stockage des phrases.

    Merci quand même à tous ceux qui on pris le temps de lire !
    L'illimuné

Discussions similaires

  1. PIC assembleur et gestion de mots de 16 bits
    Par Nico8583 dans le forum Électronique
    Réponses: 10
    Dernier message: 07/10/2009, 05h53
  2. PIC, gestion de l'heure ?
    Par invite116c4f9b dans le forum Électronique
    Réponses: 16
    Dernier message: 16/12/2008, 20h54
  3. Script chez octave : programme avec chaîne de caractères.
    Par julien_4230 dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 21/03/2007, 09h58
  4. PIC : Chaine de caractères
    Par Toufinet dans le forum Électronique
    Réponses: 2
    Dernier message: 24/05/2006, 17h49
  5. Gestion d'un afficheur avec un PIC
    Par invitee1ad6ffc dans le forum Électronique
    Réponses: 3
    Dernier message: 08/12/2005, 21h28
Découvrez nos comparatifs produits sur l'informatique et les technologies.