Está en la página 1de 13

;******************************************************************************* *** ; Proyecto de cerradura electronica con pic ; Por Newlin Nieves.

; con 8 digitos para la clave ;******************************************************************************* *** list cblock 0x11 digito_1 digito_2 digito_3 digito_4 digito_5 digito_6 digito_7 digito_8 di_tem_1 di_tem_2 di_tem_3 di_tem_4 di_tem_5 di_tem_6 di_tem_7 di_tem_8 cont_err cont_tecla temp_1 temp_2 Delay_1 Delay_2 Delay_3 endc w f indf tmr0 opcion pcl status fsr trisa trisb porta portb eedato eecon1 eeadr eecon2 pclath intcon nuevo equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ equ 0 1 0x00 0x01 0x01 0x02 0x03 0x04 0x05 0x06 0x05 0x06 0x08 0x08 0x09 0x09 0x0a 0x0b 0x21 ;Referencia al acumulador ;Referencia al registro fuente ;Direccionado indirecto ;Registro del timer 0 ;Registro de opciones ;8 bits de menos peso del PC ;Registro de estado ;Registro de indireccin ;Regitsro de direccionado de la puerta A ;Registro de direccionado de la puerta B ;Registro de la puerta A ;Registro de la puerta B ;Regsitro de datos EEPROM ;Registro 1 de control EEPROM ;Registro de direcciones EEPROM ;Registro 2 de control EEPROM ;Parte alta del PC ;Registro de control de interrupcin p=16f84 ;Tipo de procesador

;Variables para los dgitos clave

;Temporales para los dgitos ;Contador de fallos ;Contador de teclas pulsadas ;Variables temporales ;Variables para la temporizacin de 1 s

#define #define #define #define #define #define #define #define B #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define #define o) #define #define #define #define #define

_ps0 _ps1 _ps2 _psa _t0se _t0cs _intedg _rbpu

opcion,0 opcion,1 opcion,2 opcion,3 opcion,4 opcion,5 opcion,6 opcion,7

;Bit 0 de seleccin del preescaler ;Bit 1 de seleccin del preescaler ;Bit 2 de seleccin del preescaler ;Asignacin del preescaler a TMR0 o WDT ;Seleccin de tipo de flanco para TMR0 ;Seleccin de tipo de reloj para el TMR0 ;Seleccin de flanco de la interrupcin INT ;Actibacin de cargas pull-up para puerta

_rbif _intf _t0if _rbie _inte _t0ie _eeie _gie _c _dc _z _pd _to _rp0 _rp1 _irp

intcon,0 intcon,1 intcon,2 intcon,3 intcon,4 intcon,5 intcon,6 intcon,7 status,0 status,1 status,2 status,3 status,4 status,5 status,6 status,7

;Flag de interrupcin de la puerta B ;Flag de interrupcin externa INT ;Flag de interrupcin del TMR0 ;Habilitacin de interrupcin de la puerta B ;Habilitacin de la interrupcin externa INT ;Habilitacin de interrupcin del TMR0 ;Habilitacin de interrupcin de la EEPROM ;Habilitacin global de interrupciones ;Flag de acarreo ;Flag de acarreo decimal ;Flag Z (a "1" si resultado=0) ;Flag de "power down" ;Flag de "WDT Timer Out" ;Bit 0 selector de pgina ;Bit 1 selector de pgina ;Seleccin de bancos (direcionado indirect

_rd _wr _wren _wrerr _eeif

eecon1,0 eecon1,1 eecon1,2 eecon1,3 eecon1,4

;Orden de lectura ;Orden de escritura ;Permiso de escritura ;Flag de error de escritura ;Flad de fin de escritura

org goto org tabla Mens_1 movwf equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw

0 Inicio 5 pcl $ '(' '*' ')' ' ' 'A' 'p' 'e' 'r' 't' 'u' 'r'

;Vector de inicio

;Desplazamiento sobre la tabla

retlw retlw Mens_1_1 equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw equ retlw retlw retlw retlw retlw retlw retlw retlw retlw equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw

'a' 0x00 $ '(' '#' ')' ' ' 'C' 'a' 'm' 'b' 'i' 'o' ' ' 'C' 'l' 'a' 'v' 'e' 0x00 $ 'C' 'l' 'a' 'v' 'e' ' ' '?' ' ' 0x00 $ '(' '#' ')' ' ' 'C' 'a' 'n' 'c' 'e' 'l' 'a' 'r' 0x00 $ 'N' 'u' 'e' 'v' 'a' ' ' 'C' 'l' 'a' 'v' 'e'

Mens_2

Mens_2_1

Mens_3

retlw retlw Mens_4 equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw equ retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw cblock 0x0C CONT1 CONT2 Num_tecla Temp_Tecla Static endc TECLADO

' ' 0x00 $ 'C' 'o' 'n' 'f' 'i' 'r' 'm' 'a' 'r' ' ' 0x00 $ 'P' 'u' 'e' 'd' 'e' ' ' 'P' 'a' 's' 'a' 'r' 0x00 $ 'A' 'C' 'C' 'E' 'S' 'O' ' ' 'D' 'E' 'N' 'E' 'G' 'A' 'D' 'O' 0x00

Mens_5

Mens_6

; ; ; ; ;

Contador Contador Reg. de tecla pulsada Reg. de lectura Temporal Reg. de Flags ; Pagina 1 ; RB<0-3> Salidas a Columnas ; RB<4-7> Entradas a Filas

bsf _rp0 movlw b'11110000' movwf trisb

bsf _rbpu bcf _rp0 ; Test clrf Static clrf Num_tecla movlw 0x0E movwf portb nop btfss portb,4 goto CRONOS incf Num_tecla,f btfss portb,5 goto CRONOS incf Num_tecla,f btfss portb,6 goto CRONOS incf Num_tecla,f btfss portb,7 goto CRONOS incf Num_tecla,f movlw 0x10 subwf Num_tecla,w btfsc _z goto No_Tecla bsf _c rlf portb,f goto Que_tecla No_Tecla Fuera CRONOS movlw 0x80 movwf Num_tecla return btfsc Static,7 goto CRONOS_1 bsf Static,7 movf Num_tecla,w movwf Temp_Tecla goto CRONOS_2 bcf Static,7 movf Num_tecla,w subwf Temp_Tecla,w btfss _z goto No_Tecla movf Num_tecla,w call Tabla movwf Num_tecla goto Fuera movlw 0x05 movwf CONT1 clrf CONT2 decfsz CONT2,f goto $ - 1

; activa pull_up ; Pagina 0 ; ; ; ; ; Flag de proceso Contador teclas a 0. 0000 1110 <== al portb espera para asegurar la seal

Que_tecla

; Salta la sig. si RB<4>=1 ; A temporizar ;

; Valor limite de Num_tecla. ; ; ; ; Si _z=0 el resultado no fu 0. Si _z=1 lleg a mximo de Num_tecla. Carry a 1 xxxx

; 0x080 cdigo de que no hay tecla ; pulsada ; Retorno ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; Flag.Si bit 7=0 es 2 pasada.Si bit 7=1.. salta esta instruccion. Flag de proceso 1 pasada guarda valor de Num_tecla en temporal.. y va a temporizar. Es la 2 pasada.Baja Flag de aviso.. Num_tecla==>w RESTA. Si _z=1 ==>Num_tecla=Temp_Tecla, va $+1 Si _z=0 resultado <> 0. Num_tecla=desplazamiento en tabla localizacin del valor de la tecla w retorna con el valor. Num_tecla ya contiene el cdigo de tecla.

CRONOS_1

CRONOS_2 CRONOS_3

; Carga del bucle externo. ; 00 y decrementa pasando a FFh ; En este bucle anidado... ; se cuentan 0,000768s.

decfsz CONT1,f goto CRONOS_3 goto Test ; Tabla addwf retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw retlw 0x02,f 1 4 7 0x0A 2 5 8 0 3 6 9 0x0B 0x0F 0x0E 0x0D 0x0C bsf bcf bsf bcf bcf bsf porta,2 porta,2 porta,1 porta,1 porta,0 porta,0

; En este bucle externo.. ; se cuenta 9 veces el bucle interno. ; va a realizar 2 escaneo. ; pcl + w(desplazamiento en Tabla)

#define #define #define #define #define #define UP_LCD

ENABLE DISABLE LEER ESCRIBIR OFF_COMANDO ON_COMANDO

;Activa E ;Desactiva ;Pone LCD en Modo RD ;Pone LCD en Modo WR ;Desactiva RS (modo comando) ;Activa RS ;Banco 1 ;RB <0-7> salidas digitales ;RA0=RS RA1=R/W RA2=E ;RA<0,1,2> Sd. RA<3,4> Ed. ;Preescaler asignado al ;timer 0 Div 1:128 ;Banco 0 ;Desactivar interrupciones. ;RS=0 ;E=0 ;Pone el LCD en Modo RD ;Puerta B como entrada ;Selecciona el banco 0 ;Activa el LCD ;Chequea bit de Busy ;Desactiva LCD ;Puerta B salida ;Pone LCD en modo WR

bsf _rp0 clrf trisb movlw B'00011000' movwf trisa movlw B'10000111' movwf opcion bcf _rp0 movlw 0 movwf intcon OFF_COMANDO DISABLE return LEER bsf _rp0 movlw H'FF' movwf trisb bcf _rp0 ENABLE nop btfsc portb,7 goto $-1 DISABLE bsf _rp0 clrf trisb bcf _rp0 ESCRIBIR return

LCD_BUSY

; ;--------------------------------------------------------------------------

;LCD_E: Pulso de Enable ; LCD_E ENABLE ;Activa E nop DISABLE ;Desactiva E return ; ;-------------------------------------------------------------------------;LCD_DATO: Escritura de datos en DDRAM o CGRAM ; LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando) movwf portb ;Valor ASCII a sacar por portb call LCD_BUSY ;Espera a que se libere el LCD ON_COMANDO ;Activa RS (modo dato). goto LCD_E ;Genera pulso de E ;-------------------------------------------------------------------------;LCD_REG: Escritura de comandos del LCD ;W=Cdigo de comando para el LCD ;W ==> portb ; LCD_REG OFF_COMANDO ;Desactiva RS (modo comando) movwf portb ;Cdigo de comando. call LCD_BUSY ;LCD libre?. goto LCD_E ;SI.Genera pulso de E. ; ;--------------------------------------------------------------------------;LCD_INI: icializacin del LCD ; LCD_INI movlw D'3' ;Contador de inicializacin movwf CONT1 ;interface de 8 bits,2 lneas de clrwdt movlw b'00111000' ;caracteres 5-7,datos de 8 bits.(#) call LCD_REG ;Comando. movlw H'D6' ;5ms.(Especificacin de Fabricante) movwf tmr0 btfss intcon,2 ;Rebos el timer 0? goto $-1 ;NO. bcf intcon,2 ;SI.Borrar flag TOIF. decfsz CONT1,1 ;Decrementar contador goto $-9 return ; ;------------------------------------------------------------------------;BORRA_Y_HOME: Borra el display y retorna el cursor a la posicin 0 ; BORRA_Y_HOME movlw b'00000001' ;Borra LCD y Home. call LCD_REG return ; ;------------------------------------------------------------------------;DISPLAY_ON_CUR_OFF: Control ON/OFF del display y cursor. ;Activa Display desactiva cursor. DISPLAY_ON_CUR_OFF movlw b'00001100' call LCD_REG return ;LCD on,cursor off.

Key_Off

Key_Off_No

movf movwf bcf movlw call bsf call movlw subwf btfss goto movf movwf return movwf decfsz goto decfsz goto decfsz goto return movwf movf call movwf movf btfss goto return call incf goto movlw movwf movlw movwf call movlw subwf btfsc goto call movlw call call movlw subwf btfsc goto goto bsf return

Num_tecla,w temp_1 porta,3 1 Delay porta,3 TECLADO 0x80 Num_tecla,w _z Key_Off_No temp_1,w Num_tecla

;Guarda temporalmente la tecla ;Activa zumbador beep ;Temporiza ;Beep OFF

;Se ha soltado la tecla ? ;Todavia no ;Ahora si ;Repone la tecla pulsada

Delay Delay_loop

Delay_1 Delay_3,f Delay_loop Delay_2,f Delay_loop Delay_1,f Delay_loop

Mensaje Mensaje_1

temp_1 temp_1,w tabla temp_2 temp_2,f _z No_es_ultimo LCD_DATO temp_1,f Mensaje_1 8 cont_tecla digito_1 fsr TECLADO 0x80 Num_tecla,w _z N_tecla UP_LCD '-' LCD_DATO Key_Off 0x0c Num_tecla,w _z Es_Can No_es_Can temp_1,1

;Salva posicin de la tabla ;Recupera posicin de la tabla ;Busca caracter de salida ;Guarda el caracter ;Mira si es el ltimo ;Visualiza en el LCD ;Siguiente caracter ;Repite con siguiente caracter ;Inicia contador de pulsaciones ;Apunta al inicio del buffer de tecla ;Explora el teclado ;Hay alguna pulsada ? ;NO ;Reconfigura el LCD ;Visualiza el ;Genera Beep y espera se libere ;Mira si es tecla C (Cancelar) ;Activa Flag de cancelacin

No_es_ultimo

Control

N_tecla

Es_Can

No_es_Can

bcf movf movwf incf decfsz goto return bcf movlw movwf movlw movwf clrf call movf andlw subwf btfss bsf incf incf decfsz goto return

temp_1,1 Num_tecla,w indf fsr,f cont_tecla,f N_tecla temp_1,0 8 cont_tecla digito_1 fsr eeadr EE_Read eedato,w 0x0f indf,w _z temp_1,0 eeadr,f fsr,f cont_tecla,f Okey_1

;Desactiva Flag de cancelacin ;Almacena la tecla en el buffer ;Siguiente posicin del buffer ;Actualiza contador de tecla ;Repite el proceso ;Borra flag de error ;Nmero de bytes a comprobar ;Primer dgito ;Primera posicin de la EEPROM ;Lee byte de la EEPROM ;Lo compara con el del buffer ;Mira si es igual ;NO, activa flag de error ;Siguiente posicin de la EEPROM ;Siguiente dgito ;Repite la comprobacin

Okey

Okey_1

EE_Read

bsf _rp0 bsf _rd bcf _rp0 return bsf bsf movlw movwf movlw movwf bsf bcf btfss goto bcf bcf return call call call movlw movwf clrf call movlw subwf btfss goto _rp0 _wren 0x55 eecon2 0xaa eecon2 _wr _wren _eeif Wait _eeif _rp0

;Selecciona banco 1 ;Orden de lectura ;Seleccin banco 0 ;Selecciona banco 1 ;Permiso de escritura

EE_Write

Wait

;Secuencia segn Microchip ;Orden de escritura ;Evita posteriores escrituras ;Testear final de byte grabado ;Reponer flag de final ;Seleccin banco 0

Inicio

UP_LCD LCD_INI ;Inicializa LCD DISPLAY_ON_CUR_OFF b'00011000' porta eeadr EE_Read 0xff eedato,w _z Si_usada ;Posicin EEPROM de la firma ;Lee byte de EEPROM ;Mira si est usada

No_usada No_usada_1

clrf movlw movwf incf call incf decfsz goto call movlw call movlw call movlw call call movlw subwf btfsc goto call movlw subwf btfsc goto movlw subwf btfss goto call call movlw call movlw call movlw call call btfsc goto call btfsc goto call call movlw call movlw call movlw call call btfsc

eedato 8 temp_1 eedato,f EE_Write eeadr,f temp_1,f No_usada_1 BORRA_Y_HOME Mens_1 Mensaje 0xc0 LCD_REG Mens_1_1 Mensaje TECLADO 0x80 Num_tecla,w _z No_hay Key_Off 0x0D Num_tecla,w _z Si_es_A 0x0C Num_tecla,w _z No_hay UP_LCD BORRA_Y_HOME Mens_2_1 Mensaje 0xc0 LCD_REG Mens_2 Mensaje Control temp_1,1 Si_usada Okey temp_1,0 Si_usada UP_LCD BORRA_Y_HOME Mens_2_1 Mensaje 0xc0 LCD_REG Mens_3 Mensaje Control temp_1,1

;Nmero de bytes a guardar ;Clave a guardar ;Graba dato

Si_usada

;Actualiza LCD ;Offset del mensaje 1 ;Visualiza "Apertura (A)" ;Ajusta posicin del mensaje ;Offset del mensaje 1.1 ;Visualiza "Cambio Clave (C)" ;Explora el teclado ;Hay tecla ;Genera beep y espera se libere ;Es la tecla A (Apertura) ?

No_hay

No_es_A

;Es la tecla C (Cambio clave) ? ;Reconfigura LCD ;Actualiza ;Offset del mensaje 2.1 ;Visualiza "Cancelar (C)" ;Reposiciona cursor del LCD ;Offset del mensaje 2 ;Visualiza "Clave ?" ;Espera se introduza clave actual ;Hubo cancelacin ?? ;Si. ;Comprueba si es correcta ;Es vlida ? ;No, vuelta al principio ;Si. Reconfigura LCD ;Borra e inicia el LCD ;Offset del mensaje 2.1 ;Visualiza "(C) Cancelar" ;Reposiciona el LCD ;Offset del mensaje 3 ;Visualiza "Nueva clave" ;Espera que se pulse la nueva clave ;Hubo cancelacin ??

Si_es_C

goto call call movlw call movlw call movlw call movf movwf movf movwf movf movwf movf movwf movf movwf movf movwf movf movwf movf movwf call btfsc goto movf subwf btfss goto movf subwf btfss goto movf subwf btfss goto movf subwf btfss goto movf subwf btfss goto movf subwf btfss

Si_usada UP_LCD BORRA_Y_HOME Mens_2_1 Mensaje 0xc0 LCD_REG Mens_4 Mensaje digito_1,w di_tem_1 digito_2,w di_tem_2 digito_3,w di_tem_3 digito_4,w di_tem_4 digito_5,w di_tem_5 digito_6,w di_tem_6 digito_7,w di_tem_7 digito_8,w di_tem_8 Control temp_1,1 Si_usada digito_1,w di_tem_1,w _z Si_usada digito_2,w di_tem_2,w _z Si_usada digito_3,w di_tem_3,w _z Si_usada digito_4,w di_tem_4,w _z Si_usada digito_5,w di_tem_5,w _z Si_usada digito_6,w di_tem_6,w _z

;Si. ;Reconfigura LCD ;Borra e inicia LCD ;Offset del mensaje 2.1 ;Visualiza "(C) Cancelar" ;Reposicionar LCD ;Offset del mensaje 4 ;Visualiza "Confirmar"

;Salva temporalmente 1 clave ;Lee la segunda clave ;Hubo cancelacin ?? ;Si. ;Compara 1er.dgito ;Igual ? ;No ;Compara 2 dgito ;Igual ? ;No ;Compara 3er.dgito ;Igual ? ;No ;Compara 4 dgito ;Igual ? ;No ;Compara 5to.dgito ;Igual ? ;No ;Compara 6to dgito ;Igual ?

goto movf subwf btfss goto movf subwf btfss goto

Si_usada digito_7,w di_tem_7,w _z Si_usada digito_8,w di_tem_8,w _z Si_usada

;No ;Compara 7mo.dgito ;Igual ? ;No ;Compara 8vo dgito ;Igual ? ;No

Otro_digito

movlw movwf movlw movwf clrf movf movwf call incf incf decfsz goto goto movlw movwf call call movlw call movlw call movlw call call btfsc goto call btfsc goto call call movlw call call movlw call ;bcf ;bcf ;movlw ;call

8 cont_tecla digito_1 fsr eeadr indf,w eedato EE_Write fsr,f eeadr,f cont_tecla,f Otro_digito Si_usada 3 cont_err UP_LCD BORRA_Y_HOME Mens_2_1 Mensaje 0xc0 LCD_REG Mens_2 Mensaje Control temp_1,1 Si_usada Okey temp_1,0 No_Ok UP_LCD BORRA_Y_HOME Mens_5 Mensaje Newlin 0x10 Delay porta,4 porta,3 0x0a Delay

;N de octetos a grabar ;Indice de dgitos ;Primera direcin de EEPROM ;Carga digito ;Graba en EEPROM ;Siguiente dgito ;Siguiente posicin EEPROM

Si_es_A Otro_mas

;Establece nmero de intentos ;Reconfigura LCD ;Actualiza ;Offset del mensaje 2.1 ;Visualiza "Cancelar (C)" ;Reposicionar cursor del LCD ;Offset del mensaje 2 ;Visualiza "Clave ?" ;Espera que se introduzca la clave ;Hubo cancelacin ?? ;Si. ;Comprueba si es correcta ;Es vlida ? ;No ;Reconfigura LCD ;Borra e inicia LCD ;Offset del mensaje 5 ;Visualiza "Puede Pasar" ;Temporiza ;Si, activa rel ;Activa beep ;Temporiza 2 seg.

bsf bsf clrf goto No_Ok decfsz goto call call movlw call movlw call goto bsf movlw movwf bcf movlw movwf movlw call return ORG DE

porta,4 porta,3 cont_err Si_usada cont_err,f Otro_mas UP_LCD BORRA_Y_HOME Mens_6 Mensaje 0x10 Delay Si_usada

;Desactiva rel ;Desactiva beep ;Pone a 0 contador de intentos ;Repite el proceso ;Intento fallido ;Repite otro intento ;Reconfigura LCD ;Borra e inicia LCD ;Offset del mensaje 6 ;Visualiza "ACCESO DENEGADO" ;Temporiza ;Repite el proceso

Newlin

status,5 0X00 porta status,5 0X00 porta 0x02 Delay

;Temporiza

2100H 0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A end