[Programmation] Afficher caractère Afficheur ST7920 par liason série - Page 2
Répondre à la discussion
Page 2 sur 3 PremièrePremière 2 DernièreDernière
Affichage des résultats 31 à 60 sur 88

Afficher caractère Afficheur ST7920 par liason série



  1. #31
    Qristoff
    Animateur Électronique

    Re : Afficher caractère Afficheur ST7920 par liason série


    ------

    Si ça t'intéresse, j'ai (dans une autre galaxie lointaine..) écris une routine pour contrôler via une liaison série "custom" un afficheur 8 bits // en utilisant un registre à décalage (liaison déportée)
    Je prépare le mot à transmettre et je l'envoie bit par bit en comptant le nombre de coup d'horloge.

    Code:
    ;*********************************************************************************
    ;**                                                                                **
    ;**    ROUTINES DE GESTION DU MODULE LCD                     **
    ;**                                                                                **
    ;*********************************************************************************
    
    ;--------------------------------------------------------------------------------
    ;    ROUTINE D'INITIALISATION DU LCD
    ;
    ;    variables utilisées :
    ;--------------------------------------------------------------------------------
    
    LCD_INIT
        call    T1s            ; tempo d'1s pour l'auto-init de l'afficheur
        movlw    0x38        ; chargement du mode de fonctionnement (8 bits, 2 lignes 16 car)
        call    LCD_CMD        ; envoi de la commande au LCD
        call    T25ms        ; tempo de 25ms (tant de prise en compte par l'afficheur)
        movlw    0x0C        ; afficheur ON, curseur OFF, clignotement OFF
        call    LCD_CMD        ; envoi de la commande au LCD
        call    T25ms        ; tempo de 25ms (tant de prise en compte par l'afficheur)
        movlw    0x01        ; 
        call    LCD_CMD        ; envoi de la commande au LCD
        call    T25ms        ; tempo de 25ms (tant de prise en compte par l'afficheur)
        movlw    0x06        ; mode incrément, décalage OFF
        call    LCD_CMD        ; envoi de la commande
        call    T25ms        ; tempo de 25ms (tant de prise en compte par l'afficheur)
        call    LCD_CLS        ; Efface et Home
        call    T25ms        ; tempo de 25ms (tant de prise en compte par l'afficheur)
        ; L'afficheur est initialisé
        ; enregistrement des symboles "custom"
        call     LCD_SY1        ; enegistrement du symbôle n°1 (0x00)
        call     LCD_SY2        ; enegistrement du symbôle n°2 (0x01)
        call     LCD_SY3        ; enegistrement du symbôle n°3 (0x02)
        return
    
    ;--------------------------------------------------------------------------------
    ;    ROUTINE D'ENVOI D'UNE DONNEE/COMMANDE contenue dans W
    ;
    ;    variables utilisées : local1, local2, cpt1
    ;--------------------------------------------------------------------------------
    
    LCD_L1
        movlw    0x80        ; code pour aller a la ligne 1
        goto    LCD_CMD        ; on saute a l'envoi
    
    LCD_L2
        movlw    0xC0        ; code pour aller a la ligne 2
        goto    LCD_CMD        ; on saute a l'envoi
    
    LCD_L3
        movlw    0x94        ; code pour aller a la ligne 3
        goto    LCD_CMD        ; on saute a l'envoi
    
    LCD_L4
        movlw    0xD4        ; code pour aller a la ligne 4
        goto    LCD_CMD        ; on saute a l'envoi
    
    LCD_CLS
        movlw    0x01        ; code pour effacer l'ecran et revenir au debut de ligne 1
    
    LCD_CMD
        bcf        local2,    0    ; on va envoyer une commande => RS=0
        goto    LCD_TX        ; on saute a l'envoi
    
    LCD_ESPACE
        movlw    ' '            ; affiche un espace
    
    LCD_DAT
        bsf        local2,    0    ; on va envoyer une donnée => RS=1
    
    LCD_TX
        bcf        lcd_en        ; on efface la ligne de validation
        movwf    local1        ; sauvegarde de l'octet a envoyer dans local1
        movlw    .8            ; nombre de bits à envoyer
        movwf    cpt1        ; dans cpt1
    LCD_TX2
        bcf        lcd_data    ; on efface la ligne serie
        btfsc    local1,    7    ; le bit de poids fort est il à '0' ?
        bsf        lcd_data    ; NON, on ecrit 1 sur la ligne serie
        bsf        lcd_clk        ; front montant sur l'horloge
        bcf        lcd_clk        ; front descandant sur l'horloge
        rlf        local1,    F    ; on decale vers la gauche l'octet a envoyer
        decfsz    cpt1,    F    ; il reste cpt1=ctp1-1 bits a traité, cpt1 vaut il '0' ?
        goto    LCD_TX2        ; NON, il reste des bits a envoyer, on boucle
        bcf        lcd_data    ; on efface la ligne série
        btfsc    local2,    0    ; RS est il a '0' ?
        bsf        lcd_data    ; NON, on ecrit 1 sur la ligne serie pour positionner RS du LCD
        bsf        lcd_en        ; front montant sur la validation
        bcf        lcd_en        ; front descandant sur la validation
            ; on va perdre 60µs le temps que l'afficheur traite la donnée
        movlw    .16
        movwf    cpt1
    LCD_bcl1
        decfsz    cpt1,    F    ; cpt1=cpt1-1 on perd 1 cycle = tempo 1µs
        goto    LCD_bcl1    ; on perd 2 cycle = tempo 2µs
        return                ; L'octet a été envoyé, retour au programme appelant
    
    ;--------------------------------------------------------------------------------

    -----
    Tout existe, il suffit de le trouver...!

  2. #32
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Et bien sûr, même traitement pour DonAff4 et DonAff5...


    Citation Envoyé par MathSACO Voir le message
    Bonjour.

    As-tu essayer d'ajouter :
    Code:
            bcf	PIR1,SSPIF	; effacer flag fin de transmission
    avant :
    Code:
    	movf	DonAff2,w	; charger octet à envoyer à l'afficheur
    et avant :
    Code:
    	movf	DonAff3,w	; charger octet à envoyer à l'afficheur

  3. #33
    Qristoff
    Animateur Électronique

    Re : Afficher caractère Afficheur ST7920 par liason série

    Je viens de terminer la transformation de mon montage et de mon code pour une liaison parallèle 8 bits...
    C'est beaucoup mieux car pour l'instant j'initialise mon afficheur et j'affiche un caractère même si ce n'est pas celui voulu et que je n'arrive pas à mon positionner mon curseur où je veux.
    Mais ça c'est du à mon manque de connaissance en afficheur donc je vais chercher et tenter de mieux comprendre le data sheet !

    Je vais essayer de mieux maîtriser les protocoles de mon afficheur dans ce mode plus simple avant de me repencher sur cette liaison série...
    c'est dommage d'abandonner, tu y étais presque...
    Tout existe, il suffit de le trouver...!

  4. #34
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Merci pour la routine, je regarderai ça de plus prés dans le cas ou il faudra générer moi même ma propre liaison série

    Je abandonne pas, je voudrais être sûr de bien maîtriser mon mode parallèle (plus simple) pour savoir comment piloter l'afficheur.
    Ce que j'arrive au niveaux caractères ASCII car j'affiche celui que je veux où je veux. Une bonne avancée déjà !

    Maintenant j'essaie de le faire fonctionner en mode graphique mais là c'est plus galère !
    L'afficheur m'affiche un E alors qu'il devrait être en mode graphique ! Je remarque que le E correspond aux bits de poids forts des deux octets que j'écris en DDRAM.
    Etrange vu que je devrais être en mode graphique... A moins qu'on puisse se servir des deux en même temps ?

    Sinon j'ai eu des améliorations en SPI avec la correction de @MathSACO car je vois mon afficheur et à l'adresse que je veux (En mode graphique OFF).
    Mais toujours impossible de pointer un caractère...

    Code:
    ;*****************************************************************************
    ;                             MACRO                                          *
    ;*****************************************************************************
    
    BANK0	    macro				; passer en banque0
    		bcf	STATUS,RP0
    		bcf	STATUS,RP1
    	    endm
    
    BANK1	    macro				; passer en banque1
    		bsf	STATUS,RP0
    		bcf	STATUS,RP1
    	    endm
    
    BANK2	    macro				; passer en banque2
    		bcf	STATUS,RP0
    		bsf	STATUS,RP1
    	    endm
    
    BANK3	    macro				; passer en banque3
    		bsf	STATUS,RP0
    		bsf	STATUS,RP1
    	    endm
    	
    INSTAFF	    macro
    		bcf	RW
    		bcf	RS
    		
    	    endm
    
    WRAFF	    macro
    		bcf	RW
    		bsf	RS		
    	    endm
    		
    RDAFF	    macro
    		bsf	RW
    		bsf	RS		
    	    endm

    Code:
    Initialisation Liaison série pour Afficheur      
    ;		 -------------------------------------------
    
    	BANK0
    
    	bcf	E
    	
    	call	Tempo250ms	; Tempo nécessaire à l'initialisation
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;
    	movlw	B'00110000'	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTC		;
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;
    	movlw	B'00110000'	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTC		;
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'00001000'	; Dispay OFF - Cursor OFF - Character BLINK OFF
    	movwf	PORTC		;
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'00000001'	; Clear Display
    	movwf	PORTC		; 
    	call	Tempo250ms	;
    	bcf	E		;
    	call	Tempo250ms	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'00000110'	; Entry Mode Set
    	movwf	PORTC		; I/D=1 S=0 
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'00001100'	; Dispay ON - Cursor OFF - Character BLINK OFF
    	movwf	PORTC		;
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'00000010'	; Return Home
    	movwf	PORTC		; 
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'00110100'	; Extended function set
    	movwf	PORTC		; Fonction étendues
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			; Extended function set	
    	movlw	B'00110110'	; Graphic Display ON
    	call	Tempo100us	;
    	movwf	PORTC		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    
    	goto	aff

    Code:
    aff	
    
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'10000000'	; Set DDRAM Adress
    	movwf	PORTC		; 
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'10000000'	; Set DDRAM Adress
    	movwf	PORTC		; 
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	WRAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;
    	movlw	0x49		; WRITE RAM
    	movwf	PORTC		;
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;
    	movlw	0x52		; WRITE RAM
    	movwf	PORTC		;
    	call	Tempo250ms	;
    	bcf	E		;
    	call	Tempo100us	;
    
    	goto	start

    J'ai été obligé de mettre des NOP sinon j'avais des décalages de bits dans mon ecriture en RAM lors du test en simples caractères de HGROM
    Dernière modification par damien8024 ; 03/05/2020 à 18h43.

  5. #35
    Qristoff
    Animateur Électronique

    Re : Afficher caractère Afficheur ST7920 par liason série

    bon, je vois que tu n'es toujours pas décidé à utiliser l'analyseur logique. ca risque de durer un petit moment.
    Tout existe, il suffit de le trouver...!

  6. #36
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Si je vais regarder ça avec l'analyseur logique mais je voulais d'abord finir de faire fonctionner l'afficheur en mode parallèle.

    Actuellement les erreurs peuvent venir à la fois de ma méthode pour piloter l'afficheur et de la liaison SPI, donc dès que je saurais comment piloter exactement cet afficheur, je pourrais me concentrer que sur la liaison spi.

  7. #37
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Quand tu reviendras au SPI, voici un bout de code que je viens d'écrire, il est plus simple à utiliser.

    Code:
    #DEFINE	Instru_ou_donnee flag,7				; bit de flag utilisé pour déterminer si l'octet à envoyer à l'afficheur est une donnée ou une instruction
    
    sendAff macro typedata data					; Appeler avec sendAff INSTRU xx ou sendAff DONNEE xx
    	IF typedata == INSTRU					; Si INSTRU
    		bcf		Instru_ou_donnee			; Instru_ou_donnee = 0
    	ENDIF
    	
    	IF typedata == DONNEE					; Si DONNEE
    		bsf		Instru_ou_donnee			; Instru_ou_donnee = 1
    	ENDIF
    
    	movlw	data							; Charge la valeur à envoyer
    	call		SendAffMacro			         	; et l'envoie
    	endm
    	
    CBLOCK    0x20								; Début de la zone (0x20 à 0x6F)
        dataAff : 1								; Octet à envoyer à l'afficheur
    	flag	: 1								; Octets de flags
    
        org 0x000								; Adresse de départ après reset
        clrf    PCLATH							        ; Effacer sélecteur de pages
          goto    init						        	; Initialiser
    
    ;...
    ;...
    ;...
    ;...
    
    init
       
    	sendAff	INSTRU 0x30 						; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	sendAff	INSTRU 0x08						; Dispay ON - Cursor OFF - Character BLINK OFF
    	sendAff	INSTRU 0x01						; Clear display
    	sendAff	INSTRU 0x06						; Entry mode set
    	sendAff	INSTRU 0x02						; Return home
    ;... 
    ;...
    ;...
    
    
    
    SendAffMacro	
    	movwf	dataAff							; Sauvegarde l'octet pour utilisation future
    	movlw 	b'11111000'						; Charge la synchro pour un octet type INSTRU
    	btfsc		Instru_ou_donnee					; Si c'est une donnée
    	movlw	b'11111010'						; Alors charge la synchro pour un octet type DONNEE
    	bsf		CSAFF							; Selectionne l'afficheur
    	call		sendSPI							; Envoie l'octet
    	call 		send								; Envoie l'octet sous forme de 2 demi-octets	
    	bcf		CSAFF							; Chip select = 0
    	endm
    
    send										; Envoie l'octet sous forme de 2 demi-octets
    	movf		dataAff,w						; Charge l'octet à envoyer
    	andlw	0xF0							; Efface les 4 derniers bits
    	call		sendSPI						; Envoie les 4 MSB de dataAff suivi de 0000 sur le SPI
    	swapf	dataAff,w						; inverse les 4 MSB avec les 4 LSB de dataAff et stocke le résultat dans W
    	andlw	0xF0							; et efface les 4 derniers bits, on se retrouve ainsi avec les 4 LSB de dataAff suivi de 0000 dans le registre W
    										; puis envoie les 4 bits de poids faible suivis de 0000
    
    sendSPI									; Routine envoyant la valeur de W sur le SPI
    	bcf		PIR1,SSPIF					; Effacement du flag de fin de transmission
    	movwf	SSPBUF						; et place la valeur dans le buffer
    sendSPIloop
    	btfss	PIR1,SSPIF					; teste si transfert terminé
    	goto	sendSPIloop						; non, attendre
    
    										; puis tempo de 100 µs
    	
    
    ;*********************************************************************
    ;                SOUS-ROUTINE TEMPO 1 de 100us      *
    ;*********************************************************************
    Tempo100us
        BANK0    
        movlw    0x20        
        movwf    CmptTempo1					; ajuster à 249,564 ms                            
    BclTempo3
        decfsz    CmptTempo1,f					; décrémenter compteur1            
        goto    BclTempo3						; si pas 0, boucler            
        return
    Il faut juste ajouter une variable flag et définir le 7ème bit comme celui définissant le registre (0=instruction, 1=data).
    Ensuite, il faut appeler la macro sendAff en précisant s'il s'agit dune instruction ou d'une donnée puis la valeur : ex
    sendAff INSTRU 0x04
    sendAff DONNEE 0x52

    Chaque appel de la macro ne génère ainsi que 3 lignes de code.

    ATTENTION : Ne rien intercaler entre le début de la routine send et la fin de la routine Tempo100us.

  8. #38
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    8ème bit, et non 7ème.

  9. #39
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Et à la fin de sendAffMacro, juste après avec remis le chip select à 0, il faut return et non endm

  10. #40
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Super ! Merci pour ce bout de code, c'est sympa

    C'est vrai que je n'avais rien optimisé encore tant que mes tests n'était pas concluants... Ça m'enlève une partie du boulot !

    Par contre, je vois (si je ne me trompe pas) qu'il y a un mélange de C et d'assemblée. Ça ne posera pas de problème pour la compilation ?
    Sinon je traduirai, c'est pas grand chose à faire...

    Encore merci en tout cas, c'est sympa

  11. #41
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Bonjour.

    Tu parles sans doute de ceci :
    Code:
    	IF typedata == INSTRU					; Si INSTRU
    		bcf		Instru_ou_donnee			; Instru_ou_donnee = 0
    	ENDIF
    	
    	IF typedata == DONNEE					; Si DONNEE
    		bsf		Instru_ou_donnee			; Instru_ou_donnee = 1
    	ENDIF
    Ce n'est pas du C, il s'agit d'une instruction donnée au compilateur, ainsi, à l'appel de ta macro par l'une des 2 lignes suivantes :
    Code:
    	sendAff	INSTRU 0x30
    	sendAff	DONNEE 0x80
    le compilateur réagira différemment, en n'entrant pas dans le même IF/ENDIF. À savoir, si tu as écrit sendAff INSTRU,data, il le traduira par :
    Code:
    	bcf		Instru_ou_donnee			; Instru_ou_donnee = 0 (premier IF/ENDIF)
    	movlw	data						; Charge la valeur à envoyer
    	call		SendAffMacro			         ; et l'envoie
    et si tu as écrit sendAff DONNEE,data par :
    Code:
    	bsf		Instru_ou_donnee			; Instru_ou_donnee = 1 (second IF/ENDIF)
    	movlw	data						; Charge la valeur à envoyer
    	call		SendAffMacro			         ; et l'envoie

    Il est également possible de faire comme ceci :
    Code:
    macro sendData data			; Macro pour écrire dans le registre data 
    	bsf		Instru_ou_donnee
    	movlw 	data
    	call		SendAffMacro
    	endm
    
    macro sendInstru instru		; Macro pour écrire dans le registre instructions
    	bcf		Instru_ou_donnee
    	movlw 	instru
    	call		SendAffMacro
    	endm
    et d'envoyer les commandes à l'afficheur par :
    Code:
    	sendInstru	0x80
    	sendData		0x30
    Je vois d'autres petites optimisations à faire pour gagner quelques lignes de code et temps processeur, mais qui rendraient l'écriture du programme plus sujette à erreurs.

  12. #42
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Ah ok ! Je ne connaissais pas cette manière plus simple de programmer en assembleur...
    C'est vrai que ça simplifie pour l’écriture et la compréhension !

    Dés que je me sors de ce pilotage en mode graphique et parallèle, je reviendrais sur la liaison SPI en y insérant et adaptant ton code...

    Pour l'instant, j'essaie de comprendre pourquoi mon afficheur en mode graphique ON m'affiche des caractères ASCII et en plus en ne prenant que les octets forts de chaque envoie sur le port D (on dirait qu'il fonctionne en mode 4 bits !). Donc 2 routines pour un caractère.
    Alors que ça fonctionne très bien en mode Graphique OFF... Peut-être une mauvaise initialisation de l'afficheur...

  13. #43
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Je n'ai encore jamais interfacé ce contrôleur, je viens de jeter un coup d'oeil un peu plus appuyé sur le datasheet et je pense avoir trouvé une erreur dans ton code. Lors de l'écriture des 2 octets de l'adresse DGRAM (en mode fonctions étendues), il NE faut PAS désactiver le CS et envoyer les 2 octets à la suite. Tu peux ensuite le remettre à 0.

    Du coup, il faudra également modifier mon code car l'envoi de 2 octets n'est pas prévu dans ma macro, mais maintenant que tu connais le principe, tu devrais y arriver.

  14. #44
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    J'ai dit n'importe quoi, c'est pas un Chip Select en mode parallèle, c'est le Enable. je me croyais encore en SPI. Oublie le message précédent.

    Je vais jeter un coup d'oeil sur les diagrammes.
    Dernière modification par MathSACO ; 04/05/2020 à 11h50.

  15. #45
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Essaie de remplacer
    Code:
    	INSTAFF			;
    	bsf	E		;
    	nop			;
    	nop			;
    	nop			;
    	nop			;	
    	movlw	B'xxxxxxxx'	; 
    	movwf	PORTC		; 
    	call	Tempo100us	;
    	bcf	E		;
    	call	Tempo100us	;

    par

    Code:
    	INSTAFF			; ou les autres couples RS/RW
    	movlw	B'xxxxxxxx'	; 
    	movwf	PORTC		; 
    	bsf	E		; Pulse sur Enable
    	bcf	E
    	call	Tempo100us	;

  16. #46
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Je viens d'essayer et c'est pareil...

    J'ai également tout basculé sur le PORTD et reprismon code pour simplement afficher des caractères et j'ai des réactions différentes ! Notamment plus des caractères vides affichés.
    On dirait qu'il y a une différence entre l'utilisation du PORTC et du PORTD

  17. #47
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Est-ce que tu peux m'envoyer ton code complet pour que je regarde ?

  18. #48
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Oups rectification pour le PortD, j'avais inversé les deux RD6 et RD7 !!!

    Oui je prépare ça et le le poste...

  19. #49
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Voici mon code...

    Pour information, j'ai essayé plusieurs initialisations. Avec celui-ci, l'afficheur m'affiche R et x (ce qui correspond aux deux adresses des caractères ACSII).

    Donc on dirait qu'il ne passe pas en mode graphique. Si je change la dernière instruction d'initialisation avec le bis Graphic Display à 1, j'ai plein de pixels sur l'écran (comme montré dans un de mes premiers posts).

    Fais attention, la fin de l'initialisation de l’afficheur pointe sur l'étiquette aff et non start.

    Je te remercie en attendant

    Code:
    ;*****************************************************************************
    ;                               ASSIGNATIONS SYSTEME                         *
    ;*****************************************************************************
    
    ; REGISTRE OPTION_REG (configuration)
    ; -----------------------------------
    OPTIONVAL	EQU	B'00000000'
    			; RBPU     b7 : 1= Résistance rappel +5V hors service
    			; INTEDG   b6 : 1= Interrupt sur flanc montant de RB0
    			;               0= Interrupt sur flanc descend. de RB0
    			; TOCS      b5 : 1= source clock = transition sur RA4
    			;                0= horloge interne
    			; TOSE      b4 : 1= Sélection flanc montant RA4(si B5=1)
    			;                0= Sélection flanc descendant RA4
    			; PSA       b3 : 1= Assignation prédiviseur sur Watchdog
    			;                0= Assignation prédiviseur sur Tmr0
    			; PS2/PS0   b2/b0 valeur du prédiviseur
                            		;           000 =  1/1 (watchdog) ou 1/2 (tmr0)
    			;           001 =  1/2               1/4
    			;           010 =  1/4		     1/8
    			;           011 =  1/8		     1/16
    			;           100 =  1/16		     1/32
    			;           101 =  1/32		     1/64
    			;           110 =  1/64		     1/128
    			;           111 =  1/128	     1/256
    
    
    ; REGISTRE INTCON (contrôle interruptions standard)
    ; -------------------------------------------------
    INTCONVAL	EQU	B'00010000'
    			; GIE       b7 : masque autorisation générale interrupt
                            ;                ne pas mettre ce bit à 1 ici
                            ;                sera mis en temps utile
    			; PEIE      b6 : masque autorisation générale périphériques
    			; T0IE      b5 : masque interruption tmr0
    			; INTE      b4 : masque interuption RB0/Int
    			; RBIE      b3 : masque interruption RB4/RB7
    			; T0IF      b2 : flag tmr0
    			; INTF      b1 : flag RB0/Int
    			; RBIF      b0 : flag interruption RB4/RB7
    
    ; REGISTRE PIE1 (contrôle interruptions périphériques)
    ; ----------------------------------------------------
    PIE1VAL		EQU	B'00000000'
    			; PSPIE     b7 : Toujours 0 sur PIC 16F786
    			; ADIE      b6 : masque interrupt convertisseur A/D
    			; RCIE      b5 : masque interrupt réception USART
    			; TXIE      b4 : masque interrupt transmission USART
    			; SSPIE     b3 : masque interrupt port série synchrone
    			; CCP1IE    b2 : masque interrupt CCP1
    			; TMR2IE    b1 : masque interrupt TMR2 = PR2
    			; TMR1IE    b0 : masque interrupt débordement tmr1
    
    ; REGISTRE PIE2 (contrôle interruptions particulières)
    ; ----------------------------------------------------
    PIE2VAL		EQU	B'00000000'
    			; UNUSED    b7 : inutilisé, laisser à 0
    			; RESERVED  b6 : réservé, laisser à 0
    			; UNUSED    b5 : inutilisé, laisser à 0
    			; EEIE      b4 : masque interrupt écriture EEPROM
    			; BCLIE     b3 : masque interrupt collision bus
    			; UNUSED    b2 : inutilisé, laisser à 0
    			; UNUSED    b1 : inutilisé, laisser à 0
    			; CCP2IE    b0 : masque interrupt CCP2
    
    ; REGISTRE CMCON (COMPARATEURS)
    ; ------------------------------------
    CMCONVAL	EQU	B'00000111' 
    			; C2OUT	    b7 :sortie comparateur2
    			; C1OUT     b6 :sortie comparateur1
    			; C2INV     b5 :inverseur comparateur2
    			; C1INV     b4 :inverseur comparateur1
    			; CIS       b3 :selection entree des comparateurs
    			; CM2-CM0   b2-0 :mode des comparateurs
    			;configurer le mode 111 pour utiliser RA0 RA1 RA2 RA3 en I/O
    
    ; REGISTRE VRCON (voltage reference module)
    ; ------------------------------------
    CVRCONVAL	EQU	B'00000000'
    			; CVREN     b7 :Validation du module
    			; CVROE     b6 :Sortie sur RA2
    			; CVRR      b5 :Choix de la plage 
    			; RESERVED  b4 : réservé, laisser à 0
    			; CVR3-CVR0 b3-0 :Choix de la valeur dans la plage 
    					; si CVRR=1 CVREF=(VR[3:0]/24)*Vdd
    					; si CVRR=0 CVREF=(1/4*Vdd)+(VR[3:0]/32)*Vdd
    
    ; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
    ; ------------------------------------
    ADCON1VAL	EQU	B'00000110' ; PORTA et PORTE en mode digital
    
    ; DIRECTION DES PORTS I/O
    ; -----------------------
    
    DIRPORTA	EQU	B'11111100'	; Direction PORTA (1=entrée)
    DIRPORTB	EQU	B'11111111'	; Direction PORTB
    DIRPORTC	EQU	B'11111111'	; Direction PORTC
    DIRPORTD	EQU	B'00000000'	; Direction PORTD
    DIRPORTE	EQU	B'00000000'	; Direction PORTE
    Code:
    ;*****************************************************************************
    ;                             MACRO                                          *
    ;*****************************************************************************
    
    BANK0	    macro				; passer en banque0
    		bcf	STATUS,RP0
    		bcf	STATUS,RP1
    	    endm
    
    BANK1	    macro				; passer en banque1
    		bsf	STATUS,RP0
    		bcf	STATUS,RP1
    	    endm
    
    BANK2	    macro				; passer en banque2
    		bcf	STATUS,RP0
    		bsf	STATUS,RP1
    	    endm
    
    BANK3	    macro				; passer en banque3
    		bsf	STATUS,RP0
    		bsf	STATUS,RP1
    	    endm
    	
    INSTAFF	    macro
    		bcf	RW
    		bcf	RS
    		
    	    endm
    
    WRAFF	    macro
    		bcf	RW
    		bsf	RS		
    	    endm
    Code:
    ;*****************************************************************************
    ;                          INITIALISATIONS                                   *
    ;*****************************************************************************
    
    init
    
    			; initialisation PORTS (banque 0 et 1)
    			; ------------------------------------
    	BANK0			; sélectionner banque0
    	clrf	PORTA		; Sorties PORTA à 0
    	clrf	PORTB		; sorties PORTB à 0
    	clrf	PORTC		; sorties PORTC à 0
    	clrf	PORTD		; sorties PORTD à 0
    	clrf	PORTE
    	bsf	STATUS,RP0	; passer en banque1
    	movlw	ADCON1VAL	; PORTA en mode digital/analogique
    	movwf	ADCON1		; écriture dans contrôle A/D
    	movlw	DIRPORTA	; Direction PORTA
    	movwf	TRISA		; écriture dans registre direction
    	movlw	DIRPORTB	; Direction PORTB
    	movwf	TRISB		; écriture dans registre direction
    	movlw	DIRPORTC	; Direction PORTC
    	movwf	TRISC		; écriture dans registre direction
    	movlw	DIRPORTD	; Direction PORTD
    	movwf	TRISD		; écriture dans registre direction
    	movlw	DIRPORTE	; Direction PORTE
    	movwf	TRISE		; écriture dans registre direction
    
    
    			; Registre d'options (banque 1)
    			; -----------------------------
    	movlw	OPTIONVAL	; charger masque
    	movwf	OPTION_REG	; initialiser registre option
    
    			; registres interruptions (banque 1)
    			; ----------------------------------
    	movlw	INTCONVAL	; charger valeur registre interruption
    	movwf	INTCON		; initialiser interruptions
    	movlw	PIE1VAL		; Initialiser registre 
    	movwf	PIE1		; interruptions périphériques 1
    	movlw	PIE2VAL		; initialiser registre
    	movwf	PIE2		; interruptions périphériques 2
    	movlw	CVRCONVAL	; charger la valeur du registre pour VREF
    	movwf	CVRCON		; initialiser le registre
    	movlw	CMCONVAL	; charger la valeur du registre des comparateurs
    	movwf	CMCON		; initialiser le registre
    
    
    			; Effacer RAM banque 0
    			; ---------------------
    	bcf	STATUS,RP0	; sélectionner banque 0
    	movlw	0x20		; initialisation pointeur
    	movwf	FSR		; d'adressage indirect
    init1
    	clrf	INDF		; effacer ram
    	incf	FSR,f		; pointer sur suivant
    	btfss	FSR,7		; tester si fin zone atteinte (>7F)
    	goto	init1		; non, boucler
    
    			; autoriser interruptions (banque 0)
    			; ----------------------------------
    	clrf	PIR1		; effacer flags 1
    	clrf	PIR2		; effacer flags 2
    	bsf	INTCON,GIE	; valider interruptions
    ;	goto	start		; programme principal
    
    	
    ;                Initialisation Liaison série pour Afficheur      
    ;		 -------------------------------------------
    
    	BANK0
    
    	bcf	E
    	
    	call	Tempo250ms	; Tempo nécessaire à l'initialisation
    	
    	INSTAFF			;
    	movlw	B'00110000'	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	B'00110000'	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	B'00001000'	; Dispay ON - Cursor OFF - Character BLINK OFF
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	INSTAFF			;	
    	movlw	B'00000110'	; Entry Mode Set
    	movwf	PORTD		; I/D=1 S=0 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	B'00001101'	; Dispay ON - Cursor OFF - Character BLINK ON
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	INSTAFF			;	
    	movlw	B'00000010'	; Return Home
    	movwf	PORTD		; 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	INSTAFF			;	
    	movlw	B'00110100'	; Extended function set
    	movwf	PORTD		; Ouvre Fonctions étendues
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	nop			; Extended function set	
    	movlw	B'00110110'	; Graphic Display ON
    	bsf	E		;
    	movwf	PORTD		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	nop			; 
    	movlw	B'00000011'	; Scroll or Ram Adress Select
    	bsf	E		; enable vertical scroll position
    	movwf	PORTD		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	B'00110000'	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	B'00000001'	; Clear Display
    	movwf	PORTD		; 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo250ms	;
    	
    	INSTAFF			;
    	nop			; Extended function set	
    	movlw	B'00110100'	; Ouvre Fonctions étendues
    	bsf	E		;
    	movwf	PORTD		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	
    
    	goto	aff
    
    	
    	
    ;*********************************************************************
    ;                SOUS-ROUTINE TEMPO 1 de 250ms (249,564ms)      *
    ;*********************************************************************
    Tempo250ms
    	BANK0	
    	movlw	0xF3		
    	movwf	CmptTempo2	; ajuster à 249,564 ms	    	    
    BclTempo2
    	clrf	CmptTempo1	; effacer compteur 2		    
    BclTempo1
    	nop
    	decfsz	CmptTempo1,f	; décrémenter compteur1		    
    	goto	BclTempo1	; si pas 0, boucler		    
    	decfsz	CmptTempo2,f 	; si 0, décrémenter compteur 2	    
    	goto	BclTempo2	; si cmpt2 pas 0, recommencer boucle1
    	return
    
    	;*********************************************************************
    ;                SOUS-ROUTINE TEMPO 1 de 100us      *
    ;*********************************************************************
    Tempo100us
    	BANK0	
    	movlw	0x20		
    	movwf	CmptTempo1	; ajuster à 249,564 ms	    	    		    
    BclTempo3
    	decfsz	CmptTempo1,f	; décrémenter compteur1		    
    	goto	BclTempo3	; si pas 0, boucler		    
    	return
    
    		
    ;*********************************************************************
    ;                SOUS-ROUTINE TEST CAPTEURS FIN DE COURSE            *
    ;*********************************************************************
    ;TestCFC
    ;	BANK0
    ;	btfsc	CFCH	    ; obstacle dans capteur fin de course Haut 
    ;	goto	flagcfch0   ; effacer flag capteur fin de course Haut
    ;	movlw	0x01
    ;	movwf	CFCHaut	    ; activer flag capteur fin de course Haut
    ;testcfcb
    ;	btfsc	CFCB	    ; obstacle dans capteur fin de course Bas
    ;	goto	flagcfcb0   ; effacer flag capteur fin de course Bas
    ;	movlw	0x01
    ;	movwf	CFCBas	    ; activer flag capteur fin de course Bas
    ;	return
    ;flagcfch0
    ;	clrf	CFCHaut
    ;	goto	testcfcb
    ;flagcfcb0
    ;	clrf	CFCBas
    ;	return
    	
    
    
    
    ;*****************************************************************************
    ;                      PROGRAMME PRINCIPAL                                   *
    ;*****************************************************************************
    
    
    start	
    	clrwdt			; effacer watch dog
    	BANK0
    	
    ;	bcf	CSAFF		; désélectionner Afficheur
    	
    	btfss	FlTempo250,0	; Appuie sur RB0 ?
    	goto	start
    	call	Tempo250ms	; Anti-rebonds
    	bcf	INTCON,INTF	; effacer flag d'interruption RB0
    	clrf	FlTempo250	; effacer flag appuie RB0
    	bsf	LEDV		; allumer LEDV
    	movlw	0x04
    	movwf	BclLED		; boucle 4*250ms=1s
    
    boucle1
    	call	Tempo250ms
    	decfsz	BclLED,f
    	goto	boucle1
    	bcf	LEDV		; eteindre LEDV
    	bsf	INTCON,INTE	; autoriser interruption RB0
    	
    	goto	start
    	
    ;testflcfc	
    ;	call	TestCFC
    ;	BTFSS	CFCHaut,0
    ;	goto	ledve
    ;	bsf	LEDV
    ;testflcfcb
    ;	BTFSS	CFCBas,0
    ;	goto	ledre
    ;	bsf	LEDR
    ;	bcf	INTCON,GIE	;
    ;	bsf	EAX		; evite interruption déclenchée 
    ;	call	Tempo250ms	; par chute de tension RB0
    ;	call	Tempo250ms	;
    ;	call	Tempo250ms	;
    ;	call	Tempo250ms	;
    ;	bsf	INTCON,GIE	; 
    ;	goto	start
    ;ledve
    ;	bcf	LEDV
    ;	goto	testflcfcb
    ;ledre
    ;	bcf	LEDR
    ;	bcf	EAX
    ;	goto	start
    	
    
    	
    	
    	
    aff	
    	INSTAFF			;
    	movlw	0x03		; WRITE RAM
    	movwf	PORTD		;
    ;	bsf	E		;
    ;	bcf	E		;
    ;	call	Tempo100us	;
    	
    ;	INSTAFF			;
    	movlw	0x00		; WRITE RAM
    	movwf	PORTD		;
    ;	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	WRAFF
    	movlw	0x52		; WRITE RAM
    	movwf	PORTD		; 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	; 
    	
    	WRAFF			;
    	movlw	0x78		; WRITE RAM
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	; 
    	
    	goto	start
    	
    	
    	END

  20. #50
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Par endroits, tu as mis :
    Code:
       bsf E
       movwf PORTD
       bcf E
    et non :
    Code:
       movwf PORTD
       bsf E
       bcf E
    Est-ce un essai ?

    Je suppose que E renvoie vers portA.0, portA.1 ou une broche du port E, je ne vois pas où il est défini ?

  21. #51
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Je viens d'essayer avec cette initialisation de l'afficheur et là j'ai un écran vide et plus de caractères ASCII affichés.
    Donc on dirait qu'il est bien en mode Graphic Display ON mais il ne réagit pas à mon ecriture dans la RAM


    Code:
    BANK0
    
    	bcf	E
    	
    	call	Tempo250ms	; Tempo nécessaire à l'initialisation
    	
    	INSTAFF			;
    	movlw	0x30		; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	0x30	    	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	0x34		; Extended Function Set
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	0x36		; Extended Function Set
    	movwf	PORTD		; Graphic Display ON
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	0x30		; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	0x01		; Display Clear
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	0x36		; Extended Function Set
    	movwf	PORTD		; Graphic Display ON
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    
    	goto	aff

  22. #52
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Il y avait une erreur sur l'envoie de l'adresse en GDRam mais l'ecran reste toujours vide.
    Si j'ai bien compris, on pointe les adresses X et Y à la suite et ensuite on ecrit en RAM les deux octets pour dire quels sont les pixels qu'on allume ?
    Doit-on repasser en fonctions basiques pour écrire en RAM ?

    Code:
    aff	
    	INSTAFF			;
    	movlw	0x03		; Set Graphoc Display RAM Adress
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    ;	call	Tempo100us	;
    	
    ;	INSTAFF			;
    	movlw	0x00		; 
    	movwf	PORTD		;Set Graphoc Display RAM Adress
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	WRAFF
    	movlw	0x52		; WRITE RAM
    	movwf	PORTD		; 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	; 
    	
    	WRAFF			;
    	movlw	0x78		; WRITE RAM
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	; 
    	
    	goto	start
    Dernière modification par damien8024 ; 04/05/2020 à 13h34.

  23. #53
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Pour répondre à ton message, non c'était une erreur de copier-coller ! Mais ça a été rectifié dans ma seconde initialisation...

    Pour les définitions de broches :

    Code:
    ;*****************************************************************************
    ;                                  DEFINE                                    *
    ;*****************************************************************************
    
    #DEFINE LEDR	PORTA,1		; Led rouge
    #DEFINE LEDV	PORTA,0		; Led verte
    ;#DEFINE CFCH	PORTC,6		; Capteur fin de course Haut
    ;#DEFINE CFCB	PORTC,7		; Capteur fin de course Bas
    ;#DEFINE EAX	PORTC,0		; Electro-Aimant
    #DEFINE RS	PORTE,0		; RS Afficheur
    #DEFINE RW	PORTE,1		; R/W Afficheur
    #DEFINE E	PORTE,2		; Horloge

  24. #54
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    J'essaierais cette séquence :

    RS=RW = 0

    0x30 ; Function set : 8 bit, RE = 0
    0x30 ; Function set : 8 bit, RE = 0
    0x0C ; Display control : Display ON, Cursor OFF, Blink OFF ou 0x08 (display OFF)
    0x01 ; Display clear, voir si c'est nécessaire - ATTENTION, TEMPO > 10 ms après cette instruction
    0X06 ; Entry mode : Increment, pas de shift
    0x34 ; Function set : 8 bit, RE = 1, G = 0
    0x36 ; Function set : 8 bit, RE = 1, G = 1

    0x80 ; Set GDRAM adresse verticale : 00 ; bien laisser la tempo après, tu l'as enlevée dans le dernier fichier
    0x80 ; Set GDRAM adresse horizontale : 00

    RS=1
    0x52
    0x78

  25. #55
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    J'ai essayé ta séquence avec les deux différentes valeurs pour Display Control (0C et 08) et j'ai un écran avec plein de pixels (https://drive.google.com/file/d/1tqS...ew?usp=sharing)

    Code:
    ;                Initialisation Liaison série pour Afficheur      
    ;		 -------------------------------------------
    
    	BANK0
    
    	bcf	E
    	
    	call	Tempo250ms	; Tempo nécessaire à l'initialisation
    	
    	INSTAFF			;
    	movlw	0x30		; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	0x30	    	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	0x0C		; Display Control
    	movwf	PORTD		; Display ON, Cursor OFF, Blink OFF
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	0x01		; Display Clear
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo250ms	;
    	
    	INSTAFF			;
    	movlw	0x06		; Entry Mode
    	movwf	PORTD		; Increment, Pas de shift
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	0x34		; Extended Function Set
    	movwf	PORTD		; Graphic Display OFF
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;	
    	movlw	0x36		; Extended Function Set
    	movwf	PORTD		; Graphic Display ON
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	
    	goto	aff

    Code:
    aff	
    	INSTAFF			;
    	movlw	0x03		; Set Graphoc Display RAM Adress
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    ;	INSTAFF			;
    	movlw	0x00		; 
    	movwf	PORTD		;Set Graphoc Display RAM Adress
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	WRAFF
    	movlw	0x52		; WRITE RAM
    	movwf	PORTD		; 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	; 
    	
    	WRAFF			;
    	movlw	0x78		; WRITE RAM
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	; 
    	
    	
    	goto	start
    	
    	
    	END
    Dernière modification par damien8024 ; 04/05/2020 à 14h37.

  26. #56
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    Pourquoi

    Code:
    	INSTAFF			;
    	movlw	0x03		; Set Graphoc Display RAM Adress
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    ;	INSTAFF			;
    	movlw	0x00		; 
    	movwf	PORTD		;Set Graphoc Display RAM Adress
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    03, c'est 'enable vertical scroll position'
    00, je ne sais pas.

    As-tu essayé avec 0x80, puis 0x80, puis passer RS à 1 et envoyer des données ?

  27. #57
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Effectivement, c'et une erreur suite à des essais
    Ca fait 2 jours que je cherche et je commence à m'embrouiller !

    Donc j'ai corrigé et même soucis d'écran pixelisé. J'ai testé de stopper le programme juste aprés l'initialisation et j'ai déjà cet écran pixélisé.
    J'ai rajouté à le fin de l'initialisation une ouverture des fonctions basiques puis un clear display puis une ouverture des fonctions étendues et j'ai depuis maintenant un écran vide.

    Code:
    INSTAFF			;
    	movlw	0x30	    	; Ouvre Fonctions basiques (RE=0) + Interfaçage 8 bits
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    	
    	INSTAFF			;
    	movlw	0x01		; Display Clear
    	movwf	PORTD		;
    	bsf	E		;
    	bcf	E		;
    	call	Tempo250ms	;
    	
    	INSTAFF			;	
    	movlw	0x34		; Extended Function Set
    	movwf	PORTD		; 
    	bsf	E		;
    	bcf	E		;
    	call	Tempo100us	;
    Je ne suis pas sûr de bien comprendre pour le extended function set dans quel ordre il faut s'en servir. En effet le datasheet dit qu'on ne peut modifier tous les bits en même temps et qu'il faut d'abord modifier G ou D puis RE. Ce qui ne me semble pas logique !

    Pour ta question, je ne suis pas sûr de saisir... Tu veux que j'écrive le RS qu’après avoir mis les deux octets sur le port C ?

  28. #58
    MathSACO

    Re : Afficher caractère Afficheur ST7920 par liason série

    J'ai trouvé plusieurs programmes en C, la séquence d'init utilisée est toujours :
    0x30
    0x30
    0x0C
    0x01
    0x06
    0x02

    Pour passer en mode graphique, la séquence est :
    0x30
    0x34
    0x36

    Pour sortir du mode graphique :
    0x30


    Est-ce que tu arrives déjà à afficher du texte (non en mode graphique) ?
    Les afficheurs utilisés en C ont une broche reset sur laquelle est envoyée une séquence 0-1 en début de programme. Je ne pense pas que tu aies cette broche.

    Dis moi déjà si tu affiches du texte, mets des tempos plus longues (je n'ai pas vérifié la durée des tempos, sait-on jamais).

    Et si l'écran pixelisé n'était pas tout simplement le contenu de sa RAM ? Après avoir envoyé les deux 0x80 de suite, essaie d'envoyer des trames de 0x55 avec RS = 1 pour voir ce que ça donne sur la première ligne. Il faudra peut-etre faire évoluer les adresses à l'aide de 0x81 0x80 puis 0x82 0x80, etc avec RS =0, selon les paramètres de l'afficheur.

  29. #59
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    Merci pour ta séquence, je cherchais partout sur le net mais comme je ne connais pas le langage C, j'avais pas mal de doutes !

    Donc j'ai du progrès dans le sens où malgré mon bazar de pixel affiché, je vois mes écritures 0x55 sur la première ligne. Ce dont je n'étais jamais arrivé !
    Déjà un grand merci pour ton aide

    Il ne reste plus qu'à comprendre comment effacer ce qui est affiché à l'écran... J'ai tenté à la suite de mon initialisation de repasser en fonction basiques, faire un clear du display et je retrouve un affichage vide.
    Mais dés que je veux repasser en mode fonctions étendues pour pouvoir pointer ma SGRAM, les pixels reviennent. Donc je tourne en boucle !

    Et sinon oui, en mode affichage de caractères ASCII, mon code tourne comme il faut depuis tes conseils
    Dernière modification par damien8024 ; 04/05/2020 à 17h01.

  30. #60
    damien8024

    Re : Afficher caractère Afficheur ST7920 par liason série

    ET sinon sur la broche de l'afficheur, j'ai bien une broche RST (n°17)

Page 2 sur 3 PremièrePremière 2 DernièreDernière

Discussions similaires

  1. [Numérique] Afficher la date sur une horloge avec afficheur 7 segment
    Par invitefda58457 dans le forum Électronique
    Réponses: 18
    Dernier message: 17/06/2016, 19h44
  2. compréhension d'un programme assembleur pour afficher un afficheur lcd.
    Par invite71a200f7 dans le forum Électronique
    Réponses: 1
    Dernier message: 09/03/2012, 10h43
  3. Réponses: 29
    Dernier message: 05/03/2012, 15h59
  4. Liason Série RS232 entre PIC et PC
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 7
    Dernier message: 15/12/2008, 16h23
  5. afficher un caractère avec mikroC
    Par nanard dans le forum Électronique
    Réponses: 20
    Dernier message: 09/11/2008, 18h50
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...