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