IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres architectures Assembleur Discussion :

[PIC 16F628A] Afficheur (lcd 2x16) n'affiche rien


Sujet :

Autres architectures Assembleur

  1. #1
    epc
    epc est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 83
    Points : 47
    Points
    47
    Par défaut [PIC 16F628A] Afficheur (lcd 2x16) n'affiche rien
    Bonjour

    Impossible d'afficher quelque chose sur mon afficheur
    lcd 2x16 en mode 4 bits
    Le port RA non connecté
    RB1 -> RS
    RB2 -> E
    RB4 -> D4
    RB5 -> D5
    RB6 -> D6
    RB7 -> D7
    MCLR/ -> +5V
    Pour l'afficheur 1 -> gnd, 2 -> +5V, 3 -> pot

    J'envoie les commandes d'initialisation suivantes en hex 00; 10; 00; 00; 10; 30; 30; 30; 20; 20; 80; 00; c0; 00; 60; 00; 10 avec une tempo de 1,5ms entre chaque octet et avec un créneau de 1,5ms sur le bit 2 pour les bits de poids forts puis faible.
    J'envoie les données suivantes en hex 32; 62; 32; 92; 42; 12; 62; 22; 72; 12; 32; F2; 32; 92; 42; 12; 62; 22; 72; 12; avec le même principe que pour les commandes.

    Tous les signaux sortant du pic sont visualisés à l'oscilloscope. Tout semble ok. Mais l'afficheur reste inactif.

    Merci de venir à mon aide, car je ne trouve pas mon erreur.

  2. #2
    epc
    epc est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 83
    Points : 47
    Points
    47
    Par défaut
    Voici une partie du code ...
    Merci pour votre aide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    ;---------------------------------------------------------------------------
    ; Init lcd
    ;---------------------------------------------------------------------------
    init_lcd:
    	call attend_init 		;attd 51ms
    	call attend_init 		;attd 51ms
     
    ; Fonction Efface Afficheur
    	movlw b'00000000'   ;00
    	call envoi
    	movlw b'00010000'   ;10
    	call envoi
    	movlw b'00000000'   ;00
    	call envoi
    	movlw b'00000000'   ;00
    	call envoi
    	movlw b'00010000'   ;10
    	call envoi
    	call big_busy 			;attend 1,5 ms 
     
    ; Fonction force LCD mode 8 bits
    	movlw b'00110000'   ;30
    	call envoi
    	movlw b'00110000'   ;30
    	call envoi
    	movlw b'00110000'   ;30
    	call envoi
    	call big_busy 			;attend 1,5 ms 
     
    ; Fonction force LCD mode 4 bits
    	movlw b'00100000'   ;20
    	call envoi
    	call big_busy 			;attend 1,5 ms 
     
    ; Fonction Reforce LCD mode 4 bits + 2 lignes car 5x7
    	movlw b'00100000'   ;20
    	call envoi
    	movlw b'10000000'   ;80
    	call envoi
    	call big_busy 			;attend 1,5 ms 
     
    ; Affiche en fonction, pas de curseur
    	movlw b'00000000'    ;00
    	call envoi
    	movlw b'11000000'    ;C0
    	call envoi
    	call busy
     
    ; Curseur se deplace vers la gauche
    	movlw b'00000000'   ;00
    	call envoi
    	movlw b'01100000'   ;60
    	call envoi
    	call big_busy
     
    ; Efface l'afficheur
    	movlw b'00000000'   ;00
    	call envoi
    	movlw b'00010000'   ;10
    	call envoi
    	call big_busy
     
    	return

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    ;---------------------------------------------------------------------------
    ; Frond montant et descendant pour le signal E
    ;---------------------------------------------------------------------------
    e_pulse
    	nop
    	nop
    	bsf PORTB,2
    	call big_busy
    	nop
    	nop
    	bcf PORTB,2
    	return
     
    envoi
    	movwf PORTB
    	call e_pulse
    	nop
    	nop
    	nop
    	return
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    donnees
    	;affiche '6' (36)
    	movlw b'00110010' 	;colonne des chiffres de la table de car.			
    	call envoi			;rs = 1 pour une donnée
    	movlw b'01100010' 	;chiffre entre 0 et 9
    	call envoi			;rs = 1 pour une donnée
     	call busy

  3. #3
    Membre régulier Avatar de Caxton
    Homme Profil pro
    Sans
    Inscrit en
    Janvier 2005
    Messages
    586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Janvier 2005
    Messages : 586
    Points : 123
    Points
    123
    Par défaut
    Bonjour,
    Pour faire fonctionné un afficheur LCD 2X16 en mode 4 bits, il faut le forcé à le faire. Voila un exemple de routine qui fonctionne chez moi. A toi d'adapter à la configuration de ton pic.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    ;Les routines liées à l'utilisation du LCD
     
    ;L'horloge du LCD (E)
    LCD_Top
    	call Attente_2ms				;Attendre 2 ms
    	bcf LCD_E						;E = 0
    	call Attente_2ms				;Attendre 2 ms
    	bsf LCD_E						;E = 1 (Affichage actualisé)
    	return
     
    ;Initialisation du LCD
    LCD_Init
    	bsf LCD_E						;E = 1
    	bcf LCD_RS						;RS = 0 -> Mode commande
     
    ;Ici on force l'afficheur 3 fois en mode 8 bits puis on bascule sur le mode 4 bits
    	movlw B'00000011'				;(0000 0010) Demande du mode 8 bit
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
     
    	movlw B'00000011'				;(0000 0010) Demande du mode 8 bit
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
     
    	movlw B'00000011'				;(0000 0010) Demande du mode 8 bit
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
     
    	movlw B'00000010'				;(0000 0010) Demande du mode 4 bit
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
    ;Fin de la routine de forçage au mode 4 bits
     
    	movlw B'00000010'				;(0000 0010) Demande du mode 4 bit
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
    	movlw B'00001000'				;(0000 1000) Affichage 5*7
    	movwf PORTB						;Dans le port B (Quartet le plus faible)
    	call LCD_Top					;Actualisation	
     
    	movlw B'00000000'				;(0000 0000) Inutilisé
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
    	movlw B'00000001'				;(0000 0001) Efface l'écran
    	movwf PORTB						;Dans le port B (Quartet le plus faible)
    	call LCD_Top					;Actualisation	
     
    	movlw B'00000000'				;(0000 0000) Inutilisé
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
    	movlw B'00001100'				;(0000 1110) Affichage ON, Curseur non visible et pas de clignotement
    	movwf PORTB						;Dans le port B (Quartet le plus faible)
    	call LCD_Top					;Actualisation	
     
    	movlw B'00000000'				;(0000 0000) Inutilisé
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
    	movlw B'00000110'				;(0000 0110) Déplacement des caractères vers la droite
    	movwf PORTB						;Dans le port B (Quartet le plus faible)
    	call LCD_Top					;Actualisation
     
    	bsf LCD_RS						;RS = 1 -> Mode écriture
    	return
     
    ;Envoie une lettre sur le LCD
    LCD_Write
    	movwf vartemp1					;Charge dans vartemp1 le contenu de w qui est une lettre au format ASCII
    	movwf vartemp2					;Charge dans vartemp2 le contenu de w qui est une lettre au format ASCII
     
    	swapf vartemp1, f				;On inverse les quartets dans vartemp1 et on les replace dans vartemp1
    									;B7 B6 B5 B4 | B3 B2 B1 B0 deviens B3 B2 B1 B0 | B7 B6 B5 B4
    	movlw B'00001111'				;Charge le masque B'00001111' dans w
    	andwf vartemp1, f				;Applique le masque (valeur dans w) sur vartemp1 et stock dans vartemp1 0000 | B7 B6 B5 B4
    	movf vartemp1, w				;Charge dans w le contenu de vartemp1
    	movwf PORTB						;Ecrit ce qui est dans w sur le port B
     
    	call LCD_Top					;Actualisation de l'affichage
     
    	movlw B'00001111'				;Charge le masque B'00001111' dans w
    	andwf vartemp2, f				;Applique le masque (valeur dans w) sur vartemp2 et stock dans vartemp2 0000 | B3 B2 B1 B0
    	movf vartemp2, w				;Charge dans w le contenu de vartemp1
    	movwf PORTB						;Ecrit ce qui est dans w sur le port B 
     
    	call LCD_Top					;Actualisation de l'affichage
     
    	return
     
    ;Envoie une position sur le LCD
    LCD_Position
    	bcf LCD_RS						;RS = 0, On passe en mode commande
     
    	movwf vartemp1					;Charge dans vartemp1 le contenu de w qui est une position au format 8 bits
    	movwf vartemp2					;Charge dans vartemp2 le contenu de w qui est une position au format 8 bits
     
    	swapf vartemp1, f				;On inverse les quartets dans vartemp1 et on les replace dans vartemp1
    									;B7 B6 B5 B4 | B3 B2 B1 B0 deviens B3 B2 B1 B0 | B7 B6 B5 B4
    	movlw B'00001111'				;Charge le masque B'00001111' dans w
    	andwf vartemp1, f				;Applique le masque (valeur dans w) sur vartemp1 et stock dans vartemp1 0000 | B7 B6 B5 B4
    	movf vartemp1, w				;Charge dans w le contenu de vartemp1
    	movwf PORTB						;Ecrit ce qui est dans w sur le port B
     
    	call LCD_Top					;Actualisation de l'affichage
     
    	movlw B'00001111'				;Charge le masque B'00001111' dans w
    	andwf vartemp2, f				;Applique le masque (valeur dans w) sur vartemp2 et stock dans vartemp2 0000 | B3 B2 B1 B0
    	movf vartemp2, w				;Charge dans w le contenu de vartemp1
    	movwf PORTB						;Ecrit ce qui est dans w sur le port B 
     
    	call LCD_Top					;Actualisation de l'affichage
     
    	bsf LCD_RS						;RS = 1, On passe en mode écriture
     
    	return
     
    ;Efface l'écran
    LCD_Clear
    	bcf LCD_RS						;RS = 0, On passe en mode commande
     
    	movlw B'00000000'				;(0000 0000) Inutilisé
    	movwf PORTB						;Dans le port B (Quartet le plus fort)
    	call LCD_Top					;Actualisation	
    	movlw B'00000001'				;(0000 0001) Efface l'écran
    	movwf PORTB						;Dans le port B (Quartet le plus faible)
    	call LCD_Top					;Actualisation	
     
    	bsf LCD_RS						;RS = 1, on passe en mode écriture
     
    	return
    A a fin de l'initialisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    ;*****************************************************************************
    ;                          INITIALISATIONS                                   *
    ;*****************************************************************************
    init
    			; Initialisation PORTS (banque 0 et 1)
    			; ------------------------------------
    	...
     
    			; Registre d'options (banque 1)
    			; -----------------------------
    	...
     
    			; Registres interruptions (banque 1)
    			; ----------------------------------
    	...
     
    			; Effacer RAM banque 0
    			; ---------------------
    	...
     
    			; Autoriser interruptions (banque 0)
    			; ----------------------------------
    	...
     
    			;Initialisation du mode I²C (Banque 1)
    			;------------------------------------
    	...
     
    			;Initialisation su LCD
    			;---------------------
    	call LCD_Init		;Initialisation de l'afficheur LCD
     
    	goto	Start		;Programme principal
    Utilisation dans le reste su programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    ;*****************************************************************************
    ;                         PROGRAMME PRINCIPAL                                *
    ;*****************************************************************************
     
    Start
    	call LCD_Clear		;Efface l'écran LCD
     
    	movlw H'82'				;Ligne 1 ecran LCD, position 2 écriture sur la droite
    	call LCD_Position		;Ecrit la position sur l'écran qui était contenu dans w
     
    	movlw 'P'				;Charge dans w la lettre entre crochets
    	call LCD_Write			;Ecrit sur l'écran la lettre situer dans w
    	movlw 'R'				;Charge dans w la lettre entre crochets
    	call LCD_Write			;Ecrit sur l'écran la lettre situer dans w
    	movlw 'G'				;Charge dans w la lettre entre crochets
    	call LCD_Write			;Ecrit sur l'écran la lettre situer dans w
    	movlw ':'				;Charge dans w la lettre entre crochets
    	call LCD_Write			;Ecrit sur l'écran la lettre situer dans w
    Je me suis permis de tout te mettre car il y a des dépendance par des "call".
    Retiens aussi que de manière générale il te faudra, en mode 4 bits, mettre le quartet des bits de poids fort avant le quartet des bits de poids faible. C'est d'ailleurs la principale source d'erreur sur la gestion des affichages en mode 4 bits.

    Je n'ai pas repris le code de la partie initialisation car elle est largement décrite dans le cous de Bigonoff.

    Tiens nous au courrant si tu bloque sur une partie. Cependant essai sur une platine de test en prenant bien attention que mon code ne correspondra pas forcément à tes sorties.

    Cordialement.

Discussions similaires

  1. programmer un afficheur LCD sur PIC
    Par ziko132 dans le forum Autres architectures
    Réponses: 1
    Dernier message: 25/11/2012, 10h15
  2. [PIC 16F876] Plugin pour afficheur lcd
    Par jpwitz dans le forum MPLAB
    Réponses: 7
    Dernier message: 03/05/2011, 18h43
  3. Réponses: 2
    Dernier message: 12/04/2010, 17h14
  4. [LG]Programme qui n'affiche rien
    Par ousunas dans le forum Langage
    Réponses: 4
    Dernier message: 17/02/2004, 19h38
  5. Opengl n'affiche rien.
    Par Fugus02 dans le forum OpenGL
    Réponses: 4
    Dernier message: 06/01/2004, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo