S'il vous plaît corriger ce code LCD

N

Naumanpak

Guest
Salut experts,

J'ai eu une grande expérience avec edaboard, vous les gens ont m'a beaucoup aidé.

J'ai ce code pour LCD 16x4 module.Mais le problème est que chaque fois que je le lance, je ne reçois que des boîtes noires sur la ligne 1 et 3.Des suggestions??MerciCode:

# Include <regx51.h># Define rs P2_5

# Define RW P2_6

# Define permettre P2_7

# Define P0 lcd_port

# Define XTAL 11.059200

# Define XDIVIDER 12,0# Define delay_1ms 164 * (XTAL / XDIVIDER)retard nul (unsigned char);

delay_ms vide (unsigned int);

lcd_display vide (unsigned char);

void Lcd_Ini ();

lcd_command vide (unsigned char);

main ()

(

unsigned int i;

lcd_command (0x01);

Lcd_Ini ();

lcd_command (0x80);

lcd_display ('L');

lcd_display («je»);

lcd_display ('N');

lcd_display («E»);

lcd_display ('1 ');

lcd_command (0xC0);

lcd_display ('L');

lcd_display («je»);

lcd_display ('N');

lcd_display («E»);

lcd_display ('2 ');

lcd_command (0x94);

lcd_display ('L');

lcd_display («je»);

lcd_display ('N');

lcd_display («E»);

lcd_display ('3 ');

lcd_command (0xd4);

lcd_display ('L');

lcd_display («je»);

lcd_display ('N');

lcd_display («E»);

lcd_display ('4 ');while (1) (;)

)void Lcd_Ini ()

(

lcd_command (0x48);

delay_ms (30);

lcd_command (0x0C);

delay_ms (10);

lcd_command (0x06);

delay_ms (10);

lcd_command (0x01);

delay_ms (10);

)lcd_command vide (unsigned char de commandement)

(

RW = 0;

rs = 0;

commande lcd_port =;

enable = 1;

enable = 0;

delay_ms (5);

)lcd_display vide (unsigned char d'affichage)

(

RW = 0;

rs = 1;

affichage lcd_port =;

enable = 1;

enable = 0;

delay_ms (1);

)delay_ms vide (unsigned int i)

(for (; i! = 0x00; i -)

(

retard (delay_1ms);

)

)retard nul (unsigned char j)

(

for (; j! = 0x00; j -)

(

)

)
 
Certains écrans LCD ont besoin d'initialisation logiciel lors de l'initialisation du matériel ne fonctionne pas.

Si vous n'avez pas initialisé correctement, ils font des choses bizarres.

Google pour l'initialisation de logiciels LCD et lui donner un essai.

Également insérer un NOP entre RW et la mise en RS, cela dépend de la vitesse du système.Donc, essayez:

RW = 0;
NOP ();
RS = 0;
NOP ();

Il s'agit de laisser le signal à régler.

 
Pouvez-vous mettre une photo de ce qui se passe?Faites vos lignes démarrer sur la ligne 0, ou à la ligne 1?

Si nos lignes sont définies comme suit:

LIGNE_1
ROW2
Rangée 3
Row4

Habituellement rangée 3 est une extension de row1.Il pour le type:

edaboard.com est un endroit convivial pour obtenir des conseils.

Il ressemblera à ceci

LIGNE_1: edaboard.com est
ROW2:
Rangée 3: un lieu convivial t
Row4:

Mat

 
Merci Matt & daviddlc des suggestions.J'ai essayé NOP (), mais même problème pour le moment.

C'est ce que je reçois sur l'écran LCD
Désolé, mais vous avez besoin de connexion pour voir cette pièce jointe

 
C'est le problème de l'initialisation.Vous devez initialiser le LCD avant d'envoyer des données

Nandhu

 
Merci Nandhu, je ne l'initialisation avec Lcd_Ini (); à droite en haut dans main ()

Pouvez-vous s'il vous plaît me dire exactement ce qu'il faut faire maintenant ..?cheers

 
mettre dans un certain délai entre les codes d'initialisation

 
Dans mon précédent post, je vous ai demandé à Google pour l'initialisation de logiciels LCD, vous pourrez voir quelques exemples là.Ajouté après 5 minutes:C'est ce que j'ai pour un 2 x 16, vous aurez besoin pour s'adapter à vos besoins:

void LCD_InitDisplay ()
(
RS = 0; / / RS = 0
RW = 0; / / R / W = 0
Delay10KTCYx (36); / / Attendre env.30 ms.
PORTB = 0x30; / / Fonction Set: 8 bits
Delay10KTCYx (6); / / Attendre env.5 msec.
PORTB = 0x30; / / Fonction Set: 8 bits
Delay1KTCYx (2); / / Attendre 100uSec aprox.(166 USEC)
LCD_WriteCommand (0x38); / / Fonction Set: 8 bits, 2 lignes, police de caractères 5x7
LCD_WriteCommand (0x0C); / / ON / OFF de contrôle: écran allumé,
LCD_WriteCommand (0x01); / / affichage Clear
LCD_WriteCommand (0x06); / / Incrémente, aucun changement
) / / LCD_InitDisplay

Encore une fois rappeler le NOP () après RS RW et les paramètres dépend de la vitesse du système de la.

 
J'ai fait une bibliothèque C18 utiliser mon LCD.Il n'est pas optimisé mais il fonctionne sans aucun problème.J'espère que ça aide.

Code:/ *

RSMU par Biblioteca LCD com PIC18F4431

Auteur: SA Diego

Des données: 03/07/2010

* // / - Tête evitar este Que fichier seja incluido Varias vezes pas programa

# ifndef __LCD_CONFIG_H / / Verifica soi une Expressão __LCD_CONFIG_H ainda não foi definida

# Define __LCD_CONFIG_H / / Définit une Expressão __LCD_CONFIG_H

/ / -# Define RS PORTBbits.RB2

# Define RW PORTBbits.RB3

# Define EN PORTBbits.RB4

# Define DATA PORTD

# Define TRIS_DATA TRISD

# Define new_line 0x0A

# Define BUSY_FLAG PORTDbits.RD7void configLCD (void);

void SendCmdLCD (unsigned char cmd_lcd);

void WriteCharLCD (char e);

void WriteTextLCD (char * texte);

void BusyFlagCheck (void);j char = 0;

char d;void configLCD (void)

(

TRISBbits.TRISB2 = 0; / / sortie Pino como RS

TRISBbits.TRISB3 = 0; / / sortie Pino como RW

TRISBbits.TRISB4 = 0; / / sortie Pino como FRFR = 0;

RS = 0;

RW = 0;BusyFlagCheck ();SendCmdLCD (0b00111000); / / Fonction Set: mode bus 8-bit, le mode d'affichage 2-ligne; 5X8 format d'affichage des points

Delay1KTCYx (10); / 5 ms de retard /

SendCmdLCD (0b00001111); / / Affichage de contrôle: à l'étalage; sur le curseur; curseur clignote sur

Delay1KTCYx (10); / 5 ms de retard /

SendCmdLCD (0b00000001); / / affichage clair

Delay1KTCYx (10); / 5 ms de retard /

SendCmdLCD (0b00000110); / curseur / à droite, l'adresse DDRAM augmenté de 1; disply transfert n'est pas effectué

)void SendCmdLCD (unsigned char cmd_lcd)

(

TRIS_DATA = 0b00000000;

FR = 0;

RW = 0;

RS = 0;DATA = cmd_lcd;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)FR = 1;Delay1KTCYx (10); / 5ms Aguarda /

/ / Ciclos = (* TimeDelay Fosc) / 4

/ / Ciclos = (5 ms * 8MHz) / 4

/ / Ciclos = 10.000

FR = 0;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)DATA = 0b00000000;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)BusyFlagCheck ();

)void WriteCharLCD (char e)

(

TRIS_DATA = 0b00000000;FR = 0;

RW = 0;

RS = 0;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)RS = 1;

DATA = e;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)FR = 1;Delay1KTCYx (10); / 5ms Aguarda /FR = 0;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)DATA = 0b00000000;

RS = 0;Delay10TCYx (2); / / Aguarda 20 ciclos (10 uSeg)BusyFlagCheck ();

)void WriteTextLCD (char * texte)

(

j = 0;while (texte *)

(

d =* texte;if (d == new_line)

(

break;

)

d'autre

(

WriteCharLCD (d);

j ;

if (j> 16) break;

)

)

)void BusyFlagCheck (void)

(

TRIS_DATA = 0b11111111;FR = 0;

RS = 0;

RW = 1;

Delay1KTCYx (10); / 5 ms de retard /while (1)

(

FR = 1;

Delay10TCYx (1);if (BUSY_FLAG == 0)

(

break;

)

d'autre

(

FR = 0;

Delay1KTCYx (10); / 5 ms de retard /

)

)FR = 0;

RW = 0;

TRIS_DATA = 0b00000000;

)# endif

 
O Merci à tous!une autre solution en 24h!

J'ai finalement réussi à le travailler avec un peu de plus de retards et la mise rs et RW à 0 lors de l'initialisation.

Merci à tous encore une fois!

 

Welcome to EDABoard.com

Sponsor

Back
Top