Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejemplos 16f84
Ejemplos 16f84
01.- Prender un led02.- Prender y apagar un led cada 0.5 segundos03.- Prender y apagar 4
leds cada segundo04.- Auto Fantastico05.- Auto Fantastico - codigo optimizado06.- Juego
de luces - dos luces que se cruzan07.- Juego de luces - dos luces que se mueven de lado a
lado08.- Encender 4 luces - al presionar un interruptor se prende el led correspondiente09.Encender 4 luces - igual que el anterior pero de otra forma10.- Manejo de un Display de
catodo comun11.- Rutina de Lectura de una Tabla en Memoria de Programa, sin importar
donde est ubicada - Versin 0.1 (por Maunix)12.- Rutina de Lectura de una Tabla en
Memoria de Programa, sin importar donde est ubicada - Versin 0.2 (por Maunix)13.Rutina de Lectura de una Tabla en Memoria de Programa, sin importar donde est ubicada Versin 0.3 (por Maunix)14.- Contador Hexadecimal de un digito con display catodo
comun, cambia cada segundo.
Cdigo
GeSHi (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
Cdigo
GeSHi (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 0C
PDel1 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 ; 1
PLoop1 movlw .253 ; 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, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
return ; 2+2 Fin.
;--------------------------------------END ; fin de programa
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
;-------------------------------------------------------------
Veguepic:
Ejeplo 04:
Efecto de luces tipo Auto Fantastico con un 16F84A por el puerto b, RB0 a RB7
Cdigo
GeSHi (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>
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
Ejemplo 05:
Gracias a la ayuda de BrunoF, he corregido este ejemplo, en la simulacion no daba
problemas pero armando el circuito prendia dos leds en vez de uno, era debido a que no
habia puesto a cero el bit de acarreo o carry del registro STATUS. Hecho esto el ejemplo
funciona correctamente.
El codigo anterior ocupaba 65 espacios de memoria de 1024 dispnibles, optimizando el
codigo anterior ahora ocupa solo 33 usando las funciones RLF y RRF.
Cdigo
GeSHi (asm):
; 05-06-06
; Ejemplo 05
; Luces del Auto fantastico - optimizado
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
Cdigo
GeSHi (asm):
; 06-06-06
; Ejemplo 06
; Juego de luces
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
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
CLRF PORTB ; ponemos a cero el puerto b
INICIO ; etiqueta
REPETIR
MOVLW SEC1 ; carga el valor de SEC1 en W
MOVWF PORTB ; carga w en el puerto b
Cdigo
GeSHi (asm):
; 11-06-06
; Ejemplo 07
; Juego de luces
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
; el efecto que se busca es de dos luces que se mueven en 4 posiciones de lado a lado.
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 0C
PDel1 equ 0D
SEC1 equ 0E
SEC2 equ 0f
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
CLRF PORTA ; ponemos a cero el puerto a
CLRF PORTB ; ponemos a cero el puerto b
BCF STATUS,0 ; limpia el carry de STATUS,C
MOVLW B'00000001' ; carga 00000001 en w
MOVWF SEC1 ; guarda el valor en SEC1
INICIO ; etiqueta
DERECHA ; rutina para mover a derecha
CALL CAMBIAR ; llama a CAMBIAR
RLF SEC1,1 ; mueve el contenido a la izquierda y lo guarda en SEC1
BTFSS SEC1,3 ; si el bit 7 es igual a 1 salta una instruccion
GOTO DERECHA ; repite la rutina derecha
IZQUIERDA ; rutina para mover a izquierda
CALL CAMBIAR ; llama a CAMBIAR
RRF SEC1,1 ; mueve el contenido a la izquierda y lo guarda en SEC1
BTFSS SEC1,0 ; si el bit 0 es igual a 1 salta una instruccion
GOTO IZQUIERDA ; repite la rutina izquierda
GOTO INICIO ; va a inicio
CAMBIAR ; rutina para repetir los 4 bits bajos en los 4 bits altos
SWAPF SEC1,0 ; intercambia los 4 bits bajos por los 4 bits altos
MOVWF SEC2 ; guarda el valor en SEC2
MOVF SEC1,0 ; carga SEC1 en w
ADDWF SEC2,1 ; suma w y SEC2 y lo guarda en SEC2
MOVF SEC2,0 ; carga SE21 en w
MOVWF PORTB ; mueve el valor de w en el puerto b
CALL DEMORA ; demora de 200ms
RETURN
;------------------------------------------------------------; La demora a sido generada con el programa PDEL
; Descripcion: Delay 200000 ciclos - 200 ms
;------------------------------------------------------------DEMORA movlw .156 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .213 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
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, loop
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;------------------------------------------------------------END ; fin de programa
Ejemplo 08:
Ponemos interruptores en RB0 a RB3, cuando son presionados, se enciende el
led respectivo en RA0 a RA3.
Cdigo
GeSHi (asm):
; 24-06-06
; Ejemplo 08
; Leer interruptores
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
; si los interruptores de RB0 a RB3 son presionados, se enciende el led
respectivo en RA0 a RA3.
Ejemplo 09:
Es igual al ejemplo anterior pero hacemos directamente la lectura del puerto B,
Ejemplo 10:
En este caso leeremos el valor binario de los interruptores conectados en el
puerto A, RA0 a RA3, y mostraremos su valor equivalente en hexadecimal en
un display de 7 segmentos de catodo comun.
A estas alturas ya debemos tener claros algunos conceptos como los fuses,
manejo de algunas instrucciones, etc. por lo cual ya no sera necesario poner
comentarios tan detallados que podria aburrir. Cuando sean conceptos nuevos
si seran necesarios. Pero si no se entiende algo no esta demas preguntar. :-)
Cdigo
GeSHi (asm):
; 09-07-06
; Ejemplo 10
; Manejo de un Display de cathodo comun
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
; metiendo el codigo binario por RA0 a RA3 se vera el codigo hexadecimal en el
display.
LIST P=16F84A, ; usar PIC 16F84A
#include <p16f84A.inc>
__CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC
; code protec of; power up timer on; watchdog of; osc XT
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'01111' ; carga 01111 en W
MOVWF TRISA ; puerto A, RA0 a RA3 entradas
MOVLW B'00000000' ; carga 11111111 en W
MOVWF TRISB ; puerto B todas salidas
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTA ; ponemos a cero el puerto A
CLRF PORTB ; ponemos a cero el puerto B
GOTO INICIO ; va a inicio
TABLA
ADDWF PCL,1 ; suma w (valor puerto A) con el valor de PCL
; (contador del programa) y lo guarda en PCL
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
B'1111110'
B'0110000'
B'1101101'
B'1111001'
B'0110011'
B'1011011'
B'1011111'
B'1110000'
B'1111111'
B'1111011'
B'1110111'
B'0011111'
B'1001110'
B'0111101'
B'1001111'
B'1000111'
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
INICIO ; etiqueta
MOVF PORTA,0 ; lee el puerto A, y lo guarda en W
CALL TABLA ; llamamos a TABLA
MOVWF PORTB ; cargamos W en el puerto B
GOTO INICIO ; va a INICIO
END ; fin de programa
Ejemplo 14:
Contador Hexadecimal de un digito con display catodo comun, cambia cada segundo.
Cdigo
GeSHi (asm):
; 28-08-06
; Ejemplo 14
; Contador con un Display de cathodo comun
; PIC 16f84a
; MPLAB 7.30
; PROTEUS 6.9 SP3
; Veguepic
; sencillo contador continuo de 0 a 9 y demora un segundo cada cambio .
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
errorlevel -302 ; Elimina el mensaje "bank warning"
Saludos
laura_bellver:
Motor paso a paso
Cdigo
GeSHi (asm):
list p=16f84
//definimos las direcciones necesarias
STATUS equ 03h
PORTB equ 06h
TRISB equ 06h
PORTA equ 05h
TRISA equ 05h
pc equ 02h
cont equ 10h
var_A equ 0ch
var_B equ 0dh
RP0 equ 5
Z equ 2
//ponemos org = 0 para que inicie el programa, rp0 con 1 bit y TRISB = 0 actuaran //como
puerto de salida
org 0
bsf STATUS,RP0
clrf TRISB
//movemos 11 al registro y el registro se mueve a TRISA y se pone el bit rp0 del //registro
estatus a cero
movlw b'11'
movwf TRISA
bcf STATUS,RP0
//se crea una variable inici con BUCLE y ESCULL, se limpia y se pone a 0 el //contador se
llama la funcin BUCLE
INICI clrf cont
BUCLE movf cont,0
call ESCULL
movwf PORTB
call RETARD
incf cont,1
movlw d'10'
subwf cont,0
btfss STATUS,Z
goto BUCLE
goto INICI
ESCULL btfsc PORTA,1 ;salta si el bit 1 = 0
goto BIT0
btfss PORTA,0 ;salta si el bit 0 = 1
goto ETAULA0
goto ETAULA1
BIT0 btfss PORTA,0 ;salta si el bit 0 = 1
goto ETAULA2
ETAULA3 call TAULA3 ;llama a TAULA 3
goto FI
ETAULA2 call TAULA2 ;llama a TAULA 2
goto FI
ETAULA1 call TAULA1 ;llama a TAULA 1
goto FI
ETAULA0 call TAULA0 ;llama a TAULA 0
FI RETURN ;vuelve al programa