# Ensamblador programas hechos en Mplab



## george.manson.69 (Oct 8, 2009)

Quisiera colocar los programas que hecho en Mplab en lenguaje ensamblador, para mi es complejo para hacer programas muy dificiles por eso estan los de alto nivel, pero nada es imposible, el ensamblador es muy bueno para ahorrar velocidad y memoria del pic.

Y los que tengas por ahi programas hechos en Ensamblador si quieren pueden subirlo para compartirlos. y SI TIENE LIBRERIAS APRA LCD Y TECLADOS 4X4 SE LOS AGRADECERIA YA QUE NO ME HAN FUNCIONADO LAS MIAS. 

Bueno empezemos...

Este es un simple contador de 0 a 9.

```
;/////////////////////////////////////////
;TITULO: CONTADOR
;AUTOR: Ing. Jorge Arturo Rdz Hdz
;FECHA: 04/Abril/2009
;/////////////////////////////////////////

LIST P=16F628A
#INCLUDE<P16F628A.INC>
__CONFIG _XT_OSC & _MCLRE_ON & _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON

CBLOCK    0X20        ;INICIO DE LA MEMORIA
        NUMERO        ;VARIBALE PARA CONTAR 0 A 9
        CONTADOR    ;VARIABLE PARA EL TIMER
ENDC
        ORG    0
        GOTO    START
        ORG    5

;///////////////////////////////
;        CONFIGURACION 
;///////////////////////////////

START    BSF        STATUS,5            ;BANK 1
        CLRF    TRISB                ;PORTB COMO SALIDA
        MOVLW    0X1F                ;RA0 RA4 COMO ENTRADA
        MOVWF    TRISA            
        MOVLW    B'11000111'            ;SE CARGA CON 256 TMR0
        MOVWF    OPTION_REG
        BCF        STATUS,5            ;BANK 0
        CLRW                        ;W=0
        CLRF    NUMERO                ;LIMPIAR VARIBALE
        
;///////////////////////////////
;      INICIO DEL PROGRAMA
;//////////////////////////////

MAIN    MOVF    NUMERO,W            ;AGARRA EL VALOR DE LA VARIABLE
        CALL    TABLA                ;LLAMA A TABLA
        MOVWF    PORTB                ;VISUALIZA EL VALOR QUE AGARRO DE TABLA
        CALL    PAUSE_1                ;PAUSA DE 1 SEGUNDO
        INCF    NUMERO,F            ;INCREMENTE VARIBALE A 1
        MOVF    NUMERO,W            ;W SE CARGA CON LA VARIABLE
        XORLW    0X0A                ;COMPARA SI A LLEGADO A 10
        BTFSS    STATUS,Z            ;CHEKADOR SI A LLEGADO
        GOTO    MAIN                ;BUCLE
        CLRW                        ;SI LLEGA A 10 RESETEA W
        CLRF    NUMERO                ;TAMBIEN LIMPIA LA VARIBALE
        GOTO    MAIN                ;BUCLE

;/////////////////////////////
;    RETARDO DE UN SEGUNDO
;////////////////////////////

PAUSE_1    MOVLW    0X64                ;SE CARGA LA CONTADOR CON 100
        MOVWF    CONTADOR
DELAY    BCF        INTCON,T0IF            ;LE LIMPIA EL BIT, DE DESBORDAMIENTO DE TMRO
        MOVLW    09                ;SE CARGA 217 
        MOVWF    TMR0                ;A TMRO
DELAY2    BTFSS    INTCON,T0IF            ;ESPERA EL DESBORAMIENTO DE TMRO
        GOTO    DELAY2                ;BUCLE
        DECFSZ    CONTADOR,F            ;DECREMENTE A 1 EL CONTADOR
        GOTO    DELAY                ;BUCLE
        RETURN

;/////////////////////////////
;            TABLA
;/////////////////////////////

TABLA    ADDWF    PCL,F
        RETLW    B'00111111'
        RETLW    B'00000110'
        RETLW    B'01011011'
        RETLW    B'01001111'
        RETLW    B'01100110'
        RETLW    B'01101101'
        RETLW    B'01111100'
        RETLW    B'00000111'
        RETLW    B'01111111'
        RETLW    B'01100111'
        END
```


----------



## the_invader (Oct 9, 2009)

muchas gracias... me baje el codigo... aun comienzo en el mundo de los micros pero espero poner un asm pronto.. SALU2!


----------



## george.manson.69 (Oct 10, 2009)

este es simple programa que controla un lcd...el driver del lcd que utilizo es muy simple, ya que solo puedes escribir todos lo caracteres del teclado, pero no puedes creer objetos.


```
;----------------------------------
;AUTOR: JORGE ARTURO RDZ HDZ
;TITULO: MANEJO DE UN LCD 16x2
;FECHA: 10/OCTUBRE/'09
;----------------------------------

;----------------------------------
;    CONFIGURACION
;----------------------------------

LIST    P=16F628A
#INCLUDE<P16F628A.INC>
__CONFIG _INTOSC_OSC_NOCLKOUT & _MCLRE_OFF & _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON

CBLOCK     0x20
        LETRA
        LCD_VAR    ;SIEMPRE SE PONE ESTA VARIABLE PARA USAR EL LCD
        DELAYS    ;SIEMPRE SE PONE ESTA VARIABLE PARA USAR LOS RETARDOS
ENDC

        ORG    0
        GOTO    INICIO
        ORG    5

        INCLUDE "DRIVER_LCD.ASM"
        INCLUDE    "RETARDOS.ASM"

;--------------------------------------
;        CONFIGURACION DEL PIC
;--------------------------------------

INICIO    BSF        STATUS,RP0    ;BANCO 1 ---------------------
        MOVLW    B'10000111'    ;SIEMPRE SE PONE ESTO PARA USAR LOS RETARDOS
        MOVWF    OPTION_REG    ;USAMOS EL TMRO
        BCF        STATUS,RP0    ;BANCO 0 ---------------------
        MOVLW    D'7'
        MOVWF    CMCON        ;APAGA COMPARADORES

;--------------------------------------
;        INICIALIZAMOS LCD
;--------------------------------------

        CALL    INIT_LCD    ;INICIALIZAMOS EL LCD

;--------------------------------------
;        EMPIEZA EL PROGRAMA
;--------------------------------------

        CLRF    LETRA        ;BORRAMOS LA VARIABLE 'LETRA'

LINE_1    MOVF    LETRA,W        ;CARGAMOS LETRA->W
        CALL    TABLA        ;LLAMAMOS LA TABLA
        MOVWF    VARLCD        ;W TIENE UN CARACTER Y LO GUARDA EN VARLCD
        CALL    MODO_CHAR    ;VIZUALIZAMOS EL CARACTER
        INCF    LETRA,F        ;LETRA+1->LETRA
        MOVF    LETRA,W        ;LETRA->W
        XORLW    D'14'        ;
        BTFSS    STATUS,Z    ;SI LETRA=14
        GOTO    LINE_1        ;NO, ENTONCES REPITE EL PROSESO
        CALL    LINEA_2        ;SI, PONE EL CURSOR EN LA SEGUNDO LINEA
        CLRF    LETRA        ;BORRAMOS VARIABLE

LINE_2    MOVF    LETRA,W        ;MISMO PROCESO DE ARRIBA
        CALL    TABLA_2        ;SOLO QUE AHORA MUESTRA LOS CARACTERES 
        MOVWF    VARLCD        ;EN LA SEGUNDA LINEA
        CALL    MODO_CHAR
        INCF    LETRA,F
        MOVF    LETRA,W
        XORLW    D'8'
        BTFSS    STATUS,Z
        GOTO    LINE_2
        SLEEP                ;BAJO CONSUMO

;--------------------------------------
;        TABLAS DE LETRAS
;--------------------------------------
        
TABLA    ADDWF    PCL,F
        DT    "SIMPLE USO DEL"
TABLA_2    ADDWF    PCL,F
        DT    "LCD 16x2"
        END
```

Simple programa que te evalua las entradas que entran en el comparador interno del pic.


```
;----------------------------------
;AUTOR: JORGE ARTURO RDZ HDZ
;TITULO: USO DE COMPARADORES EN C1
;FECHA: 10/OCTUBRE/'09
;----------------------------------

;----------------------------------
;    CONFIGURACION
;----------------------------------

LIST    P=16F628A
#INCLUDE<P16F628A.INC>
__CONFIG _INTOSC_OSC_NOCLKOUT & _MCLRE_OFF & _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON

CBLOCK     0x20
        LETRA
        LCD_VAR    ;SIEMPRE SE PONE ESTA VARIABLE PARA USAR EL LCD
        DELAYS    ;SIEMPRE SE PONE ESTA VARIABLE PARA USAR LOS RETARDOS
ENDC

        ORG    0
        GOTO    INICIO
        ORG    5

        INCLUDE "DRIVER_LCD.ASM"
        INCLUDE    "RETARDOS.ASM"

;----------------------------------
;    CONFIGURACION DEL PIC
;----------------------------------

INICIO    BSF        STATUS,RP0    ;BANCO0--------------1
        MOVLW    0x09        ;RA0 Y RA3 COMO ENTRADAS
        MOVWF    TRISA
        MOVLW    B'10000111'    ;PARA USAR LOS RETARDOS
        MOVWF    OPTION_REG
        BCF        STATUS,RP0    ;BANCO---------------0
        MOVLW    B'00000100'        ;SE ACTIVA EL C1 Y EL C2 
        MOVWF    CMCON        ;NO SE USA
        CALL    INIT_LCD

;-----------------------------------
;    INICIO DEL PROGRAMA
;-----------------------------------

LINE_1    MOVF    LETRA,W        ;CARGAMOS LETRA->W
        CALL    TABLA        ;LLAMAMOS LA TABLA
        MOVWF    VARLCD        ;W TIENE UN CARACTER Y LO GUARDA EN VARLCD
        CALL    MODO_CHAR    ;VIZUALIZAMOS EL CARACTER
        INCF    LETRA,F        ;LETRA+1->LETRA
        MOVF    LETRA,W        ;LETRA->W
        XORLW    D'16'        ;
        BTFSS    STATUS,Z    ;SI LETRA=16
        GOTO    LINE_1        ;NO, ENTONCES REPITE EL PROSESO
        CLRF    LETRA        ;BORRAMOS VARIABLE

LINE_2    CALL    LINEA_2        ;LINEA 2
        BTFSS    CMCON,C1OUT    ;SI C1OUT
        GOTO    RV1_M        ;=0
        GOTO    RV2_M        ;=1

RV1_M    MOVF    LETRA,W        ;MISMO PROCESO DE ARRIBA
        CALL    T3            ;SOLO QUE AHORA MUESTRA LOS CARACTERES 
        MOVWF    VARLCD        ;EN LA SEGUNDA LINEA
        CALL    MODO_CHAR
        INCF    LETRA,F
        MOVF    LETRA,W
        XORLW    D'7'
        BTFSS    STATUS,Z
        GOTO    RV1_M
        CLRF    LETRA
C1        BTFSS    CMCON,C1OUT    ;AUN EN 1?
        GOTO    C1            ;SI,CICLO HASTA QUE CAMBIE
        GOTO    LINE_2        ;NO,PASA A A REVISAR LA SALIDA

RV2_M    MOVF    LETRA,W        ;MISMO PROCESO DE ARRIBA
        CALL    T2            ;SOLO QUE AHORA MUESTRA LOS CARACTERES 
        MOVWF    VARLCD        ;EN LA SEGUNDA LINEA
        CALL    MODO_CHAR
        INCF    LETRA,F
        MOVF    LETRA,W
        XORLW    D'7'
        BTFSS    STATUS,Z
        GOTO    RV2_M
        CLRF    LETRA
C2        BTFSC    CMCON,C1OUT    ;AUN ES 0?
        GOTO    C2            ;SI,PERMANECE EN ESTE CICLO HASTA QUE CAMBIE
        GOTO    LINE_2        ;NO,CHECA QUE CAMBIO

TABLA    ADDWF    PCL,F
        DT    "---COMPARADOR---"
T2        ADDWF    PCL,F
        DT    "RV1<RV2"
T3        ADDWF    PCL,F
        DT    "RV1>RV2"
        END
```


----------



## LxL (Ago 26, 2010)

Hola george.manson.69!! 

Me gustaria saber si se puede programar un PIC para que le ingrese un numero d 7bits y que este tenga como salida ese numero pero en BCD...

Es que tengo un circuito de un sumador-restador d 7 bits, en otras palabras el maximo numero en decimal es 127 entonces ocupo representarlo en 3 display, pero un circuito co CIs basicos es muy grande y costoso...

Por eso me gustaria ver si me ayudas con el PIC para eso...


----------



## gabrieladuran (Nov 21, 2010)

Hola queria ver si me podrias ayudar, lo que pasa esque mañana tengo una exposicion  y tengo que utilizar el CCP (Capture,Compara PWM) pero tengo que explicar un codigo con Capture pero no se como se utiliza, tengo que simularlo en MPLAB espero me puedas ayudar, te lo agradeceria mucho....


----------

