Cerradura electrónica con PIC

esta es mi programación
Código:
LIST P=16F876
#INCLUDE <P16F876.INC>

    __CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF &_CP_OFF & _WDT_OFF ;& _RPD_OFF & _PGD_OFF
;DEFINICION DE REGISTROS 
    CBLOCK 20
    ENDC
MENSTABLA EQU 21H
AUXA EQU 22H
AUXB EQU 23H
AUXC EQU 24H
REG_LCD EQU 25H
ROTA EQU 26H
TECLA EQU 27H
COLUMNA EQU 28H
DATALCD EQU 29H
FLAGCLAVE EQU 30H
C1 EQU    31H
C2 EQU    32H
C3 EQU    33H
C4 EQU    34H
I1 EQU    35H
I2 EQU    36H
I3 EQU    37H
I4 EQU    38H
FILA EQU 39H

#DEFINE ENABLE PORTA,0
#DEFINE RS PORTA,1


;PARA VISUALISAR MENSAJES EN LCD

VISMENSLCD    MACRO TABLA
            LOCAL MENSAJE,FIN
            CLRF MENSTABLA
MENSAJE        MOVF MENSTABLA,W
            CALL TABLA
            XORLW 1BH
            BTFSC STATUS,2
            GOTO FIN
            MOVF MENSTABLA,W
            CALL TABLA
            CALL WRITE_DATO
            INCF MENSTABLA,F
            GOTO MENSAJE
;FIN            NOP
            ENDM


;MACRO PARA LEER TECLA PULSADA
CAPT_TECLA    MACRO REG
            LOCAL CICLOTECLA
            MOVLW .20
            MOVWF TECLA
CICLOTECLA    CALL TECLADO    
            MOVF TECLA,W
            XORLW .20
            BTFSC STATUS,2
            GOTO CICLOTECLA
            MOVF TECLA,W
            MOVWF REG
            ENDM
;...............................................................................
            ORG 000H
            GOTO MAIN
            ORG 006H
;TABLAS DE MENSAJE LCD
CLAVEOK 
        ADDWF    PCL,F
        RETLW 'C'
         RETLW 'L'
         RETLW 'A'
         RETLW 'V'
         RETLW 'E'
        RETLW ' '
        RETLW 'I'
         RETLW 'G'
         RETLW 'U'
         RETLW 'A'
         RETLW 'L'
CLAVEERROR
        ADDWF PCL,F
        RETLW 'C'
         RETLW 'L'
         RETLW 'A'
         RETLW 'V'
         RETLW 'E'
        RETLW ' '
        RETLW 'E'
         RETLW 'R'
         RETLW 'R'
         RETLW 'A'
         RETLW 'D'
        RETLW 'A'
        RETLW 1BH
INGRESODECLAVE
        ADDWF PCL,F
        RETLW 'I'
        RETLW 'N'
        RETLW 'G'
        RETLW 'R'
        RETLW 'E'
        RETLW 'S'
        RETLW 'E'
        RETLW ':'
        RETLW ' '
        RETLW 1BH
ALMACENARCLAVE
        ADDWF PCL,F
        RETLW 'A'
        RETLW 'L'
        RETLW 'M'
        RETLW 'A'
        RETLW 'C'
        RETLW 'E'
        RETLW 'N'
        RETLW 'A'
        RETLW 'R'
        RETLW ' '
        RETLW 'C'
        RETLW 'L'
        RETLW 'A'
        RETLW 'V'
        RETLW 'E'
        RETLW ':'
        RETLW 1BH
;..................................................................................

;TABLAS PARA RUTINAS DE TECLADO

COLUMNA_1    ADDWF PCL,F
            RETLW 'A'
            NOP
            NOP
            NOP
            RETLW '3'
            NOP
            RETLW '2'
            RETLW '1'
            RETURN
    
COLUMNA_2    ADDWF PCL,F
            RETLW 'B'
            NOP
            NOP
            NOP
            RETLW '6'
            NOP
            RETLW '5'
            RETLW '4'
            RETURN
COLUMNA_3    
            ADDWF PCL,F
            RETLW'C'
            NOP
            NOP
            NOP
            RETLW '9'
            NOP
            RETLW '8'
            RETLW '7'
            RETURN
COLUMNA_4 
            ADDWF PCL,F
            RETLW'D'
            NOP
            NOP
            NOP
            RETLW '#'
            NOP
            RETLW '0'
            RETLW '*'
            RETURN
CONFIG_PIC
            BANKSEL TRISB
            MOVLW    b'10000111'
            MOVWF ADCON1
            MOVLW  b'00000000'
            MOVWF TRISB
            MOVLW b'11110000'
            MOVWF  TRISC
            MOVLW b'11111100'
            MOVWF TRISA
            BANKSEL PORTB
            CLRF PORTB
            CLRF PORTC
            RETURN
;......................................................................
;RUTINA DE RETARDO PARA LA ACTIVACION LCD
DELAY1    MOVLW .8
        MOVWF AUXA
LOOP1    MOVLW .200
        MOVWF AUXB
LOOP2    MOVLW .250
        MOVWF AUXC
LOOP3    NOP
        NOP
        DECFSZ AUXC,F
        GOTO LOOP3
        NOP
        DECFSZ AUXB,F
        GOTO LOOP2
        NOP
        DECFSZ AUXA,F
        GOTO LOOP1
        NOP
        RETURN
;...........................................................................
;RUTINA DE RETARDO PARA ENVIO DE INFORMACION A LCD
DELAY2    MOVLW    .3
        MOVWF    AUXA
LOP11    MOVLW    .255
        MOVWF    AUXB
LOP22    DECFSZ    AUXB,F
        GOTO    LOP22
        DECFSZ    AUXA,F
        GOTO    LOP11
        NOP 
        RETURN
;............................................................................
;RUTINA DE ESCRITURA DE INSTRUCCIONES O DATOS EN EL LCD
WRITE_INST    MOVWF REG_LCD
            BCF RS
            GOTO CONTINUAR
WRITE_DATO    MOVWF REG_LCD
            BSF RS
            NOP
            NOP
CONTINUAR    MOVF REG_LCD,W
            MOVWF PORTB
            BSF    ENABLE
            NOP
            NOP
            NOP
            BCF ENABLE
            CALL DELAY2
            RETURN
;CONFIGURACION INICIAL DE LCD

INI_LCD    CALL DELAY1
        MOVLW b'00111000'
        CALL WRITE_INST
        MOVLW b'00001100'
        CALL WRITE_INST
        MOVLW b'00000110'
        CALL WRITE_INST
        RETURN
SCAN_FIN
            BSF STATUS,C
            MOVF PORTC,W
            ANDLW 0x0F0
            XORLW 0x0F0
            BTFSS STATUS,2
            GOTO SCAN_FIN
            RETURN
ROTAR        RLF ROTA,F
            MOVF ROTA,W
            MOVWF PORTC
            BTFSC ROTA,4
            RETURN
TECLADO        CALL ROTAR
            MOVF PORTC,W
            ANDLW 0F0;11110000
            MOVWF COLUMNA
            SWAPF COLUMNA,F
            MOVF COLUMNA,W
            XORLW 0XF
            BTFSC STATUS,2
            RETURN
            BTFSS PORTC,0
            GOTO FILA_1
            BTFSS PORTC,1
            GOTO    FILA_2
            BTFSS PORTC,2
            GOTO FILA_3
            GOTO FILA_4
FILA_1    MOVLW .07
        SUBWF COLUMNA,W
        CALL COLUMNA_2
        MOVWF TECLA
        CALL SCAN_FIN
        RETURN
FILA_2    MOVLW .07
        SUBWF COLUMNA,W
        CALL COLUMNA_2
        MOVWF TECLA
        CALL SCAN_FIN
        RETURN
FILA_3    MOVLW .07
        SUBWF COLUMNA,W
        CALL COLUMNA_3
        MOVWF TECLA
        CALL SCAN_FIN
FILA_4    MOVLW .07
        SUBWF COLUMNA,W
        CALL COLUMNA_4
        MOVWF TECLA
        CALL SCAN_FIN
        RETURN
;RUTINA DE COMPARACION DE CLAVES
COMPCLAVES
        BCF FLAGCLAVE,0
        MOVF C1,W
        XORWF I1,W
        BTFSS STATUS,2
        RETURN
        MOVF C2,W
        XORWF I2,W
        BTFSS STATUS,2
        RETURN
        MOVF C3,W
        XORWF I3,W
        RETURN
        MOVF C4,W
        XORWF I4,W
        BTFSS STATUS,2
        RETURN
        BSF FLAGCLAVE,0
        RETURN

;PROGRAMA PRINCIPAL
MAIN 
        CALL CONFIG_PIC
        CALL INI_LCD
 VISMENSLCD ALMACENARCLAVE
            MOVLW b'11000001'
            CALL WRITE_INST
            CAPT_TECLA C1
            MOVLW '*'
            CALL WRITE_DATO
CLAVE1
            CAPT_TECLA C2
            MOVLW '*'
            CALL WRITE_DATO
CLAVE2
            CAPT_TECLA C3
            MOVLW '*'
            CALL WRITE_DATO
CLAVE3
            CAPT_TECLA C4
            MOVLW '*'
            CALL WRITE_DATO
CLAVE4
            CALL DELAY1
CICLOMAIN
            MOVLW b'00000001'
            CALL WRITE_INST
    VISMENSLCD    INGRESOCLAVE
CAPT_TECLA I1
CALL WRITE_DATO
CAPT_TECLA I2
CALL WRITE_DATO
CAPT_TECLA I3
CALL WRITE_DATO
CAPT_TECLA I4
CALL WRITE_DATO
MOVLW b'11000001'
CALL WRITE_INST
CALL COMPCLAVES
BTFSS FLAGCLAVE,0
GOTO ERRORC
VISMENSLCD CLAVEOK
CALL DELAY1
GOTO CICLOMAIN
ERRORC 
VISMENSLCD CLAVEERROR
CALL DELAY1
GOTO CICLOMAIN
END
y aquí os muestro el los errores que me salen
Código:
Message[302] C:\USERS\PROPIETARIO\CERRADURA PIC 16F876\CERRAR.ASM 184 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Error[113]   C:\USERS\PROPIETARIO\CERRADURA PIC 16F876\CERRAR.ASM 38 : Symbol not previously defined (INGRESOCLAVE)
Error[113]   C:\USERS\PROPIETARIO\CERRADURA PIC 16F876\CERRAR.ASM 43 : Symbol not previously defined (INGRESOCLAVE)
Warning[206] C:\USERS\PROPIETARIO\CERRADURA PIC 16F876\CERRAR.ASM 350 : Found call to
 
Última edición por un moderador:
Puedes hacer dos cosas.
Esta parte...
Código:
[B]INGRESODECLAVE[/B]
        ADDWF PCL,F
        RETLW 'I'
        RETLW 'N'
        RETLW 'G'
        RETLW 'R'
        RETLW 'E'
        RETLW 'S'
        RETLW 'E'
        RETLW ':'
        RETLW ' '
        RETLW 1BH
cambiarla por...
Código:
[B]INGRESOCLAVE[/B]
        ADDWF PCL,F
        RETLW 'I'
        RETLW 'N'
        RETLW 'G'
        RETLW 'R'
        RETLW 'E'
        RETLW 'S'
        RETLW 'E'
        RETLW ':'
        RETLW ' '
        RETLW 1BH
O esta parte...
VISMENSLCD INGRESOCLAVE
cambiarla por...
VISMENSLCD INGRESODECLAVE

Saludos.
 
Señores muy buenas , estoy realizando el circuito de cerradura electronica de clave es 0000, lo estoy simulando en proteus y no funciona a ver si alguien me pude ayudar a les adjunto todo lo q' avanzado asta ahora ojala alguien me pueda ayudar
 

Adjuntos

  • pic16f876.rar
    1.8 MB · Visitas: 123
Ese programa es muy parecido a este que adjunto, solo que este si funciona.
Si te fijas al ver los programas notarás que son similares.
No recuerdo de que pagina lo conseguí, y el programa estaba hecho para un PIC16F877A.
Recuerdo que el archivo contenía el diseño de simulación muy mal realizado, y lo modifique.
También adapté el código para trabajar con un PIC16F873A
Como el PIC16F876 es similar, con solo cambiar el tipo de PIC te funcionará.

Suerte.
 

Adjuntos

  • 16F873A Cerradura con Clave.zip
    39.4 KB · Visitas: 197
Oye amigo puse el código de ese programa de la cerradura electrónica en el pic16f873a hice un pcb pero lo que pasa esque se me movió la clave y ya no se cuál es , no lo puedo quemar de nuevo por que me marca error en la EEPROM 0x0000 necesito saber si ahí alguna manera de regresarlo a 0000 como estaba antes ? O encontrar la clave que se tecleó
 
Oye amigo puse el código de ese programa de la cerradura electrónica en el pic16f873a hice un pcb pero lo que pasa esque se me movió la clave y ya no se cuál es , no lo puedo quemar de nuevo por que me marca error en la EEPROM 0x0000 necesito saber si ahí alguna manera de regresarlo a 0000 como estaba antes ? O encontrar la clave que se tecleó
Pues, necesitas encontrar la forma de poder volver a grabar el PIC,
ya que el código tiene protección para la lectura de la EEPROM.
Si no puedes regrabar el PIC, ya no existe forma de regresar el valor original de 0000, ó cambiarlo.

Intenta borrando el PIC con el programa ICProg por medio de ICSP, con éste los vuelvo a recuperar.

Suerte.
 
Subo un proyecto que es simple de modificar y facil de entender, esta hecho en mikroc.

Código:
unsigned short kp, cnt, eepr, oldstate, inc, clok = 0;

// Keypad module connections
char  keypadPort at PORTD;
// End Keypad module connections

// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

void menu()
{
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Cmd(_LCD_CURSOR_OFF);                 // Cursor off
   Lcd_Out(1, 1, "1: Abrir");
   Lcd_Out(2, 1, "2: Cambiar clave");                 // Write message text on Lcd
   Lcd_Out(3, 1, "     sergio");
   return;
}



void mesjtres()
{
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1, 1, "Ingrese clave...");
     return;
}

void beep()
{
  PORTC.F1 = 1;
  Delay_ms(200);
  PORTC.F1 = 0;
  return;
}
void msjcuatro()
{
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(1, 1, "  nueva  clave  ");
     return;
}

void msjok()
{
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(2, 1, "    clave ok    ");
     return;
}
void msjclguard()
{
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(2, 1, " clave guardada ");
     return;
}
void msjclerr()
{
     Lcd_Cmd(_LCD_CLEAR);
     Lcd_Cmd(_LCD_CURSOR_OFF);
     Lcd_Out(2, 1, " clave  erronea ");
     return;
}

char convert(unsigned short kp)
{
  switch (kp) {                   //pasa a ascii la tecla pulsada
      case  1: kp = '1'; break; // 1
      case  2: kp = '2'; break; // 2
      case  3: kp = '3'; break; // 3
      case  4: kp = 'A'; break; // A
      case  5: kp = '4'; break; // 4
      case  6: kp = '5'; break; // 5
      case  7: kp = '6'; break; // 6
      case  8: kp = 'B'; break; // B
      case  9: kp = '7'; break; // 7
      case 10: kp = '8'; break; // 8
      case 11: kp = '9'; break; // 9
      case 12: kp = 'C'; break; // C
      case 13: kp = '*'; break; // *
      case 14: kp = '0'; break; // 0
      case 15: kp = '#'; break; // #
      case 16: kp = 'D'; break; // D
    }
    return kp;
}

void guardaclave()        //lee una clave de 4 digitos desde teclado y la guarda en la eeprom
{
   int i;
   unsigned short c;
   for (i = 0; i < 4; i++){
      do {
         c = Keypad_Key_Click();
         }
      while (!c);
      Lcd_Chr(2,1+ i, '*');
      beep();
      EEPROM_Write(0x80+i, c);     //se podria agregar un pitido en cada pulsacion
   }
}

int claveok()    //devuelve 1 si la clave es ok o 0 si es erronea
{
 unsigned short c, car;
 char cr, chr;
 int i = 0;
 int ok = 1;
 while(i < 4 && ok == 1){
      car = EEPROM_Read(0x80+i);
      do {
          c = Keypad_Key_Click();
         }
      while (!c);
      Lcd_Chr(2,1+ i, '*');
      beep();
      if(car == c){
          ok = 1;
      }else
           {
          ok = 0;
           }
      i++;
 }
 return ok;
}

void main() {
  Keypad_Init();                                // Initialize Keypad
  Lcd_Init();                                   // Initialize Lcd
  TRISC.F0 = 0;
  TRISC.F1 = 0;
  PORTC.F0 = 0;
  PORTC.F1 = 0;
  eepr = EEPROM_Read(0x80);             // lee eeprom para ver si esta vacia
  if (eepr == 255){
     mesjtres();
     guardaclave();
  }
  do
  {    //bucle infinito
    inc = 0;                                     // Reset key code variable
    menu();
    do{
       inc = Keypad_Key_Click();         //en inc el numero de tecla pulsada
      }
    while (!inc);
    beep();
    if (inc == 1){
        mesjtres();
        if ((clok = claveok())== 1){        //si clave es correcta
             msjok();
             PORTC.F0 = 1;
             PORTC.F1 = 1;
             Delay_ms(2000);
             PORTC.F0 = 0;
             PORTC.F1 = 0;
        }else
              {
              msjclerr();
              PORTC.F0 = 0;
              Delay_ms(500);
              }
       }
       else{
       if (inc == 2){
         mesjtres();
         if ((clok = claveok())== 1){
              msjcuatro();
              guardaclave();
              Delay_ms(500);
              msjclguard();
              Delay_ms(500);
         }else
              {
              msjclerr();
              Delay_ms(500);
              }
          }
       }
  } while (1);
}
 

Adjuntos

  • CerraduraEl (1).zip
    63.4 KB · Visitas: 83
Ese programa es muy parecido a este que adjunto, solo que este si funciona.
Si te fijas al ver los programas notarás que son similares.
No recuerdo de que pagina lo conseguí, y el programa estaba hecho para un PIC16F877A.
Recuerdo que el archivo contenía el diseño de simulación muy mal realizado, y lo modifique.
También adapté el código para trabajar con un PIC16F873A
Como el PIC16F876 es similar, con solo cambiar el tipo de PIC te funcionará.

Suerte.

Hola que tal! sabes tu circuito es muy intersante y lo implemente (si tienes alguna pagina web o algo asi para ponerte como bibliografia seria excelente, al creador su respectiva gratitud) pero a la hora de grabar el pic y armar tengo un problema grande con el LCD, el mismo solo me muestra cuadros en la 1ra linea...ya probe de todo...el contraste y nada...otro LCD...y nada.....otro pic....nada...alguna idea de qe puede ser???
 
Última edición por un moderador:
¿ tienes alguna pagina web o algo así para ponerte como bibliografía?sería excelente
Aquí en esta página me pueden contactar: https://www.forosdeelectronica.com/
Perfil: https://www.forosdeelectronica.com/members/d-rkbytes/

En los usuarios que han agregado su página, al hacer click izquierdo sobre su Nick aparece !Visita mi Sitio!

Tengo un problema grande con el LCD, el mismo solo me muestra cuadros en la 1ra linea.
Ya probé de todo, el contraste y nada, otro LCD y nada, otro pic y nada.
¿Alguna idea de que puede ser?
Pueden ser varios motivos, y sin más información de tu proyecto es imposible saber.
Necesitas darnos más datos; tipo de pantalla, algún esquema, código, etc.

Lo que puedes hacer es utilizar el Buscador y encontrarás mucha información para resolver tu problema.

Temas relacionados con cuadros negros en LCD

Suerte.
 
Pueden ser varios motivos, y sin más información de tu proyecto es imposible saber.
Necesitas darnos más datos; tipo de pantalla, algún esquema, código, etc.

Mil disculpas, ando tan nervioso que olvidé por completo esa parte.
El lcd es uno de pantalla azul 16x2 1602a y el esquema de conexión es el mismo que adjuntaste en el archivo para el pic 16f873a.
Lo único que modifiqué en el código fue el cambio de pic del 16f873 al 16f876a.
Después todo el código y el esquema no varia en nada. De antemano gracias por responder.
 
Última edición por un moderador:
Atrás
Arriba