Programas hechos en MPLAB

Hola a todos, estoy intentando realizar una comunicacion serie bidireccional (duplex por ahora,aunque full duplex seria excelente) entre 2 pics pero solo logro una unidireccional. no se que estara fallando si alguien ve algo en el codigo agradezco la ayuda.
Gracias y saludos.

Código:
//primer pic

#include <16f628a.h>
#fuses XT,NOWDT,NOMCLR   
#use delay(clock=4000000)       
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1)    
//#use rs232(baud=9600, UART1)       // USART POR HARDWARE  RB2/TX Y RB1/RX 

#include <stdlib.h>

#define LED_0 PIN_B4
char r;
void main() {
   while (TRUE) { 
       if (kbhit()) {
         r = getc();
       }
      if (input(PIN_A0)==0){
         output_high(LED_0);
         printf("a"); //ENVIAR CARACTER a
         
       }
       else{
       
         output_low(LED_0);
         printf("b"); //ENVIAR CARACTER b
         if (r=="c"){
         output_high(LED_0);
         delay_ms(500);
         output_low(LED_0);
         delay_ms(500);
         output_high(LED_0);
         delay_ms(500);
         output_low(LED_0);
       }
       }
       }
   }

Código:
//segundo pic

#include <16f628a.h>
#fuses XT,NOWDT,NOMCLR      
#use delay(clock=4000000)       
#use rs232(baud=9600, xmit=PIN_B0, rcv=PIN_B1)    
//#use rs232(baud=9600, UART1)       // USART POR HARDWARE  RB2/TX Y RB1/RX 

#define LED_0 PIN_B4
#include <stdlib.h>

char x;

void main() {
   while (TRUE) { 
       if (kbhit()) {
         x = getc();
       }
       if (x=='a'){
         delay_ms(1000);
         output_high(LED_0);
         printf("c");
         delay_ms(3000);
       }
       else{
         output_low(LED_0);
         
       }
   }
}
 
Última edición:
Hola amigos.
Tengo un dolor de cabeza con la programación de pull up internas
del pic 12f629 en ccs.:oops:
Me pueden mostrar el para de instrucciones para habilitarla individualmente
y en conjunto..
Les agradesco..
 
olep colegas,,, necesito ayuda,,

Me encuentro realizando un proyecto con un pic18F2550 y un lcd de 4 filas en CCS, el proyecto toma la señal de dos sensores que estan por el Puerto B (BO , y B1) Estoy utilizando dos de las tres interrrupciones que tiene este PIC, estas señales las coloco dentro de un contador y realiza una resta Nota: Siempre hay una señal mayor que otra, simultaneamente entra la señal y esta realziando la resta, hasta ahi todo marcha bien ,el conteo o las entradas llegan de 0 hasta 200000, por lo que utilice Long long en tipo de datos, utilice interrupciones para garantizar de que no se me perdiera ninguna pulso, En proteus me funciona de maravillas pero en lo fisico el conteo de ambas entradas solo me llega hasta un valor ejemplo 5000, y se me detiene el conteo como si el PIC se Bloquera, lo reseteo y vuelve inicia pero se me detiene el conteo, dedusco de que algo pasa con las interrupciones no se si las estoy configurando bien las dos, cada señal entra con una frecuencia de 10HZ mas o menos adjunto el codigo por favor a ver si tengo algun problema,,,

#include <18f2550.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT
#use delay (clock=12000000)

#use standard_io(b) //puerto usado para el LCD es necesario declararlo como #use standard_io(b)
#use fast_io(a)
#use standard_io(C) //puerto usado para el LCD es necesario declararlo como #use standard_io(b)

#BYTE porta = 0x05
#BYTE portb = 0x06
#BYTE portc = 0x07

#define use_portb_lcd TRUE
#include "lcd flex.c"
#include "internal_eeprom.c"


long long contador2=0;
long long contador1=0;
long long cont_resta=0;

#INT_EXT
void ext_isr()
{
contador2++;

}

#INT_EXT1
void ext1_isr()
{
contador1++;

}


////////////////////////////// ciclo principal /////////////////////////
void main()
{

lcd_init();//llama a lcd
delay_ms(500);
lcd_gotoxy(1,1);
printf(lcd_putc," Contador Restador ");
Lcd_putc( "\b"); //Limpio pantalla
disable_interrupts(global);
//configura puertos
set_tris_a(0b11111111);
set_tris_b(0b00000011);
set_tris_c(0b00000001);
//fin configura puertos
ext_int_edge (L_TO_H);
// setup_timer_1 (T1_EXTERNAL);
enable_interrupts(int_ext);
enable_interrupts(int_ext1);
enable_interrupts(global);

delay_ms(20);

ext_int_edge (L_TO_H);
//setup_timer_1 (T1_EXTERNAL);
enable_interrupts(int_ext1);
enable_interrupts(global);

delay_ms(20);

//////////////////////////////////////////// bucle principal /////////////////////////////
for(;;){

while(!input(PIN_c0)) //reset

{
Lcd_putc( "\f"); //Limpio pantalla

lcd_gotoxy(1,2);
printf(lcd_putc,"CONTADOR EN CEROS ");

delay_ms(1000);
Lcd_putc( "\b"); //Limpio pantalla
lcd_gotoxy(1,1);
printf(lcd_putc," Contador Restador ");
Lcd_putc( "\b");
{set_timer1 (0);contador2=0;contador1=0;cont_resta=0;

lcd_gotoxy(1,2); //tercera linea
printf(lcd_putc,"UNI ENT= %7lu ",contador1); //muestra la ENTRADA
lcd_gotoxy(21,1); //tercera linea
printf(lcd_putc,"UNI SAL= %7lu ",contador2); //muestra la SALIDA
lcd_gotoxy(85,1); //cuarta linea
printf(lcd_putc,"DESPERDICIO= %7lu ",cont_resta); // muestra la diferencia
Lcd_putc( "\b"); //Limpio pantalla
}
}

if(contador1>contador2)
{cont_resta=contador1-contador2;} //ENTRADA-SALIDA
lcd_gotoxy(1,2); //tercera linea
printf(lcd_putc,"UNI ENT= %7lu ",contador1); //muestra la ENTRADA
lcd_gotoxy(21,1); //tercera linea
printf(lcd_putc,"UNI SAL= %7lu ",contador2); //muestra la SALIDA
lcd_gotoxy(85,1); //cuarta linea
printf(lcd_putc,"DESPERDICIO=%7lu ",cont_resta); // muestra la diferencia


Lcd_putc( "\b"); //Limpio pantalla
//***********************************************************
}
}
 
Usa la definicio de
alta prioridad, a lo mejor las dos interrupciones surgen al mismo tiempo y el PIC no sabe que hacer,
la instruccion es:

#priotity interrupcion de alta prioridad,interrupcion de baja prioridad

checa en el Manual de CCS
o si no activa las interrupciones cuando sea necesario, cuando cuente lo que debe de contar desactivalos y muestra el resultado, al mostrar el resultado en el LCD activa las interrupciones para leer los pulsos nuevamente.
Estas usando un oscilador Externo de 12Mhz en fisico?
 
Gracias George.manson por tu respuesta,,

Bueno lo primero que me dices no lo he hecho en ccs voy a chequear te agredeceria si tienes algo de informacion,

Con respecto a lo segundo seria algo asi, habilitar y deshabilitar cuando se requiera:

#INT_EXT
void ext_isr()
{
disable_interrupts(INT_EXT1);
contador2++;
enable_interrupts(INT_EXT1);

}

#INT_EXT1
void ext1_isr()
{
disable_interrupts(INT_EXT);
contador1++;
enable_interrupts(INT_EXT);

}

Voy a realizar lo anterior si es lo que me dices, y en cuanto a lo tercero si, efectivamente estoy utilizando un cristal de 12MHZ para el PIC18F2550 que utilizo.

Gracias
Saludos Jairo
 
Olap utilice la segunda opcion de habilitar y deshabilitar la interrupcion cuando se esta en un conteo,,, pero igual,, el micro se detiene cuando esta trbajando,,, sigo con el interrogante de las interrupciones como vos decis george el micro se esta bloqueando cuando se encuentran las dos y no sabe q hacer ayuda


#INT_EXT
void ext_isr()
{
disable_interrupts(INT_EXT1);
contador2++;
enable_interrupts(INT_EXT1);
}

#INT_EXT1
void ext1_isr()
{
disable_interrupts(INT_EXT);
contador1++;
enable_interrupts(INT_EXT);
}
 
De nuevo George.manson, voy a realizar segun lo que he encontrado sobre las prioridades a una algo no me queda claro segun lei para el caso de los:
*PIC16F se escribe en el codigo algo asi #priority INT_EXT,INT_EXT1,
*Para los de la familia PIC18ff se escribe asi: #INT_EXT HIGH y #INT_EXT1 LOW.
* Por ultimo tambien encontre algo asi: ejemplo #INT_EXT FAST
Es cierto lo anterior?? cual de los TRES usar?? Para que mi micro no se quede colgado en pleno programa debido al uso de dos interrupciones..

Gracias por la respuesta
 
Que tal!.
Los PIC16F no tienen prioridad, al ocurrir una interrupción el CPU salta siempre al mismo vector donde debe estar la rutina de interrupción.
El uso de #priority solo se aplica a los 18F o mayores.
Se te olvida usar #device HIGH_INTS=true, de otro modo no le hará caso a interrupciones con prioridad en los P18. Luego usas #INT_EXT HIGH para indicarle que esta interrupción tiene mayor prioridad.

#INT_EXT HIGH, es de mayor prioridad.
#INT_EXT FAST, de mayor prioridad pero no guarda el contexto, la respuesta es más rápida pero se pueden perder datos.
#INT_EXT1 LOW, o sin LOW se considera de baja prioridad cuando se usa #device HIGH_INTS=true.

saludos.
 
no tedras la simulacion del circuito para qu lo subas y lo chequemos...por cierto en que puerto esta el LCD? veo que ocupas los tres puertos y aparte el LCD dodne esta conectado?...!!
 
hola me podrian echar un cable con este programa necesito variar la velocidad entre 0 y 50 ya que este solo actua entre 0 y 9.

#include <16f628a.h>
#fuses xt,nowdt,nomclr
#use delay (clock = 4000000)
#define use_portb_kbd TRUE
#include <kbd.c>
#use standard_io (a)

void main (){

char k,kant='0';
char pwmh=0,pwml=0;
kbd_init();
PORT_b_PULLUPS(TRUE);

while(1){
k=kbd_getc();
if (k=='\0') k=kant;

if ((k=='*') || (k=='#')) k='0';

kant=k;
k=k-48;
pwmh=k*28;
pwml=255-pwmh;
for (pwmh;pwmh>0;pwmh--){
output_high(pin_A0);}

for (pwml;pwml>0;pwml--){
output_low(pin_A0);}
}
}
 
Colegas otra ves yo,, de nuevo con el proyecto...

BYAXEL gracias por la repuesta acerca de las prioridades, cargue el programa con las modificaciones pero de nuevo con el problema de que el micro se me detiene, es decir el conteo se detiene, no se si es que no le esta haciendo caso a las prioridades yo realice lo siguiente:

#include <18f2550.h>
#device HIGH_INTS=true Esta declaración la coloque justo debajo del include

más abajo coloque

#priority INT_EXT, INT_EXT1,


y despues coloque

#INT_EXT HIGH : high ala ext 0 cmo prioridad alta
void ext_isr()
{
disable_interrupts(INT_EXT1);
contador2++;
enable_interrupts(INT_EXT1);
}

Creo que lo he hecho bien, lo único fue que cuando intente colocar LOW al EXT 1 me salió un error de directiva invalidad, lo que hice fue más bien no colocarla ya q considero q está declarada también en la # prioridad ext1, como segunda prioridad. Bueno la verdad ya no se que mas realizarle a esto, adjunto aunque no sea necesario la simulación puesto que en ella funciona para que le den una chequea de como es el programa. Aclaro el circuito lo diseñe en Eagle y en baquelita y como es sencillo la parte del hardware esta mas que descartada lo único extraordinario es los datos al lcd que está a 4 bits van por un cable utp que utilice más o menos de 3 metros, el cual con anterioridad probé continuidad y todo eso , e igualmente la iluminación y el contraste se ven muy bien puesto que el voltaje llega bien,
Lo anterior lo descarto ya que el micro se me queda pegado pero sospecho por interrupciones ya q cuando ocurre esto reseteo el pic y arranca nuevamente, a veces dura funcionando un buen rato hasta que se para.
 

Adjuntos

  • SIMULACION.rar
    78.1 KB · Visitas: 70
Colegas , byaxel, les cuento que revizando el progrma en la declaracion de los flancos me falta declarar el flanco de la EXT1: de hecho me cuaso curiosida como le hacias caso en el contador,

ext_int_edge (L_TO_H);
ext_int_edge (1,L_TO_H);
enable_interrupts(int_ext);
enable_interrupts(int_ext1);
enable_interrupts(global);

lo anterior lo realice pero sin buenos resultados, todavia no entien por que se me pega el pic utilizando las dos interrupciones, aun declarando las prioridades, los flancos, y qu ya comprobe de ingun pulso se esta perdiendo,
Ayuda por favor debido a que buscado varia informacion acerca de las int. y creo q como la tengo esta bien..
Por que se queda pegado un microcontrolador ?? Aun cuando sus interrupciones tienen prioridad
 
Has intentado no usar el pin RW del LCD? hay algo que no me está gustando (bueno, nunca e usado ese pin)... pero cuando el PIC espera al LCD (unos 10ms creo) ocurre la interrupción de cualquiera de las dos entradas, puede ser que al volver a la parte del LCD se pierda...
Por ahora no se me ocurre otra cosa...

saludos.
 
hola he comenzado a usar el mplab de la version 8.56, y al seguir los esquemas de programacion en c que ponen de ejmplos me salen los siguientes errores:
Error 111 "C:\ejemplosPIC\NUEVA\prueba.c" Line 3(7,43): Unknown keyword in #FUSES
*** Error 128 "C:\ejemplosPIC\NUEVA\prueba.c" Line 5(2,6): A #DEVICE required before this line
me podrian ayudar a comprender este error ya que no se porque me dice que no reconoce FUSES
de antemano gracias y son muy buenos su proyectos que esponen
 
hola he comenzado a usar el mplab de la version 8.56, y al seguir los esquemas de programacion en c que ponen de ejmplos me salen los siguientes errores:
Error 111 "C:\ejemplosPIC\NUEVA\prueba.c" Line 3(7,43): Unknown keyword in #FUSES
*** Error 128 "C:\ejemplosPIC\NUEVA\prueba.c" Line 5(2,6): A #DEVICE required before this line
me podrian ayudar a comprender este error ya que no se porque me dice que no reconoce FUSES
de antemano gracias y son muy buenos su proyectos que esponen

CCS en MPLAB, bueno asegúrate de usarlo ya que el MPLAB instala el C de Hi-tech que sigue el estándar ANSI C cosa que no es compatible con el CCS, no lo confundas... lo digo puesto que ahí no reconoce las directivas.
 
Uso de tarjetas microSD proyecto a nivel hardware, SPI.
Este circuito es muy simple solo trata de uso de una tarjeta microSD modo SPI, este caso he usado un microcontroldor PIC16F887, usando solo 64 bytes en cada bloque de la tarjeta y el resto como basura ya que este microcontrolador no posee mas de 368 bytes.

Codigo hecho en CCS C.
Código:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;USO DE TARJETA SD
//DATE:22/JULIO/'05
///////////////////////////////////////

//CONFIGURACION///////////////////
#include<16F887.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,NODEBUG
#use delay(clock=8M)
//#include<kbd_lib.c>
#include<LCD420_PORTD.C>
#define SIZE_BLOCK 64
#include<SPI_uSD.c>

const char letra[]={"PRIMERA PRUEBA DE MICROSD YEAH"};

void config(void){
    //set_tris_c(0x10);
    setup_adc(ADC_OFF);
    setup_comparator(NC_NC_NC_NC);
    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64);
}

void main(void){
    int info;
    config();
    //kbd_init();
    lcd_init();

    lcd_putc("\fExample SD card!!!\n");
    delay_ms(1000);
    if(!SD_Init()){
        lcd_putc("Tarjeta SD fail");
        lcd_gotoxy(1,3);
        lcd_putc("try again      ");
        while(TRUE);
    }else{
        lcd_putc("Tarjeta Accedida    ");
    }
    delay_ms(1000);
    lcd_gotoxy(1,2);
    for(info=0;info<SIZE_BLOCK;info++){            //Guardamos temporalemente en la variable "data"
        if(info<30) data[info]=letra[info];        //la frase y resto basura
        else data[info]=info;
    }
    if(write_SD(100)){                            //Grabamos a la tarjeta la frase que contiene la 
        lcd_putc("DATA fail!!!            ");        //variable "data"
    }else{
        lcd_putc("DATA saved!!!         ");
    }
    for(info=0;info<SIZE_BLOCK;info++){        //BORRAMOS TODA LA VARIABLE "data" para
        data[info]=0xAA;                    //saber que no hay nada en la variable
    }
    delay_ms(1000);

    lcd_gotoxy(1,2);

    if(!read_SD(100)){                        //cargamos la variable data con los valores
        lcd_putc("DATA read!!!     ");        //guardados en la tarjeta SD
    }else{
        lcd_putc("DATA fail!!!     ");
    }
    delay_ms(1000);
    for(info=0;info<30;info++){                //Si se guardo correctamente este
        if(info<14){                        //debe de proyectar la frase que guardamos en la memoria
            lcd_gotoxy(info+1,3);
            lcd_putc(data[info]);
        }else{
            lcd_gotoxy(info-14,4);
            lcd_putc(data[info]);
        }
    }
}
Otra prueba con la tarjeta, guarda 64 lecturas analogas.

Código:
///////////////////////////////////////
//AUTOR:JORGE ARTURO RODRIGUEZ HERNANDEZ
//TITLE;USO DE TARJETA SD
//DATE:22/JULIO/'09
///////////////////////////////////////

//CONFIGURACION///////////////////
#include<16F887.h>
#fuses INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
#use delay(clock=8000000)
#use fast_io(b)
#include<kbd_lib.c>
#include<LCD420_PORTD.C>
#define SIZE_BLOCK 64
#include<SPI_uSD.c>

int c=0,ca,x,aux=0,count=3,ac;
float volts;

void config(void){
    set_tris_b(0xF0);
    port_b_pullups(0xF0);
    setup_comparator(NC_NC_NC_NC);
    setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64);
    setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD);
    setup_adc_ports(sAN0);
}

char tecla(){
    while(TRUE){
        c=kbd_getc();
        if(c!=0)break;
    }
    return c;
}


void main(void){
    config();
    lcd_init();
    kbd_init();


    while(TRUE){
        lcd_putc("\f----Invernadero-----\n");
        lcd_putc("Intertar SD:     <A>");
        ca=tecla();
        switch(ca){
            case 'A': 
                    if(!SD_init()){
                        lcd_gotoxy(1,2);
                        lcd_putc("Inicialiacion fallo   ");
                        break;
                    }else{

                        lcd_gotoxy(1,2);
                        lcd_putc("Inicialiacion SD    ");
                        delay_ms(2000);
                        lcd_gotoxy(1,2);
                        lcd_putc("Rec Temperatura: <B>");
                        lcd_gotoxy(1,3);
                        lcd_putc("Read Temperatura:<C>");
                        ac=tecla();
                        if(ac!='B' && ac!='C'){
                            break;
                        }else if(ac=='B'){
                            lcd_gotoxy(1,2);
                            lcd_putc("NO RETIRE SD...!!!! ");
                            lcd_gotoxy(1,3);
                            lcd_putc("                    ");
                            for(x=0;x<64;x++){
                                if(x==count){
                                    count+=3;
                                    aux++;
                                    lcd_gotoxy(aux,3);
                                    lcd_putc(0xFF);
                                }
                                delay_ms(100);
                                DATA[x]=read_adc();
                            }
                            if(write_SD(50)){
                                lcd_gotoxy(1,2);
                                lcd_putc("No se pudo grabar!!! ");
                                lcd_gotoxy(1,3);
                                lcd_putc("                     ");
                            }else{
                                lcd_gotoxy(1,2);
                                lcd_putc("Grabado!!!           ");
                                lcd_gotoxy(1,3);
                                lcd_putc("                     ");
                            }
                            aux=0;
                            count=3;
                            delay_ms(2000);
                            break;
                        }else if(ac=='C'){
                            
                            lcd_gotoxy(1,2);
                            lcd_putc("Checando temp. saved     ");
                            lcd_gotoxy(1,3);
                            lcd_putc("                         ");
                            if(!read_SD(50)){
                                while(ca!='D'){
                                        ca=tecla();
                                        if(ca=='1'){
                                            if(aux<=64){
                                                aux++;
                                            }else{aux=1;}
                                        }
                                        if(ca=='8'){        
                                            if(aux==0){
                                                aux=1;
                                            }else{
                                                aux--;
                                            }
                                        }
                                        volts=((float)DATA[aux]*5)/255;
                                        lcd_gotoxy(1,3);
                                        printf(lcd_putc,"%u.- %0.2f C                 ",aux,volts);
                                    }
                            }else {aux=0;break;}
                            aux=0;
                            break;
                        }
                                            
                                        
                    }
        }
    }
}

Se necesita tener proteus 7.7 para la simulacion


George, como estas? Estoy comenzando con la programación para la lectura y escritura de memorias SD, y pase por el foro y encontré estos ejemplos subidos por vos, que están realmente buenísimos. Utilizo el compilador PCWHD de CCS.
Mi pregunta es, la librería SPI_uSD.c, la programaste vos?
Gracias!
Un abrazo!
 
Estoy loco con este programa para mostrar por el LCD esto tan sencillo en proteus me funciona bien pero al momento de probarlo realmente no hace nada, el programa trata de mostrar un mensaje en el lcd para decir q esta listo luego cuando el led prenda y apague el lcd indica el estado del led, el lcd no inicia ni tampoco pasa a la funcion de prender y apagar el led del pin_a2. Espero me puedas ayudar con esto. el lcd que uso al momento de probarlo es el LM071L de la hitachi. te adjunto la conexion en proteus para ver si me puedes indicar que esta malo.

Código:
#include <16F628.h>

#FUSES NOWDT                     //No Watch Dog Timer
#FUSES HS                        //High speed Osc (> 4mhz)
#FUSES NOPUT                     //No Power Up Timer
#FUSES NOPROTECT                 //Code not protected from reading
#FUSES NOBROWNOUT                //No brownout reset
#FUSES MCLR                      //Master Clear pin enabled
#FUSES NOLVP                     //No low voltage prgming, B3(PIC16) or B5(PIC18)  used for I/O
#FUSES NOCPD                     //No EE protection

#use delay(clock=20000000)
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA_PORT 6
#define LCD_TYPE 2
#define LCD_TRIS_LOCATION set_tris_b(x)
#include <lcd.c>

#use fast_io (a)
#use fast_io (b)

void main()
{
   port_b_pullups(False);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   lcd_putc("\fReady...");
   delay_ms(500);
   output_a(0x00);
   set_tris_a(0x00);
   while(1)
   {
      output_high(PIN_A2);
      lcd_putc("\fOff");
      delay_ms(500);
      output_low(PIN_A2);
      lcd_putc("\fOn");
      delay_ms(500);
   }
}

Hola, como Tu, yo soy nuevo en esto, probe este programa en PROTEUS y luego en PROTOBOARD y funciona correctamente. Creo que tienes un problema de conexion, recuerda que el LCD rquiere de un potenciometro para el contraste.
 
Correcto, si no colocas un divisor de tension adecuado o un potenciometro "reostato"
en el pin 3 del lcd, puede que solo percibas el encendido de los segmentos sin dejar ver los caracteres enviados por
tu pic.El proteus no los necesita pues asume estos valores por default,pero en protoboard se debe
colocar.Un valor tipico es de 5k para este reostato..
 
Última edición:
este es un programa en mplab, para poner un pulsador que detecta los numeros del 0 al 8 y los muestra en una pantalla lcd(aunque tiene unos errores). bueno mi pregunta es como puedo hacer una foto celda que cada vez que detecte oscuridad me muestre en el lcd el nivel de luz y en unos leds en los otros puertos vayan subiendo(llevo dias mirando y no se por donde empezar) jejejeje pal que le sirva la programacion con gusto aunque el error es que se me coloca automatico no espera la siguiente secuencia de pulsos y se queda oscilando el lcd entre 1 y mas de 8. hay algunas cosas que estan con ; por que las coloque de comentario para luego agregarlas o mirar si las suprimo.

Código:
;**********************************************************************
;   This file is a basic code template for assembly code generation   *
;   on the PIC16F887. This file contains the basic code               *
;   building blocks to build upon.                                    *
;                                                                     *
;   Refer to the MPASM User's Guide for additional information on     *
;   features of the assembler (Document DS33014).                     *
;                                                                     *
;   Refer to the respective PIC data sheet for additional             *
;   information on the instruction set.                               *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Filename:	    xxx.asm                                           *
;    Date:                                                            *
;    File Version:                                                    *
;                                                                     *
;    Author:                                                          *
;    Company:                                                         *
;                                                                     *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Files Required: P16F887.INC                                      *
;                                                                     *
;**********************************************************************
;                                                                     *
;    Notes:                                                           *
;                                                                     *
;**********************************************************************


	list		p=16f887	; list directive to define processor
	#include	<p16f887.inc>	; processor specific variable definitions


; '__CONFIG' directive is used to embed configuration data within .asm file.
; The labels following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.

	__CONFIG    _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__CONFIG    _CONFIG2, _WRT_OFF & _BOR21V



;***** VARIABLE DEFINITIONS
CONT		EQU	0X20
CONT2		EQU	0X21
LCDATA		EQU	0X22
VAR1		EQU	0X23
TEMPORAL	EQU	0X24

w_temp		EQU	0x7D		; variable used for context saving
status_temp	EQU	0x7E		; variable used for context saving
pclath_temp	EQU	0x7F		; variable used for context saving


;********* DEFINICIONES DE BANDERAS *************
EN		EQU		0X00
RS		EQU		0X01



;**********************************************************************
		ORG     0x000             ; processor reset vector
		clrf    PCLATH            ; ensure page bits are cleared
  		goto    main              ; go to beginning of program


	movwf   w_temp            ; save off current W register contents
	movf	STATUS,w          ; move status register into W register
	movwf	status_temp       ; save off contents of STATUS register
	movf	PCLATH,w	  ; move pclath register into w register
	movwf	pclath_temp	  ; save off contents of PCLATH register

; isr code can go here or be located as a call subroutine elsewhere


	movf	pclath_temp,w	  ; retrieve copy of PCLATH register
	movwf	PCLATH		  ; restore pre-isr PCLATH register contents
	movf    status_temp,w     ; retrieve copy of STATUS register
	movwf	STATUS            ; restore pre-isr STATUS register contents
	swapf   w_temp,f
	swapf   w_temp,w          ; restore pre-isr W register contents
	retfie                    ; return from interrupt



main
		BANKSEL	ANSELH
		CLRF	ANSELH

		BANKSEL	ANSEL
		CLRF	ANSEL

		BANKSEL	TRISB
		CLRF	TRISB			;PONGO TODOS LOS TRIS DE SALIDA EN EL PUERTO B

		BANKSEL	PORTB

		BANKSEL	ANSELH			;SELECCIONO EL BANCO DE RAM DEL REGISTRO ANSELH (ANALOG SELECTOR HIGH SE USA PARA CONFIGURAR EL PORTB)
		MOVLW	0X00
		MOVWF	ANSELH			;AL CARGAR 0X00 EN ESE REGISTRO LE DIGO AL PIC QUE LOS PINES DEL PUERTO B SON DIGITALES (CON 1 ES ANALOGO)
	
		BANKSEL	ANSEL			;SELECCIONO EL BANCO DE RAM DEL REGISTRO ANSEL (ANALOG SELECTOR HIGH SE USA PARA CONFIGURAR EL PORTA)
		MOVLW	0X00
		MOVWF	ANSEL			;AL CARGAR 0X00 EN ESE REGISTRO LE DIGO AL PIC QUE LOS PINES DEL PUERTO A SON DIGITALES (CON 1 ES ANALOGO)
	
		BANKSEL	TRISC			;SELECCIONO EL BANCO DE RAM DEL REGISTRO DE CONFIGURACION DE ENTRADA/SALIDA DEL PUERTO C
		MOVLW	B'00001111'
		MOVWF	TRISC			;EN EL PORTC LOS PINES BAJOS SON DE ENTRADA Y LOS ALTOS SON DE SALIDA 
	
		BANKSEL	TRISA			;ESTO ES LO MISMO PERO PARA EL PUERTO A
		MOVLW	B'00000011'			
		MOVWF	TRISA			;CAMBIO EL VALOR EN EL REGUISTRO TRIS PARA QUE EN EL PIN 0 DEL PORTA SEA DE ENTRADA 
	
		BANKSEL	PORTC			;ANTES DE PASAR A LA RUTINA QUE NECESITO, DEBO SELECCIONAR EL BANCO DEL PUERTO B (QUE ES EL QUE VOY A USAR)
		CLRF	VAR1
		CLRF	PORTC
		CLRF	PORTA
		BCF		STATUS,Z

	LED_ON_OFF
			BSF		PORTA,3			;PONGO EN 1 EL PIN 3 DEL PUERTO A 
			CALL 	RUTINA
			BCF		PORTA,3			;PONGO EN 0 EL PIN 0 DEL PUERTO B
			CALL	RETARDOTI		;LLAMO AL RETARDO
			BSF		PORTA,3			;PONGO EN 1 EL PIN 3 DEL PUERTO A 
			CALL 	RUTINA
			BCF		PORTA,3			;PONGO EN 0 EL PIN 0 DEL PUERTO B
			CALL	RETARDOTI		;LLAMO AL RETARDO
			GOTO	LED_ON_OFF		;VUELVO A INICIAR TODO DE NUEVO PERO SIN RECONFIGURAR LA MAQUINA 
		
		RETARDI
			MOVLW	0XFF
			MOVWF	CONT
		LOOP_RETARDI
			DECFSZ	CONT,F
			GOTO	LOOP_RETARDI
			RETURN
		
		RETARDOTI
			MOVLW	0XFF
			MOVWF	CONT2
		LOOP_RETARDOTI
			CALL	RETARDI
			DECFSZ	CONT2,F
			GOTO	LOOP_RETARDOTI
			RETURN
		
		
		RUTINA
			BTFSS	PORTA,0
			GOTO	CHEQUEO1
			BTFSS	PORTA,1
			GOTO	CHEQUEO5
			GOTO	RUTINA
		
		CHEQUEO1
			BTFSC	PORTA,1
			GOTO	CHEQUEO2
			GOTO	CHEQUEO1
		
		CHEQUEO2
			BTFSS	PORTA,1
			GOTO	CHEQUEO3
			GOTO	CHEQUEO2
		
		CHEQUEO3
			BTFSC	PORTA,0
			GOTO	CHEQUEO4
			GOTO	CHEQUEO3
		
		CHEQUEO4
			BTFSS	PORTA,1
			GOTO	CHEQUEO4
			INCF	VAR1
			GOTO	MIRAR1
		
		CHEQUEO5
			BTFSC	PORTA,0
			GOTO	CHEQUEO6
			GOTO	CHEQUEO5
		
		CHEQUEO6
			BTFSS	PORTA,0
			GOTO	CHEQUEO7
			GOTO	CHEQUEO6
		
		CHEQUEO7
			BTFSC	PORTA,1
			GOTO	CHEQUEO8
			GOTO	CHEQUEO7
		
		CHEQUEO8
			BTFSS	PORTA,0
			GOTO	CHEQUEO8
			DECF	VAR1
			GOTO	MIRAR2
		
		MIRAR1
			MOVF	VAR1,W
			SUBLW	0X10
			BTFSC	STATUS,Z	
			DECF	VAR1
			GOTO	ACTUALIZAR	
		
		MIRAR2
			MOVF	VAR1,W
			SUBLW	0XFF
			BTFSC	STATUS,Z
			INCF	VAR1
			GOTO	ACTUALIZAR			;3520634    2685240
		
		ACTUALIZAR
			MOVF	VAR1,W
			MOVWF	TEMPORAL		;Y LO ALAMCENO EN UNA VARIABLE "TEMPORAL" PARA PODER OPERARLA
			SWAPF	TEMPORAL,W		;HAGO UN SWAPDE LOS BITS QUE ACABO DE LEER DEL PUERTO B
		
		SALIDA
			MOVWF 	PORTC 			;UNA VEZ REALIZADA LA OPERACION RECARGO EL RESULTADOEN EL PUERTO B
			GOTO	CHEQUEO_NUMERICO


CHEQUEO_NUMERICO

		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	INIT_LCD
		GOTO	CHEQUEO_PIN_CUATRO

CHEQUEO_PIN_CUATRO

		BTFSC	PORTC,7
		GOTO	CHEQUEO_POSIBLE_OCHO
		GOTO	CHEQUEO_NO_ES_OCHO

CHEQUEO_NO_ES_OCHO

		BTFSC	PORTC,6
		GOTO	CHEQUEO_POSIBLE_CUATRO
		GOTO	CHEQUEO_NO_ES_CUATRO

CHEQUEO_POSIBLE_OCHO

		BTFSC	PORTC,6
		GOTO	MAS_D_OCHO
		GOTO	CHEQUEO_POSIBLE_OCHO2

CHEQUEO_NO_ES_CUATRO

		BTFSC	PORTC,6
		GOTO	CHEQUEO_POSIBLE_TRES
		GOTO	CHEQUEO_POSIBLE_UNO


CHEQUEO_POSIBLE_OCHO2

		BTFSC	PORTC,5
		GOTO	MAS_D_OCHO 
		GOTO	CHEQUEO_POSIBLE_OCHO3

CHEQUEO_POSIBLE_CUATRO

		BTFSC	PORTC,5
		GOTO	CHEQUEO_POSIBLE_SIETE
		GOTO	CHEQUEO_POSIBLE_CUATRO2

CHEQUEO_POSIBLE_OCHO3

		BTFSC	PORTC,4
		GOTO	MAS_D_OCHO 
		GOTO	ES_8

CHEQUEO_POSIBLE_CUATRO2

		BTFSC	PORTC,4
		GOTO	ES_CINCO
		GOTO	ES_CUATRO

CHEQUEO_POSIBLE_UNO
		BTFSC	PORTC,4
		GOTO	ES_UNO
		GOTO	ES_CERO

CHEQUEO_POSIBLE_TRES

		BTFSC	PORTC,4
		GOTO	ES_TRES
		GOTO	ES_DOS


CHEQUEO_POSIBLE_SIETE

		BTFSC	PORTC,4
		GOTO	ES_SIETE
		GOTO	ES_SEIS

ES_CERO

		CALL	MENSAJE_ES_0
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_UNO

		CALL	MENSAJE_ES_1
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_DOS

		CALL	MENSAJE_ES_2
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_TRES

		CALL	MENSAJE_ES_3
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_CUATRO
		
		CALL	MENSAJE_ES_4
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF
ES_CINCO
		
		CALL	MENSAJE_ES_5
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_SEIS

		CALL	MENSAJE_ES_6
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_SIETE

		CALL	MENSAJE_ES_7
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

ES_8
		
		CALL	MENSAJE_ES_8
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

MAS_D_OCHO

		CALL	MENSAJE_MAS_DE_8
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE
		MOVLW	.255
		CALL	RETARDOTE

		CALL	BORRAR
		GOTO	LED_ON_OFF

INICIO

	;	CALL	BORRAR
;
;		CALL	ACTIVAR_CURSOR_
;		MOVLW	.255
;		CALL	RETARDOTE

		CALL	COMANDO_CURSOR_DER
		CALL	COMANDO_CURSOR_DER
		CALL	COMANDO_CURSOR_DER
		CALL	COMANDO_CURSOR_DER
		CALL	COMANDO_CURSOR_DER

		CALL	MENSAJE_HOLA_MUNDO


		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ

		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER

		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ

		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER

		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ
		CALL	COMANDO_SCROLL_IZQ

		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER
		CALL	COMANDO_SCROLL_DER

		;MOVLW	.128					;CARGO EL VALOR BASE DE RAM PARA MOSTRAR CARACTERES
		;ADDLW	.64						;LE SUMO EL VALOR QUE NECESITO PARA LA LINEA 2 (LA LINEA 1 ES 0, LA LINEA 2 ES 64)
		;CALL	LCDI					;ENVIO LA INSTRUCCION

	;	CALL	MENSAJE_LINEA2

	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	CALL	COMANDO_SCROLL_IZQ
	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	CALL	COMANDO_SCROLL_IZQ
	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	CALL	COMANDO_SCROLL_IZQ

	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	MOVLW	.255
	;	CALL	RETARDOTE
	;	MOVLW	.255
	;	CALL	RETARDOTE
;
;		CALL	BORRAR
;
;		CALL	MENSAJE_A_TRABAJAR

LOOP	GOTO	LOOP


RETARDOTE
LOOP_RETARDOTE
		CALL	RETARDO
		DECFSZ	CONT2,F
		GOTO	LOOP_RETARDOTE
		RETURN

RETARDO
		MOVLW	.255
		MOVWF	CONT
LOOP_RETARDO
		DECFSZ	CONT,F
		GOTO	LOOP_RETARDO
		RETURN

INIT_LCD
		MOVLW   0X30		;MANDA LA INSTRUCCION 3 VECES, PRIMERA
		MOVWF	PORTB
        CALL    OUTLCD
        MOVLW   0X30		;SEGUNDA
		MOVWF	PORTB
        CALL    OUTLCD
        MOVLW   0X30		;TERCERA
		MOVWF	PORTB
        CALL    OUTLCD
        MOVLW   0X20		;Operacion en 4 bits
		MOVWF	PORTB
        CALL    OUTLCD		;MANDA LA INSTRUCCION
        MOVLW   0X2C		;
        CALL    LCDI
        MOVLW   0X08		;
        CALL    LCDI
        MOVLW   0X0F		;
        CALL    LCDI
        MOVLW   0X01		;
        CALL    LCDI
        MOVLW   0X06		;
        CALL    LCDI
        MOVLW   0X0C
        CALL    LCDI
		RETURN

OUTLCD
		BSF     PORTB,EN         ; PONE EN 1 el enable del lcd  "HABILITA" EL LCD
		MOVLW   0X05			;0X05
		MOVWF   CONT2
		CALL    RETARDOTE
		BCF     PORTB,EN         ; PONE EN 0 ENABLE DEL LCD
		RETURN

LCDD
		MOVWF	LCDATA		;
		SUBLW	0X00		;COMPARO CON 0X00 PARA SABER SI TERMINO DE ESCRIBIR EN LCD
		BTFSC	STATUS,Z	;SALTO SI NO ES IGUAL A 0X00
		GOTO	FIN_LCDD	;SI ES IGUAL TERMINO LA RUTINA SIN SACAR NADA POR LCD

		MOVLW	0XF0            ;MASCARA DEL NIBBLE ALTO
		ANDWF	LCDATA,W        ;
		MOVWF   PORTB           ;SACA POR EL PUERTO EL DATO
		BSF		PORTB,RS        ;PONE RS EN CARACTER

		CALL	OUTLCD

		MOVLW	0X0F            ;MASCARA DEL NIBBLE BAJO
		ANDWF	LCDATA,f        ;
		SWAPF	LCDATA,W        ;PONE LOS 4 BITS DE MENOR PESO EN EL DE MAYOR PESO EN LCDATA
		MOVWF   PORTB           ;SACA POR EL PUERTO EL DATO
		BSF		PORTB,RS        ;PONE RS EN CARACTER

		CALL	OUTLCD
FIN_LCDD
		RETURN


LCDI
		MOVWF	LCDATA		;
		MOVLW	0XF0            ; MASCARA DEL NIBBLE ALTO
		ANDWF	LCDATA,W        ;
		MOVWF   PORTB           ;SACA POR EL PUERTO EL DATO
		BCF		PORTB,RS        ; PONE RS EN INSTRUCCION O COMANDO

		CALL	OUTLCD          ; DA SALIDA POR EL LCD

		MOVLW	0X0F            ; MASCARA DEL NIBBLE BAJO
		ANDWF	LCDATA,f        ;
		SWAPF	LCDATA,W        ; PONE LOS 4 BITS DE MENOR PESO EN EL DE MAYOR PESO EN IODATA
		MOVWF   PORTB           ;SACA POR EL PUERTO EL DATO
		BCF		PORTB,RS        ; PONE RS EN INSTRUCCION

		CALL	OUTLCD          ; DA SALIDA POR EL LCD

		RETURN


MENSAJE_ES_0

		MOVLW	'M'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'C'
		CALL	LCDD
		MOVLW	'H'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		RETURN

MENSAJE_ES_1

		MOVLW	'P'
		CALL	LCDD
		MOVLW	'U'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'C'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'M'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'Q'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'1'
		CALL	LCDD

		RETURN

MENSAJE_ES_2

		MOVLW	'A'
		CALL	LCDD
		MOVLW	'H'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'R'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'2'
		CALL	LCDD
		RETURN

MENSAJE_ES_3

		MOVLW	'P'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'R'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'Y'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'3'
		CALL	LCDD

		RETURN

MENSAJE_ES_4

		MOVLW	'3'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'M'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'1'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	'.'
		CALL	LCDD
		MOVLW	'.'
		CALL	LCDD
		MOVLW	'.'
		CALL	LCDD
		MOVLW	'.'
		CALL	LCDD
		CALL 	RETARDOTE
		CALL 	BORRAR
		GOTO 	SEGUNDO_CUATRO
	
SEGUNDO_CUATRO
		MOVLW	'M'
		CALL	LCDD
		MOVLW	'U'
		CALL	LCDD
		MOVLW	'Y'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'B'
		CALL	LCDD
		MOVLW	'I'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'4'
		CALL	LCDD
				
		RETURN
MENSAJE_ES_5

		MOVLW	'C'
		CALL	LCDD
		MOVLW	'U'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	'T'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'V'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		RETURN

MENSAJE_ES_6

		MOVLW	'E'
		CALL	LCDD
		MOVLW	'L'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	'U'
		CALL	LCDD
		MOVLW	'M'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'L'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		RETURN


MENSAJE_ES_7

		MOVLW	'E'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	'T'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'7'
		CALL	LCDD
		MOVLW	'M'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'C'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	'N'
		CALL	LCDD
		MOVLW	'C'
		CALL	LCDD
		RETURN


MENSAJE_MAS_DE_8

		MOVLW	'M'
		CALL	LCDD
		MOVLW	'A'
		CALL	LCDD
		MOVLW	'S'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'D'
		CALL	LCDD
		MOVLW	'E'
		CALL	LCDD
		MOVLW	' '
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		MOVLW	'C'
		CALL	LCDD
		MOVLW	'H'
		CALL	LCDD
		MOVLW	'O'
		CALL	LCDD
		RETURN

MENSAJE_ES_8

		MOVLW	'C'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'O'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'M'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'O'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	' '
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'Q'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	' '
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'E'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'S'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	' '
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		MOVLW	'8'
		CALL	LCDD
;		MOVLW	.255
;		CALL	RETARDOTE

		RETURN


COMANDO_CURSOR_IZQ
;		MOVLW	.16			;A QUE BINARIO CORRESPONDE? SI ESTA BIEN EL COMANDO?
;		CALL	LCDI
;		RETURN

COMANDO_CURSOR_DER
;		MOVLW	.20			;A QUE BINARIO CORRESPONDE? SI ESTA BIEN EL COMANDO?
;		CALL	LCDI
;		RETURN

COMANDO_SCROLL_DER
		MOVLW	.28
		CALL	LCDI

		MOVLW	.255
		CALL	RETARDOTE
		RETURN

COMANDO_SCROLL_IZQ
		MOVLW	.24
		CALL	LCDI

		MOVLW	.255
		CALL	RETARDOTE
		RETURN

BORRAR
		MOVLW	.1
		CALL	LCDI
		RETURN

ACTIVAR_CURSOR
;		MOVLW	.13
;		CALL	LCDI
;		RETURN

ACTIVAR_CURSOR_
;		MOVLW	.14
;		CALL	LCDI
;		RETURN

MENSAJE_HOLA_MUNDO
;		MOVLW	'H'
;		CALL	LCDD
;		MOVLW	'O'
;		CALL	LCDD
;		MOVLW	'L'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	' '
;		CALL	LCDD
;		MOVLW	'M'
;		CALL	LCDD
;		MOVLW	'U'
;		CALL	LCDD
;		MOVLW	'N'
;		CALL	LCDD
;		MOVLW	'D'
;		CALL	LCDD
;		MOVLW	'O'
;		CALL	LCDD
;		RETURN

MENSAJE_LINEA2
;		MOVLW	'E'
;		CALL	LCDD
;		MOVLW	'S'
;		CALL	LCDD
;		MOVLW	'T'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	' '
;		CALL	LCDD
;		MOVLW	'E'
;		CALL	LCDD
;		MOVLW	'S'
;		CALL	LCDD
;		MOVLW	' '
;		CALL	LCDD
;		MOVLW	'L'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	' '
;		CALL	LCDD
;		MOVLW	'2'
;		CALL	LCDD
;		MOVLW	' '
;		CALL	LCDD
;		MOVLW	'L'
;		CALL	LCDD
;		MOVLW	'I'
;		CALL	LCDD
;		MOVLW	'N'
;		CALL	LCDD
;		MOVLW	'E'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		RETURN


MENSAJE_A_TRABAJAR
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	' '
;		CALL	LCDD
;		MOVLW	'T'
;		CALL	LCDD
;		MOVLW	'R'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	'B'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	'J'
;		CALL	LCDD
;		MOVLW	'A'
;		CALL	LCDD
;		MOVLW	'R'
;		CALL	LCDD
;		MOVLW	'.'
;		CALL	LCDD
;		MOVLW	'.'
;		CALL	LCDD
;		MOVLW	'.'
;		CALL	LCDD
;		RETURN


		END                       ; directive 'end of program
 
Atrás
Arriba