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