Mini-Practicas de programación ensamblador y en C para microcontroladores

Iniciado por BADBYTE-K, 11 Octubre 2004, 02:58 AM

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

BADBYTE-K

aqui iran unas cuantas practicas para que nos iniciemos en la programacion basica de microcontroladores (esta ocasion con el 16C84)

Sumando en ensamblador con microcontroladores

programa 1

Citar;  Este programa suma el contenido de las posiciones 0x0c y 0x0d
; de memoria y almacena el resultado en la posicion 0e.


        LIST p= 16c84           ;Indica el modelo de PIC que se usa
                                ;Es una directiva del ensamblador.

; --------------------------------------------------------------------------
                                ;Zona para etiquetas.
        OPERANDO1 EQU 0x0c      ;Define la posici¢n del operando1
        OPERANDO2 EQU 0x0d      ;Define la posici¢n del operando2
        RESULTADO EQU 0x0e      ;Define la posici¢n del resultado

;---------------------------------------------------------------------------

        ORG 0                   ;Comando que indica al Ensamblador
                                ;la direcci¢n de la memoria de programa
                                ;donde situar  la siguiente instrucci¢n

;---------------------------------------------------------------------------

        movlw   05            ; 5 -> W (Primera instrucci¢n)   
        movwf   OPERANDO1     ; W -> OPERANDO1
        movlw   02            ; 2 -> W
        movwf   OPERANDO2     ; W -> OPERANDO2
        movfw   OPERANDO1     ; OPERANDO1 -> W
        addwf   OPERANDO2,0   ; W + OPERANDO2 -> W
        movwf   RESULTADO     ; W -> RESULTADO

        END                   ; Directiva de fin de programa

programa 2

Citar; Optimizacion del primer programa que calcula la suma de 2
;posiciones de memoria y deja el resultado en una tercera.
;Estas posiciones son 0x0c para operando1, 0x0d para operando2 y 0x0e para
;el resultado.
;La optimizaci¢n consiste en ahorrar una instrucci¢n al aprovechar el hecho
;de que la suma es una operaci¢n conmutativa.De esta manera tras cargar en W
;el operando 2 se puede realizar directamente la suma.



        LIST p= 16c84           ;Indica el modelo de PIC que se usa
                                ;Es una directiva del ensamblador.

; --------------------------------------------------------------------------
                                ;Zona para etiquetas.
        OPERANDO1 EQU 0x0c      ;Define la posici¢n del operando1
        OPERANDO2 EQU 0x0d      ;Define la posici¢n del operando2
        RESULTADO EQU 0x0e      ;Define la posici¢n del resultado

;---------------------------------------------------------------------------

        ORG 0                   ;Comando que indica al Ensamblador
                                ;la direcci¢n de la memoria de programa
                                ;donde situar  la siguiente instrucci¢n

;---------------------------------------------------------------------------

        movlw   05              ;5 --> W (primera instrucci¢n)
        movwf   OPERANDO1       ;W --> Operando1
        movlw   02              ;2 --> W
        movwf   OPERANDO2       ;W --> Operando2
        addwf   OPERANDO1,0     ;W + operando1 --> W
        movwf   RESULTADO       ;W --> resultado

        END                     ;directiva de fin del programa


programa 3

Citar; Este programa suma el contenido de las posiciones 0c y 0d de memoria y
; almacena el resultado en la misma posici¢n 0d.


        LIST    p= 16C84     ; Para PIC 16C84

;--------------------------------------------------------------------------

        OPERANDO1  EQU  0x0C ; Define la posici¢n del operando 1
        OPERANDO2  EQU  0x0D ; Define la posici¢n del operando 2
                             ; y del resultado

;--------------------------------------------------------------------------

        ORG     0            ; Direcci¢n de inicio del programa

;--------------------------------------------------------------------------

        movlw   02           ; 2 -> W
        movwf   OPERANDO2    ; W -> OPERANDO2
        movlw   05           ; 5 -> W
        movwf   OPERANDO1    ; W -> OPERANDO1 ( Operando1 est  en W y en 0x0C)
        addwf   OPERANDO2,1  ; OPERANDO2 + W -> Operando2

        END                  ; Directiva de fin de programa

sumando en C

Citar/* Programa que suma el contenido de dos variables en memoria y almacena */
/* el resultado en una tercera variable de resultado.                */

#include <16c84.h>

void main( void )
{
int operando1 = 5, operando2 = 2, resultado;
resultado = operando1 + operando2;
}


espero les sirvan de mucho

saludox

[/color]

BADBYTE-K

Empezando con leds e interruptores simples

programa en ensamblador

Citar;Programa que lee el numero binario introducido mediante 3
;interruptores simples konectados al puerto A (pines RA0,RA1,RA2), luego suma 2 unidades
;a ese valor y visualiza el resultado mediante 4 diodos led conectados al
;puerto B (pines RB0, RB1,RB2,RB3).

;----------------------------------------------------------------------------

        LIST    P=16C84         ;Comando que indica el PIC usado
        RADIX   HEX             ;Los valores se representar n en hexadecimal

;----------------------------------------------------------------------------

        PUERTAA EQU     0X05    ;La etiqueta "PUERTAA" queda identificada con
                                ;la direcci¢n 0x05, que si corresponde con el
                                ;banco 0 es el valor de PUERTAA y si es del
                                ;banco 1 con el de TRISA.
        PUERTAB EQU     0X06    ;Equivalencia de la etiqueta PUERTAB
        ESTADO  EQU     0X03    ;Estado corresponde con el valor 0x03.
        W       EQU     0       ;Identifica W con el valor 0.

;----------------------------------------------------------------------------

        ORG     0               ;Comando que indica al Ensamblador la
                                ;direcci¢n de la memeoria donde se
                                ;situar  la instruci¢n siguiente

;----------------------------------------------------------------------------

        bsf     ESTADO,5        ;Pone a 1 el bit 5 de ESTADO para direccionar
                                ;la p gina 1 de la memoria de datos.
        movlw   0xff            ;W <-- FF(Hex)
        movwf   PUERTAA         ;W --> TRISA
        movlw   0x00            ;W <-- 0
        movwf   PUERTAB         ;W --> TRISB (Las l¡neas de PB salidas)
        bcf     ESTADO,5        ;Pone a 0 el bit 5 de ESTADO pasando a
                                ;acceder al banco 0.
               
inicio  movf   PUERTAA,W        ;W <-- PUERTAA. Se introduce el valor binario
                                ;de los interruptores.
        addlw   2               ;W <-- W + 2
        movwf   PUERTAB         ;W --> PUERTAB. El valor de W sale por las
                                ;l¡neas de PB a los led.
        goto    inicio          ;Salta a la instrucci¢n precedida por la
                                ;etiqueta de inicio.
        END

Programando en C

Citar/* Programa que suma 2 unidades al valor que entra por la PuertaA */
/* mediante unos interuptores y visualiza el resultado mediante unos leds
/* que se suponen conectados al puerto b igual que el anterior */

#INCLUDE <16C84.H>

void main(void)
{

int valor;         /* Valor temporal */
int * p_puertaa= 0x05;      /* Puntero a PuertaA */
int * p_puertab= 0x06;      /* Puntero a PuertaB */

SET_TRIS_A (0xff);      /* 0xff --> TRISA */
SET_TRIS_B (0x00);      /* 0x00 --> TRISB */
   
do {
   valor = * p_puertaa;   /* PuertaA --> valor  */
   valor += 2;      /* se incrementa valor en 2 */
   *p_puertab = valor;   /* valor --> puertaB */
   
   } while (TRUE);      /* Bucle infinito */

}

[/color]

BADBYTE-K

otro parecido

Citar;  Controla cinco interruptores conectados a RA0-RA4 y enciende una serie de
; leds en las puertas RB0-RB4 dependiendo de las entradas introducidas por la puerta A.
; Con un 0 en la puerta A se enciende el le correspondiente de la puerta B

   LIST   p=16c84      ; Se usa el PIC16C84
   RADIX   hex      ; Se emplea el sistema de numeraci¢n hexadecimal


; ZONA DE ETIQUETAS-----------------------------------------------------------------------

   W   EQU   0   ; Cuando el destino es W, d = 0
   F   EQU   1   ; Cuando el destino es el registro f, d = 1
   PUERTAA   EQU   0x05   ; La Puerta A (datos) ocupa la direcci¢n 5 del                      ; banco 0 y el registro de configuraci¢n la                      ; direcci¢n 5 del banco 1

   PUERTAB EQU   0x06   ; La misma etiqueta para el registro de datos y el                   ; de configuraci¢n de la Puerta B
   ESTADO   EQU   0x03    ; El registro Estado ocupa direcci¢n 3 de los dos                  ; bancos

; COMIENZO DEL PROGRAMA -----------------------------------------------------------------

   ORG    0      ; El programa comienza en la direcci¢n 0 (Vector Reset)
   goto   inicio      ; Se salta a la etiqueta "inicio"
   ORG   5      ; Se asigna la direcci¢n 5 a la siguiente instrucci¢n


inicio   bsf   ESTADO,5   ; Pone a 1 el bit 5 de Estado. Acceso al banco 1.
   clrf   PUERTAB      ; Se configuran como salidas las l¡neas de la Puerta B
   movlw   0xff      ; El registro W se carga con unos
   movwf   PUERTAA      ; Se configuran como entradas las l¡neas de la Puerta A
        bcf     ESTADO,5        ; Pone a 0 el bit 5 de Estado. Acceso al banco 0.
bucle   movf    PUERTAA,W   ; Carga el registro de datos de Puerta A en W
        comf    PUERTAA,W       ; Complementa a 1 la entrada y la deposita en W
   movwf   PUERTAB      ; El contenido de W se deposita en el registro de datos de                ; la Puerta B
   goto    bucle      ; Se crea un bucle cerrado e infinito

   END         ; Fin del programa

en C

Citar/*  Lee el valor de cinco interruptores en la puerta A y saca por */
/* la puerta B el valor inverso                      */

#include <16c84.h>
#byte   puertaa = 05     /* Posici¢n de la puerta A */
#byte   puertab = 06      /* Posici¢n de la puerta B */


void main( void )
{
int temp;
set_tris_a( 0xFF );      /* Puerta A configurada para entrada */
set_tris_b( 0x00 );     /* Puerta B configurada para salida  */

do {           /* La variable temporal es necesaria porque    */
      temp = ~puertaa;    /* la complementaci¢n se traduce en dos pasos: */
      puertab = temp;     /* a) Copia de puertaa en temp                 */
    }                 /* b) Complementaci¢n de temp                  */
               /* De no hacerlo as¡ los LED parpadear¡an      */
                
while( TRUE );           /* Repetir ininterrumpidamente       */
 
}

saludox[/color]

Ertai

Cuando este en mi casa posteare codigos para el ADuC 182, se puede pedir por Internet, te lo montas tu, y luego lo programas.

Salu2.
Si la felicidad se comprara, entonces el dinero sería noble.


void rotar_by_ref(int& a, int& b) {
   /* Quien dijo que no se podia sin una variable temporal? */
   *a = *a ^ *b;
   *b = *a ^ *b;
   *a = *a ^ *b;
}

{_The_Alwar_}

hey genios de la electronica, tengo una duda, aunque viendo este tema creo resolverla,
¿estos programas luego los introduces en un chip o algo no?¿con esto, programas los chip para que trabajen solos no? ¿como los introduces los programas? me supongo que tendras algun aparatito conectado al pc y hay conectas los chips, jeje que programa utilizas para compilar todo eso? Se que hago muchas preguntas espero no molestar, pero me encanta la electronica, aunque se muy poco (soy joven para saber de esto) y tengo ganas de aprender, viendo esto, el ensamblador no parece dificil, solo que son sentencias muy simples xD
Saludos!!

D1e6o!

Sep... estamops hablando de un microcontrolador, el cual guarda el programa que le ingresemos en su memoria interna, y así puede funcionar independiente del pc. (en este caso el pic 16f84 (posee una memoria flash donde se guardan los programas y una eprom para datos...). Introducirlos en el integrado es fácil, basta con armar alguno de los circuitos sencillos que hay en distintas webs(generalmente se conectan por puerto paralelo, aunque hay variantes). Para compilar eso hay varios programas, el más básico, creado por el mismo fabricante del uC es Mplab (pag de inicio microchip.com) que lo descargás gratis, y sí.. la programación es bastante sencilla. Si necesitas algún circuito busca en internet. Hay muchos, así como tb ejemplos. Saludos. Si no fuí claro preguntá, es que estoy un poco apurado.

{_The_Alwar_}

gracias, ya lo entendi, era como me suponia aunque.. tengo ciertas dudas con los chips... pero weno como no son muy claras no se ni lo q tengo q preguntar

Saludos!

BADBYTE-K


ijfa

que wena toy arreglando un programa pa un teklado matricial y me sirve el que toma algo en el puerto A y kontrola el B....wenoweno...thx

{05c4r}

Viendo los programas que teneis colgados me parecen un poco como para iniciarse, aqui os pongo varios programas un poco mas avanzados, no se que os parecera, pero yo pongo mi granito

Programa que hace una escritura en una pantalla LCD

;**********************************************************************
;               Liquid Chrystal Display
;**********************************************************************

;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN DEL PIC
;---------------------------------------------------------------------------------------------------------
      LIST      P=16F84      ;tipo de procesador
      INCLUDE      "P16F84.INC"   ;definición del registro de inicio
;---------------------------------------------------------------------------------------------------------
;         DEFINICIÓN DE VARIABLES
;---------------------------------------------------------------------------------------------------------
Lcd_var      EQU      0X0C      ;definición de variables de rutina
                  ;de manejo del lcd
CONT1      EQU      0X10
;---------------------------------------------------------------------------------------------------------
;         PUESTA A CERO DEL PIC
;---------------------------------------------------------------------------------------------------------
      ORG        0X00      ;vector de reset
      GOTO      INICIO      ;salta a inicio
      ORG      0X05      ;salva el vector de
                  ;interrupcion
      INCLUDE      "LCD_Cxx.INC"   ;incluye rutinas de manejo lcd
;---------------------------------------------------------------------------------------------------------
;         RETARDO DE 500 MS
;---------------------------------------------------------------------------------------------------------
TEMP1      MOVLW      .78
      MOVWF      CONT1
TEMP1B      BCF      INTCON,T0IF
      MOVLW      .100
      MOVWF      TMR0
TEMP1C      CLRWDT
      BTFSS      INTCON,T0IF
      GOTO      TEMP1C
      DECFSZ      CONT1,F
      GOTO      TEMP1B
      RETURN
;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN PUERTOS  E INICIO DEL LCD
;---------------------------------------------------------------------------------------------------------
INICIO      CLRF      PORTB      ;borra los latch de salida
      BSF      STATUS,RP0   ;selecciono banco 1
      CLRF      TRISB      ;configuro trisb como salida
      MOVLW      B'00011000'
      MOVWF      TRISA
      MOVLW      B'10000111'   ;multiplicador a 256
      MOVWF      OPTION_REG   ;configuro OPTION_REG
      BCF      STATUS,RP0   ;selecciona banco 0
      CALL      LCD_INI      ;secuencia de inicio del lcd
      MOVLW      B'00000001'   ;borra LCD
      CALL      LCD_REG      
      MOVLW      B'00001111'   ;envía instrucción: lcd on,
      CALL      LCD_REG      ;cursor on y blink on
;---------------------------------------------------------------------------------------------------------
;         APARECE EL NOMBRE EN LA PRIMERA FILA
;---------------------------------------------------------------------------------------------------------
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      'O'
      CALL      LCD_DATO      
      MOVLW      'S'
      CALL      LCD_DATO      
      MOVLW      'C'
      CALL      LCD_DATO      
      MOVLW      'A'
      CALL      LCD_DATO   
      MOVLW      'R'
      CALL      LCD_DATO
      CALL      TEMP1   
;---------------------------------------------------------------------------------------------------------      
;         APARECEN LOS APELLIDOS EN LA SEGUNDA FILA
;---------------------------------------------------------------------------------------------------------
      MOVLW      B'00000001'   ;borra el LCD
      CALL      LCD_REG
      MOVLW      B'11000000'   ;coloca el cursor en C0h
      CALL      LCD_REG      ;ya que '11000000' = C0h
      MOVLW      'A'
      CALL      LCD_DATO
      MOVLW      'G'
      CALL      LCD_DATO
      MOVLW      'U'
      CALL      LCD_DATO
      MOVLW      'D'
      CALL      LCD_DATO
      MOVLW      'O'
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      'B'
      CALL      LCD_DATO
      MOVLW      'U'
      CALL      LCD_DATO
      MOVLW      'S'
      CALL      LCD_DATO
      MOVLW      'T'
      CALL      LCD_DATO
      MOVLW      'A'
      CALL      LCD_DATO
      MOVLW      'M'
      CALL      LCD_DATO
      MOVLW      'A'
      CALL      LCD_DATO
      MOVLW      'N'
      CALL      LCD_DATO
      MOVLW      'T'
      CALL      LCD_DATO
      MOVLW      'E'
      CALL      LCD_DATO
      CALL      TEMP1
;---------------------------------------------------------------------------------------------------------
;         HAGO QUE SE REPITA LA SECUENCIA
;---------------------------------------------------------------------------------------------------------
;      GOTO      INICIO
;---------------------------------------------------------------------------------------------------------
      NOP
      NOP
      END



Despalazamiento del texto en una pantalla de LCD

;**********************************************************************
;               Liquid Chrystal Display
;**********************************************************************

;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN DEL PIC
;---------------------------------------------------------------------------------------------------------
      LIST      P=16F84      ;tipo de procesador
      INCLUDE      "P16F84.INC"   ;definición del registro de inicio
;---------------------------------------------------------------------------------------------------------
;         DEFINICIÓN DE VARIABLES
;---------------------------------------------------------------------------------------------------------
Lcd_var      EQU      0X0C      ;definición de variables de rutina
                  ;de manejo del lcd
CONT1      EQU      0X10
CONT2A      EQU      0X11
CONT2B      EQU      0X12
AUX1      EQU      0X13
;---------------------------------------------------------------------------------------------------------
;         PUESTA A CERO DEL PIC
;---------------------------------------------------------------------------------------------------------
      ORG        0X00      ;vector de reset
      GOTO      INICIO      ;salta a inicio
      ORG      0X05      ;salva el vector de
                  ;interrupcion
      INCLUDE      "LCD_Cxx.INC"   ;incluye rutinas de manejo lcd
;---------------------------------------------------------------------------------------------------------
;         RETARDO DE 40 MS
;---------------------------------------------------------------------------------------------------------
TEMP1      MOVLW      .6
      MOVWF      CONT1
TEMP1B      BCF      INTCON,T0IF
      MOVLW      .100
      MOVWF      TMR0
TEMP1C      CLRWDT
      BTFSS      INTCON,T0IF
      GOTO      TEMP1C
      DECFSZ      CONT1,F
      GOTO      TEMP1B
      RETURN
;---------------------------------------------------------------------------------------------------------
;         RETARDO DE 5 SG
;---------------------------------------------------------------------------------------------------------
TEMP2      MOVLW      .75
      MOVWF      CONT2A
      MOVLW      .75
      MOVWF      CONT2B
TEMP2B      BCF      INTCON,T0IF
      MOVLW      .100
      MOVWF      TMR0
TEMP2C      CLRWDT
      BTFSS      INTCON,T0IF
      GOTO      TEMP2C
      DECFSZ      CONT2A,F
      GOTO      TEMP2B
TEMP2D      CLRWDT
      MOVLW      .1
      MOVWF      CONT2A
      BTFSS      INTCON,T0IF
      GOTO      TEMP2D
      DECFSZ      CONT2B,F
      GOTO      TEMP2B
      RETURN
;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN PUERTOS  E INICIO DEL LCD
;---------------------------------------------------------------------------------------------------------
INICIO      
      CLRF      PORTB      ;borra los latch de salida
      BSF      STATUS,RP0   ;selecciono banco 1
      CLRF      TRISB      ;configuro trisb como salida
      MOVLW      B'00011000'
      MOVWF      TRISA
      MOVLW      B'10000111'   ;multiplicador a 256
      MOVWF      OPTION_REG   ;configuro OPTION_REG
      BCF      STATUS,RP0   ;selecciona banco 0
      CALL      LCD_INI      ;secuencia de inicio del lcd
      MOVLW      B'00000001'   ;borra LCD
      CALL      LCD_REG      
      MOVLW      B'00001111'   ;envía instrucción: lcd on,
      CALL      LCD_REG      ;cursor on y blink on
;---------------------------------------------------------------------------------------------------------
;         TEXTO FIJO EN LA PRIMERA LINEA
;---------------------------------------------------------------------------------------------------------
FIJO      MOVLW      B'00000000'   
      CALL      LCD_REG
      MOVLW      B'10000000'   ;texto en la primera linea
      CALL      LCD_REG
      MOVLW      B'00000001'   ;borra el display
      CALL      LCD_REG

      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO

      MOVLW      'E'
      CALL      LCD_DATO
      MOVLW      'L'
      CALL      LCD_DATO
      MOVLW      'E'
      CALL      LCD_DATO
      MOVLW      'C'
      CALL      LCD_DATO
      MOVLW      'T'
      CALL      LCD_DATO
      MOVLW      'R'
      CALL      LCD_DATO
      MOVLW      'O'
      CALL      LCD_DATO
      MOVLW      'N'
      CALL      LCD_DATO
      MOVLW      'I'
      CALL      LCD_DATO
      MOVLW      'C'
      CALL      LCD_DATO
      MOVLW      'A'
      CALL      LCD_DATO

      CALL      TEMP2
      
      MOVLW      B'00000001'
      CALL      LCD_REG
      MOVLW      .32
      MOVWF      AUX1
;---------------------------------------------------------------------------------------------------------
;         DESPLAZA TEXTO EN LA SEGUNDA FILA
;---------------------------------------------------------------------------------------------------------
MOVER      MOVLW      B'00011000'
      CALL      LCD_REG      ;se desplaza el display
      MOVLW      B'11000000'
      CALL      LCD_REG
            
      MOVLW      ' '
      CALL      LCD_DATO         
      MOVLW      ' '
      CALL      LCD_DATO               
      MOVLW      ' '
      CALL      LCD_DATO         
      MOVLW      ' '
      CALL      LCD_DATO               
      MOVLW      ' '
      CALL      LCD_DATO         
      MOVLW      ' '
      CALL      LCD_DATO               
      MOVLW      ' '
      CALL      LCD_DATO         
      MOVLW      ' '
      CALL      LCD_DATO



      MOVLW      'L'
      CALL      LCD_DATO
      MOVLW      'O'
      CALL      LCD_DATO   
      MOVLW      'G'
      CALL      LCD_DATO         
      MOVLW      'I'
      CALL      LCD_DATO         
      MOVLW      'C'
      CALL      LCD_DATO         
      MOVLW      'A'
      CALL      LCD_DATO         
      
      MOVLW      ' '
      CALL      LCD_DATO         
      
      MOVLW      'D'
      CALL      LCD_DATO         
      MOVLW      'I'
      CALL      LCD_DATO         
      MOVLW      'G'
      CALL      LCD_DATO         
      MOVLW      'T'
      CALL      LCD_DATO         
      MOVLW      'A'
      CALL      LCD_DATO         
      MOVLW      'L'
      CALL      LCD_DATO         
      
      MOVLW      ' '
      CALL      LCD_DATO         
            
      MOVLW      'Y'
      CALL      LCD_DATO         
      
      MOVLW      ' '
      CALL      LCD_DATO         
      
      MOVLW      'M'
      CALL      LCD_DATO         
      MOVLW      'I'
      CALL      LCD_DATO         
      MOVLW      'C'
      CALL      LCD_DATO         
      MOVLW      'R'
      CALL      LCD_DATO         
      MOVLW      'O'
      CALL      LCD_DATO         
      MOVLW      'P'
      CALL      LCD_DATO         
      MOVLW      'R'
      CALL      LCD_DATO         
      MOVLW      'O'
      CALL      LCD_DATO         
      MOVLW      'G'
      CALL      LCD_DATO         
      MOVLW      'R'
      CALL      LCD_DATO         
      MOVLW      'A'
      CALL      LCD_DATO         
      MOVLW      'M'
      CALL      LCD_DATO         
      MOVLW      'A'
      CALL      LCD_DATO         
      MOVLW      'B'
      CALL      LCD_DATO         
      MOVLW      'L'
      CALL      LCD_DATO         
      MOVLW      'E'
      CALL      LCD_DATO         
   
      CALL      TEMP1
      DECFSZ      AUX1
      CALL      MOVER         
      CALL      FIJO
;---------------------------------------------------------------------------------------------------------      
      NOP
      NOP
      END



Un programa que simula la peticion del turno de una carnicera en un supermecado y guarda el numero en la memoria del PIC de forma que si quitas la alimentacion y la vuelves a poner sigues teniendo el mismo numero. Tiene posibilidad de adelantar y retroceder el numero con interruptores y de ponerle a cero.

;**********************************************************************
;               Liquid Chrystal Display
;**********************************************************************

;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN DEL PIC
;---------------------------------------------------------------------------------------------------------
      LIST      P=16F84      ;tipo de procesador
      INCLUDE      "P16F84.INC"   ;definición del registro de inicio
;---------------------------------------------------------------------------------------------------------
;         DEFINICIÓN DE VARIABLES
;---------------------------------------------------------------------------------------------------------
Lcd_var      EQU      0X0C      ;definición de variables de rutina
                  ;de manejo del lcd
CONT1      EQU      0X10
TURNO1      EQU      0X11
TURNO2      EQU      0X12
;---------------------------------------------------------------------------------------------------------
;         PUESTA A CERO DEL PIC
;---------------------------------------------------------------------------------------------------------
      ORG        0X00      ;vector de reset
      GOTO      INICIO      ;salta a inicio
      ORG      0X05      ;salva el vector de
                  ;interrupcion
      INCLUDE      "LCD_Cxx.INC"   ;incluye rutinas de manejo lcd
;---------------------------------------------------------------------------------------------------------
;         RETARDO
;---------------------------------------------------------------------------------------------------------
TEMP1      MOVLW      .10
      MOVWF      CONT1
TEMP1B      BCF      INTCON,T0IF
      MOVLW      .10
      MOVWF      TMR0
TEMP1C      CLRWDT
      BTFSS      INTCON,T0IF
      GOTO      TEMP1C
      DECFSZ      CONT1,F
      GOTO      TEMP1B
      RETURN
;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN PUERTOS  E INICIO DEL LCD
;---------------------------------------------------------------------------------------------------------
INICIO      CLRF      PORTB      ;borra los latch de salida
      BSF      STATUS,RP0   ;selecciono banco 1
      CLRF      TRISB      ;configuro trisb como salida
      MOVLW      B'00011000'
      MOVWF      TRISA
      MOVLW      B'10000111'   ;multiplicador
      MOVWF      OPTION_REG   ;configuro OPTION_REG
      BCF      STATUS,RP0   ;selecciona banco 0
      CALL      LCD_INI      ;secuencia de inicio del lcd
      MOVLW      B'00000001'   ;borra LCD
      CALL      LCD_REG      
      MOVLW      B'00001111'   ;envía instrucción: lcd on,
      CALL      LCD_REG      ;cursor on y blink on
;---------------------------------------------------------------------------------------------------------
;         LEE LOS DATOS AL INICIO
;---------------------------------------------------------------------------------------------------------
LECTURA1   BCF      STATUS,RP0
      MOVLW      0X21
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA1B   BTFSC      EECON1,RD
      GOTO      ESPERA1B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      TURNO1

LECTURA2   BCF      STATUS,RP0
      MOVLW      0X22
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA2B   BTFSC      EECON1,RD
      GOTO      ESPERA2B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      TURNO2
;---------------------------------------------------------------------------------------------------------
;         MUESTRA DATOS EN LCD
;---------------------------------------------------------------------------------------------------------
BUCLE1      BTFSS      PORTA,3
      GOTO      BUCLE2
      MOVLW      0X30
      MOVWF      TURNO1
      MOVLW      0X30
      MOVWF      TURNO2

BUCLE2      MOVLW      B'00000001'
      CALL      LCD_REG

      MOVLW      'S'
      CALL      LCD_DATO
      MOVLW      'U'
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      'T'
      CALL      LCD_DATO
      MOVLW      'U'
      CALL      LCD_DATO
      MOVLW      'R'
      CALL      LCD_DATO
      MOVLW      'N'
      CALL      LCD_DATO
      MOVLW      'O'
      CALL      LCD_DATO
      MOVLW      ':'
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO
      MOVLW      ' '
      CALL      LCD_DATO

      MOVF      TURNO2,W
      CALL      LCD_DATO
      MOVF      TURNO1,W
      CALL      LCD_DATO
   
PASAR      BTFSS      PORTA,4
      GOTO      PASAR
      CALL      TEMP1
      INCF      TURNO1,F
      CALL      AUX
;---------------------------------------------------------------------------------------------------------      
;         GUARDA LOS DATOS EN MEMORIA
;---------------------------------------------------------------------------------------------------------
ESCRITURA1   BCF      STATUS,RP0
      MOVLW      0X21
      MOVWF      EEADR
      MOVF      TURNO1,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA1A   BTFSS      EECON1,EEIF
      GOTO      ESPERA1A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

ESCRITURA2   BCF      STATUS,RP0
      MOVLW      0X22
      MOVWF      EEADR
      MOVF      TURNO2,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA2A   BTFSS      EECON1,EEIF
      GOTO      ESPERA2A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

      GOTO      BUCLE1
;---------------------------------------------------------------------------------------------------------      
;         FUNCION PARA PREPARAR DATOS DE SALIDA
;---------------------------------------------------------------------------------------------------------
AUX      MOVF      TURNO1,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN

      INCF      TURNO2,F
      MOVLW      0X30
      MOVWF      TURNO1
      
      MOVF      TURNO2,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN
      MOVLW      0X30
      MOVWF      TURNO2
      RETURN         


      NOP
      NOP
      END



Aqui un programa que me costo lo mio desarrollar. Se trata de un cronometro (seguramente no muy exacto debido a tiempos de propagacion y tal) qu muestra en el LCD minutos, segundos y centesimas, con un interruptor le pones en marcha o le paras y con otro interruptor le haces avanzar o retroceder.


;**********************************************************************
;               Liquid Chrystal Display
;**********************************************************************

;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN DEL PIC
;---------------------------------------------------------------------------------------------------------
      LIST      P=16F84      ;tipo de procesador
      INCLUDE      "P16F84.INC"   ;definición del registro de inicio
;---------------------------------------------------------------------------------------------------------
;         DEFINICIÓN DE VARIABLES
;---------------------------------------------------------------------------------------------------------
Lcd_var      EQU      0X0C      ;definición de variables de rutina
                  ;de manejo del lcd
CONT1      EQU      0X10
CENT1      EQU      0X11
CENT2      EQU      0X12
SEG1      EQU      0X15
SEG2      EQU      0X16
MIN1      EQU      0X13
MIN2      EQU      0X14
;---------------------------------------------------------------------------------------------------------
;         PUESTA A CERO DEL PIC
;---------------------------------------------------------------------------------------------------------
      ORG        0X00      ;vector de reset
      GOTO      INICIO      ;salta a inicio
      ORG      0X05      ;salva el vector de
                  ;interrupcion
      INCLUDE      "LCD_Cxx.INC"   ;incluye rutinas de manejo lcd
;---------------------------------------------------------------------------------------------------------
;         RETARDO
;---------------------------------------------------------------------------------------------------------
TEMP1      MOVLW      .1
      MOVWF      CONT1
TEMP1B      BCF      INTCON,T0IF
      MOVLW      .1
      MOVWF      TMR0
TEMP1C      CLRWDT
      BTFSS      INTCON,T0IF
      GOTO      TEMP1C
      DECFSZ      CONT1,F
      GOTO      TEMP1B
      RETURN
;---------------------------------------------------------------------------------------------------------
;         CONFIGURACIÓN PUERTOS  E INICIO DEL LCD
;---------------------------------------------------------------------------------------------------------
INICIO      CLRF      PORTB      ;borra los latch de salida
      BSF      STATUS,RP0   ;selecciono banco 1
      CLRF      TRISB      ;configuro trisb como salida
      MOVLW      B'00011000'
      MOVWF      TRISA
      MOVLW      B'10000000'   ;multiplicador
      MOVWF      OPTION_REG   ;configuro OPTION_REG
      BCF      STATUS,RP0   ;selecciona banco 0
      CALL      LCD_INI      ;secuencia de inicio del lcd
      MOVLW      B'00000001'   ;borra LCD
      CALL      LCD_REG      
      MOVLW      B'00001111'   ;envía instrucción: lcd on,
      CALL      LCD_REG      ;cursor on y blink on
;---------------------------------------------------------------------------------------------------------
;         LEE LOS DATOS AL INICIO
;---------------------------------------------------------------------------------------------------------
LECTURA1   BCF      STATUS,RP0
      MOVLW      0X21
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA1B   BTFSC      EECON1,RD
      GOTO      ESPERA1B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      CENT1

LECTURA2   BCF      STATUS,RP0
      MOVLW      0X22
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA2B   BTFSC      EECON1,RD
      GOTO      ESPERA2B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      CENT2

LECTURA3   BCF      STATUS,RP0
      MOVLW      0X23
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA3B   BTFSC      EECON1,RD
      GOTO      ESPERA3B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      SEG1

LECTURA4   BCF      STATUS,RP0
      MOVLW      0X24
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA4B   BTFSC      EECON1,RD
      GOTO      ESPERA4B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      SEG2

LECTURA5   BCF      STATUS,RP0
      MOVLW      0X25
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA5B   BTFSC      EECON1,RD
      GOTO      ESPERA5B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      MIN1

LECTURA6   BCF      STATUS,RP0
      MOVLW      0X26
      MOVWF      EEADR
      BSF      STATUS,RP0
      BSF      EECON1,RD

ESPERA6B   BTFSC      EECON1,RD
      GOTO      ESPERA6B
      BCF      STATUS,RP0
      MOVF      EEDATA,W
      MOVWF      MIN2
;---------------------------------------------------------------------------------------------------------
;         MUESTRA DATOS EN LCD
;---------------------------------------------------------------------------------------------------------
MOSTRAR      MOVLW      B'00000001'
      CALL      LCD_REG

      MOVF      MIN2,W
      CALL      LCD_DATO
      MOVF      MIN1,W
      CALL      LCD_DATO
      MOVLW      ':'
      CALL      LCD_DATO
      MOVF      SEG2,W
      CALL      LCD_DATO
      MOVF      SEG1,W
      CALL      LCD_DATO
      MOVLW      ':'
      CALL      LCD_DATO
      MOVF      CENT2,W
      CALL      LCD_DATO
      MOVF      CENT1,W
      CALL      LCD_DATO
      
ADELANTE   BTFSC      PORTA,4
      GOTO      SIGUIENTE
      CALL      CERO         
      GOTO      ADELANTE

CERO      BTFSS      PORTA,3
      RETURN
      MOVLW      0X30
      MOVWF      CENT1
      MOVLW      0X30
      MOVWF      CENT2
      MOVLW      0X30
      MOVWF      SEG1
      MOVLW      0X30
      MOVWF      SEG2
      MOVLW      0X30
      MOVWF      MIN1
      MOVLW      0X30
      MOVWF      MIN2
      
      MOVLW      B'00000001'
      CALL      LCD_REG

      MOVF      MIN2,W
      CALL      LCD_DATO
      MOVF      MIN1,W
      CALL      LCD_DATO
      MOVLW      ':'
      CALL      LCD_DATO
      MOVF      SEG2,W
      CALL      LCD_DATO
      MOVF      SEG1,W
      CALL      LCD_DATO
      MOVLW      ':'
      CALL      LCD_DATO
      MOVF      CENT2,W
      CALL      LCD_DATO
      MOVF      CENT1,W
      CALL      LCD_DATO

      RETURN

SIGUIENTE   CALL      TEMP1
      INCF      CENT1,F
      CALL      AUX
      CALL      ESCRITURA1
      GOTO      MOSTRAR
;---------------------------------------------------------------------------------------------------------      
;         FUNCION PARA PREPARAR DATOS DE SALIDA
;---------------------------------------------------------------------------------------------------------
AUX      MOVF      CENT1,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN

      INCF      CENT2,F
      MOVLW      0X30
      MOVWF      CENT1
      
      MOVF      CENT2,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN

      INCF      SEG1,F
      MOVLW      0X30
      MOVWF      CENT2
      
      MOVF      SEG1,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN
      
      INCF      SEG2,F
      MOVLW      0X30
      MOVWF      SEG1

      MOVF      SEG2,W
      SUBLW      0X35      
      BTFSC      STATUS,C
      RETURN

      INCF      MIN1,F
      MOVLW      0X30
      MOVWF      SEG2
      
      MOVF      MIN1,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN

      INCF      MIN2,F
      MOVLW      0X30      
      MOVWF      MIN1

      MOVF      MIN2,W
      SUBLW      0X39
      BTFSC      STATUS,C
      RETURN

      MOVLW      0X30
      MOVWF      MIN2
      RETURN
;---------------------------------------------------------------------------------------------------------      
;         GUARDA LOS DATOS EN MEMORIA
;---------------------------------------------------------------------------------------------------------
ESCRITURA1   BCF      STATUS,RP0
      MOVLW      0X21
      MOVWF      EEADR
      MOVF      CENT1,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA1A   BTFSS      EECON1,EEIF
      GOTO      ESPERA1A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

ESCRITURA2   BCF      STATUS,RP0
      MOVLW      0X22
      MOVWF      EEADR
      MOVF      CENT2,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA2A   BTFSS      EECON1,EEIF
      GOTO      ESPERA2A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

ESCRITURA3   BCF      STATUS,RP0
      MOVLW      0X23
      MOVWF      EEADR
      MOVF      SEG1,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA3A   BTFSS      EECON1,EEIF
      GOTO      ESPERA3A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

ESCRITURA4   BCF      STATUS,RP0
      MOVLW      0X24
      MOVWF      EEADR
      MOVF      SEG2,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA4A   BTFSS      EECON1,EEIF
      GOTO      ESPERA4A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

ESCRITURA5   BCF      STATUS,RP0
      MOVLW      0X25
      MOVWF      EEADR
      MOVF      MIN1,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA5A   BTFSS      EECON1,EEIF
      GOTO      ESPERA5A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

ESCRITURA6   BCF      STATUS,RP0
      MOVLW      0X26
      MOVWF      EEADR
      MOVF      MIN2,W
      MOVWF      EEDATA
      BSF      STATUS,RP0
      BSF      EECON1,WREN
      MOVLW      0X55
      MOVWF      EECON2
      MOVLW      0XAA
      MOVWF      EECON2
      
      BSF      EECON1,WR
ESPERA6A   BTFSS      EECON1,EEIF
      GOTO      ESPERA6A
      BCF      EECON1,EEIF
      BCF      STATUS,RP0

      RETURN


;---------------------------------------------------------------------------
      NOP
      NOP
      END