Microcontroladores PIC > Almacén del Assembler
Ejemplos en Asembler PIC16F84A
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
[#] Página Siguiente
Ir a la versión completa