Control de Display LCD con microcontrolador PIC

Hola amigos tengo u problema no se como diablos mandarle datos a un display serial, el datasheet dice que enviando unos datos el display de borra se mueve etc, ejemplo: 0x01 = clean display. peor no se como mandarlo adjunto parte de mi soft

Código:
//*****************CONFIGURACION*******************************//
#include <16F628a.h>
#use delay (clock = 8000000)
#include <lcd.c>

#FUSES HS,WDT,NOPUT,NOPROTECT,NOBROWNOUT NOLVP  NOCPD
#use RS232(BAUD=1200,UART1,STREAM=Emisor)
#use RS232(BAUD=2400, XMIT=PIN_B3,FORCE_SW,STREAM=DYSPLAY1)
#use RS232(BAUD=9600, XMIT=PIN_B4,FORCE_SW,STREAM=DYSPLAY2)
//************************************************************//
int i;
int marcador1;
int marcador2;
int blanco1=5;
int blanco2=10;
int z=0x01;

#INT_RDA

void RDA_isr(void){
fprintf(DYSPLAY1,"\f");
      i=getc(Emisor);
                  if(i==1){
                  marcador1=marcador1+blanco1;
                  fprintf(DYSPLAY1,"puntosa;%d",marcador1);
                                  }
                  if(i==2){
                  marcador2=marcador2+blanco1;
                  fprintf(DYSPLAY2,"puntosb;%d",marcador2);
                                  }
                  if(i==11){
                  marcador1=marcador1+blanco2;
                  fprintf(DYSPLAY1,"puntosa;%d",marcador1);
                                  }
                  if(i==22){
                  marcador2=marcador2+blanco2;
                  fprintf(DYSPLAY2,"puntosb;%d",marcador2);
                                  }
                  }

void main(){
int a=1;
int b=2;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

                         
                for(;;){
                     if(input(pin_A0)==1){
                     fputc(a,Emisor);
                     delay_ms(500);
                                         }
                                         
                     if(input(pin_A1)==1){
                     fputc(b,Emisor);
                     delay_ms(500);
                                         }  
                       }
            }

como verán uso 3 UART uno por hardware que se comunica con los demás pic y los otros dos son por software para controlar los dos display por separados, el problema es que cuando quiero mandar el dato a un display pongo fprintf(STREAM,"mensage",value); pero he intentado de todo para mandarle el bendito 0x01 y no toma en cuenta me pone los números donde le place. ya me tiene arto...
 
el datasheet dice que enviando unos datos el display de borra se mueve etc, ejemplo: 0x01 = clean display.
¿Cual datasheet? :confused:

Hace poco tiempo hice un programa sencillo para controlar el LCD serial 16x2 Milford que viene con proteus.
No tengo esa pantalla serial, tan solo quise hacer la prueba. :D

Tal vez te pueda servir para que veas los comandos que utilicé y como lo hice.

Suerte.
 

Adjuntos

  • 16F628A LCD serial.rar
    27.1 KB · Visitas: 18
¿Cual datasheet? :confused:

Hace poco tiempo hice un programa sencillo para controlar el LCD serial 16x2 Milford que viene con proteus.
No tengo esa pantalla serial, tan solo quise hacer la prueba. :D

Tal vez te pueda servir para que veas los comandos que utilicé y como lo hice.

Suerte.

Amigos después de buscar y buscar lei algo de lo que muestra el amigo en su adjunto y obtuve que para manejar los datos del datashhet de este display serial debes hacerlo con la directriz fputc(Valor,Stream);
eso es siempre que uses un UART por software si no el envio sera comun por putc y la lectura por getc.

por ende para mandar el 0x01 ò el 0x08 debes hacerlo asi,

fputc(0x08,STREAM);

saludos espero les sirva..!!!!
 
Les quiero compartir una librería en ensamblador para pantallas LCD 16x2 que adapté para trabajar con los PIC18.
Para usar esta librería se hace uso de las instrucciones para leer tablas en este tipo de PIC's.

Su uso es muy sencillo y se pueden escribir los mensajes de esta forma por ejemplo:
DB "Hola_Mundo______"

De esta manera nos evitamos escribir el mensaje con los clásicos MOVLW 'X' o RETLW 'X'
Esta librería contiene las funciones básicas para escribir en la pantalla y adjunto un ejemplo para su uso.

Utilicé un PIC18F4550 para el ejemplo y funciona perfectamente en pantallas LCD 16x2 con el controlador HD44780 y compatibles.

Nota:
La librería está escrita para trabajar a 4MHz, y para usarla a otra frecuencia se deben cambiar las rutinas de los retardos.

Espero sea de utilidad para quienes les gusta el lenguaje ensamblador y necesiten una librería LCD para PIC18.

Suerte.
 

Adjuntos

  • Conexión LCD SCH.jpg
    Conexión LCD SCH.jpg
    96.8 KB · Visitas: 21
  • Librería LCD 16x2 PIC18.rar
    98.5 KB · Visitas: 13
Última edición:
Hola, soy nuevo en el foro.
Estoy intentando inicializar un LCD JM162A sin éxito
Estoy usando el pic24fj64gb002. El LCD lleva el controlador ks0070b (similar al hitachi 44780 pero con la rutina de inicialización un poco distinta).
Quiero usar el LCD en modo 4 bits usando los pines tolerantes a 5v del puerto B (RS y E en pines RB5 y RB7 respectivamente, RW a tierra y DB4-DB7 en RB8-RB11).
No consigo de ninguna manera inicializar el LCD, me queda una línea con cuadros negros (creo que no es el contraste, he conectado potenciómetro de 10k, al regularlo pasa de cuadros negros a nada). Las conexiones también creo que están bien.
He hecho mil rutinas pero nada :confused:, incrementando los tiempos muy por encima de lo que marca el fabricante y no he obtenido ningún resultado.
Estoy bastante desesperado.:cry:
He de decir que estudié ingenieria electrónica pero hace ya muchos años que no hacia nada con microcontroladores y estoy bastante oxidado. En el siguiente post adjunto código.
Muchas grácias por adelantado

Código:
#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>


#define FCY 10000000UL
#include <libpic30.h>

_CONFIG1 (JTAGEN_OFF);                      //Modulo JTAG deshabilitado (RB5-RB9 i/o digitales)
_CONFIG3 (SOSCSEL_IO);                      //RA4 i RB4 i/0 digitales
_CONFIG2 (POSCMOD_XT & OSCIOFNC_OFF & FNOSC_PRI); //Oscilador primario XT (cristal 20MHz)

// Definir pins control i dades

#define LCD_PIN_RS  _LATB5
//#define LCD_PIN_RW  _RA1      //RW a tierra
#define LCD_PIN_E   _LATB7
#define LCD_PIN_DB4 _LATB8
#define LCD_PIN_DB5 _LATB9
#define LCD_PIN_DB6 _LATB10
#define LCD_PIN_DB7 _LATB11

// Definir direcció dels pins

#define RS_DIRECCIO     _TRISB5
//#define RW_DIRECCIO     _TRISA1
#define E_DIRECCIO      _TRISB7
#define DB4_DIRECCIO    _TRISB8
#define DB5_DIRECCIO    _TRISB9
#define DB6_DIRECCIO    _TRISB10
#define DB7_DIRECCIO    _TRISB11
#define CONFIG_1x5x7    0x04
#define CONFIG_2x5x7    0x08
#define CONFIG_1x5x10   0x04
#define CONFIG_2x5x10   0x0C


void port_4bits (char dada)
{
    LCD_PIN_DB4 = dada & 1;
    LCD_PIN_DB5 = (dada & 2)>>1;
    LCD_PIN_DB6 = (dada & 4)>>2;
    LCD_PIN_DB7 = (dada & 8)>>3;
}

void escriure_byte (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 1;     //Mode dato
    __delay_us(1);
    LCD_PIN_E = 1;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);      //Transmitir 4 bits altos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(1);
    LCD_PIN_E = 1;
    port_4bits (dada);          //Transmitir 4 bits bajos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(50);

}

void escriure_cmd (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);
    LCD_PIN_E = 1;
    __delay_us(100);
    LCD_PIN_E = 0;
    port_4bits (dada);
    LCD_PIN_E = 1;
    __delay_us(100);
    LCD_PIN_E = 0;
}


void cmd_lcd_4bits (char dada)
{
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;         //Instrucción
    port_4bits(dada);       //Poner dada en el puerto
    LCD_PIN_E = 1;
    __delay_ms(100);
    LCD_PIN_E = 0;
}

void ini_LCD_4bits ()
{
    TRISB = 0x0000;     //port B salida
    __delay_ms(100);
                        //Inicializa a 4 bits
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;
    port_4bits(0x02);
    __delay_us(100);
  
    escriure_cmd(0x28);     //Function set 2 lineas 5x7
    __delay_us(80);
    escriure_cmd(0x0E);     //Display on, cursor on, blink off
    __delay_us(80);
    escriure_cmd(0x01);     //Clear display
    __delay_ms(4);
    escriure_cmd (0x06);    //Increment mode y entrire shift off
    __delay_us(80);

}


int main() {

    AD1PCFG = 0xffff;   //Todos los puertos digitales
    ODCB = 0x0000;      //No open drain
    TRISB = 0;          //Port B salida
    _TRISA0 = 0;        //RA0 salida

    ini_LCD_4bits();
    __delay_ms(1000);
    escriure_byte (0x48);
    
    while(1)
    {
       _LATA0 = 1;          //Parpadeo de led cada segundo, para verificar retardos
       __delay_ms(1000);
       _LATA0 = 0;
       __delay_ms(1000);
    };


    
}
 
Ok. Gracias Fogonazo.

Ya me lo estuve mirando pero no logré solucionar el problema. Soy bastante nuevo en esto de los foros y ahora me doy cuenta que en vez de abrir un nuevo tema a lo mejor hubiera sido más correcto escribir en este tema que me recomiendas.

Gracias de nuevo

También he visto que el código que he enviado está mal...

Perdonad las molestias, hoy estoy un poco torpe... :(

Hola de nuevo. He mirado el foro que me has recomendado pero no he conseguido solucionar el problema :confused:

He visto al final del foro que recomendaba abrir un nuevo tema ya que hacia más de 6 meses que no se publicaba en él, por esto he optado seguir aquí (si estoy equivocado ya me diréis).

Adjunto el código corregido (a parte, he bajado la frecuencia del oscilador para relantizar el programa, he visto que lo recomendaba en caso de problemas). Lo copio aquí ya que no se como lo has hecho para que quedara en una ventana (soy muy novato en eso de los foros).

Código:
#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>


#define FCY 62500UL
#include <libpic30.h>

_CONFIG1 (JTAGEN_OFF);                      //Modulo JTAG deshabilitado (RB5-RB9 i/o digitales)
_CONFIG3 (SOSCSEL_IO);                      //RA4 i RB4 i/0 digitales
//_CONFIG2 (POSCMOD_XT & OSCIOFNC_OFF & FNOSC_PRI); //Oscilador primario XT (cristal 20MHz)
_CONFIG2 (POSCMOD_NONE & OSCIOFNC_ON);


// Definir pins control i dades

#define LCD_PIN_RS  _LATB5
//#define LCD_PIN_RW  _RA1      //RW a tierra
#define LCD_PIN_E   _LATB7
#define LCD_PIN_DB4 _LATB8
#define LCD_PIN_DB5 _LATB9
#define LCD_PIN_DB6 _LATB10
#define LCD_PIN_DB7 _LATB11

// Definir direcció dels pins

#define RS_DIRECCIO     _TRISB5
//#define RW_DIRECCIO     _TRISA1
#define E_DIRECCIO      _TRISB7
#define DB4_DIRECCIO    _TRISB8
#define DB5_DIRECCIO    _TRISB9
#define DB6_DIRECCIO    _TRISB10
#define DB7_DIRECCIO    _TRISB11
#define CONFIG_1x5x7    0x04
#define CONFIG_2x5x7    0x08
#define CONFIG_1x5x10   0x04
#define CONFIG_2x5x10   0x0C


void port_4bits (char dada)
{
    LCD_PIN_DB4 = dada & 1;
    LCD_PIN_DB5 = (dada & 2)>>1;
    LCD_PIN_DB6 = (dada & 4)>>2;
    LCD_PIN_DB7 = (dada & 8)>>3;
}

void escriure_byte (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 1;     //Mode dato
    __delay_us(1);
    LCD_PIN_E = 1;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);      //Transmitir 4 bits altos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(1);
    LCD_PIN_E = 1;
    port_4bits (dada);          //Transmitir 4 bits bajos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(50);

}

void cmd_lcd_4bits (char dada)
{
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;         //Instrucción
    port_4bits(dada);       //Poner dada en el puerto
    LCD_PIN_E = 1;
    __delay_ms(100);
    LCD_PIN_E = 0;
}

void escriure_cmd (char dada)
{
    char hg_4bits;

    hg_4bits = dada >>4;
    cmd_lcd_4bits(hg_4bits);
    __delay_ms(1000);
    cmd_lcd_4bits(dada);
    __delay_ms(1000);
}




void ini_LCD_4bits ()
{
    TRISB = 0x0000;     //port B salida
    __delay_ms(100);
                        //Inicializa a 4 bits
    cmd_lcd_4bits(0x02);
    __delay_ms(100);
  
    escriure_cmd(0x28);     //Function set 2 lineas 5x7
    __delay_ms(80);
    escriure_cmd(0x0E);     //Display on, cursor on, blink off
    __delay_ms(80);
    escriure_cmd(0x01);     //Clear display
    __delay_ms(4);
    escriure_cmd (0x06);    //Increment mode y entrire shift off
    __delay_ms(80);

}


int main() {

    _NOSC = 0x7;    //Fast RC
    _RCDIV = 0x6;   //Divided per 64 (125kHz)

    AD1PCFG = 0xffff;   //Todos los puertos digitales
    ODCB = 0x0000;      //No open drain
    TRISB = 0;          //Port B salida
    _TRISA0 = 0;        //RA0 salida

    ini_LCD_4bits();
    __delay_ms(1000);
    escriure_byte (0x48);
    
    while(1)
    {
       _LATA0 = 1;          //Parpadeo de led cada segundo, para verificar retardos
       __delay_ms(1000);
       _LATA0 = 0;
       __delay_ms(1000);
    };


    
}

Gracias de nuevo

[En lugar de crear nuevos comentarios edita los que ya tienes.]
 
Ok. Gracias Fogonazo.

Ya me lo estuve mirando pero no logré solucionar el problema. Soy bastante nuevo en esto de los foros y ahora me doy cuenta que en vez de abrir un nuevo tema a lo mejor hubiera sido más correcto escribir en este tema que me recomiendas.

Gracias de nuevo

También he visto que el código que he enviado está mal...

Perdonad las molestias, hoy estoy un poco torpe... :(

Hola de nuevo. He mirado el foro que me has recomendado pero no he conseguido solucionar el problema :confused:

He visto al final del foro que recomendaba abrir un nuevo tema ya que hacia más de 6 meses que no se publicaba en él, por esto he optado seguir aquí (si estoy equivocado ya me diréis).

Adjunto el código corregido (a parte, he bajado la frecuencia del oscilador para relantizar el programa, he visto que lo recomendaba en caso de problemas). Lo copio aquí ya que no se como lo has hecho para que quedara en una ventana (soy muy novato en eso de los foros).

Código:
#include <stdio.h>
#include <stdlib.h>
#include <p24FJ64GB002.h>


#define FCY 62500UL
#include <libpic30.h>

_CONFIG1 (JTAGEN_OFF);                      //Modulo JTAG deshabilitado (RB5-RB9 i/o digitales)
_CONFIG3 (SOSCSEL_IO);                      //RA4 i RB4 i/0 digitales
//_CONFIG2 (POSCMOD_XT & OSCIOFNC_OFF & FNOSC_PRI); //Oscilador primario XT (cristal 20MHz)
_CONFIG2 (POSCMOD_NONE & OSCIOFNC_ON);


// Definir pins control i dades

#define LCD_PIN_RS  _LATB5
//#define LCD_PIN_RW  _RA1      //RW a tierra
#define LCD_PIN_E   _LATB7
#define LCD_PIN_DB4 _LATB8
#define LCD_PIN_DB5 _LATB9
#define LCD_PIN_DB6 _LATB10
#define LCD_PIN_DB7 _LATB11

// Definir direcció dels pins

#define RS_DIRECCIO     _TRISB5
//#define RW_DIRECCIO     _TRISA1
#define E_DIRECCIO      _TRISB7
#define DB4_DIRECCIO    _TRISB8
#define DB5_DIRECCIO    _TRISB9
#define DB6_DIRECCIO    _TRISB10
#define DB7_DIRECCIO    _TRISB11
#define CONFIG_1x5x7    0x04
#define CONFIG_2x5x7    0x08
#define CONFIG_1x5x10   0x04
#define CONFIG_2x5x10   0x0C


void port_4bits (char dada)
{
    LCD_PIN_DB4 = dada & 1;
    LCD_PIN_DB5 = (dada & 2)>>1;
    LCD_PIN_DB6 = (dada & 4)>>2;
    LCD_PIN_DB7 = (dada & 8)>>3;
}

void escriure_byte (char dada)
{
    char hg_4bits;

    LCD_PIN_E = 0;
    LCD_PIN_RS = 1;     //Mode dato
    __delay_us(1);
    LCD_PIN_E = 1;
    hg_4bits = dada >>4;
    port_4bits (hg_4bits);      //Transmitir 4 bits altos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(1);
    LCD_PIN_E = 1;
    port_4bits (dada);          //Transmitir 4 bits bajos
    __delay_us(1);
    LCD_PIN_E = 0;
    __delay_us(50);

}

void cmd_lcd_4bits (char dada)
{
    LCD_PIN_E = 0;
    LCD_PIN_RS = 0;         //Instrucción
    port_4bits(dada);       //Poner dada en el puerto
    LCD_PIN_E = 1;
    __delay_ms(100);
    LCD_PIN_E = 0;
}

void escriure_cmd (char dada)
{
    char hg_4bits;

    hg_4bits = dada >>4;
    cmd_lcd_4bits(hg_4bits);
    __delay_ms(1000);
    cmd_lcd_4bits(dada);
    __delay_ms(1000);
}




void ini_LCD_4bits ()
{
    TRISB = 0x0000;     //port B salida
    __delay_ms(100);
                        //Inicializa a 4 bits
    cmd_lcd_4bits(0x02);
    __delay_ms(100);
  
    escriure_cmd(0x28);     //Function set 2 lineas 5x7
    __delay_ms(80);
    escriure_cmd(0x0E);     //Display on, cursor on, blink off
    __delay_ms(80);
    escriure_cmd(0x01);     //Clear display
    __delay_ms(4);
    escriure_cmd (0x06);    //Increment mode y entrire shift off
    __delay_ms(80);

}


int main() {

    _NOSC = 0x7;    //Fast RC
    _RCDIV = 0x6;   //Divided per 64 (125kHz)

    AD1PCFG = 0xffff;   //Todos los puertos digitales
    ODCB = 0x0000;      //No open drain
    TRISB = 0;          //Port B salida
    _TRISA0 = 0;        //RA0 salida

    ini_LCD_4bits();
    __delay_ms(1000);
    escriure_byte (0x48);
    
    while(1)
    {
       _LATA0 = 1;          //Parpadeo de led cada segundo, para verificar retardos
       __delay_ms(1000);
       _LATA0 = 0;
       __delay_ms(1000);
    };


    
}

Gracias de nuevo

[En lugar de crear nuevos comentarios edita los que ya tienes.]

Hola de nuevo. Creo que el problema está en que la pantalla no funciona correctamente, pero antes de comprar otra quería escuchar vuestra opinión.

Conseguí un código que parecía que funcionaba algo mejor, no conseguí sacar texto pero pasaba de los cuadros negros a una línea parpadeante. De repente pero dejó de funcionar o hacia diferentes cosas al ejecutar la pantalla y el pic (salían cuadros negros, no salía nada o salía la línea parpadeante).

Ahora me encuentro que al dar tensión solamente a la pantalla (sin conectar el pic), a veces no sale nada (ni la línea de cuadros negros) y los pines de datos se me ponen a "1":confused:

Esto me hace pensar que la pantalla no está bien, pero como siempre no pasa lo mismo a lo mejor es que el chip de control de esta a veces no se reinicializa bien en el reset por apagado... no se...

Que les parece a ustedes?

Gracias de nuevo
 
Tengo un programa en ensamblador (mplab) para un LCD LM016L y un microcontrolador PIC16F877

Tengo en la linea 1, un mensaje en movimiento y en la linea 2 necesito colocar un mensaje centrado y que no se mueva, pero aparece es las dos lineas moviéndose; y necesito que la linea de arriba se mueva pero la de abajo quede quieta todo el tiempo.

Y claro la linea 1 al final del recorido se tiene que quedar quieta (cosa que si funciona)

Ademas de eso en la linea 1 necesito colocar mas letras pero cuando lo hago solo salen 40 caracteres como máximo.

Este es el código (algunos comandos o etiquetas sobran):
Código:
list p=16F877A
 __CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuracin para el programador
        #include    <P16F877A.INC>

STATUS           EQU    0X03
PORTA            EQU    0X05
PORTB            EQU    0X06
TRISA            EQU    0X85
TRISB            EQU    0X86
LCD_LINEA1     EQU    80
LCD_LINEA2     EQU    0C0
LCD_CLR         EQU    01
LCD_CASA     EQU    02
LCD_INC         EQU    06
LCD_DEC         EQU    04
LCD_ON         EQU    0C
LCD_OFF         EQU    08
CURSOR_ON     EQU    0E
CURSOR_OFF     EQU    0C
CURSOR_PARP     EQU    0F
LCD_IZDA     EQU    18
LCD_DECHA     EQU    1C
CURSOR_IZDA     EQU    10
CURSOR_DECHA     EQU    14
LCD_FUNCIÓN     EQU    38
LCD_CGRAM     EQU    40
        CBLOCK 0x20

	contador1,contador2			; Variables para los retardos
	Scroll						; Variable para el Scroll
	Aux							; Variable auxiliar
	endc

LCD_Putc macro	Caracter
	movlw	Caracter
	call	lcd_dato
	endm

        ORG    0x00

 BCF STATUS, RP0 ;
 BCF STATUS, RP1 ; Banco 0
 CLRF PORTA ; Inicializo PORTA poniendo los latches a 0 BSF
 BSF STATUS, RP0 ; Banco 1
 MOVLW 0x06 ; Configuro todos los pines
 MOVWF ADCON1 ; como entradas digitales
 MOVLW 0xCF

INICIO
                bsf         STATUS,RP0
                   movlw        b'00011000'
        movwf        TRISA
        clrf        TRISB
        bcf             STATUS,RP0
        clrf        PORTA
        clrf        PORTB
        movlw        LCD_FUNCIÓN
        call        LCD_COMANDO
        call        PAUSA_5ms
        movlw        LCD_FUNCIÓN
        call        LCD_COMANDO
        call        PAUSA_5ms
        movlw        LCD_FUNCIÓN
        call        LCD_COMANDO
        call        PAUSA_5ms
        movlw        LCD_CLR
        call        LCD_COMANDO
        movlw        LCD_INC
        call        LCD_COMANDO
        movlw        LCD_ON
        call        LCD_COMANDO
        movlw        80
        call        LCD_COMANDO
ver                                             ;inicio escritura de caracteres


        movlw 0c0                     ; Seleccionar la posición en la fila 2
        call LCD_COMANDO

        movlw    ' '
        call    LCD_CARACTER
        movlw    ' '
        call    LCD_CARACTER
        movlw    '3'
        call    LCD_CARACTER
        movlw    '0'
        call    LCD_CARACTER
         movlw    '9'
        call    LCD_CARACTER
        movlw    '6'
        call    LCD_CARACTER
        movlw    '9'
        call    LCD_CARACTER
        movlw    '6'
        call    LCD_CARACTER
        movlw    '-'
        call    LCD_CARACTER
        movlw    'M'
        call    LCD_CARACTER
        movlw    'p'
        call    LCD_CARACTER
        movlw    '&'
        call    LCD_CARACTER
        movlw    'M'
        call    LCD_CARACTER
        movlw    'c'
        call    LCD_CARACTER
        movlw    ' '
        call    LCD_CARACTER
        movlw    ' '
        call    LCD_CARACTER

	movlw	80		; Seleccionar la posición en la fila 1
        call LCD_COMANDO
        movlw    ' '
        call    LCD_CARACTER
        movlw    'M'
        call    LCD_CARACTER
        movlw    'I'
        call    LCD_CARACTER
        movlw    'C'
        call    LCD_CARACTER
        movlw    'R'
        calL    LCD_CARACTER
        movlw    'O'
        calL    LCD_CARACTER
        movlw    'P'
        calL    LCD_CARACTER
        movlw    'R'
        calL    LCD_CARACTER
        movlw    'O'
        calL    LCD_CARACTER
        movlw    'C'
        calL    LCD_CARACTER
        movlw    'E'
        calL    LCD_CARACTER
        movlw    'S'
        calL    LCD_CARACTER
        movlw    'A'
        calL    LCD_CARACTER
        movlw    'D'
        calL    LCD_CARACTER
        movlw    'O'
        calL    LCD_CARACTER
        movlw    'R'
        calL    LCD_CARACTER
        movlw    'E'
        calL    LCD_CARACTER
        call        MOVLCD
        movlw    'S'
        calL    LCD_CARACTER
        call        MOVLCD
        movlw    ' '
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'Y'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    ' '
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'M'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'I'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'C'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'R'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'C'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'N'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'T'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'R'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'L'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'A'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'D'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'O'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'R'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'E'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    'S'
        call    LCD_CARACTER
        call        MOVLCD
        movlw    ' '
        call    LCD_CARACTER
        call        MOVLCD

        movlw 0c0
        call LCD_COMANDO

        movlw    'A'
        call    LCD_CARACTER
        call        MOVLCD
  sleep
subrutinas
          CBLOCK
        CONTA1
        CONTA2
        GUARDA_CARÁCTER
        ENDC
PAUSA_5ms
                movlw        7
        movwf        CONTA2
        clrf        CONTA1
RETRASO1
                decfsz        CONTA1,1
        goto        RETRASO1
        decfsz        CONTA2,1
        goto        RETRASO1
        return
LCD_COMANDO
                clrf        PORTA
        movwf        PORTB
        call        LCD_CHEQUEA
        goto        LCD_HABILITA
LCD_CARACTER
        clrf    PORTA
        call    LCD_CARÁCTER_ESPECIAL
        movwf    PORTB
        call    LCD_CHEQUEA
        bsf     PORTA,0
        goto    LCD_HABILITA
LCD_CARÁCTER_ESPECIAL
        movwf    GUARDA_CARÁCTER
        sublw    'ñ'
        btfss    STATUS,Z
        goto    LCD_EÑE_MAYÚSCULA
        movlw    b'11101110'
        movwf    GUARDA_CARÁCTER
        goto    LCD_FIN_CARACTER_ESP

LCD_EÑE_MAYÚSCULA
        movfw    GUARDA_CARÁCTER
        sublw     'Ñ'
        btfss       STATUS,Z
        goto       LCD_GRADO
        movlw    b'11101110'
        movwf    GUARDA_CARÁCTER
        goto       LCD_FIN_CARACTER_ESP
LCD_GRADO
        movfw    GUARDA_CARÁCTER
        sublw      'º'
        btfss      STATUS,Z
        goto       LCD_FIN_CARACTER_ESP
        movlw    b'11011111'
        movwf    GUARDA_CARÁCTER

LCD_FIN_CARACTER_ESP
        movfw    GUARDA_CARÁCTER
        return
LCD_CHEQUEA
        bsf         STATUS,RP0
        movlw        0FF
        movwf        TRISB
        bcf         STATUS,RP0
        bcf         PORTA,0
        bsf         PORTA,1
BUCLE
        bsf         PORTA,2
        movf        PORTB,0
        bcf         PORTA,2
        addlw        84
        btfsc        STATUS,C
        goto        BUCLE
        bsf         STATUS,RP0
        clrf        TRISB
        bcf         STATUS,RP0
        bcf         PORTA,1
        return
LCD_HABILITA
        bsf         PORTA,2
        nop
        bcf         PORTA,2
        return
MOVLCD
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
 call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
 call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        call PAUSA_5ms
        movlw 18
        call        LCD_COMANDO
        return

 END

Espero porfavor me puedan ayudar con el codigo.
Gracias
 
Hola a todos. Se que se va del tema discutido, pero no creo necesario crear un nuevo tema para una pregunta simple. Mas o menos las pantallas de 16x2 que consumo tienen? Sucede que tengo un proyecto con micro PIC18F4680 y una pantalla de estas y en el datasheet no dice el consumo, y dispongo de una trafo de bocinitas de 200mA, pregunto si me servira?. Por supuesto, no pienso usar la iluminacion de la pantalla GC-1602G3 de Goldentek
 
Hola. Con ese transformador basta y sobra; en efecto, el mayo consumo de la pantalla se lo lleva la luz de fondo. Fuera de eso el consumo de la pantalla junto con su lógica anda entre los 5~10mA, depende también del tamaño de la pantalla.

Saludos
 
Atrás
Arriba