Thanks for your answer
I think I understand almost everything, but don't understand why graphic need a 128/8 * 64=1024 bytes of  RAM.
Now i have another problem, i'm trying to display just some text on my lcd, but it don't display what i want and display in wrong position.
lcd.c:
Code:
#include "lcd.h"
// Testar checking flow
void vLCD_BusyCheck( void )
{
     unsigned char data;
    LCD_DATA_TRIS = 0xFF;   // Inicializa LCD_DATA como entrada
   LCD_CD = 1;         // Instrucao de comando
   LCD_RD = 0;         // Define modo de leitura
   LCD_WR = 1;
   LCD_CE = 0;         // Habilita o LCD
   data = LCD_DATA;        // Lê um byte do display
   // Testa bits 0 e 1 e não faz nada enquanto estes nao forem os dois 1
   while ( data && 0x03 == 0 );   
   LCD_CE = 1;         // Desabilita o LCD
   LCD_RD = 1;
   LCD_DATA_TRIS = 0x00;   // Inicializa LCD_DATA como saida
}
// Envia uma instrução de controlo ou um dado para o LCD
void vLCD_Write( unsigned char hInstrucao, unsigned char bCD )
{
   vLCD_BusyCheck();
   // Coloca a instrucao ou os dados a escrever no display
   LCD_DATA = hInstrucao;
   
   if (bCD)
      LCD_CD = 1;         // Define escrita de uma instrução
   else 
      LCD_CD = 0;         // Define escrita de dados
   LCD_WR = 0;            // Define modo de escrita   
   LCD_RD = 1;
   LCD_CE = 0;            // Habilita o LCD
   Nop();
   LCD_CE = 1;            // Desabilita o LCD
   LCD_WR = 1;
}
// Envia um endereço para o LCD
void vLCD_WriteAddr( unsigned int hAddr, unsigned char hCmd )
{
   vLCD_Write(hAddr && 0x00FF, 0);   // Escreve byte low do endereco
   vLCD_Write(hAddr >> 8, 0);      // Escreve byte high do endereco
   vLCD_Write(hCmd, 1);         // Escreve instrução de comando
}
// Inicializa display.
void vLCD_Init( void ) 
{
   LCD_RST = 0;      // Faz o reset
   Delay100TCYx(50);   // Espera 1ms
   LCD_RST = 1;
   // Mode set
   vLCD_Write(0x80, 1);      // Modo OR
   // Control word set
   vLCD_WriteAddr(lcd_th, 0x40);   // Endereco inicial da area de texto
   vLCD_WriteAddr(lcd_ta, 0x41);   // Area de texto
   // Display mode
   vLCD_Write(0x94, 1);   // Selecciona modo de texto sem cursor
   vLCD_ClearText();         // Apaga area de texto
}
// Apaga area de texto
void vLCD_ClearText( void )
{
   int i=0, j=0;
   vLCD_WriteAddr(lcd_th, 0x24);
   for ( i=0;i<15;i++ )
      for ( j=0;j<7;j++)
         vLCD_WriteChar(' ');
}
// Escreve um caracter no LCD
void vLCD_WriteChar( unsigned char hLetra ) 
{
   vLCD_Write(hLetra - 0x20, 0);
   vLCD_Write(0xC0, 1);
}
// Indica o endereço para escrita ou leitura da ram 
void vLCD_GotoXY(unsigned char x, unsigned char y)
{
   unsigned int addr;
   
   addr = lcd_th + y*lcd_ta + x;
   vLCD_WriteAddr(addr, 0x24);
}
void main(void)
{
   TRISEbits.PSPMODE = 0;         // Inicializa PORTD como I/O digitais
   LCD_CTRL_TRIS = 0b00000011;   // Inicializa pinos de controlo como saidas
   LCD_DATA_TRIS = 0x00;      // Inicializa LCD_DATA como saida
    LCD_LED = 1;
   
   vLCD_Init();
   LCD_LED = 0;
 //     vLCD_GotoXY(0, 0);
   vLCD_WriteAddr(0x0000, 0x24);
   vLCD_WriteChar('0');
//      vLCD_GotoXY(1, 0);
   vLCD_WriteAddr(0x0002, 0x24);   
   vLCD_WriteChar('1');
//      vLCD_GotoXY(0, 1)
   vLCD_WriteAddr(0x0010, 0x24);   
   vLCD_WriteChar('4');
   while(1);
}
lcd.h:
Code:
#include <p18f4520.h>
#include <delays.h>
#pragma config OSC = HS      // Oscilador do tipo "High-Speed Crystal/Resonator"
#pragma config WDT = OFF   // Watchdog Timer
#pragma config LVP = OFF   // Low Voltage ICSP
// Pino C/D (Register Select)
#define LCD_CD   LATCbits.LATC6   // LCD_CD = 0 -> Entrada de dados
                  // LCD_CD = 1 -> Entrada de instrucoes de comando
// Pino WR (Write)
#define LCD_WR   LATCbits.LATC3   // LCD_WR = 0 -> Escrita no LCD
// Pino RD (Read)
#define LCD_RD   LATCbits.LATC4   // LCD_RD = 0 -> Leitura do LCD
// Pino CE (Enable)
#define LCD_CE   LATCbits.LATC5   // LCD_CE = 0 -> Display fica habilitado
// Pino RST (Reset)
#define LCD_RST   LATCbits.LATC7   // LCD_RST = 0 -> Faz o reset
// Led indicativo do processo de inicializacao
#define LCD_LED LATCbits.LATC2      // LCD_LED = 1 -> Inicializacao do LCD
// Pinos DB0..DB7
#define LCD_DATA   LATD
// Defenicao das entradas e saidas
#define LCD_CD_TRIS      TRISCbits.TRISC6   // LCD_.._TRIS = 0 -> Saida
#define LCD_WR_TRIS      TRISCbits.TRISC3   // LCD_.._TRIS = 1 -> Entrada
#define LCD_RD_TRIS      TRISCbits.TRISC4
#define LCD_CE_TRIS      TRISCbits.TRISC5
#define LCD_RST_TRIS   TRISCbits.TRISC7
#define LCD_CTRL_TRIS   TRISC
#define LCD_DATA_TRIS   TRISD
#define lcd_th  0x0000      // Endereço inicial da area de texto
#define lcd_pixel_x  128               // Largura do display
#define lcd_pixel_y  64                  // Altura do display
#define lcd_caracter_x  8               // 6x8 -> 6; 8x8 -> 8
#define lcd_ga  lcd_pixel_x/lcd_caracter_x   // Area grafica (bytes usados por linha)
#define lcd_ta  lcd_ga                  // Area de texto (bytes usados por linha)
// Testar checking flow
void vLCD_BusyCheck( void );
// Envia uma instrução ou um dado para o LCD
// Variaveis de entrada: hInstrucao -> Instrução a enviar ao LCD
//               bCD -> Comando (1) ou dados (0)
void vLCD_Write( unsigned char hInstrucao, unsigned char bCD );
// Envia um endereço para o LCD
// Variaveis de entrada: hAddr -> Endereço
//               hCmd -> Instrucao de comando
void vLCD_WriteAddr( unsigned int hAddr, unsigned char hCmd );
// Inicializa display.
void vLCD_Init( void );   
// Apaga area de texto
void vLCD_ClearText( void );
// Escreve um caracter no LCD
// Variaveis de entrada: hletra -> Caracter a enviar ao LCD
void vLCD_WriteChar( unsigned char hletra ); 
// Indica o endereço para escrita ou leitura da ram
void vLCD_GotoXY(unsigned char x, unsigned char y);
I'm trying to write:
   01...
   4
   .
   .
   .
But i'm write:
   04...
   4
   .
   .
   .
I don't understand why!
Thanks for your help