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

LCD 16*2 avec pic 16f877a



  1. #1
    modoki

    LCD 16*2 avec pic 16f877a

    Bonjour,

    J'essai de programmer un ecran LCD 16 caractères * 2 lignes philips ltn214r-10 avec un pic 16f877a mais sans succès

    J'ai fait le tour des forums que j'ai pu trouver avec google et j'ai meme essayé d'adapter les programmes donnés sur mon pic mais ca n'a pas marché non plus


    Voici le code assembleur :


    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'10000000' ;pour la led
    ; 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






    ;***************************** ****************************** ******************
    ; DEFINE *
    ;***************************** ****************************** ******************

    #DEFINE LCD_D0 PORTB,0 ; Données LCD sur Port B
    #DEFINE LCD_D1 PORTB,1 ; Données LCD sur Port B
    #DEFINE LCD_D2 PORTB,2 ; Données LCD sur Port B
    #DEFINE LCD_D3 PORTB,3 ; Données LCD sur Port B
    #DEFINE LCD_D4 PORTB,4 ; Données LCD sur Port B
    #DEFINE LCD_D5 PORTB,5 ; Données LCD sur Port B
    #DEFINE LCD_D6 PORTB,6 ; Données LCD sur Port B
    #DEFINE LCD_D7 PORTB,7 ; Données LCD sur Port B
    #DEFINE LCD_EN PORTC,0 ; LCD Enable sur RB0
    #DEFINE LCD_RW PORTC,1 ; LCD Read/Write sur RC1
    #DEFINE LCD_RS PORTC,2 ; LCD Register-Select sur RC2

    ;***************************** ****************************** ******************
    ; 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






    ;***************************** ****************************** ******************
    ; VARIABLES BANQUE 0 *
    ;***************************** ****************************** ******************

    ; Zone de 80 bytes
    ; ----------------

    CBLOCK 0x20 ; Début de la zone (0x20 à 0x6F)
    TEMP0 : 1 ;variables temporaires
    TEMP1 : 1
    TEMP2 : 1
    TEMP3 : 1
    ENDC ; Fin de la zone






    ;***************************** ****************************** ******************
    ; DEMARRAGE SUR RESET *
    ;***************************** ****************************** ******************

    org 0x000 ; Adresse de départ après reset
    ; clrf PCLATH ; Effacer sélecteur de pages
    goto init ; Initialiser




    ; ////////////////////////////////////////////////////////////////////////////

    ; P R O G R A M M E

    ; ////////////////////////////////////////////////////////////////////////////

    ;***************************** ****************************** ******************
    ; INITIALISATIONS *
    ;***************************** ****************************** ******************

    init

    clrf PCLATH ; Effacer sélecteur de pages

    ; 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 ; sorties PORTE à 0
    bsf STATUS,RP0 ; passer en banque1




    movlw 0x000 ; Direction PORTB
    movwf TRISB ; écriture dans registre direction
    movlw 0x000 ; Direction PORTC
    movwf TRISC ; écriture dans registre direction
    movlw 0x000 ; Direction PORTD
    movwf TRISD ; écriture dans registre direction
    movlw 0x000 ; Direction PORTE
    movwf TRISE ; écriture dans registre direction

    ; Registre d'options (banque 1)
    ; -----------------------------
    movlw OPTIONVAL ; charger masque
    movwf OPTION_REG ; initialiser registre option

    goto start ; programme principal





    ;***************************** ****************************** **********
    ; SOUS PROGRAMME
    ;***************************** ****************************** **********


    ;============================= ============================== ==================
    ; Delay_100µs:
    ; Ce programme permet de temporiser le programme en fonction de W
    ; le délai obtenu est environ de 100 µs/unité (de W)
    ; Registre modifié : TEMP0
    ;le pic exécute 1 MIPS, ma première boucle compte 4 cycles, pour perdre 100µs je dois la faire 25 fois
    ;============================= ============================== ==================

    Delay_100µs
    movwf TEMP0 ; +1 1 cycle
    MOVLW d'24' ; +1 1 cycle
    ADDLW -1 ; +1 1 cycle
    BTFSS STATUS, Z ; +1 1 cycle
    GOTO $ - 2 ; +2 2 cycles
    decfsz TEMP0, f ; +1 1 cycle
    goto $ - 5 ; +2 2 cycles
    return ; +1 1 cycle





    ;============================= ============================== ==================
    ; LCD_Init
    ; Initialisation du module LCD
    ; appel des procédures : Delay, LCD_Send, LCD_Clear
    ; registre modifié : TEMP0
    ;============================= ============================== ==================
    LCD_Init
    ;Debut de la première phase========================= ==========================
    bcf LCD_RS ; Choix des registres LCD
    bcf LCD_RW


    movlw d'150' ; Attendre au moins 15 ms
    call Delay_100µs


    movlw b'00110000' ; Function set
    call LCD_Send

    movlw d'41' ; Attendre au moins 4,1 ms
    call Delay_100µs


    movlw b'00110000' ; Function set
    call LCD_Send

    movlw d'1' ; Attendre au moins 100 µs
    call Delay_100µs


    movlw b'00110000' ; Function set
    call LCD_Send


    ;Fin de la première phase========================= =====================




    movlw b'00111000' ; Sélection de l'interface 8 bits : -- 0 0 1 1 1 0 0 0
    call LCD_Send




    movlw b'00001000'
    call LCD_Send



    movlw b'00000001'
    call LCD_Send



    movlw b'00000111'
    call LCD_Send




    return
    ;============================= ============================== ==================
    ; LCD_Clear
    ; Effaçage du LCD et retour du curseur à l'origine
    ; appel de la procédure : LCD_Cmd
    ; registres modifiés : TEMP0, TEMP1 (LCD_Cmd)
    ;============================= ============================== ==================
    LCD_Clear
    MOVLW 0x001

    CALL LCD_Send
    RETURN
    ;============================= ============================== ==================
    ; LCD_Home
    ; Retour du curseur à l'origine
    ; appel de la procédure : LCD_Cmd
    ; registres modifiés : TEMP0, TEMP1 (LCD_Cmd)
    ;============================= ============================== ==================
    LCD_Home
    MOVLW 0x002
    CALL LCD_Send
    RETURN

    ;***************************** ****************************** ******************
    ; Deplacement du curseur de 1 vers la droite
    ;***************************** ****************************** ******************

    C_D
    movlw b'00010100' ;seul le curseur se deplace vers la droite
    call LCD_Send
    return


    ;***************************** ****************************** ******************
    ;***************************** ****************************** ******************
    LCD_Send
    BANK1 ;selection de la banque 1
    bcf LCD_D7 ; Données du LCD en sortie
    bcf LCD_D6
    bcf LCD_D5
    bcf LCD_D4
    bcf LCD_D3 ; Données du LCD en sortie
    bcf LCD_D2
    bcf LCD_D1
    bcf LCD_D0
    BANK0 ; sélection du banc 0

    bcf LCD_RW ; Ceci est une commande d'écriture
    nop


    movwf TEMP1
    bcf LCD_D0
    bcf LCD_D1
    bcf LCD_D2
    bcf LCD_D3
    bcf LCD_D4
    bcf LCD_D5
    bcf LCD_D6
    bcf LCD_D7


    bsf LCD_EN ; Validation de la commande
    nop

    movlw d'1' ; Attendre au moins 100 µs
    call Delay_100µs

    btfsc TEMP1,0
    bsf LCD_D0
    btfsc TEMP1,1
    bsf LCD_D1
    btfsc TEMP1,2
    bsf LCD_D2
    btfsc TEMP1,3
    bsf LCD_D3
    btfsc TEMP1,4
    bsf LCD_D4
    btfsc TEMP1,5
    bsf LCD_D5
    btfsc TEMP1,6
    bsf LCD_D6
    btfsc TEMP1,7
    bsf LCD_D7

    ;en ecriture sur le LCD les infos sont prises en comptes sur le front descendant de EN

    bcf LCD_EN ; Fin de commande et enregistrement par le LCD

    return
    ;***************************** ****************************** ******************


    ;***************************** ****************************** ******************
    ; PROGRAMME PRINCIPAL *
    ;***************************** ****************************** ******************

    start
    BANK0
    movlw d'150' ; Attendre au moins 15 ms
    call Delay_100µs



    CALL LCD_Init
    movlw d'150' ; Attendre au moins 15 ms
    call Delay_100µs

    CALL LCD_Clear


    movlw d'150' ; Attendre au moins 15 ms
    call Delay_100µs



    call LCD_Home
    movlw d'1' ; Attendre au moins 100 µs
    call Delay_100µs

    ;affichage d'un L

    bsf LCD_RS ;selection du registre de données
    bcf LCD_RW ;ordre d'ecriture dans le LCD

    movlw b'01001100'
    CALL LCD_Send

    AFF
    goto AFF

    END ; directive fin de programme




    J'utilise un quartz a 4Mhz.
    J'espère que quelqu'un pourra m'aider...

    -----


  2. #2
    menui

    Re : LCD 16*2 avec pic 16f877a

    Salut,
    Déjà ,ton programme est fait pour un 16F877.
    alors que tu as un 16F877( A).
    @+

  3. #3
    modoki

    Re : LCD 16*2 avec pic 16f877a

    oui et alors?
    pardonne moi mais je ne connais pas bien les pic mais je crois qu'il n'y a pas de grandes différences entre le 16f877 et le 16f877a et que l'on peut tres bien inclure les fichiers du 877 pour le 877a (du moins ca marche pour faire clignoter une diode...)

  4. #4
    freepicbasic

    Re : LCD 16*2 avec pic 16f877a

    si ton Quartz est de 20mhz ta routine delay_100µs est fausse.
    Il faudra la mutiplier par 5
    20mhz/4mhz=5
    Code:
    Delay_100µs
    call Delay_20µs ;1
    call Delay_20µs ;2
    call Delay_20µs ;3
    call Delay_20µs ;4
    ;5
    Delay_20µs
    A+, pat

Sur le même thème :

Discussions similaires

  1. pic 16f877a
    Par trigertrouper dans le forum Électronique
    Réponses: 3
    Dernier message: 01/02/2008, 10h49
  2. Driver LCD 2*16 avec PIC 16F877
    Par misstik dans le forum Électronique
    Réponses: 2
    Dernier message: 20/07/2007, 22h54
  3. probleme avec convertisseur,pic et LCD
    Par T-bag dans le forum Électronique
    Réponses: 4
    Dernier message: 30/01/2007, 14h16
  4. Programmation Pic 16F877A
    Par FandeMuse dans le forum Électronique
    Réponses: 16
    Dernier message: 15/10/2006, 10h57
  5. xbt magelis et pic 16f877A
    Par jc_s2000 dans le forum Électronique
    Réponses: 5
    Dernier message: 06/09/2006, 21h55