LCDInfo.com
http://forum.lcdinfo.com/

init t6963c
http://forum.lcdinfo.com/viewtopic.php?f=9&t=2359
Page 1 of 1

Author:  eutuele [ Wed Nov 14, 2007 13:32 ]
Post subject:  init t6963c

Hi :)

I'm trying to program a lcd with a t6963c controller. In initialization theres a thing that i can't understand, how you know the area and text home address set. The data sheet isn't clear and and i don't find nothing explicit.
My lcd is a 128x64.

Thanks for the help and sorry for the English.
Silvia

Author:  Henri [ Sun Nov 18, 2007 15:55 ]
Post subject: 

Those are left for you to decide.

The display has some amount of RAM, often 8 or 32KB. Let's say you put the text home address to the address 0. The minimum size you need for this is number of character columns * number of character rows. So for 128x64 LCD with 8x8 font it would be 128/8*64/8 = 128. With 6x8 font it is more as you can calculate.

But as there usually is plenty of RAM available you can reserve for example 1KB for the text and place the graphics area starting from address 0x400 for example. For graphics with 8x8 font you need 128/8*64=1024 bytes. So you could place another graphics buffer starting from 0x800.

So the parameters in this example would be:
TEXT_HOME 0x000
GRAPHICS_HOME 0x400

Or another way to calculate the parameters:
Code:
BYTES_PER_ROW_TXT = xpixels/font_width;
BYTES_PER_ROW_GFX = xpixels/font_width;

T_BASE = 0x0000;
G_BASE = ypixels/8 * BYTES_PER_ROW_TXT;


  // Display init
  WriteData(T_BASE & 0xFF);   //Data1: LowAddress
  WriteData(T_BASE >> 8);     //Data2: HighAddress
  WriteCtrl(0x40);            //Command: 0x40 -> 01000000

  WriteData(BYTES_PER_ROW_TXT);  //Data1: Colums
  WriteData(0);              //Data2: 0
  WriteCtrl(0x41);           //Command: 0x41 -> 01000001

  WriteData(G_BASE & 0xFF);  //Data1: LowAddress
  WriteData(G_BASE >> 8);    //Data2: HighAddress
  WriteCtrl(0x42);           //Command: 0x42 -> 01000010

  WriteData(BYTES_PER_ROW_GFX);  //Data1: Colums
  WriteData(0);              //Data2: 0
  WriteCtrl(0x43);           //Command: 0x43 -> 01000011


You could also place the graphics area starting from 0x000 and the text area after the graphics area. As you wish.

Author:  eutuele [ Sun Nov 18, 2007 23:18 ]
Post subject: 

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

Author:  eutuele [ Fri Nov 23, 2007 11:02 ]
Post subject: 

Hi!

Everything is fine now. Later i'll put here the final code.
Thanks

Page 1 of 1 All times are UTC + 2 hours
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/