Autor Tema: Consulta - Duda sobre libreria GLCD 128x64 KS108  (Leído 2401 veces)

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

Desconectado Enrique_0xFF

  • PIC10
  • *
  • Mensajes: 2
Consulta - Duda sobre libreria GLCD 128x64 KS108
« en: 15 de Enero de 2019, 15:14:24 »
Buenas tardes, me llamo Enrique soy estudiante y hace poco empece con el tema de micronotorladores, estoy viendo los lcd graficos. Encontre en internet un libreria en la cual tengo cual es el funcionamiento del algunas lineas de la funcion "GLCD_String" lo demas como el tema de la inicialicion, envios de camando, etc lo entendi con la hoja de datos.
Espero de su ayuda y desde ya muchas gracias
Les pongo las lineas que no entido de diferentes partes de la funcion:
float Page_inc=0.5;

if (Y_address>(1024-(((page_no)*128)+5)))

 if ((Y_address+column)==(128*((int)(Page_inc+0.5))))
    {
      if (column==5)
      break;
      GLCD_Command(0x40);
      Y_address = Y_address+column;
     CS1 = ~CS1;
     CS2 = ~CS2;
     GLCD_Command((Page+Page_inc));
     Page_inc=Page_inc+0.5;
}

GLCD_Char(font[str-32][column])

Código: [Seleccionar]
void GLCD_Init()    /* GLCD Initialization function */
{
    Ctrl_dir = 0;    /* Make Control pin as output */
    Data_dir = 0;    /* Make Data pin as output */
    OSCCON = 0x72;    /* Internal 8MHz OSC Frequency */
    RST = 1;        /* Make reset pin High */
    CS1 = 1; CS2 = 1;/* Select Left half of display */
    MSdelay(20);
    GLCD_Command(0x3E);    /* Display OFF */
    GLCD_Command(0x40);    /* Set Y address (column=0) */
    GLCD_Command(0xB8);    /* Set x address (page=0) */
    GLCD_Command(0xC0);    /* Set z address (start line=0) */
    GLCD_Command(0x3F);    /* Display ON */
}

void GLCD_Command(char cmd)/* GLCD Command function */
{
    LCD_data = cmd;    /* Copy command on data pin */
    RS = 0;        /* Make RS LOW for command register*/
    EN = 1;        /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

void GLCD_Char(char data)/* GLCD Data function */
{
    LCD_data = data;    /* Copy Data on data pin */
    RS = 1;        /* Make RS HIGH for data register */
    EN = 1;        /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

void GLCD_String(char page_no, char *str)/* GLCD string write function */
{
    unsigned int i,column,Page=((0xB8)+page_no),Y_address=0;   
    float Page_inc=0.5;                                                   
    CS1 = 1; CS2 = 0;    /* Select Left half of display */
    GLCD_Command(Page);
    for(i=0;str[i]!=0;i++)    /* Print char in string till null */
    {
       if (Y_address>(1024-(((page_no)*128)+5)))
          break;
        if (str[i]!=32)
        {
            for (column=1;column<=5;column++)
            {
                if ((Y_address+column)==(128*((int)(Page_inc+0.5))))
                {
                    if (column==5)
                        break;
                    GLCD_Command(0x40);
                    Y_address = Y_address+column;
                    CS1 = ~CS1; CS2 = ~CS2;
                    GLCD_Command((Page+Page_inc));
                    Page_inc=Page_inc+0.5;
                }
            }
        }
        if (Y_address>(1024-(((page_no)*128)+5)))
            break;
        if((font[((str[i]-32)*5)+4])==0 || str[i]==32)
        {
            for(column=0;column<5;column++)
            {
                GLCD_Char(font[str[i]-32][column]);
                if((Y_address+1)%64==0)
                {
                    CS1 = ~CS1; CS2 = ~CS2;
                    GLCD_Command((Page+Page_inc));
                    Page_inc=Page_inc+0.5;
                }
                Y_address++;
            }
        }
        else
        {
            for(column=0;column<5;column++)
            {
                GLCD_Char(font[str[i]-32][column]);
                if((Y_address+1)%64==0)
                {
                    CS1 = ~CS1; CS2 = ~CS2;
                    GLCD_Command((Page+Page_inc));
                    Page_inc=Page_inc+0.5;
                }
                Y_address++;
            }
            GLCD_Char(0);
            Y_address++;
            if((Y_address)%64==0)
            {
                CS1 = ~CS1; CS2 = ~CS2;
                GLCD_Command((Page+Page_inc));
                Page_inc=Page_inc+0.5;
            }
        }
    }
    GLCD_Command(0x40);
}

void GLCD_Clear()
{
    int i,j;
    CS1 = 1; CS2 = 1;
    for(i=0;i<8;i++)
    {
        GLCD_Command((0xB8)+i);
        for(j=0;j<64;j++)
        {
            GLCD_Char(0);
        }
    }
    GLCD_Command(0x40);
    GLCD_Command(0xB8);
}

/*****************************Delay Function*****************************/

void MSdelay(unsigned int val)
{
     unsigned int i,j;
        for(i=0;i<=val;i++)
            for(j=0;j<165;j++);
}

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Consulta - Duda sobre libreria GLCD 128x64 KS108
« Respuesta #1 en: 16 de Enero de 2019, 08:01:54 »
Hola Enrique, creo entenderte que tus dudas son que no sabes que hace cada línea de código que has puesto en la parte de arriba, así que trataré de explicarte que hace en cada una a ver si es eso lo que buscas saber, sino perdoname por interpretarte mal...

Aquí declaras una variable float(tipo de variable con decimales para que lo entiendas a grandes rasgos) llamada Page_inc con el valor 0.5
float Page_inc=0.5;

si el valor Y_address pongamos que vale 1000 es mayor que (el calculo de este paréntesis que seria(page_no vale 2): 1024-(((2)*128)+5) cuyo resultado es 261 asi que  la condición del IF seria afirmativa y continuamos
if (Y_address>(1024-(((page_no)*128)+5)))

Aquí lo mismo comparamos la suma de Y_address+column si es igual a Page_inc + 0.5 (aquí veras (int) lo que hace es pasar Page_inc que es float a una variable tipo int así que quitas los decimales que hayan  y eso multiplicado por 128)
 if ((Y_address+column)==(128*((int)(Page_inc+0.5))))
    {
      aquí comparamos si column es = 5, si lo es hacemos el break; ese break hace que nos salgamos de las llaves del anterior if y no se ejecute las líneas que hay debajo (GLCD…)   
      if (column==5)
      break;
      aqui llamas a esta funcion y meteindole el valor 0x40
      GLCD_Command(0x40);
      aquí haces que sea igual Y_addres a Y address+column
      Y_address = Y_address+column;
  En estas dos líneas siguientes haces el complemento a 1 de  CS1 y CS2, es decir si CS1 vale en binario 0000 0000 pasara a valer 1111 1111
     CS1 = ~CS1;
     CS2 = ~CS2;
aqui llamas a esta funcion metiendole la suma de esos valores
     GLCD_Command((Page+Page_inc));
     Page_inc=Page_inc+0.5;
}
aqui no entiendo del todo bien que hace, pienso que con esos calculos muestra el caracter que sea en la LCD
GLCD_Char(font[str-32][column])

Desconectado Enrique_0xFF

  • PIC10
  • *
  • Mensajes: 2
Re:Consulta - Duda sobre libreria GLCD 128x64 KS108
« Respuesta #2 en: 16 de Enero de 2019, 10:08:25 »
Muchas gracias por las repuestas voy entiendo, lo unico que no se que por ahi no encontre en la hoja de datos pero para que utiliza los 0.5, es para ver cual lado usar del GLC?

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:Consulta - Duda sobre libreria GLCD 128x64 KS108
« Respuesta #3 en: 16 de Enero de 2019, 12:15:19 »
No se para que puede ser ese 0.5 mira bien por la libreréa que hayas descargado quizas en algun comentario puedas encontrar la explicación.
Tambien puedes probar a quitarlo o modificarlo en funciones sencillas en la que solo se utilize una vez y así ves que hace, quizas te ayude a entender para que vale.
Un Saludo !!


 

anything