Prsentado por:
Richard Alain Puello Heredia
Alexander Rodriguez Mahecha
INTRODUCCION
Este trabajo cumple
con el objetivo de interactuar con los compañeros del aula virtual para dar
respuesta a una cierta una actividad descriptiva del modulo y temas a tratar,
promoviendo que el alumno haga una exploración total de los temas de
Microprocesador, Principios Básicos, Familias de Microprocesadores y sobre todo
Ensamblador (Assembler).
Siendo así una
interacción individual con acompañamiento del tutor del CEAD en donde se plasma
de manera practica la estructura temática del aula del curso de
microprocesadores y microcontroladores en su unidad 1 con el lenguaje de
programación Assembler, contribuyendo a los principios formativos para el mismo
aprendizaje.
También se pretende
que alumno pueda compartir con sus demás compañeros el trabajo individual
realizado para que los compañeros generen comentarios que le ayuden a
perfeccionar el trabajo, igualmente se extiende la invitación para que comentes
el trabajo de los demás.
El trabajo ayuda a
tomar conciencia sobre la importancia de los microcontroladores y
microprocesadores, acentuando su diseño utilidad, características e
implementación de manera clara y distribuida en los diferentes equipos
actualmente usados junto con los componentes de las mimas.
Por último se puede
inferir que en la realización de este trabajo la participación por medio de los
aportes es clave en este trabajo y su centro o raíz es gracias al aula virtual
dada por la Universidad Nacional Abierta y a Distancia Unad, dándole un enfoque
diferente para mejorar las capacidades de aprendizaje del alumno.
Objetivos
Diseñar un programa que
permita recibir números y realizar las cuatro operaciones aritméticas básicas.
Conocer los camandos básicos
para la operación de un microprocesador.
Punto 1
Diseñar un programa que
represente una solución matemática en simuproc
Se desarrrolla una
calculadora que suma, resta, multiplica y divide.
PROCEDIMIENTO
Para desarrollar esta Ejercicio es
conveniente seguir los siguientes pasos:
Establecer las variables, constantes y
demás parámetros relevantes en el diseño del algoritmo.
Diseñar el algoritmo y diagrama de
flujo solución del problema planteado.
Generar el código fuente, producto del
algoritmo diseñado.
Guardar el código fuente en .COM o
.EXE.
Compilar, depurar y ejecutar el
programa generado.
Guardar los cambios
realizados.
Código:
#SimuProc 1.4.3.0
#El siguiente código
corresponde a una calculadora que realiza las cuatro operaciones con ejecutada en simuproc.
MSG 'CALCULADORA ':
;Imprimimos menu
MSG '**** MENU
****'
MSG '1 = SUMA'
MSG '2 = RESTA'
MSG '3 = MULTIPLICACIÓN'
MSG '4 = DIVISIÓN'
MSG
LDT 'INGRESE SELECCIÓN'; Capturamos por
teclado el numero acorde a operacion.
CMP 80 ;Comparamos con el # preestablecido en memoria 80, que es
1.
JEQ 40 ;Si son iguales salte a la memoria 40
ejecute a partir de hay.
; de lo contrario ...
CMP 81 ;Comparamos con el numero preestablecido en memoria 81,
que es 1.
JEQ 50
;Si son iguales salte a la memoria 50 ejecute a partir de hay.
; de lo contrario ...
CMP 82
;Comparamos con el numero
preestablecido en memoria 82, que es 1.
JEQ 60
;Si son iguales salte a la memoria 60 ejecute a partir de hay.
; de lo contrario ...
CMP 83
;Comparamos con el numero preestablecido en memoria 83, que es 1.
JEQ 70
;Si son iguales salte a la memoria 70 ejecute a partir de hay.
; de lo contrario ...
MSG 'ERROR DE DIGITACION INTENTELO DE NUEVO';
Imprima mensaje de errror
JMP 0 ;Salta incondicionalmente y presenta
nuevamente el menu seleccion,
;MENU DE SUMA
#40
MSG 'SUMA'
MSG 'Ingrese numero'
IN AX,1 ; Lee de puerto 1 el teclado y permite que
sean numeros flotantes)
; esta
instruccion remplaza a °LTD°.
STF 2A ; Almaceno el numero de 32 bits en 2A y 2B,
en 2A quedan los
;16 bits mas significativos y en 1B
los 16 menos significativos.
MSG 'Ingrese numero'
IN AX,1 ; Capturamos segundo numero y queda en AX.
ADDF 2A ; Sumamos a AX el numero guardado en 2A.
MSG 'RESULTADO'
OUT 1,AX ; Imprimimos en
pantalla el resultado a travez del pto 1.
HLT ; Termina programa.
;MENU DE RESTA
#50
MSG 'RESTA'
MSG 'Ingrese numero'
IN AX,1
STF 2A
MSG 'Ingrese numero'
IN AX,1
STF 2C ; Almaceno el numero
de 32 bits en 2C y 2D,
LDF 2A ; Cargo en AX la
memoria 2A.
SUBF 2C ; Resta a AX el
valor de 2C
MSG 'RESULTADO'
OUT 1,AX
HLT
;MENU DE MULTIPLICACION
#60
MSG 'MULTIPLICACION'
MSG 'Ingrese numero'
IN AX,1
STF 2A
MSG 'Ingrese numero'
IN AX,1
MULF 2A ; Multiplicacion de
AX por lo que hay en 2A.
MSG 'RESULTADO'
OUT 1,AX
HLT
;MENU DE DIVISION
#70
MSG 'DIVISION'
MSG 'Ingrese numero'
IN AX,1
STF 2A
MSG 'Ingrese numero'
IN AX,1
STF 2C
LDF 2A
DIVF 2C ; Division de AX por
lo que hay en 2A.
MSG 'RESULTADO'
OUT 1,AX
HLT
; DEFINIMOS VALORES A
MEMORIA
#80
0000000000000001 ; Asignamos el valor de 1 a memoria 80
0000000000000010 ; Asignamos el valor de 2 a memoria 81
0000000000000011 ; Asignamos el valor de 3 a memoria 82
0000000000000100 ; Asignamos el valor de 4 a memoria 83
Ejercicio
1.2.1: Encendido y apagado de un LED con intermitencia de aproximadamente 1
segundo.
__CONFIG 0X3FF9
#INCLUDE<P16F84A.INC>
LIST P=16F84A
P EQU 0xC ; VALOR EN MILISEGUNDO ENTRE 10
M EQU 0xD
N EQU 0xE
BSF STATUS,5
;INICIA PUERTO COMO SALIDA
MOVLW B'00000000'
MOVWF TRISB
;INICIA PUERTO COMO ENTRADA
MOVLW B'11111111'
MOVWF TRISA
BCF STATUS,5
;DESACTIVA COMPARADOR
ANALOGICO
;MOVLW D'7'
;MOVWF CONCOM
CLRF PORTA
CLRF PORTB
INICIO
BTFSS PORTA,0
GOTO NO
GOTO SI
NO
BCF PORTB,0
GOTO INICIO
SI
BSF PORTB,0
GOTO INICIO
END
Diagrama
de flujo
Ejercicio
1.2.2: Encendido de un LED por acción sobre un pulsador.
__CONFIG 0X3FF9
#INCLUDE<P16F84A.INC>
LIST P=16F84A
P EQU 0xC ; VALOR EN MILISEGUNDO ENTRE 100
M EQU 0xD
N EQU 0xE
CONTADOR EQU 0XF
BSF STATUS,5
;INICIA PUERTO COMO SALIDA
MOVLW B'00000000'
MOVWF TRISB
;INICIA PUERTO COMO ENTRADA
MOVLW B'11111111'
MOVWF TRISA
BCF STATUS,5
;DESACTIVA COMPARADOR ANALOGICO
;MOVLW D'7'
;MOVWF CONCOM
CLRF PORTA
CLRF PORTB
INICIO
BSF PORTB,0
MOVLW D'5'
MOVWF P
CALL RETARDO
BCF PORTB,0
MOVLW D'5'
MOVWF P
CALL RETARDO
GOTO INICIO
RETARDO
TRES
MOVLW D'80'
MOVWF M
DOS
MOVLW D'250'
MOVWF N
UNO
NOP
NOP
DECFSZ N,1
GOTO UNO
DECFSZ M,1
GOTO DOS
DECFSZ P,1
GOTO TRES
RETURN
Diagrama
de Flujo
Ejercicio
1.2.3: Implementación de al menos 5 secuencias diferentes sobre ocho (8) LEDs
controladas en selección por dos pulsadores, uno para seleccionar la secuencia
siguiente y otro para seleccionar la secuencia anterior.
;*********Secuencia*de*leds*********
list
p=16F84A
#include
P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF
& _PWRTE_ON & _XT_OSC
;*******definición*de*variables*******
tempo3 equ 0x10
tempo1 equ 0x11
tempo2 equ 0x12
leds equ 0x13
conta equ 0x14
;*************inicio***************
org 0
goto inicio
inicio org 0x20
bsf STATUS,RP0
movlw 0xff
movwf TRISA
movlw 0x00
movwf TRISB
bcf STATUS,RP0
ini clrf tempo1
clrf tempo2
clrf leds
clrf conta
movlw 0x05
movwf conta
segui clrf leds
rut1 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x09
btfss STATUS,Z
goto rut1
decfsz conta,1
goto borra1
movlw 0x05
movwf conta
goto rut2
borra1 clrf leds
goto rut1
rut2 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x12
btfss STATUS,Z
goto rut2
decfsz conta,1
goto borra2
movlw 0x05
movwf conta
goto rut3
borra2 movlw 0x09
movwf leds
goto rut2
rut3 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x1B
btfss STATUS,Z
goto rut3
decfsz conta,1
goto borra3
movlw 0x05
movwf conta
goto rut4
borra3 movlw 0x12
movwf leds
goto rut3
rut4 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x24
btfss STATUS,Z
goto rut4
decfsz conta,1
goto borra4
movlw 0x05
movwf conta
goto rut5
borra4 movlw 0x1B
movwf leds
goto rut4
rut5 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x2D
btfss STATUS,Z
goto rut5
decfsz conta,1
goto borra5
movlw 0x05
movwf conta
goto rut6
borra5 movlw 0x24
movwf leds
goto rut5
rut6 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x36
btfss STATUS,Z
goto rut6
decfsz conta,1
goto borra6
movlw 0x05
movwf conta
goto rut7
borra6 movlw 0x2D
movwf leds
goto rut6
rut7 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x3F
btfss STATUS,Z
goto rut7
decfsz conta,1
goto borra7
movlw 0x05
movwf conta
goto rut8
borra7 movlw 0x36
movwf leds
goto rut7
rut8 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x48
btfss STATUS,Z
goto rut8
decfsz conta,1
goto borra8
goto ini
borra8 movlw 0x3F
movwf leds
goto rut8
;***********la*tabla***************
tabla bcf STATUS,RP0
addwf PCL,1
retlw b'00000000';rut1 retlw b'00000001'
retlw b'00000100'
retlw b'00010000'
retlw b'01000000'
retlw b'10000000'
retlw b'00100000'
retlw b'00001000'
retlw b'00000010'
retlw b'00000000';rut2
retlw b'00000010'
retlw b'00001000'
retlw b'00100000'
retlw b'10000000'
retlw b'01000000'
retlw b'00010000'
retlw b'00000100'
retlw b'00000001'
retlw b'00000000';rut3
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000000';rut4
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'00000000';rut5
retlw b'00000011'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000001'
retlw b'11111111';rut6
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000';rut7
retlw b'10000000'
retlw b'11000000'
retlw b'11100000'
retlw b'11110000'
retlw b'11111000'
retlw b'11111100'
retlw b'11111110'
retlw b'11111111'
retlw b'11111111';rut8
retlw b'01111111'
retlw b'00111111'
retlw b'00011111'
retlw b'00001111'
retlw b'00000111'
retlw b'00000011'
retlw b'00000001'
retlw b'00000000'
;************retardo*m*************
delaym movlw 0x16
movwf tempo1
carget movlw 0x32
movwf tempo2
carget2 movlw 0x32
movwf tempo3
reta1 decfsz tempo3,1
goto reta1
decfsz tempo2,1
goto carget2
decfsz tempo1,1
goto carget
return
end
I.
Diagramas de flujo
Ejercicio
1.2.3: Implementación de al menos 5 secuencias diferentes sobre ocho (8) LEDs
controladas en selección por dos pulsadores, uno para seleccionar la secuencia
siguiente y otro para seleccionar la secuencia anterior.
;*********Secuencia*de*leds*********
list
p=16F84A
#include
P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF
& _PWRTE_ON & _XT_OSC
;*******definición*de*variables*******
tempo3 equ 0x10
tempo1 equ 0x11
tempo2 equ 0x12
leds equ 0x13
conta equ 0x14
;*************inicio***************
org 0
goto inicio
inicio org 0x20
bsf STATUS,RP0
movlw 0xff
movwf TRISA
movlw 0x00
movwf TRISB
bcf STATUS,RP0
ini clrf tempo1
clrf tempo2
clrf leds
clrf conta
movlw 0x05
movwf conta
segui clrf leds
rut1 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x09
btfss STATUS,Z
goto rut1
decfsz conta,1
goto borra1
movlw 0x05
movwf conta
goto rut2
borra1 clrf leds
goto rut1
rut2 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x12
btfss STATUS,Z
goto rut2
decfsz conta,1
goto borra2
movlw 0x05
movwf conta
goto rut3
borra2 movlw 0x09
movwf leds
goto rut2
rut3 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x1B
btfss STATUS,Z
goto rut3
decfsz conta,1
goto borra3
movlw 0x05
movwf conta
goto rut4
borra3 movlw 0x12
movwf leds
goto rut3
rut4 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x24
btfss STATUS,Z
goto rut4
decfsz conta,1
goto borra4
movlw 0x05
movwf conta
goto rut5
borra4 movlw 0x1B
movwf leds
goto rut4
rut5 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x2D
btfss STATUS,Z
goto rut5
decfsz conta,1
goto borra5
movlw 0x05
movwf conta
goto rut6
borra5 movlw 0x24
movwf leds
goto rut5
rut6 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x36
btfss STATUS,Z
goto rut6
decfsz conta,1
goto borra6
movlw 0x05
movwf conta
goto rut7
borra6 movlw 0x2D
movwf leds
goto rut6
rut7 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x3F
btfss STATUS,Z
goto rut7
decfsz conta,1
goto borra7
movlw 0x05
movwf conta
goto rut8
borra7 movlw 0x36
movwf leds
goto rut7
rut8 movf leds,0
call tabla
movwf PORTB
call delaym
incf leds,1
movf leds,0
xorlw 0x48
btfss STATUS,Z
goto rut8
decfsz conta,1
goto borra8
goto ini
borra8 movlw 0x3F
movwf leds
goto rut8
;***********la*tabla***************
tabla bcf STATUS,RP0
addwf PCL,1
retlw b'00000000';rut1 retlw b'00000001'
retlw b'00000100'
retlw b'00010000'
retlw b'01000000'
retlw b'10000000'
retlw b'00100000'
retlw b'00001000'
retlw b'00000010'
retlw b'00000000';rut2
retlw b'00000010'
retlw b'00001000'
retlw b'00100000'
retlw b'10000000'
retlw b'01000000'
retlw b'00010000'
retlw b'00000100'
retlw b'00000001'
retlw b'00000000';rut3
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000000';rut4
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'00000000';rut5
retlw b'00000011'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000001'
retlw b'11111111';rut6
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000';rut7
retlw b'10000000'
retlw b'11000000'
retlw b'11100000'
retlw b'11110000'
retlw b'11111000'
retlw b'11111100'
retlw b'11111110'
retlw b'11111111'
retlw b'11111111';rut8
retlw b'01111111'
retlw b'00111111'
retlw b'00011111'
retlw b'00001111'
retlw b'00000111'
retlw b'00000011'
retlw b'00000001'
retlw b'00000000'
;************retardo*m*************
delaym movlw 0x16
movwf tempo1
carget movlw 0x32
movwf tempo2
carget2 movlw 0x32
movwf tempo3
reta1 decfsz tempo3,1
goto reta1
decfsz tempo2,1
goto carget2
decfsz tempo1,1
goto carget
return
end
I.
Diagramas de flujo
El
desarrollo de este programa consiste en poner en cierto orden las salidas del
puerto B de forma tal que se vea como un juego de luces; en el programa tenemos
8 rutinas diferentes la cual cada una de ellas se repite 5 veces antes de darle
paso a la siguiente.
(Distribución
que le dimos a los leds.)
Para
la apreciación de este programa es mejor verlo en funcionamiento, pero a
continuación damos una somera idea del orden como se desarrolla el programa.
Rutina 1=
ninguno / 1 / 3 / 5 / 7 / 8 / 6 / 4 / 2
Rutina 2=ninguno
/ 2 / 4 / 6 / 8 / 7 / 5 / 3 / 1
Rutina 3=ninguno
/ 1-2 / 3-4 / 5-6 / 7-8 /(bis)
Rutina 4=ninguno
/ 7-8 / 5-6 / 3-4 / 1-2 /(bis)
Rutina 5=ninguno
/ 1-2 / 2-3 / 3-4 / 4-5 / 5-6
/ 6-7 / 7-8 / 8-1
Rutina 6=
todos / ninguno / todos / ninguno
todos
/ ninguno / todos / ninguno / todos
Rutina 7=
ninguno / 8 / 8-7 / 8-7-6 / 8-7-6-5 /
8-7-6-5-4 / 8-7-6-5-4-3 /8-7-6-5-4-3-2/todos
Rutina 8=
todos/ 1-2-3-4-5-6-7 / 1-2-3-4-5-6
/
1-2-3-4-5 / 1-2-3-4 / 1-2-3 / 1-2 / 1 /ninguno
Con
el desarrollo de esta actividad pudimos jugar un poco con la imaginación, la
creatividad y por su puesto el ingenio, ya que a pesar de la aparente simpleza
en el desarrollo del programa, tuvimos inconvenientes por lo extenso que
resulta realizar tantas rutinas iguales (aparentemente); pero gracias a ello
tuvimos que investigar un poco mas hasta que hallamos una muy buena solución lo
cual es el manejo de tablas.
Con
el desarrollo de una tabla pudimos suprimir muchas líneas repetitivas que se
tenían en el programa inicial y así solucionamos el problema de lo extenso del
programa.
“Dicha
tabla se encuentra dentro del diagrama de flujo en la parte de visualizar”
En
este ejercicio pudimos aprender el manejo de pequeñas temporizaciones
realizadas a través de repetición de instrucciones.
I. Secuencia de LEDs controlada por un pulsador.
Para
la apreciación de este programa es mejor verlo en funcionamiento, pero a
continuación damos una somera idea del orden como se desarrolla el programa.
Rutina 1=
ninguno / 1 / 3 / 5 / 7 / 8 / 6 / 4 / 2
Rutina 2=ninguno
/ 2 / 4 / 6 / 8 / 7 / 5 / 3 / 1
Rutina 3=ninguno
/ 1-2 / 3-4 / 5-6 / 7-8 /(bis)
Rutina 4=ninguno
/ 7-8 / 5-6 / 3-4 / 1-2 /(bis)
Rutina 5=ninguno
/ 1-2 / 2-3 / 3-4 / 4-5 / 5-6
/ 6-7 / 7-8 / 8-1
Rutina 6=
todos / ninguno / todos / ninguno
todos
/ ninguno / todos / ninguno / todos
Rutina 7=
ninguno / 8 / 8-7 / 8-7-6 / 8-7-6-5 /
8-7-6-5-4 / 8-7-6-5-4-3 /8-7-6-5-4-3-2/todos
Rutina 8=
todos/ 1-2-3-4-5-6-7 / 1-2-3-4-5-6
/
1-2-3-4-5 / 1-2-3-4 / 1-2-3 / 1-2 / 1 /ninguno
Con
el desarrollo de esta actividad pudimos jugar un poco con la imaginación, la
creatividad y por su puesto el ingenio, ya que a pesar de la aparente simpleza
en el desarrollo del programa, tuvimos inconvenientes por lo extenso que
resulta realizar tantas rutinas iguales (aparentemente); pero gracias a ello
tuvimos que investigar un poco mas hasta que hallamos una muy buena solución lo
cual es el manejo de tablas.
Con
el desarrollo de una tabla pudimos suprimir muchas líneas repetitivas que se
tenían en el programa inicial y así solucionamos el problema de lo extenso del
programa.
“Dicha
tabla se encuentra dentro del diagrama de flujo en la parte de visualizar”
En
este ejercicio pudimos aprender el manejo de pequeñas temporizaciones
realizadas a través de repetición de instrucciones.
I. Secuencia de LEDs controlada por un pulsador.
;*********secuencia*de*leds************ list p=16F84A
#include
P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF
& _PWRTE_ON & _XT_OSC
;*********definición*de*variables********
vel equ 0x10
tempo1 equ 0x11
tempo2 equ 0x12
leds equ 0x13
conta equ 0x14
tempo3 equ 0x15
;*************inicio******************
org 0
goto inicio
inicio org 0x20
bsf STATUS,RP0
movlw 0xff
movwf TRISA
movlw 0x00
movwf TRISB
bcf STATUS,RP0
ini movlw 0x05
movwf conta
movwf vel
goto pulsa
pulsa00 call porfin
pulsa clrf leds
rut9 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa11
incf leds,1
movf leds,0
xorlw 0x09
btfss STATUS,Z
goto rut9
goto pulsa
pulsa11 call porfin
pulsa1 movlw 0x09
movwf leds
rut10 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa22
incf leds,1
movf leds,0
xorlw 0x12
btfss STATUS,Z
goto rut10
goto pulsa1
pulsa22 call porfin
pulsa2 movlw 0x12
movwf leds
rut11 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa33
incf leds,1
movf leds,0
xorlw 0x1B
btfss STATUS,Z
goto rut11
goto pulsa2
pulsa33 call porfin
pulsa3 movlw 0x1B
movwf leds
rut12 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa44
incf leds,1
movf leds,0
xorlw 0x24
btfss STATUS,Z
goto rut12
goto pulsa3
pulsa44 call porfin
pulsa4 movlw 0x24
movwf leds
rut13 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa55
incf leds,1
movf leds,0
xorlw 0x2D
btfss STATUS,Z
goto rut13
goto pulsa4
pulsa55 call porfin
pulsa5 movlw 0x2D
movwf leds
rut14 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa66
incf leds,1
movf leds,0
xorlw 0x36
btfss STATUS,Z
goto rut14
goto pulsa5
pulsa66 call porfin
pulsa6 movlw 0x36
movwf leds
rut15 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa77
incf leds,1
movf leds,0
xorlw 0x3F
btfss STATUS,Z
goto rut15
goto pulsa6
pulsa77 call porfin
pulsa7 movlw 0x3F
movwf leds
rut16 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa00
incf leds,1
movf leds,0
xorlw 0x48
btfss STATUS,Z
goto rut16
goto pulsa7
;**************la*tabla****************
tabla bcf STATUS,RP0
addwf PCL,1
retlw b'00000000';rut1,9 retlw b'00000001'
retlw b'00000100'
retlw b'00010000'
retlw b'01000000'
retlw b'10000000'
retlw b'00100000'
retlw b'00001000'
retlw b'00000010'
retlw b'00000000';rut2
retlw b'00000010'
retlw b'00001000'
retlw b'00100000'
retlw b'10000000'
retlw b'01000000'
retlw b'00010000'
retlw b'00000100'
retlw b'00000001'
retlw b'00000000';rut3
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000000';rut4
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'00000000';rut5
retlw b'00000011'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000001'
retlw b'11111111';rut6
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000';rut7
retlw b'10000000'
retlw b'11000000'
retlw b'11100000'
retlw b'11110000'
retlw b'11111000'
retlw b'11111100'
retlw b'11111110'
retlw b'11111111'
retlw b'11111111';rut8
retlw b'01111111'
retlw b'00111111'
retlw b'00011111'
retlw b'00001111'
retlw b'00000111'
retlw b'00000011'
retlw b'00000001'
retlw b'00000000'
;***********retardos******************
delaym movlw 0x16
movwf tempo1
carget movlw 0x32
movwf tempo2
carget2 movlw 0x32
movwf tempo3
reta1 decfsz tempo3,1
goto reta1
decfsz tempo2,1
goto carget2
decfsz tempo1,1
goto carget
return
delay1 movlw 0x08
movwf tempo1
carget3 movlw 0x04
movwf tempo2
reta2 decfsz tempo2,1
goto reta2
decfsz tempo1,1
goto carget3
return
;*******Suelta pulsador1**********
porfin btfsc PORTA,0
call
delay1
btfsc PORTA,0
goto porfin
return
end
II.
Diagramas
de flujo
El
desarrollo de este programa es muy similar al anterior, con la diferencia de
que nosotros controlamos el momento en el cual deseamos que cambie la rutina.
Este
cambio se logra a través de una interrupción externa por medio de un pulsador.
Tanto
las secuencias como las rutinas son iguales a las propuestas en el ejercicio 1,
con la excepción de que el programa no cambia de rutina hasta que no detecte
dicha interrupción.
Debido
a la gran similitud de este ejercicio con el primero, las conclusiones y
comentarios son casi los mismos; así que además de estas lo que nos queda por
añadir son los comentarios y experiencias obtenidas con el manejo de la
interrupción externa, las cuales son:
1-
El primer reto fue determinar en que
parte del programa deberíamos chequear el bit por el cual generaríamos la
interrupción.
2- Una
vez definido el punto anterior, nos encontramos con el problema de que
esporádicamente las secuencias
cambiaban
sin haberle dado la orden y después de investigar un poco supimos que en
ocasiones la estática genera pulsos los cuales el pic toma como interrupciones,
así que decidimos hacer una pequeña rutina donde él se tiene que cerciorar de
que realmente la orden viene del pulsador y no de la estática. Para esto el pic
va a un corto retardo después de haber detectado una señal en el pin respectivo
y después del retardo vuelve y chequea si la señal esta todavía activa, en caso
contrario ignora la primera señal y continua donde se había quedado.
3- Después
de solucionar este problema tuvimos otro, el cual era que cada vez que dábamos
el pulso el programa saltaba mas de una rutina, lo cual después de pensar un
rato llegamos a la conclusión de que se debía a que el pic es tan rápido que no
nos daba tiempo de soltar el pulsador; así que decidimos hacer una pequeña
rutina donde después de generar la interrupción, el programa no hace nada hasta
asegurarse de que hemos soltado dicho pulsador.
I. Secuencia
de Leds con
control de velocidad
y tipo de secuencia
;*********secuencia*de*leds****************
;*********secuencia*de*leds************ list p=16F84A
#include
P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF
& _PWRTE_ON & _XT_OSC
;*********definición*de*variables********
vel equ 0x10
tempo1 equ 0x11
tempo2 equ 0x12
leds equ 0x13
conta equ 0x14
tempo3 equ 0x15
;*************inicio******************
org 0
goto inicio
inicio org 0x20
bsf STATUS,RP0
movlw 0xff
movwf TRISA
movlw 0x00
movwf TRISB
bcf STATUS,RP0
ini movlw 0x05
movwf conta
movwf vel
goto pulsa
pulsa00 call porfin
pulsa clrf leds
rut9 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa11
incf leds,1
movf leds,0
xorlw 0x09
btfss STATUS,Z
goto rut9
goto pulsa
pulsa11 call porfin
pulsa1 movlw 0x09
movwf leds
rut10 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa22
incf leds,1
movf leds,0
xorlw 0x12
btfss STATUS,Z
goto rut10
goto pulsa1
pulsa22 call porfin
pulsa2 movlw 0x12
movwf leds
rut11 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa33
incf leds,1
movf leds,0
xorlw 0x1B
btfss STATUS,Z
goto rut11
goto pulsa2
pulsa33 call porfin
pulsa3 movlw 0x1B
movwf leds
rut12 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa44
incf leds,1
movf leds,0
xorlw 0x24
btfss STATUS,Z
goto rut12
goto pulsa3
pulsa44 call porfin
pulsa4 movlw 0x24
movwf leds
rut13 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa55
incf leds,1
movf leds,0
xorlw 0x2D
btfss STATUS,Z
goto rut13
goto pulsa4
pulsa55 call porfin
pulsa5 movlw 0x2D
movwf leds
rut14 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa66
incf leds,1
movf leds,0
xorlw 0x36
btfss STATUS,Z
goto rut14
goto pulsa5
pulsa66 call porfin
pulsa6 movlw 0x36
movwf leds
rut15 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa77
incf leds,1
movf leds,0
xorlw 0x3F
btfss STATUS,Z
goto rut15
goto pulsa6
pulsa77 call porfin
pulsa7 movlw 0x3F
movwf leds
rut16 movf leds,0
call tabla
movwf PORTB
call delaym
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa00
incf leds,1
movf leds,0
xorlw 0x48
btfss STATUS,Z
goto rut16
goto pulsa7
;**************la*tabla****************
tabla bcf STATUS,RP0
addwf PCL,1
retlw b'00000000';rut1,9 retlw b'00000001'
retlw b'00000100'
retlw b'00010000'
retlw b'01000000'
retlw b'10000000'
retlw b'00100000'
retlw b'00001000'
retlw b'00000010'
retlw b'00000000';rut2
retlw b'00000010'
retlw b'00001000'
retlw b'00100000'
retlw b'10000000'
retlw b'01000000'
retlw b'00010000'
retlw b'00000100'
retlw b'00000001'
retlw b'00000000';rut3
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000000';rut4
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'00000000';rut5
retlw b'00000011'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000001'
retlw b'11111111';rut6
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000';rut7
retlw b'10000000'
retlw b'11000000'
retlw b'11100000'
retlw b'11110000'
retlw b'11111000'
retlw b'11111100'
retlw b'11111110'
retlw b'11111111'
retlw b'11111111';rut8
retlw b'01111111'
retlw b'00111111'
retlw b'00011111'
retlw b'00001111'
retlw b'00000111'
retlw b'00000011'
retlw b'00000001'
retlw b'00000000'
;***********retardos******************
delaym movlw 0x16
movwf tempo1
carget movlw 0x32
movwf tempo2
carget2 movlw 0x32
movwf tempo3
reta1 decfsz tempo3,1
goto reta1
decfsz tempo2,1
goto carget2
decfsz tempo1,1
goto carget
return
delay1 movlw 0x08
movwf tempo1
carget3 movlw 0x04
movwf tempo2
reta2 decfsz tempo2,1
goto reta2
decfsz tempo1,1
goto carget3
return
;*******Suelta pulsador1**********
porfin btfsc PORTA,0
call
delay1
btfsc PORTA,0
goto porfin
return
end
II.
Diagramas
de flujo
El
desarrollo de este programa es muy similar al anterior, con la diferencia de
que nosotros controlamos el momento en el cual deseamos que cambie la rutina.
Este
cambio se logra a través de una interrupción externa por medio de un pulsador.
Tanto
las secuencias como las rutinas son iguales a las propuestas en el ejercicio 1,
con la excepción de que el programa no cambia de rutina hasta que no detecte
dicha interrupción.
Debido
a la gran similitud de este ejercicio con el primero, las conclusiones y
comentarios son casi los mismos; así que además de estas lo que nos queda por
añadir son los comentarios y experiencias obtenidas con el manejo de la
interrupción externa, las cuales son:
1-
El primer reto fue determinar en que
parte del programa deberíamos chequear el bit por el cual generaríamos la
interrupción.
2- Una
vez definido el punto anterior, nos encontramos con el problema de que
esporádicamente las secuencias
cambiaban
sin haberle dado la orden y después de investigar un poco supimos que en
ocasiones la estática genera pulsos los cuales el pic toma como interrupciones,
así que decidimos hacer una pequeña rutina donde él se tiene que cerciorar de
que realmente la orden viene del pulsador y no de la estática. Para esto el pic
va a un corto retardo después de haber detectado una señal en el pin respectivo
y después del retardo vuelve y chequea si la señal esta todavía activa, en caso
contrario ignora la primera señal y continua donde se había quedado.
3- Después
de solucionar este problema tuvimos otro, el cual era que cada vez que dábamos
el pulso el programa saltaba mas de una rutina, lo cual después de pensar un
rato llegamos a la conclusión de que se debía a que el pic es tan rápido que no
nos daba tiempo de soltar el pulsador; así que decidimos hacer una pequeña
rutina donde después de generar la interrupción, el programa no hace nada hasta
asegurarse de que hemos soltado dicho pulsador.
I. Secuencia de Leds con control de velocidad y tipo de secuencia
;*********secuencia*de*leds****************
list
p=16F84A
#include
P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF
& _PWRTE_ON & _XT_OSC
;*************definicion*de*variables*******
vel equ 0x10
tempo1 equ 0x11
tempo2 equ 0x12
leds equ 0x13
conta equ 0x14
tempo3 equ 0x15
;*************inicio**********************
org 0
goto inicio
inicio org 0x20
bsf STATUS,RP0
movlw 0xff
movwf TRISA
movlw 0x00
movwf TRISB
bcf STATUS,RP0
ini movlw 0x05
movwf conta
movwf vel
goto pulsa
pulsa00 call porfin
pulsa clrf leds
rut9 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa11
incf leds,1
movf leds,0
xorlw 0x09
btfss STATUS,Z
goto rut9
goto pulsa
pulsa11 call porfin
pulsa1 movlw 0x09
movwf leds
rut10 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa22
incf leds,1
movf leds,0
xorlw 0x12
btfss STATUS,Z
goto rut10
goto pulsa1
pulsa22 call porfin
pulsa2 movlw 0x12
movwf leds
rut11 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa33
incf leds,1
movf leds,0
xorlw 0x1B
btfss STATUS,Z
goto rut11
goto pulsa2
pulsa33 call porfin
pulsa3 movlw 0x1B
movwf leds
rut12 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa44
incf leds,1
movf leds,0
xorlw 0x24
btfss STATUS,Z
goto rut12
goto pulsa3
pulsa44 call porfin
pulsa4 movlw 0x24
movwf leds
rut13 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa55
incf leds,1
movf leds,0
xorlw 0x2D
btfss STATUS,Z
goto rut13
goto pulsa4
pulsa55 call porfin
pulsa5 movlw 0x2D
movwf leds
rut14 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa66
incf leds,1
movf leds,0
xorlw 0x36
btfss STATUS,Z
goto rut14
goto pulsa5
pulsa66 call porfin
pulsa6 movlw 0x36
movwf leds
rut15 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa77
incf leds,1
movf leds,0
xorlw 0x3F
btfss STATUS,Z
goto rut15
goto pulsa6
pulsa77 call porfin
pulsa7 movlw 0x3F
movwf leds
rut16 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa00
incf leds,1
movf leds,0
xorlw 0x48
btfss STATUS,Z
goto rut16
goto pulsa7
;*************la*tabla********************
tabla bcf STATUS,RP0
addwf PCL,1
retlw b'00000000';rut1
retlw b'00000001'
retlw b'00000100'
retlw b'00010000'
retlw b'01000000'
retlw b'10000000'
retlw b'00100000'
retlw b'00001000'
retlw b'00000010'
retlw b'00000000';rut2
retlw b'00000010'
retlw b'00001000'
retlw b'00100000'
retlw b'10000000'
retlw b'01000000'
retlw b'00010000'
retlw b'00000100'
retlw b'00000001'
retlw b'00000000';rut3
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000000';rut4
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'00000000';rut5
retlw b'00000011'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000001'
retlw b'11111111';rut6
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000';rut7
retlw b'10000000'
retlw b'11000000'
retlw b'11100000'
retlw b'11110000'
retlw b'11111000'
retlw b'11111100'
retlw b'11111110'
retlw b'11111111'
retlw b'11111111';rut8
retlw b'01111111'
retlw b'00111111'
retlw b'00011111'
retlw b'00001111'
retlw b'00000111'
retlw b'00000011'
retlw b'00000001'
retlw b'00000000'
;***************retardos******************
delaym movlw 0x16
movwf tempo1
carget movlw 0x32
movwf tempo2
carget2 movlw 0x32
movwf tempo3
reta1 decfsz tempo3,1
goto reta1
decfsz tempo2,1
goto carget2
decfsz tempo1,1
goto carget
return
delay1 movlw 0x08
movwf tempo1
carget3 movlw 0x04
movwf tempo2
reta2 decfsz tempo2,1
goto reta2
decfsz tempo1,1
goto carget3
return
;************cambio*de*velocidad**********
pulvel btfsc PORTA,1
call delay1
btfsc PORTA,1
call delaym
call delaym
return
***********Suelta
pulsador1***************
porfin btfsc PORTA,0
call
delay1
btfsc PORTA,0
goto porfin
return
end
list
p=16F84A
#include
P16F84A.inc
__CONFIG _CP_OFF & _WDT_OFF
& _PWRTE_ON & _XT_OSC
;*************definicion*de*variables*******
vel equ 0x10
tempo1 equ 0x11
tempo2 equ 0x12
leds equ 0x13
conta equ 0x14
tempo3 equ 0x15
;*************inicio**********************
org 0
goto inicio
inicio org 0x20
bsf STATUS,RP0
movlw 0xff
movwf TRISA
movlw 0x00
movwf TRISB
bcf STATUS,RP0
ini movlw 0x05
movwf conta
movwf vel
goto pulsa
pulsa00 call porfin
pulsa clrf leds
rut9 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa11
incf leds,1
movf leds,0
xorlw 0x09
btfss STATUS,Z
goto rut9
goto pulsa
pulsa11 call porfin
pulsa1 movlw 0x09
movwf leds
rut10 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa22
incf leds,1
movf leds,0
xorlw 0x12
btfss STATUS,Z
goto rut10
goto pulsa1
pulsa22 call porfin
pulsa2 movlw 0x12
movwf leds
rut11 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa33
incf leds,1
movf leds,0
xorlw 0x1B
btfss STATUS,Z
goto rut11
goto pulsa2
pulsa33 call porfin
pulsa3 movlw 0x1B
movwf leds
rut12 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa44
incf leds,1
movf leds,0
xorlw 0x24
btfss STATUS,Z
goto rut12
goto pulsa3
pulsa44 call porfin
pulsa4 movlw 0x24
movwf leds
rut13 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa55
incf leds,1
movf leds,0
xorlw 0x2D
btfss STATUS,Z
goto rut13
goto pulsa4
pulsa55 call porfin
pulsa5 movlw 0x2D
movwf leds
rut14 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa66
incf leds,1
movf leds,0
xorlw 0x36
btfss STATUS,Z
goto rut14
goto pulsa5
pulsa66 call porfin
pulsa6 movlw 0x36
movwf leds
rut15 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa77
incf leds,1
movf leds,0
xorlw 0x3F
btfss STATUS,Z
goto rut15
goto pulsa6
pulsa77 call porfin
pulsa7 movlw 0x3F
movwf leds
rut16 movf leds,0
call tabla
movwf PORTB
call pulvel
btfsc PORTA,0
call delay1
btfsc PORTA,0
goto pulsa00
incf leds,1
movf leds,0
xorlw 0x48
btfss STATUS,Z
goto rut16
goto pulsa7
;*************la*tabla********************
tabla bcf STATUS,RP0
addwf PCL,1
retlw b'00000000';rut1
retlw b'00000001'
retlw b'00000100'
retlw b'00010000'
retlw b'01000000'
retlw b'10000000'
retlw b'00100000'
retlw b'00001000'
retlw b'00000010'
retlw b'00000000';rut2
retlw b'00000010'
retlw b'00001000'
retlw b'00100000'
retlw b'10000000'
retlw b'01000000'
retlw b'00010000'
retlw b'00000100'
retlw b'00000001'
retlw b'00000000';rut3
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000011'
retlw b'00001100'
retlw b'00110000'
retlw b'11000000'
retlw b'00000000';rut4
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'11000000'
retlw b'00110000'
retlw b'00001100'
retlw b'00000011'
retlw b'00000000';rut5
retlw b'00000011'
retlw b'00000110'
retlw b'00001100'
retlw b'00011000'
retlw b'00110000'
retlw b'01100000'
retlw b'11000000'
retlw b'10000001'
retlw b'11111111';rut6
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000'
retlw b'11111111'
retlw b'00000000';rut7
retlw b'10000000'
retlw b'11000000'
retlw b'11100000'
retlw b'11110000'
retlw b'11111000'
retlw b'11111100'
retlw b'11111110'
retlw b'11111111'
retlw b'11111111';rut8
retlw b'01111111'
retlw b'00111111'
retlw b'00011111'
retlw b'00001111'
retlw b'00000111'
retlw b'00000011'
retlw b'00000001'
retlw b'00000000'
;***************retardos******************
delaym movlw 0x16
movwf tempo1
carget movlw 0x32
movwf tempo2
carget2 movlw 0x32
movwf tempo3
reta1 decfsz tempo3,1
goto reta1
decfsz tempo2,1
goto carget2
decfsz tempo1,1
goto carget
return
delay1 movlw 0x08
movwf tempo1
carget3 movlw 0x04
movwf tempo2
reta2 decfsz tempo2,1
goto reta2
decfsz tempo1,1
goto carget3
return
;************cambio*de*velocidad**********
pulvel btfsc PORTA,1
call delay1
btfsc PORTA,1
call delaym
call delaym
return
***********Suelta
pulsador1***************
porfin btfsc PORTA,0
call
delay1
btfsc PORTA,0
goto porfin
return
end
I.
Diagramas de flujo
Segunda
parte
Ejercicio
1.2.1: Control de una pantalla LCD de mínimo 2x16 y Ejercicio 1.2.2:
Control
de un teclado matricial mínimo 4x3.
_Move_Delay:
;Control de una pantalla LCD
2x16_Ejer1.c,63 :: void
Move_Delay() {
;Control de una pantalla LCD
2x16_Ejer1.c,64 :: Delay_ms(500); // velocidad de movimiento.
MOVLW 3
MOVWF R11+0
MOVLW 138
MOVWF R12+0
MOVLW 85
MOVWF R13+0
L_Move_Delay0:
DECFSZ R13+0, 1
GOTO L_Move_Delay0
DECFSZ R12+0, 1
GOTO L_Move_Delay0
DECFSZ R11+0, 1
GOTO L_Move_Delay0
NOP
NOP
;Control de una pantalla LCD
2x16_Ejer1.c,65 :: }
L_end_Move_Delay:
RETURN
; end of _Move_Delay
_main:
;Control de una pantalla LCD
2x16_Ejer1.c,68 :: void
main( void )
;Control de una pantalla LCD
2x16_Ejer1.c,71 :: TRISA.F4
= 1;
BSF TRISA+0, 4
;Control de una pantalla LCD
2x16_Ejer1.c,74 :: Lcd_Init(); // inicializar LCD
CALL _Lcd_Init+0
;Control de una pantalla LCD
2x16_Ejer1.c,76 :: Lcd_Cmd(_LCD_CLEAR); // limpia el display
MOVLW 1
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,77 :: Lcd_Cmd(_LCD_CURSOR_OFF); // apaga el cursor
MOVLW 12
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,78 :: Lcd_Out(1,2,txt1); // escribe el texto en fila(1)
columna(2)
MOVLW 1
MOVWF FARG_Lcd_Out_row+0
MOVLW 2
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt1+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,85 :: for(i=0;
i<39; i++) { // mueve el
texto a la izquierda 39 veces
CLRF _i+0
L_main1:
MOVLW 39
SUBWF _i+0, 0
BTFSC STATUS+0, 0
GOTO L_main2
;Control de una pantalla LCD
2x16_Ejer1.c,87 :: Lcd_Cmd(_LCD_SHIFT_LEFT);
MOVLW 24
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,88 :: Move_Delay();
CALL _Move_Delay+0
;Control de una pantalla LCD
2x16_Ejer1.c,85 :: for(i=0;
i<39; i++) { // mueve el
texto a la izquierda 39 veces
INCF _i+0, 1
;Control de una pantalla LCD
2x16_Ejer1.c,89 :: }
GOTO L_main1
L_main2:
;Control de una pantalla LCD
2x16_Ejer1.c,91 :: Lcd_Cmd(_LCD_CLEAR); // limpia el display
MOVLW 1
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,92 :: Lcd_Cmd(_LCD_CURSOR_OFF); // apaga el cursor
MOVLW 12
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,93 :: Lcd_Out(1,3,txt2); // escribe el texto en fila(1)
columna(3)
MOVLW 1
MOVWF FARG_Lcd_Out_row+0
MOVLW 3
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt2+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,96 :: Lcd_Out(2,1,txt3); // escribe el texto en fila(2)
columna(1)
MOVLW 2
MOVWF FARG_Lcd_Out_row+0
MOVLW 1
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt3+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,101 :: pulso=0;
BCF _pulso+0, BitPos(_pulso+0)
;Control de una pantalla LCD
2x16_Ejer1.c,102 :: while
(pulso==0)
L_main4:
BTFSC _pulso+0, BitPos(_pulso+0)
GOTO L_main5
;Control de una pantalla LCD
2x16_Ejer1.c,104 :: if(
PORTA.F4==1 ) //Evalúa el valor del bit RA4.
BTFSS PORTA+0, 4
GOTO L_main6
;Control de una pantalla LCD
2x16_Ejer1.c,106 :: delay_ms(300);
MOVLW 2
MOVWF R11+0
MOVLW 134
MOVWF R12+0
MOVLW 153
MOVWF R13+0
L_main7:
DECFSZ R13+0, 1
GOTO L_main7
DECFSZ R12+0, 1
GOTO L_main7
DECFSZ R11+0, 1
GOTO L_main7
;Control de una pantalla LCD
2x16_Ejer1.c,107 :: pulso =
1;
BSF _pulso+0, BitPos(_pulso+0)
;Control de una pantalla LCD
2x16_Ejer1.c,108 :: Lcd_Cmd(_LCD_CLEAR); // limpia el display
MOVLW 1
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,109 :: Lcd_Cmd(_LCD_CURSOR_OFF); // apaga el cursor
MOVLW 12
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,110 :: Lcd_Out(1,3,txt4); // escribe el texto en fila(1)
columna(3)
MOVLW 1
MOVWF FARG_Lcd_Out_row+0
MOVLW 3
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt4+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,112 :: delay_ms(2000);
MOVLW 11
MOVWF R11+0
MOVLW 38
MOVWF R12+0
MOVLW 93
MOVWF R13+0
L_main8:
DECFSZ R13+0, 1
GOTO
L_main8
DECFSZ R12+0, 1
GOTO L_main8
DECFSZ R11+0, 1
GOTO L_main8
NOP
NOP
;Control de una pantalla LCD
2x16_Ejer1.c,115 :: }
L_main6:
;Control de una pantalla LCD
2x16_Ejer1.c,116 :: }
GOTO L_main4
L_main5:
;Control de una pantalla LCD
2x16_Ejer1.c,120 :: Lcd_Cmd(_LCD_CLEAR); // limpia el display
MOVLW 1
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,121 :: Lcd_Cmd(_LCD_CURSOR_OFF); // apaga el cursor
MOVLW 12
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,122 :: Lcd_Out(2,3,txt6); // escribe el texto en fila(2)
columna(2)
MOVLW 2
MOVWF FARG_Lcd_Out_row+0
MOVLW 3
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt6+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,128 :: for(i=0;
i<18; i++) { // mueve el
texto a la izquierda 39 veces
CLRF _i+0
L_main9:
MOVLW 18
SUBWF _i+0, 0
BTFSC STATUS+0, 0
GOTO L_main10
;Control de una pantalla LCD
2x16_Ejer1.c,130 :: Lcd_Cmd(_LCD_SHIFT_LEFT);
MOVLW 24
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,131 :: Move_Delay();
CALL _Move_Delay+0
;Control de una pantalla LCD
2x16_Ejer1.c,128 :: for(i=0;
i<18; i++) { // mueve el
texto a la izquierda 39 veces
INCF _i+0, 1
;Control de una pantalla LCD
2x16_Ejer1.c,132 :: }
GOTO L_main9
L_main10:
;Control de una pantalla LCD
2x16_Ejer1.c,135 :: Lcd_Cmd(_LCD_CLEAR); // limpia el display
MOVLW 1
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,136 :: Lcd_Cmd(_LCD_CURSOR_OFF); // apaga el cursor
MOVLW 12
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,137 :: Lcd_Out(2,3,txt7); // escribe el texto en fila(2)
columna(2)
MOVLW 2
MOVWF FARG_Lcd_Out_row+0
MOVLW 3
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt7+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD 2x16_Ejer1.c,143
:: for(i=0; i<19; i++)
{ // mueve el texto a la
izquierda 39 veces
CLRF _i+0
L_main12:
MOVLW 19
SUBWF _i+0, 0
BTFSC STATUS+0, 0
GOTO L_main13
;Control de una pantalla LCD
2x16_Ejer1.c,145 :: Lcd_Cmd(_LCD_SHIFT_LEFT);
MOVLW 24
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,146 :: Move_Delay();
CALL _Move_Delay+0
;Control de una pantalla LCD
2x16_Ejer1.c,143 :: for(i=0;
i<19; i++) { // mueve el
texto a la izquierda 39 veces
INCF _i+0, 1
;Control de una pantalla LCD
2x16_Ejer1.c,147 :: }
GOTO L_main12
L_main13:
;Control de una pantalla LCD
2x16_Ejer1.c,151 :: pulso=0;
BCF _pulso+0, BitPos(_pulso+0)
;Control de una pantalla LCD
2x16_Ejer1.c,152 :: while
(pulso==0)
L_main15:
BTFSC _pulso+0, BitPos(_pulso+0)
GOTO L_main16
;Control de una pantalla LCD
2x16_Ejer1.c,154 :: if(
PORTA.F4==1 ) //Evalúa el valor del bit RA4.
BTFSS PORTA+0, 4
GOTO L_main17
;Control de una pantalla LCD
2x16_Ejer1.c,156 :: delay_ms(300);
MOVLW 2
MOVWF R11+0
MOVLW 134
MOVWF R12+0
MOVLW 153
MOVWF R13+0
L_main18:
DECFSZ R13+0, 1
GOTO L_main18
DECFSZ
R12+0, 1
GOTO L_main18
DECFSZ R11+0, 1
GOTO L_main18
;Control de una pantalla LCD
2x16_Ejer1.c,157 :: pulso =
1;
BSF _pulso+0, BitPos(_pulso+0)
;Control de una pantalla LCD
2x16_Ejer1.c,158 :: Lcd_Cmd(_LCD_CLEAR); // limpia el display
MOVLW 1
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,159 :: Lcd_Cmd(_LCD_CURSOR_OFF); // apaga el cursor
MOVLW 12
MOVWF FARG_Lcd_Cmd_out_char+0
CALL _Lcd_Cmd+0
;Control de una pantalla LCD
2x16_Ejer1.c,160 :: Lcd_Out(1,7,txt9); // escribe el texto en fila(1)
columna(7)
MOVLW 1
MOVWF FARG_Lcd_Out_row+0
MOVLW 7
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt9+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,162 :: Lcd_Out(2,3,txt10); // escribe el texto en fila(1)
columna(3)
MOVLW 2
MOVWF FARG_Lcd_Out_row+0
MOVLW 3
MOVWF FARG_Lcd_Out_column+0
MOVLW _txt10+0
MOVWF FARG_Lcd_Out_text+0
CALL _Lcd_Out+0
;Control de una pantalla LCD
2x16_Ejer1.c,164 :: }
L_main17:
;Control de una pantalla LCD
2x16_Ejer1.c,165 :: }
GOTO L_main15
L_main16:
;Control de una pantalla LCD
2x16_Ejer1.c,167 :: while (1)
{} //bucle infinito
L_main19:
GOTO L_main19
;Control de una pantalla LCD
2x16_Ejer1.c,168 :: }
L_end_main:
GOTO $+0
; end of _main











No hay comentarios:
Publicar un comentario