FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  LCD 16*2 avec 16f877a

 




Il y a 24 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

LCD 16*2 avec 16f877a

n°7816
mokona
Posté le 04-02-2008 à 16:39:34  profilanswer
 

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...

mood
Google
Posté le 04-02-2008 à 16:39:34  profilanswer
 

n°7819
mdog
Posté le 05-02-2008 à 12:03:19  profilanswer
 

Bonjour,
 
Je ne connais pas bien l'assembleur mais personnelement je l'avais fait en C, grace au programme que l'on trouve ici : http://angeliz.free.fr/electro/elec13.htm
Sa fonctionnait très bien ;).
 
En espérant t'aider.
@+
Mdog


Message édité par mdog le 05-02-2008 à 12:03:40
mood
Google
Posté le 05-02-2008 à 12:03:19  profilanswer
 


Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  LCD 16*2 avec 16f877a

 

Hit Parade