Microcontroladores PIC > Almacén del Assembler

Ejemplos en Asembler PIC16F84A

(1/14) > >>

Veguepic:
Hola Amigos:

Gracias a que el amigo Vszener amablemente cedio sus Ejemplitos en C y simulaciones, abro este tema para pasar estos ejemplos a Asembler.

Inicialmente voy a utilizar el 16F84A, espero posteriormente migrar el codigo a los micros 16F628, 16F648 y 16F88 que estan por aqui mirandome sin hacer nada.  :shock:

Hoja tecnica 16F84A

Se usara en los ejemplos el compilador MPLAB y para las simulaciones PROTEUS.

MPLAB

PROTEUS


INDICE


* 01.- Prender un led
* 02.- Prender y apagar un led cada 0.5 segundos
* 03.- Prender y apagar 4 leds cada segundo
* 04.- Auto Fantastico
* 05.- Auto Fantastico - codigo optimizado
* 06.- Juego de luces - dos luces que se cruzan
* 07.- Juego de luces - dos luces que se mueven de lado a lado
* 08.- Encender 4 luces - al presionar un interruptor se prende el led correspondiente
* 09.- Encender 4 luces - igual que el anterior pero de otra forma
* 10.- Manejo de un Display de catodo comun
* 11.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada - Versión 0.1 (por Maunix)
* 12.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada - Versión 0.2 (por Maunix)
* 13.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde esté ubicada - Versión 0.3 (por Maunix)
* 14.- Contador Hexadecimal de un digito con display catodo comun, cambia cada segundo.
*
*


Los Zip tienen los archivos asm, hex y dsn (proteus).

Espero sus criticas, correcciones, sugerencias, etc  :-)

Veguepic:
Aqui va el ejemplo 01:

Prender un led con un 16F84A por RB0, de lo mas sencillo



--- Código: ASM ---;       02-06-06;       Ejemplo 01;       Prender un led;       PIC 16f84a;       MPLAB 7.30;       PROTEUS 6.9 SP3;       Veguepic         LIST    P=16F84A,                               ; usar PIC 16F84A        #include <p16f84A.inc>         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off                                                        ; power up timer        on                                                        ; watchdog              off                                                        ; osc                   XT         ORG     0        BSF     STATUS,5                                ; activa la pagina 1        MOVLW   B'00000'                                ; carga 00000 en W        MOVWF   TRISA                                   ; puerto a todos salidas        MOVLW   B'00000000'                             ; carga 00000000 en W        MOVWF   TRISB                                   ; puerto b todos salidaS        BCF     STATUS,5                                ; volvemos a la pagina 0         BCF     PORTB,0                                 ; ponemos a 0 RB0        BCF     PORTB,1                                 ; ponemos a 0 RB1        BCF     PORTB,2                                 ; ponemos a 0 RB2        BCF     PORTB,3                                 ; ponemos a 0 RB3        BCF     PORTB,4                                 ; ponemos a 0 RB4        BCF     PORTB,5                                 ; ponemos a 0 RB5        BCF     PORTB,6                                 ; ponemos a 0 RB6        BCF     PORTB,7                                 ; ponemos a 0 RB7                                                         ; luego haremos todos juntos INICIO                                                  ; etiqueta        BSF     PORTB,0                                 ; pone a 1 RB0        GOTO    INICIO                                  ; va a inicio         END                                             ; fin de programa

Veguepic:
Ejemplo 02:

Prender y apagar un led cada 0.5 segundos con un 16F84A por RB0



--- Código: ASM ---;       02-06-06;       Ejemplo 02;       Prende y apagar un led cada 0.5 seg;       PIC 16f84a;       MPLAB 7.30;       PROTEUS 6.9 SP3;       Veguepic         LIST    P=16F84A,                               ; usar PIC 16F84A        #include <p16f84A.inc>         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off                                                        ; power up timer        on                                                        ; watchdog              off                                                        ; osc                   XT PDel0   equ     0CPDel1   equ     0D          ORG     0        BSF     STATUS,5                                ; activa la pagina 1        MOVLW   B'00000'                                ; carga 00000 en W        MOVWF   TRISA                                   ; puerto a todos salidas        MOVLW   B'00000000'                             ; carga 00000000 en W        MOVWF   TRISB                                   ; puerto b todos salidaS        BCF     STATUS,5                                ; volvemos a la pagina 0         MOVLW   B'00000000'                             ; ponemos a cero el        MOVWF   PORTB                                   ; el puerto b                                                        ; usando esta opcion se ahorran                                                        ; 6 bytes en comparacion con el                                                        ; ejemplo 01 INICIO                                                  ; etiqueta        BSF     PORTB,0                                 ; pone a 1 RB0        CALL    DEMORA                                  ; llama a demora de 0,5 seg        BCF     PORTB,0                                 ; pone a 0 RB0        CALL    DEMORA                                  ; llama a demora de 0,5 seg        GOTO    INICIO                                  ; va a inicio ;-------------------------------------------------------------;       La demora a sido generada con el programa PDEL;       Delay 250000 ciclos;------------------------------------------------------------- DEMORA  movlw     .197                                  ; 1 set numero de repeticion  (B)        movwf     PDel0                                 ; 1PLoop1  movlw     .253                                  ; 1 set numero de repeticion  (A)        movwf     PDel1                                 ; 1PLoop2  clrwdt                                          ; 1 clear watchdog        clrwdt                                          ; 1 ciclo delay        decfsz    PDel1,1                               ; 1 + (1) es el tiempo 0  ? (A)        goto      PLoop2                                ; 2 no, loop        decfsz    PDel0,1                               ; 1 + (1) es el tiempo 0  ? (B)        goto      PLoop1                                ; 2 no, loopPDelL1  goto PDelL2                                     ; 2 ciclos delayPDelL2          return                                          ; 2+2 Fin.;---------------------------------------         END                                             ; fin de programa


Bueno hasta aqui por el dia de hoy.

Saludos

Veguepic:
Ejemplo 03:

Prender y apagar 4 leds cada segundo (RB0 a RB3). 0,5 segundos prendido y 0,5 segundos apagado con un 16F84A


--- Código: ASM ---;       03-06-06;       Ejemplo 03;       Prender y apagar un 4 leds cada 1 seg;       PIC 16f84a;       MPLAB 7.30;       PROTEUS 6.9 SP3;       Veguepic         LIST    P=16F84A,                               ; usar PIC 16F84A        #include <p16f84A.inc>         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off                                                        ; power up timer        on                                                        ; watchdog              off                                                        ; osc                   XT PDel0   equ     0CPDel1   equ     0D          ORG     0        BSF     STATUS,5                                ; activa la pagina 1        MOVLW   B'00000'                                ; carga 00000 en W        MOVWF   TRISA                                   ; puerto a todos salidas        MOVLW   B'00000000'                             ; carga 00000000 en W        MOVWF   TRISB                                   ; puerto b todos salidaS        BCF     STATUS,5                                ; volvemos a la pagina 0         MOVLW   B'00000000'                             ; ponemos a cero el        MOVWF   PORTB                                   ; el puerto b                                                        ; usando esta opcion se ahorran                                                        ; 6 bytes en comparacion con el                                                        ; ejemplo 01 INICIO                                                  ; etiqueta         MOVLW   B'00001111'                             ; prendemos leds RB0 a RB3        MOVWF   PORTB                                   ; cargamos el puerto b         CALL    DEMORA                                  ; llama a demora de 0,5 seg         MOVLW   B'00000000'                             ; apagamos leds RB0 a RB3        MOVWF   PORTB                                   ; cargamos el puerto b         CALL    DEMORA                                  ; llama a demora de 0,5 seg        GOTO    INICIO                                  ; va a inicio ;-------------------------------------------------------------;       La demora a sido generada con el programa PDEL;       Delay 500000 ciclos;------------------------------------------------------------- DEMORA  movlw     .239      ; 1 set numero de repeticion  (B)        movwf     PDel0     ; 1 |PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)        movwf     PDel1     ; 1 |PLoop2  clrwdt              ; 1 clear watchdogPDelL1  goto PDelL2         ; 2 ciclos delayPDelL2  goto PDelL3         ; 2 ciclos delayPDelL3  clrwdt              ; 1 ciclo delay        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)        goto      PLoop2    ; 2 no, loop        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)        goto      PLoop1    ; 2 no, loopPDelL4  goto PDelL5         ; 2 ciclos delayPDelL5  goto PDelL6         ; 2 ciclos delayPDelL6  goto PDelL7         ; 2 ciclos delayPDelL7  clrwdt              ; 1 ciclo delay        return              ; 2+2 Fin. ;---------------------------------------         END                                             ; fin de programa

Veguepic:
Ejeplo 04:

Efecto de luces tipo Auto Fantastico con un 16F84A por el puerto b, RB0 a RB7

--- Código: ASM ---;       04-06-06;       Ejemplo 04;       Luces del Auto fantastico;       PIC 16f84a;       MPLAB 7.30;       PROTEUS 6.9 SP3;       Veguepic         LIST    P=16F84A,                               ; usar PIC 16F84A        #include <p16f84A.inc>         __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC     ; code protec           off                                                        ; power up timer        on                                                        ; watchdog              off                                                        ; osc                   XT PDel0   equ     0CPDel1   equ     0D          ORG     0        BSF     STATUS,5                                ; activa la pagina 1        MOVLW   B'00000'                                ; carga 00000 en W        MOVWF   TRISA                                   ; puerto a todos salidas        MOVLW   B'00000000'                             ; carga 00000000 en W        MOVWF   TRISB                                   ; puerto b todos salidaS        BCF     STATUS,5                                ; volvemos a la pagina 0         MOVLW   B'00000000'                             ; ponemos a cero el        MOVWF   PORTB                                   ; el puerto b INICIO                                                  ; etiqueta         BSF     PORTB,0                                 ; prendemos y apagamos        CALL    DEMORA                                  ; led por led        BCF     PORTB,0                                 ; despues trataremos de                                                        ; usar otra funcion        BSF     PORTB,1        CALL    DEMORA        BCF     PORTB,1         BSF     PORTB,2        CALL    DEMORA        BCF     PORTB,2         BSF     PORTB,3        CALL    DEMORA        BCF     PORTB,3         BSF     PORTB,4        CALL    DEMORA        BCF     PORTB,4         BSF     PORTB,5        CALL    DEMORA        BCF     PORTB,5         BSF     PORTB,6        CALL    DEMORA        BCF     PORTB,6         BSF     PORTB,7        CALL    DEMORA        BCF     PORTB,7         BSF     PORTB,6        CALL    DEMORA        BCF     PORTB,6         BSF     PORTB,5        CALL    DEMORA        BCF     PORTB,5         BSF     PORTB,4        CALL    DEMORA        BCF     PORTB,4         BSF     PORTB,3        CALL    DEMORA        BCF     PORTB,3         BSF     PORTB,2        CALL    DEMORA        BCF     PORTB,2         BSF     PORTB,1        CALL    DEMORA        BCF     PORTB,1          GOTO    INICIO                                  ; va a inicio ;-------------------------------------------------------------;       La demora a sido generada con el programa PDEL;       Descripcion: Delay 100000 ciclos - 100 ms;-------------------------------------------------------------DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)        movwf     PDel0     ; 1 |PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)        movwf     PDel1     ; 1 |PLoop2  clrwdt              ; 1 clear watchdog        clrwdt              ; 1 ciclo delay        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)        goto      PLoop2    ; 2 no, loop        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)        goto      PLoop1    ; 2 no, loopPDelL1  goto PDelL2         ; 2 ciclos delayPDelL2  goto PDelL3         ; 2 ciclos delayPDelL3  clrwdt              ; 1 ciclo delay        return              ; 2+2 Fin.;-------------------------------------------------------------         END                                             ; fin de programa


Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa