Top Banner

of 23

ejemplos 16f84

Jul 20, 2015

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

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 __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 __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 __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 __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 __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 __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

__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 programaEjemplo 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 __CONFIG _CP_OFF&_PWRTE_ON&_WDT_OFF&_XT_OSC ; code protec off ; power up timer on ; watchdog off ; 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 __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'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 __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'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 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 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 __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