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

Afficheur LCD KS0070B et PIC 16f628



  1. #1
    mmarc2007

    Afficheur LCD KS0070B et PIC 16f628

    Bonjour!

    Alors j'ai un problème que je traine depuis plusieurs jours...

    J'ai fais l'acquisition d'un écran LCD 4X16 que je n'arrive pas à faire marcher! Je pense que le problème vient de l'initialisation! Rien ne s'affiche à part des gros carré si je mes le contraste à fond et là on peut apercevoir 2 lignes.

    Mon souhait c'est de faire afficher du texte en 8bits!

    Le curseur ne s'affiche pas, preuve que l'initialisation n'a pas marché!?

    Voila le code de mon initialisation:

    Code:
    /* initialise the LCD - put into 4 bit mode */
    void lcd_init()
    {
    	CMCON = 7;			//desactive le comparateur sur A
    	TRISA=0;				//en sortie
    	TRISB=0;				//en sortie
    	PORTA=0;
    	PORTB=0;
    
    	LCD_RS = 0;
    	LCD_EN = 0;
    	LCD_RW = 0;
    	
    	/*Start*/
    	__delay_ms(50);		//whait
    	
    	/* Function set */
    	LCD_DATA = 0b00111100;		//2 ligne/5x10dot A7-A0=111100
    	PulseEN();
    	__delay_us(100);	//whait
    
    	/* Display on/off */
    	LCD_DATA = 0b00001110;		//DB7-DB4 = 1110 (Display on, cursor on, blink off)	
    	PulseEN();
    	__delay_us(100);
    
    	/*clear display */
    	LCD_DATA=1;			// DB7-DB4=0001
    	PulseEN();
    	__delay_ms(2);
    
    	/*Entry mode set*/
    	LCD_DATA = 0b00000110;			// DB7-DB4=0110 (Incremet mode, entire shif off)
    	PulseEN();
    	__delay_ms(2);
    
    	/*End of initialisation*/	
    
    }
    Code:
    void PulseEN(void){
    LCD_EN=1;
    __delay_us(1);
    LCD_EN=0;
    }
    Mes questions:
    1) Vous voyez quelque chose qui cloche?
    2) comment initialiser 4 lignes?!
    3) Pourquoi le curseur n'apparait pas?

    Autre chose, le code d'écriture je l'ai extrait du web et d'un exemple du compilateur, le voila:

    Code:
    	
    void lcd_write(unsigned char c)
    {
    LCD_DATA = (LCD_DATA & 0xF0) | (c >> 4);
    	PulseEN();
    	LCD_DATA = (LCD_DATA & 0xF0) | (c & 0x0F);
    	PulseEN();
    	__delay_us(50);
    }
    A mon avis ça permet de convertir un caractere ASCII en donnée pour le LCD mais je ne comprend pas tout, une petite explication me serait bien utile

    Merci à tous!

    -----


  2. Publicité
  3. #2
    sdec25

    Re : Afficheur LCD KS0070B et PIC 16f628

    Salut.
    Pour ton problème, voir http://www.aurel32.net/elec/lcd.php et http://www.everbouquet.com.tw/Gener.htm.
    Il faut envoyer plusieurs fois l'instruction 0011xxxx au début.
    Si ça ne marche toujours pas c'est sûrement un problème de timings.

    Pour ta 2ème question, la fonction lcd_write permet d'écrire une donnée en mode 4 bits :
    Code:
    // écriture des 4 bits de poids fort de c
    LCD_DATA = (LCD_DATA & 0xF0) | (c >> 4);
    	PulseEN();
    // écriture des 4 bits de poids faible de c
    	LCD_DATA = (LCD_DATA & 0xF0) | (c & 0x0F);
    	PulseEN();
    	__delay_us(50);
    }

  4. #3
    mortaurat

    Re : Afficheur LCD KS0070B et PIC 16f628

    Salut,
    premierement as tu des erreurs lors de la compilation ?

    je te conseil de regarder la datasheet. Page 22 tu as un algorigramme t'indiquant ce que tu dois faire pour l'initialisation.

    Pour ecrire une donnée voici comment j'avais fait lorsque je travaillé sur mon driver pour ecran lcd:
    Code:
    void lcd_data (unsigned char x)
    {  
       lcd_check_busy();
       output_high(rs);                        //data not commnad. 
       output_low(rw);                        //write not read.   
       output_b(x);                     //data to bus.       
       output_high(e);                         //enable. 
       output_low(e);                         //disable. 
    }
    c'est le même principe sauf que ton code decompose "data" en deux mots de 4 bits et les envois à la suite.
    voici un super site pour comprendre les LCD:
    http://www.aurel32.net/elec/lcd.php

  5. #4
    mmarc2007

    Re : Afficheur LCD KS0070B et PIC 16f628

    Merci pour vos réponses!

    Les sites sont pas mal, et effectivement ils expliquent une procédure pour forcer en 8 bits. Procédure que je n'ai pas vu dans la doc que j'ai lu dans tous les sens!

    J'ai rajouté ça dans mon initialisation:

    Code:
    	/*selection du mode 8 bits*/
    	LCD_DATA = 0b00110011;		//8 bits
    	PulseEN();
    	__delay_ms(5);				//whait
    	LCD_DATA = 0b00110011;		//8 bits
    	PulseEN();
    	__delay_us(100);			//whait
    	LCD_DATA = 0b00110011;		//8 bits
    	PulseEN();
    	__delay_us(100);	//whait
    Autre chose, pour l'écriture si j'ai bien compris j'utilisais la méthode 4 bits?! Donc forcement ça risquait pas de marcher...
    Lorsque tu fais ça mortaurat:

    output_b(x);

    'x' c'est un caractère ASCII ou un code hexa?

    moi j'ai ça:

    Code:
    lcd_puts("12345678");
    
    /* write a string of chars to the LCD */
    void lcd_puts(const char * s)
    {
    	LCD_RW = 1;	// write not Read
    	LCD_RS = 1;	// write characters / none commande
    	while(*s)
    		lcd_write(*s++);
    }
    
    /* Adapté du code de mortaurat*/
    void lcd_write(unsigned char c)
    {
    	LCD_DATA = c;
    	PulseEN();
    	__delay_us(50); 
    }
    ça peut fonctionner?

    Je test ce soir, en tout cas tout compile sans problèmes! Merci!

  6. #5
    mortaurat

    Re : Afficheur LCD KS0070B et PIC 16f628

    Personellement je n'est pas utilisé de pointer.
    pour ecrire un texte j'avais fait une fonction appelé LCD display.
    Code:
    void lcd_display(unsigned char data)
    {
    write_data(data)
    et write_data etait environ comme ca:
    Code:
    void write_data(unsigned char x)
    {
    output_high(rs); //     lcd_rs = 1;              
    output_low(rw); //  lcd_ rw = 0 ;  attention tu as mis rw à 1 toi
    output_b(x); //tu dois ecrire sur ton portB le mot corespondant au code ascii. Par default il me sort toute la chaine de charactére.
    output_high(e); //enable.  ca corespond pour toi à la fct pulse_en() jimagine.
     output_low(e); //disable.
    pour ton programme, je pense qu'il va marcher, mais y'a des chances pour qu'il t'affiche plusieurs fois la chaine essaye simplement avec lcd_write(*s);

  7. A voir en vidéo sur Futura
  8. #6
    mortaurat

    Re : Afficheur LCD KS0070B et PIC 16f628

    j'ai oublié de preciser pour afficheur un mot j'avais juste à faire:
    lcd_display("hello");

  9. Publicité
  10. #7
    sdec25

    Re : Afficheur LCD KS0070B et PIC 16f628

    Citation Envoyé par mmarc2007 Voir le message
    Autre chose, pour l'écriture si j'ai bien compris j'utilisais la méthode 4 bits?! Donc forcement ça risquait pas de marcher...
    Oui, donc tu écrivais 2 fois une valeur qui était fausse au lieu d'écrire une fois la bonne.

    Sinon pour la fonction lcd_puts(const char * s) avec les pointeurs ça devrait marcher, à condition de mettre RW à 0 comme mortaurat l'a dit.

  11. #8
    mmarc2007

    Re : Afficheur LCD KS0070B et PIC 16f628

    Super!

    Le problème principal venait de l'initialisation.

    Maintenant ça marche!

    Merci

Sur le même thème :

Discussions similaires

  1. programmer un afficheur lcd avec pic 16f877
    Par zamanu dans le forum Électronique
    Réponses: 5
    Dernier message: 08/05/2011, 19h49
  2. PIC 18F4620 + afficheur LCD 4x16
    Par Twiz dans le forum Électronique
    Réponses: 2
    Dernier message: 25/04/2009, 12h22
  3. Programme en C pour PIC et afficheur LCD
    Par lcoulon dans le forum Électronique
    Réponses: 5
    Dernier message: 11/03/2009, 11h27
  4. Programme C RS232=>16f628=>LCD
    Par effet_kisscool dans le forum Électronique
    Réponses: 0
    Dernier message: 30/05/2008, 20h08
  5. afficheur lcd en afficheur 7 segment
    Par tictic01 dans le forum Électronique
    Réponses: 3
    Dernier message: 04/02/2008, 09h43