Autor Tema: GLCD adaptar libreria de 18f452 a 16f84  (Leído 3990 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado riojanito

  • PIC10
  • *
  • Mensajes: 29
GLCD adaptar libreria de 18f452 a 16f84
« en: 10 de Septiembre de 2008, 20:13:29 »
Hola gente. Encontre por la red una libreria para una glcd 240x64 con contolador T6963 creada para un 18f452. La libreria esta en http://www.ccsinfo.com/forum/viewtopic.php?t=19957
Mi idea es adaptar esa libreria para ser usada con un 16f84a, ya que yo no tengo el 18f452 y modificarla para mi glcd que es de 240x128 con un T9663 (de todas formas el 16f84a no va a ser el micro para la aplicacion que voy a hacer sino un dspic). Hice unos intentos y la compilacion no me da errores, pero al conectar el glcd ni siquiera prende  :shock:
Bueno, el tema planteado, espero que alguien pueda ayudarme.

Desconectado riojanito

  • PIC10
  • *
  • Mensajes: 29
Re: GLCD adaptar libreria de 18f452 a 16f84
« Respuesta #1 en: 16 de Septiembre de 2008, 17:47:39 »
Despues de tanto intentar me di por vencido con el 16f84a y lo cambie por un 16f877, sin embargo, no logro hacer funcionar la libreria!!! Asi que me puse en campaña de tratar de hacer una por mi mismo, pero como era de esperarme no funciona :) (no soy bueno en programacion).
Código: [Seleccionar]
#include <16F877.h>
#use delay(clock=4000000)
#fuses XT, PUT

#use fast_io(d)

//w=a0 c6 para el 877
//r=a1 c5 para el 877
//cd=a2 c4 para el 877
//ce=a3 o c0 para el 877
//reset=a3 c7 para el 877

void checkEstado();
void EscribirDato(int dato);
void EscribirComando(int dato);
void TextSet(); //memtex = memoria para dir. texto
void GrafSet();
void ModeSet();
void DispSet();
void Cursor();

void checkEstado(){
int estado = 0, temp = 0;

set_tris_d(0xff); //todas entradas

do
{
output_high(pin_c6); //w alto
output_low(pin_c5); //r bajo
output_high(pin_c4); //cd alto
output_low(pin_c0); //ce bajo y espero
delay_us(1);
temp = input_d();
output_high(pin_c0); //ce alto
estado = temp & 0x03;
}while (estado != 0x03);
}

void EscribirDato(int dato){

set_tris_d(0xff); //todas entradas
checkEstado();
output_low(pin_c4); //cd bajo
output_low(pin_c6); //w bajo
output_high(pin_c5); //r alto
output_high(pin_c0); //ce alto
output_low(pin_c0); //ce bajo
output_b(dato);
}

void EscribirComando(int dato){

set_tris_d(0xff); //todas entradas
checkEstado();
output_high(pin_c4); //cd alto
output_low(pin_c6); //w bajo
output_high(pin_c5); //r alto
output_high(pin_c0); //ce alto
output_low(pin_c0); //ce bajo
output_b(dato);
}

void ModeSet(){

set_tris_d(0xff); //todas entradas
EscribirComando(0x84); //modo "or" caract. internos 10000100
}

void TextSet(){
int parte_baja, parte_alta;

set_tris_d(0xff); //todas entradas

//ejemplo: memoria para texto en 800h=1000 0000

// parte_baja = memtext & 0x0f;
// parte_alta = memtext >> 8;

EscribirDato(0x00);
EscribirDato(0x08); //00001000
EscribirComando(0x040); //text home address 1000000

EscribirDato(0x10); //00010000 = 16 ya que el disp. es de 240x128 y 128/8=16 el num. de filas
EscribirDato(0x00);
EscribirComando(0x041); //text area 01000001
}

void GrafSet(){

set_tris_d(0xff); //todas entradas
EscribirDato(0x00);
EscribirDato(0x02); //00000010
EscribirComando(0x042); //graphics home address 01000010

EscribirDato(0x10);//00010000 = 16 ya que el disp. es de 240x128 y 128/8=16 el num. de filas
EscribirDato(0x00);
EscribirComando(0x043); //graphics area 01000011
}

void DispSet(){

set_tris_d(0xff); //todas entradas
EscribirComando(0x9c); //modo modo graf., cursor con parpadeo 10011011
}

void Cursor(){
int16 posX, posY;//
set_tris_c(0x00); //todas salidas
set_tris_d(0xff); //todas entradas

posX = 0x120;
posY = 0x65;

EscribirComando(0xa4); //cursor de 8 lineas 10100101

EscribirDato(posX);
EscribirDato(posY);
EscribirComando(0x21); //00100001
}

void main(){

output_low(pin_c7);
output_high(pin_c7);

TextSet(); //01000000 01000001
ModeSet(); //10000100
DispSet(); //10011011
GrafSet(); //01000010 01000011

Cursor(); //10100101 00100001
EscribirDato(0x21);
EscribirComando(0xc0);
EscribirComando(0xab);
}
Bueno, eso es todo lo que se me ocurrio.

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Re: GLCD adaptar libreria de 18f452 a 16f84
« Respuesta #2 en: 17 de Septiembre de 2008, 05:20:25 »
Código: [Seleccionar]
set_tris_d(0xff); //todas entradas
EscribirComando(0x84); //modo "or" caract. internos 10000100
}

void TextSet(){
int parte_baja, parte_alta;

set_tris_d(0xff); //todas entradas



se esta configurando el puerto d... y creo que estas intentando usar el puerto b para datos no?


Desconectado riojanito

  • PIC10
  • *
  • Mensajes: 29
Re: GLCD adaptar libreria de 18f452 a 16f84
« Respuesta #3 en: 17 de Septiembre de 2008, 10:17:57 »
Hola elmasvital. Sip, no me di cuenta que el codigo que subi lo copie mientras corregia muchas cosas a la vez y por ende el "abuso" del ctrl+z jejeje :?.
Pero en si el codigo usa el PORTD como entrada/salida pra los datos del glcd. De todas formas gracias por la observacion.

Desconectado riojanito

  • PIC10
  • *
  • Mensajes: 29
Re: GLCD adaptar libreria de 18f452 a 16f84
« Respuesta #4 en: 06 de Octubre de 2008, 20:11:32 »
Hola, vuelvo con novedades de mi GLCD. Resulta que todoeste tiempo estube intentando e intentando con distintos codigos que no pude hacer andar, pero encontre un codigo en assembler que si consegui que funcionara  :lol:
"Metiendo mano" consegui que inicializara y que borre (o eso parece jejeje). El tema ahora es que intento hubicar una sola letra, supongamos la "A" (0x21 para el t6963) y no solo me muestra 8 letras sino que tambien las hubica en "donde quiere". Bueno eso es todo por ahora, ya veo que hago, a partir de aqui me voy a disfrutar de mi cumpleaños, les dejo el codigo hasta la fecha.
Código: [Seleccionar]
#include <16f84a.h>
#use delay(clock=4000000)
#fuses XT, PUT

const int CURSOR_PTR_SET = 0x021; //Cursor Pointer Set: Data = X,Y
const int OFFSET_REG_SET = 0x022;   //Offset Register Set: Data = data,0
const int ADDR_PTR_SET = 0x024;    //Address Pointer Set: Data = low, high addr

// Control Word Set commands:-
const int TEXT_HOME_SET = 0x040; //Text Home Address Set: Data = low, high addr
const int TEXT_AREA_SET = 0x041; //Text Area Set: Data = columns, 0
const int GRAPH_HOME_SET = 0x042;   //Graphics Home address Set: Data = low, high addr
const int GRAPH_AREA_SET = 0x043;   //Graphics Area Set: Data = columns, 0

// Mode Set commands (OR with CG rom commands):-
const int OR_MODE = 0x080; //OR mode
const int XOR_MODE = 0x081; //XOR mode
const int AND_MODE = 0x083; //AND mode
const int TEXT_ATTR_MODE = 0x084; //Text Attribute mode
const int INT_CG_MODE = 0x080; //Internal CG ROM mode
const int EXT_CG_MODE = 0x088; //External CG ROM mode

// Display Mode commands (OR together required bits):-
const int DISPLAY_OFF = 0x090; //display off
const int BLINK_ON = 0x091;
const int CURSOR_ON = 0x092;
const int TEXT_ON = 0x094;
const int GRAPHIC_ON = 0x098;

//Cursor Pattern Select
const int CURSOR_1LINE = 0x0A0;
const int CURSOR_2LINE = 0x0A1;
const int CURSOR_3LINE = 0x0A2;
const int CURSOR_4LINE = 0x0A3;
const int CURSOR_5LINE = 0x0A4;
const int CURSOR_6LINE = 0x0A5;
const int CURSOR_7LINE = 0x0A6;
const int CURSOR_8LINE = 0x0A7;

//Data Auto Read/Write
const int DATA_AUTO_WR = 0x0B0;
const int DATA_AUTO_RD = 0x0B1;
const int AUTO_DATA_RESET = 0x0B2;

//Data Read/Write
const int DATA_WR_INC = 0x0C0; //Data write and increment addr: Data = data
const int DATA_RD_INC = 0x0C1; //Data read and increment addr
const int DATA_WR_DEC = 0x0C2; //Data write and decrement addr: Data = data
const int DATA_RD_DEC = 0x0C3; //Data read and decrement addr
const int DATA_WR = 0x0C4; //Data write - no addr change: Data = data
const int DATA_RD = 0x0C5; //Data read - no addr change

//Screen Peek
const int16 SCREEN_PEEK = 0x0E0;

//Screen Copy
const int16 SCREEN_COPY = 0x0E8;

//Bit Set/Reset (OR with bit number 0-7)

const int BIT_RESET = 0x0F0;
const int BIT_SET = 0x0F8;

const int16 GRAPHICSTART = 0x0200;
const int16 TEXTSTART = 0x0000;
const int16 CGRAMSTART = 0x1000;

const int MaxByteColumna = 30; //240/8=30 8 es el tamaño de letra
const int MaxByteFila = 16; //16=128/8 8 es el tamaño de letra
const int MaxPixelsFila = 240;

#byte option = 0x81
#byte pclath = 0x84
#bit carry = getenv("BIT:C")

void CheckEstado();
void EnviarComando(int dato);
void EnviarByte(int dato);
void PunteroHome();
void PunteroHomeGraficos();
void InicializaGraficos();
void InicializaTextos();
void Barras();
void BorraTodoGrafico(int dato);
void BorraTodoTexto();
void GoToXY(int x, int y);

void PunteroHomeGraficos(){
EnviarByte(0x00);
EnviarByte(GRAPHICSTART >> 8); //parte alta de GRAPHICSTART
EnviarComando(ADDR_PTR_SET);
}

void PunteroHome(){
EnviarByte(0x00);
EnviarByte(TEXTSTART >> 8); //parte alta de GRAPHICSTART
EnviarComando(ADDR_PTR_SET);
}

//SEND_2DATA_CMD repite SEND_1DATA_CMD

void EnviarByte(int dato){

CheckEstado();
//sets CE, C/D & WR, clears RD, Data lines O/Ps
output_b(dato);

output_low(pin_a0);
output_low(pin_a1);
output_high(pin_a2);
output_low(pin_a3);

delay_us(1); //busy check call long enough

output_high(pin_a1);
output_high(pin_a0); //busy_check will set CE high again

//CD RD WR CE
//a3 a2 a1 a0
}

void EnviarComando(int dato){

CheckEstado();
//sets CE, C/D & WR, clears RD, Data lines O/Ps
output_b(dato);

output_low(pin_a0);
output_low(pin_a1);
output_high(pin_a2);

delay_us(1);                    //busy check call long enough

output_high(pin_a1);
output_high(pin_a0);

//CD RD WR CE
//a3 a2 a1 a0
}
           
void CheckEstado(){ 

do{
output_high(pin_a0);
set_tris_b(0xff); // sets it to input
output_high(pin_a3); // Set LCD to status read
output_high(pin_a1);
output_low(pin_a0); // Enable
output_low(pin_a2);
}while ((input_b() & 0x03) != 0x03);

output_high(pin_a2);
output_high(pin_a0);
set_tris_b(0x00); // back to output

//CD RD WR CE
//a3 a2 a1 a0
}

void InicializaGraficos(){

EnviarComando(OR_MODE);                               
EnviarComando(GRAPHIC_ON); //Display On       

EnviarByte(0x00);
EnviarByte(GRAPHICSTART >> 8); //parte alta de GRAPHICSTART
EnviarComando(GRAPH_HOME_SET);

EnviarByte(MaxByteColumna); //32 columns, not 30 to make calcs easier
EnviarByte(0x00);
EnviarComando(GRAPH_AREA_SET);
               
PunteroHomeGraficos();
}
               
void InicializaTextos(){

EnviarComando(OR_MODE);
EnviarComando(TEXT_ON); //Display On     
               
EnviarByte(0x00);
EnviarByte(TEXTSTART >> 8); //parte alta de GRAPHICSTART
EnviarComando(TEXT_HOME_SET);
               
EnviarByte(MaxByteColumna); //32 columns, not 30 to make calcs easier
EnviarByte(0x00);
EnviarComando(TEXT_AREA_SET);
               
EnviarByte(0x00);
EnviarByte(0x00);
EnviarComando(CURSOR_PTR_SET);

PunteroHome();
}

void BorraTodoGrafico(int dato){
//bit 3 = 1 toda la pantalla "negra", bit 3 = 0 se borra
int temp = 0, temp1 = 0, reg = 0;
InicializaGraficos();
PunteroHomeGraficos();
if ((dato & 0b00000100) != 0b00000100){
reg = 0xff;
}
else{
reg = 0x00;
}
temp = MaxByteFila;
do {
do {
EnviarByte(reg);
EnviarComando(DATA_WR_INC);
temp1--;
}while(temp1 != 0);
temp--;
}while(temp != 0);
}

void BorraTodoTexto(){
int t = 0, t1 = 0, reg = 0;
InicializaTextos();
PunteroHome();
for(t=0;t<MaxByteFila;t++)
{
for(t1=0;t1<MaxPixelsFila;t1++)
{
EnviarByte(reg);
EnviarComando(DATA_WR_INC);
}
}
PunteroHome();
}

void Barras(){
int t = 0, t1 = 0, t2 = 0;

for(t=0;t<MaxByteFila;t++)
{
t2 = ~t2;
for(t1=0;t1<MaxPixelsFila;t1++)
{
t2 = ~t2;
EnviarByte(t2);
EnviarComando(DATA_WR_INC);
}
}
}

void AutoEscribir(int dato){
do{
output_high(pin_a0);
set_tris_b(0x00);
set_tris_b(0xff); // sets it to input
output_high(pin_a3); // Set LCD to status read
output_high(pin_a1);
output_low(pin_a0); // Enable
output_low(pin_a2);
}while ((input_b() & 0x08) !=0x08);

//output_high(pin_a2);
output_high(pin_a0);
set_tris_b(0x00); // back to output

//CD RD WR CE
//a3 a2 a1 a0

output_b(dato);

output_low(pin_a0);
output_low(pin_a1);
output_high(pin_a2);
output_low(pin_a3);

delay_us(1); //busy check call long enough

//output_high(pin_a1);
output_high(pin_a0); //busy_check will set CE high again
}

void GoToXY(int x, int y){
int t = 0;
t = x*MaxByteFila + y + TEXTSTART;
EnviarByte(t & 0xff);
EnviarByte(t >> 8);
EnviarComando(ADDR_PTR_SET);
}

void main(){

BorraTodoGrafico(0b00000000);
PunteroHomeGraficos();
Barras();
BorraTodoTexto();


GoToXY(5, 5);
EnviarByte(0x21);
EnviarComando(DATA_WR_INC);
EnviarComando(0x97);

EnviarComando(CURSOR_5LINE);

}

Desconectado riojanito

  • PIC10
  • *
  • Mensajes: 29
Re: GLCD adaptar libreria de 18f452 a 16f84
« Respuesta #5 en: 09 de Octubre de 2008, 19:01:58 »
Nadie que pueda ayudarme por ahi?????????

Desconectado riojanito

  • PIC10
  • *
  • Mensajes: 29
Re: GLCD adaptar libreria de 18f452 a 16f84
« Respuesta #6 en: 25 de Noviembre de 2008, 13:03:13 »
Hola a todos, despues de un tiempo sigo con el mismo problema, cada ves peor! Resulta que sigue enviando las 8 letras entonces probe cambiando el comando que autoincrementa el puntero (del propio controlador, no en mi software) por el comando que decrementa y el comando que no mueve el puntero y sigue dando el mismo error. Ya revise mil veces la hoja de datos del t6963cfg y por un tiempo pense que podria ser una interrupcion del controlador que este dando ese error. Creo que en ese caso no podria saber si es esa la causa del error, asi que voy a seguir probando con mi codigo.


 

anything