Autor Tema: AYUDA CON ESTE PROGRAMA DE TECLADO MATRICIAL, EVITAR AUTOREPETICION!!!  (Leído 2062 veces)

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

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
BUENAS TARDES AMIGOS!!! RESULTA QUE ESTOY APRENDIEDO A PROGRAMAR LOS PIC CON PBP, ESTOY REALIZANDO UN PROGRAMA QUE MANEJA UN TECLADO MATRICIAL Y LOS DIGITOS QUE SE PRESIONAN SE VISUALICAN EN UN LCD, HASTA AQUI ESTA BIEN, PERO NO HE PODIDO LOGRAR QUE CUANDO PRESIONE UNA TECLA ESTE DEJE DE AUTOREPETIRSE EN EL LCD, SE QUE PARA ELLO DEBO DETECTAR CUANDO SE SUELTA LA TECLA, PERO NO ME SALE!!!..ACONTINUACION LES DEJO EL PROGRAMITA QUE HE REALIZADO Y ME PUEDAN DECIR PORQUE NO FUNCIONA Y COMO PUEDO SOLUCIONARLO. ESTOY UTILIZANDO UN 18F4550

DEFINE OSC 4         

    PORTA = 0
    LATA = $00
    CMCON = $07         ;COMPARADORES APAGADOS
    TRISA = $00         ;CONFIGURA EL PUERTOA COMO SALIDA, ACA SE CONECTA EL LCD
    ADCON1 = %00001111  ;CONFIGURA ADCON1, PINES PORTA Y PORTB COMO I/O DIGITAL
   
       
    LATD = $00
    TRISD = $F0         ;CONFIGURA PUERTOD COMO SALIDA, ACA SE CONECTA EL TECLADO
    PORTD = 0   


DATO_TEC VAR BYTE

;*********************DEFINIMOS OPERACION LCD*******************************
DEFINE LCD_DREG     PORTA   ;EL BUS ESTARA CONECTADO EN EL PUERTOA
DEFINE LCD_BITS     4       ;EL BUS SERA DE CUATRO BITS
DEFINE LCD_DBIT     0       ;SELECCION DEL BIT DE INICIO DEL PUERTO

DEFINE LCD_RSREG    PORTA   ;EL PIN "RS" ESTARA EN EL PUERTOA   
DEFINE LCD_RSBIT    4       ;"RS" ESTARA CONECTADO EN RA4
DEFINE LCD_EREG     PORTA   ;EL PIN "E" ESTARA EN EL PUERTOA
DEFINE LCD_EBIT     5       ;"E" ESTARA CONECTADO EN RA5
;***************************************************************************     
        GOTO    INICIO
       
 TECLADO:
        PORTD.3 = 0         ;COLUMNA  1 = 0
        PORTD.2 = 1         ;COLUMNA  2 = 1
        PORTD.1 = 1         ;COLUMNA  3 = 1
     
        If PORTD.7 = 0 Then DATO_TEC = %00000001  ;TECLA "1"
        If PORTD.6 = 0 Then DATO_TEC = %00000100  ;TECLA "4"
        If PORTD.5 = 0 Then DATO_TEC = %00000111  ;TECLA "7"
        If PORTD.4 = 0 Then DATO_TEC = %00001010  ;TECLA "10"
       
        PAUSE   50

        PORTD.3 = 1         ;COLUMNA 1 = 1
        PORTD.2 = 0         ;COLUMNA 2 = 0
        PORTD.1 = 1         ;COLUMNA 3 = 1

        If PORTD.7 = 0 Then DATO_TEC = %00000010   ;TECLA "2"
        If PORTD.6 = 0 Then DATO_TEC = %00000101   ;TECLA "5"
        If PORTD.5 = 0 Then DATO_TEC = %00001000   ;TECLA "8"
        If PORTD.4 = 0 Then DATO_TEC = %00000000   ;TECLA "0"
   
        PAUSE   50
   
        PORTD.3 = 1         ;COLUMNA 1 = 1
        PORTD.2 = 1         ;COLUMNA 2 = 1
        PORTD.1 = 0         ;COLUMNA 3 = 0

        If PORTD.7 = 0 Then DATO_TEC = %00000011  ;tecla "3"
        If PORTD.6 = 0 Then DATO_TEC = %00000110  ;tecla "6"
        If PORTD.5 = 0 Then DATO_TEC = %00001001  ;tecla "9"
        If PORTD.4 = 0 Then DATO_TEC = %00001100  ;tecla "12"
       
        PAUSE   50
       
        IF  DATO_TEC = $FF  THEN GOTO TECLADO

;RUTINA ANTIREPETICION               

WT1:    PAUSE   50
        IF  PORTD.7 = 0  THEN GOTO WT1

WT2:    PAUSE   50
        IF  PORTD.6 = 0  THEN GOTO WT2
 
WT3:    PAUSE   50
        IF  PORTD.5 = 0  THEN GOTO WT3

WT4:    PAUSE   50
        IF  PORTD.4 = 0  THEN GOTO WT4 
       
        RETURN
;***************************************************************************         
       
INICIO:
        DATO_TEC = $FF      ;DATO ASIGNADO CUANDO NO SE PRESIONA NINGUNA TECLA
        LCDOUT  $FE,1       ;LIMPA LA PANTALLA LCD
        LCDOUT  $FE,2       ;POSICIONA EL CURSOR AL INICIO
        lCDOUT  $FE,$0F     ;CURSOR INTERMITENTE ACTIVO
OTRA:   call    teclado   
        LCDOUT  #DATO_TEC   ;VISUALIZA EN EL LCD
        DATO_TEC = $FF     
        goto    OTRA
   
        END

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: AYUDA CON ESTE PROGRAMA DE TECLADO MATRICIAL, EVITAR AUTOREPETICION!!!
« Respuesta #1 en: 05 de Diciembre de 2011, 16:36:42 »
Hola, te recomiendo utilizar indicadores o banderas, cuando ya se presionó la tecla pones la bandera de esa tecla a 1, cuando lees teclas y detectas que ya ha sido soltada pones la bandera de la tecla a 0, y para imprimir en lcd verifica que la bandera este en 0 y la colocas a 1 nuevamente.

algo asi:

if tecla = 1 and flag_tecla = 0 then
flag_tecla = 1
aqui imprime en lcd
endif

if tecla = 0 then flag_tecla = 0

saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado Sacahe

  • PIC12
  • **
  • Mensajes: 68
Re: AYUDA CON ESTE PROGRAMA DE TECLADO MATRICIAL, EVITAR AUTOREPETICION!!!
« Respuesta #2 en: 05 de Diciembre de 2011, 22:46:37 »
GRACIAS COMPAÑERO POR TU COLABORACION, YA ENCONTRE LA SOLUCION A MI PROBLEMA. LOGRE ELIMINAR LA AUTOREPETICION. PARA LOS QUE NECESITEN UN PROGRAMA SENCILLO Y CORTO DE TECLADO MATRICIAL EN PBP AQUI LES DEJO EL CODIGO, PERO OJO ME FUNCIONO SIMULADO EN PROTEUS, TODAVIA NO LO HE MONTADO:

DEFINE OSC 4         
   
    PORTA = 0
    LATA = $00
    CMCON = $07         ;COMPARADORES APAGADOS
    TRISA = $00         ;CONFIGURA EL PUERTOA COMO SALIDA, ACA SE CONECTA EL LCD
    ADCON1 = %00001111
   
    LATD = $00
    TRISD = $F0         ;CONFIGURA PUERTOD COMO SALIDA, ACA SE CONECTA EL TECLADO
    PORTD = 0   

DATO_TEC VAR BYTE

;*********************DEFINIMOS OPERACION LCD*******************************
DEFINE LCD_DREG     PORTA   ;EL BUS ESTARA CONECTADO EN EL PUERTOA
DEFINE LCD_BITS     4       ;EL BUS SERA DE CUATRO BITS
DEFINE LCD_DBIT     0       ;SELECCION DEL BIT DE INICIO DEL PUERTO

DEFINE LCD_RSREG    PORTA   ;EL PIN "RS" ESTARA EN EL PUERTOA   
DEFINE LCD_RSBIT    4       ;"RS" ESTARA CONECTADO EN RA4
DEFINE LCD_EREG     PORTA   ;EL PIN "E" ESTARA EN EL PUERTOA
DEFINE LCD_EBIT     5       ;"E" ESTARA CONECTADO EN RA5
;***************************************************************************     

        goto    INICIO
 TECLADO:
        PORTD.3 = 0         ;COLUMNA  1 = 0
        PORTD.2 = 1         ;COLUMNA  2 = 1
        PORTD.1 = 1         ;COLUMNA  3 = 1
     
        If PORTD.7 = 0 Then DATO_TEC = %00000001 : GOTO ANTIREBOTE  ;TECLA "1"
        If PORTD.6 = 0 Then DATO_TEC = %00000100 : GOTO ANTIREBOTE  ;TECLA "4"
        If PORTD.5 = 0 Then DATO_TEC = %00000111 : GOTO ANTIREBOTE  ;TECLA "7"
        If PORTD.4 = 0 Then DATO_TEC = %00001010 : GOTO ANTIREBOTE  ;TECLA "10"
       
        PAUSE   50

        PORTD.3 = 1         ;COLUMNA 1 = 1
        PORTD.2 = 0         ;COLUMNA 2 = 0
        PORTD.1 = 1         ;COLUMNA 3 = 1

        If PORTD.7 = 0 Then DATO_TEC = %00000010 : GOTO ANTIREBOTE   ;TECLA "2"
        If PORTD.6 = 0 Then DATO_TEC = %00000101 : GOTO ANTIREBOTE   ;TECLA "5"
        If PORTD.5 = 0 Then DATO_TEC = %00001000 : GOTO ANTIREBOTE   ;TECLA "8"
        If PORTD.4 = 0 Then DATO_TEC = %00000000 : GOTO ANTIREBOTE   ;TECLA "0"
   
        PAUSE   50
   
        PORTD.3 = 1         ;COLUMNA 1 = 1
        PORTD.2 = 1         ;COLUMNA 2 = 1
        PORTD.1 = 0         ;COLUMNA 3 = 0

        If PORTD.7 = 0 Then DATO_TEC = %00000011 : GOTO ANTIREBOTE  ;tecla "3"
        If PORTD.6 = 0 Then DATO_TEC = %00000110 : GOTO ANTIREBOTE  ;tecla "6"
        If PORTD.5 = 0 Then DATO_TEC = %00001001 : GOTO ANTIREBOTE  ;tecla "9"
        If PORTD.4 = 0 Then DATO_TEC = %00001100 : GOTO ANTIREBOTE  ;tecla "12"
       
        PAUSE   50
       
        GOTO    TECLADO
       
ANTIREBOTE:
        PAUSE   100
               
WAIT1:  IF  PORTD.7 = 0  THEN GOTO WAIT1     
WAIT2:  IF  PORTD.6 = 0  THEN GOTO WAIT2     
WAIT3:  IF  PORTD.5 = 0  THEN GOTO WAIT3         
WAIT4:  IF  PORTD.4 = 0  THEN GOTO WAIT4 
        PAUSE   80
       
        RETURN
;***************************************************************************         
       
INICIO:
        LCDOUT  $FE,1       ;LIMPA LA PANTALLA LCD
        LCDOUT  $FE,2       ;POSICIONA EL CURSOR AL INICIO
OTRA:   CALL    TECLADO     ;ESCANEA TECLADO
        LCDOUT  #DATO_TEC   ;VISUALIZA TECLA PULSADA EN EL LCD 
        GOTO    OTRA
               
        END