Está en la página 1de 26

INDICE

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.

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

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

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
Cdigo
GeSHi (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 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
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 watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 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
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 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
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>

__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
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, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;------------------------------------------------------------END ; fin de programa

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

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
CLRF PORTB ; ponemos a cero el puerto b
INICIO ; etiqueta
BSF PORTB,0 ; prende RB0
BCF STATUS,0 ; limpia el carry de STATUS,C
REPETIR
IZQ
CALL DEMORA ; demora de 100ms
RLF PORTB,1 ; rota el contenido de portb a la derecha
BTFSS PORTB,7 ; hasta que prenda RB7, luego se salta
GOTO IZQ ; una linea
DER
CALL DEMORA ; demora de 100 ms
RRF PORTB,1 ; rota el contenido de portb a la izquierda
BTFSS PORTB,0 ; hasta que prenda RB0, luego salta
GOTO DER ; una linea
GOTO REPETIR ; repite el ciclo

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, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;------------------------------------------------------------END ; fin de programa
Veguepic:
Ejemplo 06:
Juego de luces, las luces se cruzan de lado a lado.

Cdigo
GeSHi (asm):
; 06-06-06
; Ejemplo 06
; Juego de luces
; 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
; el efecto que se busca es de dos luces que parten de los extremos expuestos y se muevan
; de lado a lado.
SEC1 equ B'10000001'
SEC2 equ B'01000010'
SEC3 equ B'00100100'
SEC4 equ B'00011000'
; se podri haber seguido con
; SEC5 equ B'00100100' pero es igual a SEC3 y asi para los demas
; por lo que se invierte la secuencia SEC3, SEC2, SEC1

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

CALL DEMORA ; demora de 100ms


MOVLW SEC2 ; carga el valor de SEC2 en W
MOVWF PORTB ; carga w en el puerto b
CALL DEMORA ; demora de 100ms
MOVLW SEC3 ; carga el valor de SEC3 en W
MOVWF PORTB ; carga w en el puerto b
CALL DEMORA ; demora de 100ms
MOVLW SEC4 ; carga el valor de SEC4 en W
MOVWF PORTB ; carga w en el puerto b
CALL DEMORA ; demora de 100ms
MOVLW SEC3 ; carga el valor de SEC3 en W
MOVWF PORTB ; carga w en el puerto b
CALL DEMORA ; demora de 100ms
MOVLW SEC2 ; carga el valor de SEC2 en W
MOVWF PORTB ; carga w en el puerto b
CALL DEMORA ; demora de 100ms
MOVLW SEC1 ; carga el valor de SEC1 en W
MOVWF PORTB ; carga w en el puerto b
CALL DEMORA ; demora de 100ms
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, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;------------------------------------------------------------END ; fin de programa
Veguepic:
Ejemplo 07:
Juego de luces, son dos luces que se mueven en 4 posiciones de lado a lado. Movemos una
luz de lado a lado entre los cuatro bits bajos y con la funcion SWAPF copiamos para los
bits altos.

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.

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
VAR ; variable
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'00000' ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW B'11111111' ; carga 11111111 en W
MOVWF TRISB ; puerto B todas entradas
BCF OPTION_REG,7 ; activa pull-up en puerto B
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTA ; ponemos a cero el puerto A
INICIO ; etiqueta
CLRF VAR ; ponemos a cero VAR
BTFSC PORTB,0 ; si RB0 es 0 salta 1 linea
BSF VAR,0 ; pone 1 el bit 0 de VAR, encendido
BTFSC PORTB,1 ; si RB1 es 0 salta 1 linea
BSF VAR,1 ; pone 1 el bit 1 de vAR, encendido
BTFSC PORTB,2 ; si RB2 es 0 salta 1 linea
BSF VAR,2 ; pone 1 el bit 2 de VAR, encendido
BTFSC PORTB,3 ; si RB3 es 0 salta 1 linea
BSF VAR,3 ; pone 1 el bit 3 de VAR, encendido
COMF VAR,0 ; complementa VAR y carga en W (*)
MOVWF PORTA ; carga W en PORTA
GOTO INICIO ; salta a INICIO
END ; fin de programa

Ejemplo 09:
Es igual al ejemplo anterior pero hacemos directamente la lectura del puerto B,

este programa ocupa menos de la mitad de espacio que el ejemplo 08.


Cdigo
GeSHi (asm):
; 24-06-06
; Ejemplo 09
; 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.
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'00000' ; carga 00000 en W
MOVWF TRISA ; puerto A todos salidas
MOVLW B'11111111' ; carga 11111111 en W
MOVWF TRISB ; puerto B todas entradas
BCF OPTION_REG,7 ; activa pull-up en puerto B
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTA ; ponemos a cero el puerto A
INICIO ; etiqueta
COMF PORTB,0 ; leemos el puerto B, el valor lo
; complementamos y lo guardamos en W
MOVWF PORTA ; cargamos W en el puerto A
GOTO INICIO ; salta a INICIO
END ; fin de programa

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'

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

0, carga B'1111110' en W y retorna


1, carga B'0110000' en W y retorna
2, carga B'1101101' en W y retorna
3, carga B'1111001' en W y retorna
4, carga B'0110011' en W y retorna
5, carga B'1011011' en W y retorna
6, carga B'1011111' en W y retorna
7, carga B'1110000' en W y retorna
8, carga B'1111111' en W y retorna
9, carga B'1111011' en W y retorna
A, carga B'1110111' en W y retorna
b, carga B'0011111' en W y retorna
C, carga B'1001110' en W y retorna
d, carga B'0111101' en W y retorna
E, carga B'1001111' en W y retorna
F, carga B'1000111' en W y retorna

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"

CBLOCK 0x20 ; Ubica los registros consecutivamente a partir de la ubicacion 0x20


PDel0 ; 0x20
PDel1 ; 0x21
PDel2 ; 0x22
UNIDADES ; 0x23
ENDC ; Fin de las registros
ORG 0
BSF STATUS,5 ; activa la pagina 1
MOVLW B'00000' ; carga 01111 en W
MOVWF TRISA ; puerto A todos salidas
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
CLRF UNIDADES ; ponemos a cero UNIDADES
MOVLW 0 ; ponemos a cero W
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
; dp-a-b-c-d-e-f-g orden de los segmentos
RETLW B'1111110' ; 0, carga B'1111110' en W y retorna
RETLW B'0110000' ; 1, carga B'0110000' en W y retorna
RETLW B'1101101' ; 2, carga B'1101101' en W y retorna
RETLW B'1111001' ; 3, carga B'1111001' en W y retorna
RETLW B'0110011' ; 4, carga B'0110011' en W y retorna
RETLW B'1011011' ; 5, carga B'1011011' en W y retorna

RETLW B'1011111' ; 6, carga B'1011111' en W y retorna


RETLW B'1110000' ; 7, carga B'1110000' en W y retorna
RETLW B'1111111' ; 8, carga B'1111111' en W y retorna
RETLW B'1111011' ; 9, carga B'1111011' en W y retorna
RETLW B'1110111' ; A, carga B'1110111' en W y retorna
RETLW B'0011111' ; b, carga B'0011111' en W y retorna
RETLW B'1001110' ; C, carga B'1001110' en W y retorna
RETLW B'0111101' ; d, carga B'0111101' en W y retorna
RETLW B'1001111' ; E, carga B'1001111' en W y retorna
RETLW B'1000111' ; F, carga B'1000111' en W y retorna
INICIO ; etiqueta
CALL TABLA ; llamamos a TABLA
MOVWF PORTB ; mueve el dato al puerto B
CALL DEMORA
MOVLW 1 ; pones a 1 W
ADDWF UNIDADES,1 ; suma W a UNIDADES y lo guarda en UNIDADES
MOVF UNIDADES,0 ; mueve UNIDADES a W
BTFSS UNIDADES,4 ; comprueba si el bit 4 de CONTADOR es uno salta
GOTO INICIO ; va a INICIO
CLRF UNIDADES ; borra UNIDADES
MOVLW 0 ; pone a 1 W
GOTO INICIO ; va a inicio
;------------------------------------------------------------; Generado con PDEL ver SP r 1.0 el 27/08/2006 Hs 09:39:14 p.m.
; Descripcion: Delay 1000000 ciclos = 1 segundo
;------------------------------------------------------------DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop

decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)


goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;------------------------------------------------------------END ; fin de programa

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

//se crean las tablas para poder interactuar con el motor


TAULA0 addwf pc,1
retlw b' 00001010'
retlw b' 00001001'
retlw b' 00000101'
retlw b' 00000110'
retlw b' 00001010'
retlw b' 00001001'
retlw b' 00000101'
retlw b' 00000110'

TAULA1 addwf pc,1


retlw b' 00001010'
retlw b' 00001000'
retlw b' 00001001'
retlw b' 00000001'
retlw b' 00000101'
retlw b' 00000100'
retlw b' 00000110'
retlw b' 00000010'

TAULA2 addwf pc,1


retlw b' 00000110'
retlw b' 00000101'
retlw b' 00001001'
retlw b' 00001010'
retlw b' 00000110'
retlw b' 00000101'
retlw b' 00001001'
retlw b' 00001010'

TAULA3 addwf pc,1


retlw b' 00000010'
retlw b' 00000110'
retlw b' 00000100'
retlw b' 00000101'
retlw b' 00000001'

retlw b' 00001001'


retlw b' 00001000'
retlw b' 00001010'
//se ponemos retardos para facilitar la visualizacion en el montaje
RETARD movlw d'255'
movwf var_A
//doble bucle
LOOP movlw d'255'
movwf var_B
LOOP1 decfsz var_B,1
goto LOOP1
decfsz var_A,1
goto LOOP
return
end ;finaliza el programa

También podría gustarte