Vai al contenuto
PLC Forum


Problema Display Lcd - Problema LCD con scheda PicDem 2 Plus


vezzo

Messaggi consigliati

Ciao a Tutti,

vi ringrazio anche solo per aver letto il mio post, veniamo al dunque vorrei utilizzare il display della mia scheda microchip picdem 2 plus, dopo varie ricerche e prove con il tester ho individuato i pin dati db4.....db7 ed i comandi rs rw e visto che il datasheet era errato....ho steso un file per gestire il mio display, utilizzo un pic 16f877a con il port d, ho esaminato il tutto + e + volte ma non riesco a capire perchè non funziona....allego il codice qualcuno mi può aiutare???

Se ho tralasciato qualche info scusatemi...ma chiedetemi pure tutto quello che vi serve grazie


#include "Lcd_dichiarazioni.h"


void LcdInit()
{
	LCD_PWR_DIR = 0;  //VCC-VDD Display LCD

	LCD_RS = 0;  	//pulisco i port
	LCD_E = 0;
	LCD_RW = 0;
	LCD_RS_DIR = 0;  //puntano ai tris del port exp TRISD.0
	LCD_E_DIR = 0;
	LCD_RW_DIR = 0;


	LCD_PWR = 1;    	//accendo il display

	Delay_ms(15);    	//15ms
	ScriviHbit(0b.0011.0000,1);  //#1 Send control sequence

	Delay_ms(4);    	//4ms
	ScriviHbit(0b.0011.0000,1);  //#2 Send control sequence

	Delay_us(100);    	//100us
	ScriviHbit(0b.0011.0000,1);  //#3 Send control sequence

	Delay_us(100);    	//100us
	ScriviHbit(0b.0011.0000,1);  //#4 set 4-bit

	LcdPronto();    	//LCD Pronto???

	ScriviByte(0b.0010.1000,1);  //#5 Function Set

	ScriviByte(0b.0000.1101,1);  //#6 Display = ON

	ScriviByte(0b.0000.0001,1);  //#7 Display Clear

	ScriviByte(0b.0000.0110,1);  //#8 Entry Mode

	ScriviByte(0b.1000.0000,1);  //DDRAM addresss 0000

//	ScriviByte(0b.0000.0010,1);  //return home
  
}

void ScriviHbit(char byte, bit RS)	//Scrittura al display LCD del H-BYTE
{
	//Tipo di dato???
if (RS)
	{
  LCD_RS = 1;  //Dati LCD_RS=1	
	}
else
	{
  LCD_RS = 0;  //Registro istruzioni, address counter LCD_RS=0
	}
	LCD_RW = 0;    //PIC ---> LCD

	LCD_D4_DIR = 0;  	//SETTO I PORT COME OUTPUT
	LCD_D5_DIR = 0;
	LCD_D6_DIR = 0;
	LCD_D7_DIR = 0;

	nop();
	nop();

	LCD_E = 1;    //Clock per inizio scrittura

	LCD_D7 = byte.7;  //Passaggio H-BYTE
	LCD_D6 = byte.6;
	LCD_D5 = byte.5;
	LCD_D4 = byte.4;

	nop();
	nop();

	LCD_E = 0;    //Clock per fine scrittura
}
void ScriviByte(char byte,bit RS)
{
	static char SwapByte;

	LcdPronto();    	//LCD PRONTO??

	ScriviHbit(byte, RS);  	//SCRIVO H-BIT

	SwapByte = (byte << 4);  	//SWAP DEL BYTE DA SCRIVERE  << 4

	ScriviHbit(SwapByte, RS);  //SCRIVO L-BIT

}	
void LcdPronto()	//Controllo disponibilità LCD
{
	static char ReadByte;
	ReadByte = LcdLeggi(1);

	if (ReadByte.7)
  {
  	return;
  }
	else
  {
  	LcdPronto();
  }	
}
char LcdLeggi(char RS)	//Lettura dal display LCD
{
	char DatiLetti;

	LCD_D4_DIR = 1;  //Setto i port come input
	LCD_D5_DIR = 1;
	LCD_D6_DIR = 1;
	LCD_D7_DIR = 1;

	//Tipo di dato???
if (RS)
	{
  LCD_RS = 1;  //Dati LCD_RS=1	
	}
else
	{
  LCD_RS = 0;  //Registro istruzioni, address counter LCD_RS=0
	}
	LCD_RW = 1;  	//PIC <-- LCD

	nop();
	nop();

	LCD_E = 1;  	//Clock inizio lettura H-BYTE

	nop();
	nop();
	nop();
	nop();

	DatiLetti.7 = LCD_D7;  	//Lettura H-BYTE
	DatiLetti.6 = LCD_D6;
	DatiLetti.5 = LCD_D5;
	DatiLetti.4 = LCD_D4;

	LCD_E = 0;  	//Clock fine lettura H-BYTE

	nop();
	nop();
	nop();
	nop();
	nop();
	nop();
	nop();
	nop();

	LCD_E = 1;  	//Clock inizio lettura L-BYTE

	nop();
	nop();

	DatiLetti.3 = LCD_D7;  	//Lettura L-BYTE
	DatiLetti.2 = LCD_D6;
	DatiLetti.1 = LCD_D5;
	DatiLetti.0 = LCD_D4;

	LCD_E = 0;  	//Clock fine lettura L-BYTE
  
	return DatiLetti;
}
void LcdGoto(char x, char y)
{
	static char xy_addr;
  
	switch(x)
  {
  	case 1:  //Prima Linea
  	xy_addr = 0x80 | y;
  	break;
  	
  	case 2:  //Seconda Linea
  	xy_addr = 0xC0 | y;
  	break;
  }	
	ScriviByte(xy_addr,0);
}	
void Delay_us(unsigned int us)
{
	static unsigned int temp1;
	us = ((us - 18)/8);
	for (temp1=0; temp1<us; temp1++)
  {
  	nop();
  }
}	

void Delay_ms(unsigned int ms)
{
	static unsigned int temp,tempus;

	for (temp=0; temp<ms; temp++)
  {
  	for (tempus=0; tempus<99; tempus++)
    {
    	nop2();
    	nop();
    }	
  } 
}	

Modificato: da vezzo
Link al commento
Condividi su altri siti


Fai attenzione che vanno solitamente usati i pin D4 (11),D5 (12),D6 (13),D7 (14) per i dati, mentre per comunicare con il display devi collegare al tuo pic solo i pin RS (4) e EN (6),mentre R/W (5) va sempre a massa,vedrai che poi funziona,BYE.

Link al commento
Condividi su altri siti

rfabri+9/02/2010, 00:51--> (rfabri @ 9/02/2010, 00:51)

Effettivamente è propio quello che ho fatto, con la piccola differenza che ho gestito anche il pin RW, basso in scrittura e alto in lettura sad.gif , i pin dei dati sono corretti dal d4 al d7 rispettivamente portd.0 al portd.3.....non sò più dove sbattere la testa wallbash.gif

Grazie

Link al commento
Condividi su altri siti

Che "C" usi? Se mi ricordo, in giornata, ti allego il SW ("C" CSC) che uso di solito e che non da problemi.

Il "trucco" sta tutto nei tempi di inizializzazione .

Link al commento
Condividi su altri siti

Livio Orsini+9/02/2010, 09:32--> (Livio Orsini @ 9/02/2010, 09:32)

Eccomi....all'ora il compitalore che utilizzo è il CC5X, ho letto qualche cosa in merito alle temporizzazioni, io ho seguito quelle del datasheet dell' HD44780U, per verificarle in Mplab le ho testate con i breakpoint e lo stop watch...è un'azione corretta??

Grazie Grazie worthy.gif

Link al commento
Condividi su altri siti

Grazie mille!!

Questa sera mi ci metto e provo subito; devo riuscire a fare funzionare anche il mio file oa mai è una questione di pricipio....questa sera vi faccio sapere.

Grazie Grazie

Link al commento
Condividi su altri siti

Ci sono!!

Sono riuscito a sistemare il tutto, leggendo il codice di Livio (Grazie worthy.gif ) mi sono illuminato....ovvero nelle prime righe utilizzo una funzione chiamata ScriviHbit(byte,RS)

dove i parametri passati sono il byte, e RS ovvero se a 1 dato se a 0 istruzione!!!

Durante l'inizializzazione passavo tutti i parametri con RS alto!!!

Mentre invece queste sono istruzioni, modificato quello tutto ok!!

Ho anche aumentato di 1ms il primo delay ed anche il secondo, l'altro errore che ho trovato è sulla lettura del bd7 per LCD ready, anche qui la funzione LcdLeggi(RS), in questa funzione leggo i dati e li restituisco in un byte, l'unico parametro è l'RS!!! anche qui l'ho messo a 1, mentre doveva essere a 0.

Nel primo caso mi ha fregato il copia incolla....è una brutta bestia il copia ed incolla...bisogna starci attenti!!!

Grazie a tutti clap.gif

Posterò il codice corretto e con qualche altra aggiunta.

Link al commento
Condividi su altri siti

Bene ci sei riuscito ed hai descritto la soluzione e gli inconvenienti, in perfetto accordo con lo spirito del forum.

Link al commento
Condividi su altri siti

Rieccomi....è quasi tutto ok, ma (c'é sempre un ma) il busy flag mi sta vermente rompendo le scatole; accade questo:

Supponiamo di passare la seguente stringa di caratteri "0123456789ABCDEF", dopo aver scritto i primi 8 ovvero fino al 7 il pic si pianta o meglio aspetta il busy flag che effettivamente è alto, se elimino il controllo del busy flag in scrittura....tutto ok scrive tutta la stringa blink.gif non capisco prima è ok poi no?? senzasperanza.gif per il resto il sw è apposto ho anche aggiunto una funzione per scriver una stringa, poi appena è ok lo posto...ma ora il BusyFlag!!!...ma è veramente necessario???

Grazie Grazie

Link al commento
Condividi su altri siti

il busy flag ti dovrebbe consentire di accedere al display alla massima velocità senza usare i delay. Se usi i delay in modo corretto non c'è bisogno che testi il BF.

Ma sei sicuro di operare bene per testare il BF? Qual'è la funzione incaricata di questo, LcdPronto()?

Se non ricordo male il Byte Flag si testa con RS=0 e R/W=1, tu invece chiami la funzione di lettura con RS=1...

Controlla, forse l'ho interpretata male.

Link al commento
Condividi su altri siti

Nikiki+16/02/2010, 01:10--> (Nikiki @ 16/02/2010, 01:10)

Ciao,

hai interpretato benissimo, infatti mi sono dimentacto di dire nei post precedenti che ho coretto anche quell'errorino, nel sw dove ho ilproblema la lettura avviene gia con RS a 0 lo allego cosi puoi visionarlo.

Grazi grazie

Scarica qui il file File Lcd_4bit.c

Modificato: da vezzo
Link al commento
Condividi su altri siti

  • 1 month later...

Buongiorno, ho iniziato da poco a programmare i pic, ci sto lavorando da giorni ma non riesco a far funzionare un semplice display a 2 righe. Conosco il visual basic, e quindi mi sto cercando di programmare con il picbasic. E' possibile avere qualche esempio per iniziare?

Grazie.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...