Répondre à la discussion
Affichage des résultats 1 à 3 sur 3

Probleme d'affichage LCD avec PIC16F



  1. #1
    KaLas

    Probleme d'affichage LCD avec PIC16F

    Bien le bonsoir,

    V'la, je me suis mis au PIC il y a qqes temps.La première chose que j'ai essayé de faire est d 'afficher un beau message sur un bel afficheur 16x2 caractères avec un controlleur HDD44780, bien classique, géré par un PIC16F877 et son quartz de 20M.

    Mais après de longues heures passées à m'acharner, le résultat n'est pas trés radieux, un curseur qui clignote, c'est tout ...
    Pas de beau message sur mon bel afficheur.

    J' me dit encore un coup des tempos, mais je crois avoir pris larges, c'est des valeurs que j'a trouvé sur un site ( elles été données par Bigonoff, BigUp au passage pour Le Maitre, si j'me souviens bien )
    et en plus y'a mon curseur qui est bien là, j'le vois, donc mon initialisation doit être bien faite.



    Je vous soumets donc mon code.

    Si un oeil averti pouvait jeter l'autre sur celui-ci, leurs aides me setrait bien précieuses.

    Merci bien.
    A+

    -----

    Dernière modification par KaLas ; 07/11/2005 à 23h00.

  2. #2
    KaLas

    Re : Probleme d'affichage LCD avec PIC16F

    Heu,
    je viens de me rendre compte que je n'avais pas mis mon code ( on ne peut pas uploader de txt, j'avais pas vu ), voilà maintenant qui est chose faite:

    LIST p=16F877 ; Définition de processeur
    #include <p16F877.inc> ; fichier include

    __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

    ;***************************** ****************************** ******************
    ; ASSIGNATIONS SYSTEME *
    ;***************************** ****************************** ******************

    ; REGISTRE OPTION_REG (configuration)
    ; -----------------------------------
    OPTIONVAL EQU B'10000111'

    ; REGISTRE INTCON (contrôle interruptions standard)
    ; -------------------------------------------------
    INTCONVAL EQU B'01000000'

    ; REGISTRE PIE1 (contrôle interruptions périphériques)
    ; ----------------------------------------------------
    PIE1VAL EQU B'01000000'

    ; REGISTRE ADCON1 (ANALOGIQUE/DIGITAL)
    ; ------------------------------------
    ADCON1VAL EQU B'10000100'

    ; DIRECTION DES PORTS I/O
    ; -----------------------
    DIRPORTB EQU B'00000000' ; direction PORTB, pour data LCD
    DIRPORTD EQU B'00000000' ; direction PORTD, pour controle LCD

    LCD_DATA EQU PORTB
    LCD_CNTL EQU PORTD
    #DEFINE E 7
    #DEFINE RS 6
    #DEFINE RW 5

    M8B EQU 0x38 ; Mode 8 bits, 2 lignes
    LCD_OFF EQU 0x08 ; afficheur éteint, pas de curseur, pas de clignt.
    LCD_ON EQU 0x0F ; afficheur allumé, curseur visible, clignot.
    RET_BASE EQU 0x02 ; retour rang1-ligne1
    DEPL_CURS EQU 0x06 ; Entry Mode: déplacement auto du curseur
    SENS_DEPL EQU 0x1C ; déplacement du curseur vers la droite
    DDRAM_ADR EQU 0x20 ; adresse DDRAM à 0x00

    ;***************************** ****************************** ******************
    ; MACRO *
    ;***************************** ****************************** ******************
    ; Changement de banques

    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

    ;***************************** ****************************** ******************
    ; VARIABLES BANQUE 0 *
    ;***************************** ****************************** ******************
    ; Zone de 80 bytes
    ; ----------------
    CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F)
    temp: 1 ; variable
    D10ms: 1 ; pour compteur 10 ms
    D50µs: 1 ; pour compteur 50 µs
    cmpt : 1 ; compteur de boucles


    ENDC ; Fin de la zone


    ;***************************** ****************************** ******************
    ; DEMARRAGE SUR RESET *
    ;***************************** ****************************** ******************
    org 0x000 ; Adresse de départ après reset
    goto init ; Initialiser

    ;***************************** ****************************** ******************
    ; INITIALISATIONS *
    ;***************************** ****************************** ******************
    init
    ; initialisation PORTS (banque 0 et 1)
    ; ------------------------------------
    BANK0 ; banque0
    clrf PORTB ; sorties PORTB à 0
    clrf PORTD ; sorties PORTD à 0
    bsf STATUS, RP0 ; banque1
    movlw DIRPORTB ; direction PORTB
    movwf TRISB ; écriture dans registre
    movlw DIRPORTD ; direction PORTD
    movwf TRISD ; écriture dans registre

    ; Initialisation LCD
    ; --------------------

    bcf STATUS,RP0 ; banque0
    call delai26ms ; tempo de 26 ms pour attendre l'allumage complet du LCD

    movlw M8B ; mode 8 bits pour initialisation
    call SEND_CMD ; envoyer commande

    call delai6.5ms ; tempo 6.5 ms

    movlw M8B ; mode 8 bits, suite init.
    call SEND_CMD ; envoyer commande

    call delai100µs ; tempo 100 µs

    movlw M8B ; mode 8 bits, suite init.
    call SEND_CMD ; envoyer commande

    call delai6.5ms ; tempo 6.5 ms

    movlw M8B ; commande set 8 bits, suite init.
    call SEND_CMD ; envoyer commande

    call delai1.5ms ; tempo 6.5 ms

    movlw LCD_OFF ; éteindre LCD
    call SEND_CMD ; envoyer commande
    movlw LCD_ON ; allumer LCD
    call SEND_CMD ; envoyer commande
    movlw DEPL_CURS ; mode deplacement auto du cureseur
    call SEND_CMD ; envoyer commande
    movlw SENS_DEPL ; deplacement du curseur par la droite
    call CLR_LCD

    goto start ; programme principal

    ;***************************** ****************************** *********
    ; Routines LCD *
    ;***************************** ****************************** *********

    SEND_CMD
    movwf temp ; commande à envoyer au LCD
    movf temp,w ; mise dans w
    movwf LCD_DATA ; commande mise sur PORTB
    nop ; délai prise en compte
    bcf LCD_CNTL, RW ; LCD en écriture
    bcf LCD_CNTL, RS ; LCD en mode commande
    bsf LCD_CNTL, E ; E a 1
    nop ; délai prise en compte
    nop
    nop
    bcf LCD_CNTL, E ; E à 0
    call delai50µs ; délai 50 µs pour validation
    return

    SEND_CHAR
    movwf temp ; caractère à envoyer au LCD
    movf temp,w ; mis dans w
    movwf LCD_DATA ; caractère sur PORTB
    nop ; délai prise en compte
    bcf LCD_CNTL, RW ; LCD en écriture
    bsf LCD_CNTL, RS ; LCD en mode data
    bsf LCD_CNTL, E ; E à 1
    nop ; délai prise en compte
    nop
    nop
    bcf LCD_CNTL, E ; E à 0
    call delai50µs ; délai 50 µs pour validation
    return

    CLR_LCD
    movlw 0x01 ; commande pour effacer le LCD
    call SEND_CMD ; envoi de la commande
    call delai1.5ms ; délai de prise en compte
    call delai100µs
    call delai100µs
    return


    ;***************************** ****************************** ******************
    ; Tempos LCD
    ;***************************** ****************************** ******************
    delai26ms
    movlw 0xFF ; 256 fois > 25.6ms
    movwf D10ms ; stockage dans la variable tempo10ms
    delai26msboucle call delai100µs
    decfsz D10ms,1 ; décrementer et tester
    goto delai26msboucle ; on boucle tant que pas =0
    return

    delai6.5ms
    movlw D'129' ; 129 fois
    movwf D10ms ; stockage dans la variable tempo10ms
    delai6.5msboucle call delai50µs
    decfsz D10ms,1 ; décrementer et tester
    goto delai6.5msboucle ; on boucle tant que pas =0
    return

    delai1.5ms
    movlw D'29' ; 29 fois
    movwf D10ms ; stockage dans la variable tempo10ms
    delai1.5msboucle call delai50µs
    decfsz D10ms,1 ; décrementer et tester
    goto delai1.5msboucle ; on boucle tant que pas =0
    return

    delai100µs
    movlw D'165' ; 165 fois
    movwf D50µs ; stockage dans la variable tempo50µ
    delai100µsboucle decfsz D50µs,1 ; décrementer et tester
    goto delai100µsboucle ; on boucle tant que pas =0
    return

    delai50µs
    nop
    nop
    movlw D'81' ; 81 fois
    movwf D50µs ; stockage dans la variable tempo50µ
    delai50µsboucle decfsz D50µs,1 ; décrementer et tester
    goto delai50µsboucle ; on boucle tant que pas =0
    return


    ;***************************** ****************************** ******************
    ; PROGRAMME PRINCIPAL
    ;***************************** ****************************** ******************
    start
    movlw 'M'
    call SEND_CHAR
    movlw 'E'
    call SEND_CHAR
    movlw 'S'
    call SEND_CHAR
    movlw 'S'
    call SEND_CHAR
    movlw 'S'
    call SEND_CHAR
    movlw 'A'
    call SEND_CHAR
    movlw 'E'
    call SEND_CHAR

    loop
    goto loop ;boucler

    END


    Merci de votre aide.
    A+

  3. #3
    KaLas

    Re : Probleme d'affichage LCD avec PIC16F

    Hello à tous,

    Bon allez je me réponds à moi-même, alors j'ai vu qu'il y avait un p'tit soucis sur la valeur LCD_OFF, j'avais mis 0x00 alors que c'est 0x08, dans mon cas.
    Par contre aucun changement au niveau de mon non-fonctionnement.

    Je vois toujours mon curseur qui clignote comme je lui ai demandé , mais pas de message.
    Est-ce que le fait de bien voir mon curseur confirme la bonne initialisation de mon LCD ??

    A+ et merci.

Sur le même thème :

Discussions similaires

  1. Problème d'affichage avec écran LCD 2x16
    Par bestsiena dans le forum Électronique
    Réponses: 4
    Dernier message: 20/11/2007, 15h48
  2. Probleme d'affichage sur LCD
    Par maximilien dans le forum Électronique
    Réponses: 20
    Dernier message: 21/06/2007, 21h30
  3. problème d'affichage sur écran lcd
    Par nounours2 dans le forum Matériel - Hardware
    Réponses: 5
    Dernier message: 17/12/2006, 20h51
  4. probleme d'affichage sur ecran lcd
    Par nounours2 dans le forum Dépannage
    Réponses: 2
    Dernier message: 17/12/2006, 19h00
  5. probleme d'affichage LCD d'un poste radio AKAI
    Par macgaffeur dans le forum Dépannage
    Réponses: 6
    Dernier message: 21/06/2006, 14h50