Autor Tema: Teclado matricial 4x4 con mikrobasic  (Leído 4848 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado prto38is

  • PIC10
  • *
  • Mensajes: 2
Teclado matricial 4x4 con mikrobasic
« en: 16 de Abril de 2013, 12:06:55 »
Hola amigos espero me puedan ayudar...Estoy utilizando el pic 16f874a....Y  he realizado un pequeño codigo donde visualizo en un lcd 16x2 las teclas que presiono en el teclado matricial....Lo que quiero hacer ahora es comparar 4 digitos consecutivos presionados por el teclado matricial con alguna variable donde ya tenga preestablecido estos 4 digitos....Espero me puedan ayudar con esto....aqui les dejo el codigo de la parte que realice .......

program Teclado16f874a


dim kp, curX, curY as byte
dim keypadPORT as byte at PORTD


dim LCD_RS as sbit at RC4_bit   ' Conexiones del módulo Lcd
LCD_EN as sbit at RC5_bit
LCD_D4 as sbit at RC0_bit
LCD_D5 as sbit at RC1_bit
LCD_D6 as sbit at RC2_bit
LCD_D7 as sbit at RC3_bit
LCD_RS_Direction as sbit at TRISC4_bit
LCD_EN_Direction as sbit at TRISC5_bit
LCD_D4_Direction as sbit at TRISC0_bit
LCD_D5_Direction as sbit at TRISC1_bit
LCD_D6_Direction as sbit at TRISC2_bit
LCD_D7_Direction as sbit at TRISC3_bit ' Final de conexiones del módulo LCD

main:
curX=1              ' Memorizar de la posición del cursor en el visualizador LCD 2x16
curY=1
ADCON1 = 0x06       ' Configurar pines analógicos como digitales ed E/S

TRISD = 1
PORTD = 0x00
TRISC = 0
PORTC = 0x00
Keypad_Init()
Lcd_Init()
Lcd_Cmd(_LCD_CLEAR) ' Borrar el visualizador






while true          ' Esperar que alguna tecla se presione y suelte

  kp = 0
  while kp = 0
    kp = Keypad_Key_Click()
    Delay_ms(10)
  wend

  select case kp     ' Preparar el valor comoo salida
    case 1 kp = "1"
    case 2 kp = "2"
    case 3 kp = "3"
    case 4 kp = "A"
    case 5 kp = "4"
    case 6 kp = "5"
    case 7 kp = "6"
    case 8 kp = "B"
    case 9 kp = "7"
    case 10 kp = "8"
    case 11 kp = "9"
    case 12 kp = "C"
    case 13 kp = "*"
    case 14 kp = "0"
    case 15 kp = "#"
    case 16 kp = "D"
  end select



   
  if (curY > 4)  then ' Cambiar de posición del cursor
    if (curX = 1) then
      Lcd_Cmd(_LCD_SECOND_ROW)
      curX = 2
      curY = 1
    else
      Lcd_Cmd(_LCD_CLEAR)
      Lcd_Cmd(_LCD_FIRST_ROW)
      curX = 1
      curY = 1
    end if
  end if






  Lcd_Chr_CP(kp) ' Visualizar en el LCD
  Inc(cury)
  'Lcd_Cmd(_LCD_CURSOR_OFF)


 wend

end.

Desconectado RockLee_89

  • PIC16
  • ***
  • Mensajes: 140
Re: Teclado matricial 4x4 con mikrobasic
« Respuesta #1 en: 17 de Abril de 2013, 17:26:34 »
lo que puedes hacer es progranar tus 4 variables con los digitos correspondientes y despues comprobar de 1 en 1 para ver si coinciden con los digitos guardados, y la podrias programar en la eeprom del pic y cada que inicia el pic leer esa clave asi nunca se borrara y la podrias modificar a tu antojo
saludos

Desconectado prto38is

  • PIC10
  • *
  • Mensajes: 2
Re: Teclado matricial 4x4 con mikrobasic
« Respuesta #2 en: 19 de Abril de 2013, 23:50:19 »
lo que puedes hacer es progranar tus 4 variables con los digitos correspondientes y despues comprobar de 1 en 1 para ver si coinciden con los digitos guardados, y la podrias programar en la eeprom del pic y cada que inicia el pic leer esa clave asi nunca se borrara y la podrias modificar a tu antojo
saludos

Gracias por el consejo.....Ya vi una manera de almacenar un digito de 4 numeros....Lo que hace mi codigo es poner un digito de 4 numeros en el teclado y si es el correcto poner un mensaje en el lcd de clave correcta.....Para todo este proceso he utilizado el comando delay....pero cuando utilizo esto el pic se me queda estatico...Pero ahora quiero realizar otras funciones y este comando no es muy practico....por esto utilice el TMR0 PARA CREAR CONTADORES....Pero los contadores que declaro siempre se me quedan en cero y no me aumentan ...porfavor si alguien me puede ayudar con esto....aqui les pongo el codigo en mikrobasic...Y el contador que declaro es cnt...Pero como les dije se queda en cero y no aumenta.....

program Teclado16f874a
''------Declaracion de variables---------
'------Variables de teclado y lcd--------
dim cnt as word
dim b as byte
dim kg as byte
dim a as byte
dim ky,kz,kt as byte
dim kp as byte
dim curX as byte
dim curY as byte
dim keypadPORT as byte at PORTD
dim text as string [16]
dim intro as string [16]
dim falla as string [16]
dim Listo as string [16]
dim desarmado as string [16]
dim activado as byte
'-------Variables de sistema de seguridad----


sub procedure interrupt                       'cuando una interrupcion es generada

  cnt = cnt+1
  TMR0 = 96                                     ' Timer TMR0  con 96 ->  100 eq 0.5seg
  INTCON = 0x20                                 ' Bit T0IE es seteado, bit T0IF es limpiado
 end sub

dim LCD_RS as sbit at RC4_bit   ' Conexiones del módulo Lcd
LCD_EN as sbit at RC5_bit
LCD_D4 as sbit at RC0_bit
LCD_D5 as sbit at RC1_bit
LCD_D6 as sbit at RC2_bit
LCD_D7 as sbit at RC3_bit
LCD_RS_Direction as sbit at TRISC4_bit
LCD_EN_Direction as sbit at TRISC5_bit
LCD_D4_Direction as sbit at TRISC0_bit
LCD_D5_Direction as sbit at TRISC1_bit
LCD_D6_Direction as sbit at TRISC2_bit
LCD_D7_Direction as sbit at TRISC3_bit ' Final de conexiones del módulo LCD

main:

ADCON1 = 0x06       ' Configurar pines analógicos como digitales ed E/S
TRISD = 1
PORTD = 0x00
TRISC = 0
PORTC = 0x00
TRISA  = %11111011                                                             'Configuracion in/out  '%1 entrada
TRISB  = %00000000
PORTB = 0x00
PORTA = 0x00
OPTION_REG = 0x84                                                              ' preescalador se asigna a tmr0
TMR0 = 96                                                                      ' Timer T0 cuenta de 96 a 255
INTCON = 0xA0
Keypad_Init()
Lcd_Init()
Lcd_Cmd(_LCD_CLEAR) ' Borrar el visualizador
 intcon = 1
text = "Clave  Correcta"
intro = "Introduzca clave"
falla = "clave incorrecta"
listo = "ARMADO"
desarmado = "DESARMADO"

'----Inicializando variables------
'-----Variables de teclado y lcd-----

curX=1              ' Memorizar de la posición del cursor en el visualizador LCD 2x16
curY=1
kz = 0
ky = 0
kt = 0
a = 0
b = 0
cnt=0
'------Variables de sistema de seguridad-------


while true          ' Esperar que alguna tecla se presione y suelte



   

  kp = 0
  while kp = 0
    kp = Keypad_Key_Click()
    Delay_ms(10)
  wend

  select case kp     ' Preparar el valor comoo salida
    case 1 kp = "1"
    case 2 kp = "2"
    case 3 kp = "3"
    'case 4 kp = "A"
    case 5 kp = "4"
    case 6 kp = "5"
    case 7 kp = "6"
    'case 8 kp = "B"
    case 9 kp = "7"
    case 10 kp = "8"
    case 11 kp = "9"
    'case 12 kp = "C"
    case 13 kp = "*"
    case 14 kp = "0"
    case 15 kp = "#"
    'case 16 kp = "D"
  end select

 if (curX=1)  and (kp = "*" )  then
    Lcd_Cmd(_LCD_CLEAR)
    delay_ms(100)
    Lcd_Out(1,1,intro)
    Lcd_Cmd(_LCD_SECOND_ROW)
    curX=2 curY=1
  end if
 
  if (curX=1) and (kp <> "*" )   then

    Lcd_Cmd(_LCD_CLEAR)
    curX=1 curY=1

  end if
   
 if (a = 0) then 'and (portb.1=0)and (porta.2=0) then
   if (curX=2) and (kp <> "*") then
     Lcd_Chr_CP(kp)
    if (kp = "1") and (kz =0)  then
      kz = 1   'Lcd_Chr_CP(kp)
    end if
 
    if (kp = "2") and (kz = 1 ) then
      ky = 1    'Lcd_Chr_CP(kp)
     end if
   
    if (kp = "3") and ( kz =1 ) and (  ky = 1)  then
       kg =1    ' Lcd_Chr_CP(kp)
     end if
   
     if (kp = "4") and ( kz=1 ) and ( ky =1 ) and ( kg=1 )  then
            b = 1
     end if

     if b=1 then
        kz=0 ky=0  kg=0   b= 0   activado = 1     cnt=0
        Lcd_Cmd(_LCD_CLEAR)
        delay_ms(100)
        Lcd_Out(1,1,text)
        Lcd_Out(2,1,listo)
       'Lcd_Cmd(_LCD_CURSOR_OFF)
        delay_ms(3000)
        Lcd_Cmd(_LCD_CLEAR)
        Lcd_Cmd(_LCD_FIRST_ROW)
        curX=1 curY=1  a =1
     else
        if curY>4 then
          kz=0 ky=0  kg=0
          Lcd_Cmd(_LCD_CLEAR)
          delay_ms(100)
          Lcd_Out(1,1,falla)
          delay_ms(3000)
          Lcd_Cmd(_LCD_CLEAR)
          Lcd_Cmd(_LCD_FIRST_ROW)
          curX=1 curY=1   a=0
        end if


      end if

   end if

  end if

  if a = 1 then
   if (curX=2) and (kp <> "*") then
     Lcd_Chr_CP(kp)
    if (kp = "1") and (kz =0)  then
      kz = 1   'Lcd_Chr_CP(kp)
    end if

    if (kp = "2") and (kz = 1 ) then
      ky = 1    'Lcd_Chr_CP(kp)
     end if

    if (kp = "3") and ( kz =1 ) and (  ky = 1)  then
       kg =1    ' Lcd_Chr_CP(kp)
     end if

     if (kp = "4") and ( kz=1 ) and ( ky =1 ) and ( kg=1 )  then
            b = 1
     end if

     if b=1 then
        kz=0 ky=0  kg=0     b= 0
        Lcd_Cmd(_LCD_CLEAR)
        delay_ms(100)
        Lcd_Out(1,1,text)
        Lcd_Out(2,1,desarmado)
       'Lcd_Cmd(_LCD_CURSOR_OFF)
        delay_ms(3000)
        Lcd_Cmd(_LCD_CLEAR)
        Lcd_Cmd(_LCD_FIRST_ROW)
        curX=1 curY=1     a = 0
     else
        if curY>4 then
          kz=0 ky=0  kg=0
          Lcd_Cmd(_LCD_CLEAR)
          delay_ms(100)
          Lcd_Out(1,1,falla)
          delay_ms(3000)
          Lcd_Cmd(_LCD_CLEAR)
          Lcd_Cmd(_LCD_FIRST_ROW)
          curX=1 curY=1   a = 1
        end if


      end if

   end if

  end if

         Inc(cury)      ' me obedece segun donde ponga a cury



         if activado=1 then
           while 1
            if cnt <100 then
              portb.0=1   activado=0
             else
              portb.0=0
            end if
            wend
          end if








 wend

end. ' Final de programa


 

anything