hola saludos a toda la comunidad. Les cuento, soy nuevo en este foro y en la programacion de microcontroladores tambies (puedo decir que o que se lo he adquirido leyendo muchas veces infrmacion en este foro) nunca he tenido un guia que me oriente al respecto solo sigo lo que mi ogica me dicta, es por esto que quiero compartir con ustedes m primer proyecto desarrollado por mi. Se trata de una alarma para automovil con un teclado 4x4 y un lcd (creo que en este foro las alrmas ya no son nada original y la mia creo tampoco lo es). Bueno quisiera pedirles criticas al respecto del diseño del asm y todo lo que pueda servir para mejorar en un proximo proyecto. La idea en u futuro es incorporar un codogo tal que permita llamar a un celular pero por el momento mis pocos conocimientos (soy totalmente nuevo en esto) he logrado armar esto.
Esperando muchisimas criticas (ojala con respeto igual me esforce harto) para mejorar como diseñador me despidoaca dejo los codigos asm y el diseño en isis
cualquier aporte es bien recibido
muchas gracias a toda la comunidad por su atencion
al parecer para muchos puede resultar aburrido descargar el archivo por lo tanto aqui escribo el asm
Esperando muchisimas criticas (ojala con respeto igual me esforce harto) para mejorar como diseñador me despidoaca dejo los codigos asm y el diseño en isis
cualquier aporte es bien recibido
muchas gracias a toda la comunidad por su atencion
al parecer para muchos puede resultar aburrido descargar el archivo por lo tanto aqui escribo el asm
Código:
;se trata de una alarm apara automovil activada por un codigo ingresado por teclado
;la alarma cuando esta inactiva pasa al modo sleep hasta que se detecte que una tecla esta presionada
; si la puerta se abre y esta activada la alarma suena una sirena
;y muestra un mensaje de alerta
;para desactivarla pide un codigo el que esta guardado por programacion
;la tecla F funcioona como aceptar
;***********************************************************************************************************
include "p16f84a.inc"
__CONFIG _CP_OFF & _WDT_ON & _XT_OSC
;configuracion***********************************************
#DEFINE sirena PORTA,1 ;establece la sirena en RA1
#DEFINE led PORTA,3 ;establece el led de señalizacion on/off en RA3
#DEFINE puertas PORTA,4 ;establece la entrada de señal de puerta abierta
CBLOCK 0x0c ;aqui se guardan los datos o variables
ENDC
ORG 0
goto configuracion ;salta a configuracion para evitar el vector de reset
org 4 ;vector de reset
btfss STATUS,NOT_TO ;verifica si el reset fue a causa del watchdog
goto alarma ;si asi fue salta a alarma
goto interrupcion ;sino sigue interrupcion normalmente
include "Teclado.inc" ; incluye libreria de teclado
Mensajes ; se establecen los mensajes
addwf PCL,F
Mensajeclave
DT "INGRESE CLAVE",0X00
Mensajeclaveacep
DT "CLAVE ACEPTADA",0x00
Mensajeclaverech
DT "CLAVE RECHAZADA",0x00
Mensajealarmact
DT "ALARM ENCENDIDA",0x00
Mensajealarmdesact
DT "ALARM APAGADA",0x00
Mensajeactivar
DT " ENCENDER??",0x00
Mensajedesactivar
DT " APAGAR??",0x00
Mensajetecladobloq
DT " TECLADO BLOQ", 0X00
Mensajesirena
DT "ALARMA!!!!!!!!!",0x00
FinMensajes
;***************************************************************************************************
configuracion ;configuracion de puertos e inicializacion d componentes
bsf STATUS,RP0 ;acceso al banco1
bcf led ;establece led como salida (RA3)
bcf sirena ;establece sirena com salida (RA1)
movlw b'00001111' ;carga en option las opciones paara conseguir elmayor tiempo
movwf OPTION_REG; en el watchdog
bcf STATUS,RP0 ;acceso al banco0
call LCD_Inicializa ;rutina que configura el lcd
call Teclado_Inicializa ;rutina que configura el teclado
btfss STATUS,NOT_TO ;revisa si la interrupcion fue a causa del wdt
goto alarma ;va a alarma
movlw b'10001000' ;prepara para que se puedan ocupar las interrupciones
movwf INTCON
;programa******************************************************************************************
principal ;programa principal
principal0
clrwdt ;borra la cuenta del wdt pra evitar desbordamiento
sleep ;pasa a modo bajo consumo
goto principal0 ;vuelve a la rutina principal
;interrupciones******************************************************************************
interrupcion
CBLOCK ;definicion de variables
suma ;se almacena la suma de los dgtos ingresados
contador; cuenta los ingresos fallidos de contraseña
intentos
ENDC
interrupcion0
clrf suma ;borra suma
clrf contador;borra contador
clrwdt
encender
bcf led ;apaga el led
movlw Mensajealarmdesact ; se visualiza en lcd alarma apagada
call LCD_Mensaje; rutina qu provoca que se visualice en el lcd el conetenido de w
call LCD_Linea2 ;se posiciona cursor en linea dos
movlw Mensajeactivar; se visualiza encender???
call LCD_Mensaje
clrwdt
call Retardo; pequeño retardo de 2s
aceptar ; ruina para aceptar encender o apagar la alrma
clrwdt
call Teclado_LeeHex; usca tecla pusada la devuelve en w
sublw 0x0F; verifica si la teca es la F(aceptar)
btfss STATUS,Z;revisa flag z si es f salta
goto aceptar; si no es f se devuelve hasta que sea apretada la f
clrwdt
call Teclado_EsperaDejePulsar ;evita que la tecla siga pulsada
call LCD_Borra ;borra pantalla del lcd
clrf intentos ;borra memoria intentos
clrwdt
lecturaclave
clrf contador
clrf suma
clrwdt
lecturaclave0
call LCD_Borra
movlw Mensajeclave ;se visualiza ingrse clave
call LCD_Mensaje
call LCD_Linea2
lecturaclave1
clrwdt
call Retardo_50ms
call Teclado_LeeHex; se devuelve el digito pulsado
btfss STATUS,C;comprueba si se pulso un digito
goto lecturaclave1;si no se pulso vuelve a revisar
addwf suma,F ;suma el contenido de w con el contenido de suma y lo guarda en este ultimo
call Teclado_EsperaDejePulsar
movlw "*" ;se visualiza un asterisco
call LCD_Caracter
call LCD_CursorIncr ;se muve un espacio
clrwdt
incf contador,f ;incrementa para setiar la cantdad de digitos a ingresar
movlw d'4' ;establece cantidad de digitos clave
subwf contador,w ;revisa si llego al limite de digitos de la clave
btfss STATUS,Z
goto lecturaclave1 ;si no se devuelve y se sigue ingresando digitos
clrwdt
movfw suma ;revisa si se cumple la condicion de la clave es decir que los digitos sumen 24
sublw d'24' ;primera condicion clave
btfss STATUS,Z ;revisa si se cumple
goto claverechazada ;si no va a clave rechazada
claveaceptada
btfsc led ;revisa si esta encendida o no la alrma
goto apagar1 ;si es ta encendida va a apagar1
encender1
clrwdt
call LCD_Borra
movlw Mensajeclaveacep; se visualiza mensaje clave aceptada
call LCD_Mensaje
call LCD_Linea2
movlw Mensajealarmact;se visualiza alarma encendida
call LCD_Mensaje
clrf intentos
bsf led ;prende led señalizador
goto scaneo ;va a escaneo
apagar1
clrwdt
call LCD_Borra
movlw Mensajeclaveacep
call LCD_Mensaje
call LCD_Linea2
movlw Mensajealarmdesact ;visualiza alarm apagada
call LCD_Mensaje
bcf led
bcf sirena ;apaga la sirena y el led
clrwdt
call Retardo
goto reset
claverechazada
clrwdt
call LCD_Borra
movlw Mensajeclaverech ;se visulaliza clave rechazada
call LCD_Mensaje
incf intentos,f ;incrementa intentos para controlar cantidad de ingresos fallidos
movlw d'3' ;establese cantidad max de 3 intentos
subwf intentos,w ;comprueba si hay tres intentos
clrwdt
call Retardo_2s
clrwdt
btfss STATUS,Z
goto lecturaclave;si no vuelve a intentar
tecladobloqueado
clrwdt
call LCD_Borra
movlw Mensajetecladobloq ;visualiza teclado bloqueado
call LCD_Mensaje
clrwdt
call Retardo_2s
clrwdt
bsf led ;enciende aarma y led
bsf sirena
goto desactivar ;va a rutina de desactivacion
apagar
desactivar
clrwdt
call LCD_Borra
movlw Mensajesirena ;visualiza mensaje alarma!!!!!!!!
call LCD_Mensaje
call LCD_Linea2
movlw Mensajedesactivar; viualiza desactivar?
call LCD_Mensaje
clrwdt
call Retardo_2s
clrwdt
goto aceptar ;vuelve a rutina aceptar
Retardo
clrwdt
call Retardo_2s
clrwdt
return
scaneo
call Retardo ;establece un retardo para permtir que se baje del auto
call Retardo ;una vez activada la alrma sin que esta se active
call Retardo
call Retardo
call Retardo
scaneo0
clrwdt
btfss puertas ;revisa si puertas abiertas
goto scaneo0 ;si no siue revisando
clrwdt
call Retardo
clrwdt
;lecturaclave ;este bloque ya esta comentado salvo algunasdiferencias señaladasy permite
clrf contador ;ingrsar la clave para que no se detone la sirena
clrf suma
clrwdt
;lecturaclave0
call LCD_Borra
movlw Mensajeclave
call LCD_Mensaje
call LCD_Linea2
clrwdt
lecturaclave11
call Teclado_LeeHex
btfss STATUS,C
goto lecturaclave11
addwf suma,F
call Teclado_EsperaDejePulsar
movlw "*"
call LCD_Caracter
call LCD_CursorIncr
incf contador,f
movfw suma ;otorga 2,8 seg mas para ingreesar el sgt digito correcto
sublw d'7'
btfss STATUS,Z
goto continuar
clrwdt
continuar
movfw suma; lo mismo anteriormente señalado
sublw d'9'
btfsc STATUS,Z
clrwdt
movfw suma
sublw d'15'
btfsc STATUS,Z
clrwdt
movlw d'4' ;establece cantidad de digitos clave
subwf contador,w
btfss STATUS,Z
goto lecturaclave11
;confirmacion clave
movfw suma
sublw d'24' ;primera condicion clave
btfss STATUS,Z
goto alarma
;claveaceptada
goto apagar1
alarma
clrwdt
call LCD_Borra
bsf sirena ;activa la sirena
goto desactivar
reset
bcf led
bcf sirena
bcf INTCON,RBIF ;restblece flag
call LCD_Borra
goto configuracion
retfie
include "retardos.inc"
include "lcd_4bit.inc"
include "lcd_mens.inc"
END
Adjuntos
Última edición por un moderador: