PIC et affichage LCD
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

PIC et affichage LCD



  1. #1
    invite35460745

    Question PIC et affichage LCD


    ------

    bonjour tous monde.
    svp comment je peau récuperer les données pour afficher en RB0 RB1 RB2 RB3 .. l'astuce est dans iorlw B'xxxxxxxxxx' ...mais j'arrive pas de fixer le pbm..dans proteus isis affiche "stack underflow executing return instruction" l'afficheur allumé mais aucun affichage.. merci d'avance
    voici le partie de code..
    PIC 16F876 pic utilisé

    Code:
     
    
    ;ce programme émet un octet avec RS=0
    LCD_send
        bsf    PORTA,1 
        bcf    PORTC,2
    	movwf	LCD_TEMP		;charger donnée à envoyer dans LCD_TEMP
    	andlw	B'00001111';récupérer que les poids forts
    iorlw	B'00000000'		;placer les poids forts aux entrées RD4-7 et E=1
    	movwf	PORTB
    	nop				;laisser au moins 0.1µs
    	bcf	PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros		;normalement c'est inutile
        bsf    PORTA,1 
        bcf    PORTC,2
    	swapf	LCD_TEMP,w		;récupérer les poids faibles
    andlw	B'00001111'		
    iorlw	B'00000000';placer les poids faibles aux entrées RD4-7 et E=1							;2
    	movwf	PORTB
    	nop				;laisser au moins 0.1µs
    	bcf	PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros
    	return
    
    ;ce programme émet un octet avec RS=1
    LCD_sendRS
    	movwf	LCD_TEMP		;charger donnée à envoyer dans LCD_TEMP
    bsf    PORTA,1 
    	bsf	PORTC,2			;RS=1
    
    andlw	B'00001111'			;récupérer que les poids forts
    iorlw	B'00000000';placer les poids forts aux entrées RD4-7 et E=1
    	movwf	PORTB
    	nop				;laisser au moins 0.1µs
    	bcf	PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros
         bsf    PORTA,1 
    
    	swapf	LCD_TEMP,w		;récupérer les poids faibles
    	andlw	B'00001111'		
    iorlw    	B'00000000';placer les poids faibles aux entrées RD4-7 et E=1						;2
    	movwf	PORTB
    	nop				;laisser au moins 0.1µs
    	bcf	PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros
    
    
    	bcf	PORTC,2	
    	return
    
    	END

    -----

  2. #2
    gcortex

    Re : PIC et affichage LCD

    Bonjour et bienvenue sur Futura,

    Visiblement tu as un return qui n'a pas été précédé d'un call


  3. #3
    paulfjujo

    Re : PIC et affichage LCD

    bonsoir,

    On ne voit pas comment tu appelles tes subroutines.

    Apparament tu pilotes ton LCD en mode 4 bits datas
    Dans ton code , je ne vois pas l'utilité du IORLW B'000000' ?
    Tu recupere d'abords les poids faibles de LCD_TEMP ,
    isolé par le masque ANDLW B'00001111' à envoyer sur B3..B0
    puis ensuite avec le SWAP tu inverse les quartets de LCD_TEMP
    W contient donc les poids forts cadrés à droite
    Masque abec le AND pour ne garder que les 4 bits de poids fort
    puis envoit sur RB0..RB3

    les commentaires du code ne sont pas en adequations.

  4. #4
    invite35460745

    Re : PIC et affichage LCD

    merci pour vous aide..voila mon code avec les appelles soubroutin.
    je vous affichez les donnes en LCD avec RB0 ...RB3.
    Code:
    ;**********************************************************************
    ;   				         			      *
    ;	Test LCD sur un 16F877A - 20 Mhz				      *
    ;**********************************************************************
    ;                                                                     *
    ;    Filename:	    lcd.asm                                           *
    ;    Date:          30/09/04                                          *
    ;    File Version:  1                                                 *
    ;                                                                     *
    ;    Author:        Choubi 95-60 li 203  ;                              *
    ;**********************************************************************
    ;                                                                     *
    ;    Files required: p16F877a.inc ;modified to 876	                              *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Notes: Quartz 20 Mhz                                             *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    
    	list      p=16F876             ; list directive to define processor
    	#include <p16F876.inc>         ; processor specific variable definitions
    
    	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    ; Pas de code protege, pas de watch hdog timer, delai de demarrage, horloge HS.
    
    
    ;  Brochage du PIC sur la carte :
    ;
    ;  Port | Broche | E/S | Nom             | Description
    ;       |        |     |                 | Port D affecté à la commande de LCD
    ;  RC2  |      |  S  | RS		 | Sortie Broche RS du LCD 
    ;  VSS  |      |  S  | R/W		 | Sortie Broche Read/write du LCD
    ;  RA1  |      |  S  | E                 | Sortie broche Enable du LCD
    ;		 
    ;                    | NC
    ;  RB0  |      |  S  | DB4 		 | Sortie bit 4 du LCD  
    ;  RB1  |      |  S  | DB5               | Sortie bit 5 du LCD
    ;  RB2  |      |  S  | DB6  		 | Sortie bit 6 du LCD
    ;  RB3  |      |  S  | DB7		 | Sortie bit 7 du LCD
    
    ;**********************************************************************
    ;                                                                     *
    ;    Variables                                                        *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    
    ;***** Variable de temporisation
    tempo50micro		EQU	0x20		; Variable tempo 50 µs
    tempo10ms	EQU	0x21		; Variable tempo 10 ms
    tempo1s		EQU	0x22		; Variable tempo 1s
    
    ;***** LCD Var
    LCD_TEMP	EQU	0x23		; Variable temporaire pour le LCD
    
    LCD_l0	macro	A
    	
    	movlw	A
    	iorlw	B'10000000'
    	call	LCD_send
    	endm
    LCD_l1	macro	A
    	
    	movlw	A
    	iorlw	B'11000000'
    	call	LCD_send
    	endm
    ;**************************************************************** DEBUT
    		ORG     0x000           ; processor reset vector
      		GOTO    main            ; go to beginning of program
    
    
    
    ;**********************************************************************
    ;                                                                     *
    ;    Programme Main                                                   *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    
    
    main
    	;initialisation des ports
    	bcf	STATUS,RP0		; pointer en BANK0
    	bcf	STATUS,RP1		;
    bcf     PORTC,2
    ;	clrf	PORTD			;mettre les futures sorties à l'état bas
    	clrf	PORTB
        ;bcf     PORTA,1
        bcf     PORTC,2
    
    	bsf		STATUS,RP0	; pointer en BANK1
    ;	clrf	PORTD			;PORTD en sortie
    bcf     PORTC,2
    	clrf	PORTB			;PORTB en sortie
        ; bcf     PORTA,1                   ;E=0 
        bcf     PORTC,2                     ;RS=0
    	bcf		STATUS,RP0	;pointer en BANK0
    	nop				; un peu de temps laisser au PIC
    	nop				;UTILE???
    
    
    	call LCD_init
    
    boucle
    	LCD_l0	D'0'			;pointer au caractère 20 de la première ligne
    
        movlw	" "			;écrire " "
    	call	LCD_sendRS
    	
    	movlw	"I"			;écrire "I"
    	call	LCD_sendRS
    	
    
    ;	CALL	Wait1s			;
    
    	LCD_l1	D'1'
    	movlw	" "			;écrire " "
    	call	LCD_sendRS
    	
    	movlw	"U"						
    	call	LCD_sendRS
    
    	movlw	"M"						
    	call	LCD_sendRS
    	
    
    
    
    	CALL	Wait1s
    		
        call   LCD_init
    
    	LCD_l0	D'0'			;pointer au caractère 20 de la première ligne
    
       
    	movlw	"B"			;écrire "I"
    	call	LCD_sendRS
    	movlw	"B"			;écrire "I"
    	call	LCD_sendRS
    
    	movlw	"Y"			;écrire "I"
    	call	LCD_sendRS
    	
    	movlw	":"						
    	call	LCD_sendRS
    	
    
    ;Affichage 
    
    	LCD_l1	D'4'
    
    	movlw	"H"						
    	call	LCD_sendRS
    	
    
    
    
    ;**********************************************************************
    ;                                                                     *
    ;    Les pauses a 20Mhz			                  	      *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    
    
    ;***** Attente de 1 s (exactement 1.00204 s)
    Wait1s
    		MOVLW	D'99'		;	99 fois
    		MOVWF	tempo1s		; stockage dans la variable tempo1s
    T1sboucle	CALL	Wait10ms
    		DECFSZ	tempo1s,1	; décremente et test
    		GOTO	T1sboucle	; on boucle tant que <>0  
    		RETURN
    
    ;***** Attente de 15 ms (exactement 14.99 ms)
    Wait15ms
    		MOVLW	D'149'		;	149 fois
    		MOVWF	tempo10ms	; stockage dans la variable tempo10ms
    T15msboucle	CALL	Wait100micros
    		DECFSZ	tempo10ms,1	; décremente et test
    		GOTO	T15msboucle	; on boucle tant que <>0
    		RETURN
    
    
    ;***** Attente de 10 ms (exactement 10.02 ms)
    Wait10ms
    		MOVLW	D'198'		;	198 fois
    		MOVWF	tempo10ms	; stockage dans la variable tempo10ms
    T10msboucle	CALL	Wait50micros
    		DECFSZ	tempo10ms,1	; décremente et test
    		GOTO	T10msboucle	; on boucle tant que <>0
    		RETURN
    
    ;***** Attente de 1.5 ms (exactement ? ms)
    Wait1.5ms
    		MOVLW	D'29'		;	29 fois
    		MOVWF	tempo10ms	; stockage dans la variable tempo10ms
    T1.5msboucle	CALL	Wait50micros
    		DECFSZ	tempo10ms,1	; décremente et test
    		GOTO	T1.5msboucle	; on boucle tant que <>0
    		RETURN
    
    ;***** Attente de 100 µs (exactement, en comptant le temps d'appel)
    Wait100micros	
    		MOVLW	D'165'		;	165 fois
    		MOVWF	tempo50micro	; stockage dans la variable tempo50µ
    T100microsboucle	DECFSZ	tempo50micro,1	; décremente et test
    		GOTO	T100microsboucle	; on boucle tant que <>0  0.2*3=0.6 µs en tout
    		RETURN
    
    
    ;***** Attente de 50 µs (exactement, en comptant le temps d'appel)
    Wait50micros	NOP
    		NOP
    		MOVLW	D'81'		;	81 fois
    		MOVWF	tempo50micro	; stockage dans la variable tempo50µ
    T50microsboucle	DECFSZ	tempo50micro,1	; décremente et test
    		GOTO	T50microsboucle	; on boucle tant que <>0  0.2*3=0.6 µs en tout
    		RETURN
    
    
    ;***** Attente de 1 µs (exactement, en comptant le temps d'appel)
    Wait1micros		NOP
    		RETURN
    
    
    	;initialisation du LCD
    LCD_init
    	movlw	B'00110011'		;initialiser le LCD en 4 ports 00110011
    	call	LCD_send		;0 0 1 1 0 0 1 DL : DL=0(4ports)
    	movlw	B'00110010'		
    	call	LCD_send
    
    	movlw	B'00101100'		;0 0 1 DL N F x x : DL=0(4ports)/1(8ports), N=0(1ligne)/1(2lignes), F=font
    	call	LCD_send
    
    	movlw	B'00001110'		;0 0 0 0 1 D C B : D=Display=1(on)/0(off) C=curseur B=blinking
    	call	LCD_send
    
    	movlw	B'00000001'		;effacer l'écran et retour du curseur à la position 0
    	call	LCD_send
    
    	movlw	B'00000110'		;0 0 0 0 0 1 1/D S : 1/D=(1)incrémente le curseur après écriture S=(1)display is shifted
    	call	LCD_send
    	return
    
    
    ;ce programme émet un octet avec RS=0
    LCD_send
    	movwf	LCD_TEMP		;charger donnée à envoyer dans LCD_TEMP
    	andlw	B'00001111'		;récupérer que les poids forts
    	iorlw	B'00000000'		;placer les poids faibles aux entrées  
       ; bsf     PORTA,1                     ;E=1
        bcf     PORTC,2                      ;RS=0
    	movwf	PORTB
        
    	nop				;laisser au moins 0.1µs
    ;	bcf	    PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros		;normalement c'est inutile
    
    	swapf	LCD_TEMP,w		;récupérer les poids faibles
    	andlw	B'00001111'		
    	iorlw	B'00000000'		;placer les poids faibles aux entrées 						
        bsf     PORTA,1                     ; E=1	  
      bcf     PORTC,2 
    	movwf	PORTB
    	
    	nop				;laisser au moins 0.1µs
    ;	bcf	PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros
    	return
    
    ;ce programme émet un octet avec RS=1
    LCD_sendRS
    	movwf	LCD_TEMP		;charger donnée à envoyer dans LCD_TEMP
    	bsf	    PORTC,2			;RS=1
    	andlw	B'00001111'		;récupérer que les poids forts
    	iorlw	B'00000000'		;placer les poids forts aux entrées 
      bcf     PORTC,2                       ; RS=0
        bsf     PORTA,1                      ;E=1
    	movwf	PORTB
    	
    	nop				;laisser au moins 0.1µs
    	bsf     PORTA,1		;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros
    
    	swapf	LCD_TEMP,w		;récupérer les poids faibles
    	andlw	B'00001111'		
    	iorlw	B'00000000'		;placer les poids faibles aux entrées  						
      bcf     PORTC,2                        ;RS=0
        bsf     PORTA,1                      ;E=1
    	movwf	PORTB
    	
    	nop				;laisser au moins 0.1µs
    	bcf	PORTA,1			;valider les entrées du LCD (E=0 -> 1)
    
    	call	Wait50micros
    
    	bcf	  PORTC,2			;RS=0
    	return
    
    	END                     ; directive 'end of program'

  5. A voir en vidéo sur Futura

Discussions similaires

  1. affichage LCD avec pic 16F84
    Par invite32cc11f3 dans le forum Électronique
    Réponses: 3
    Dernier message: 26/01/2010, 19h37
  2. soucis pic 18f452 et affichage sur lcd
    Par inviteb8eac3ab dans le forum Électronique
    Réponses: 0
    Dernier message: 29/04/2009, 17h46
  3. [PIC]-Problème Affichage sur LCD 128x64
    Par invite3c35244f dans le forum Électronique
    Réponses: 8
    Dernier message: 31/07/2008, 14h45
  4. affichage à partir d'un PIC: LCD/Digits
    Par invite81170861 dans le forum Électronique
    Réponses: 14
    Dernier message: 10/05/2007, 14h22
  5. PIC et affichage LCD
    Par invite3a1051d7 dans le forum Électronique
    Réponses: 1
    Dernier message: 09/11/2006, 20h08
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...