HOLA TENGO UN PEQUEÑO PROBLEMA CON MI CODIGO ASSEMBLER
ALGUIEN ME PODRIA AYUDAR CON MI PROBLEMA, ES EL SIGUIENTE DE ACUERDO A UN TECLADO MATRICIAL UNIDO AL PUERTO B DEL PIC, LA LCD CONECTADA AL PURTO D (8 BITS DATOS) EL PUERTO A CONTROLA LOS 3 BITS DE CONTROL DE LA LCD, TENIENDO ESTO EN CUENTA DE ACUERDO A SI LA TECLA ES 1, 2 O 3 DESPLEGA CIERTO MENSAJE (EL CUAL ES IMPORTANTE) PERO LO QUE ME PASA ES QUE CUANDO TRATO DE ALARGAR EL MENU ES DECIR DEJARLO CENTRADO EN AMBAS LINEAS DE LA LCD (2X16) (POR EJEMPLO TIPO DE TERAPIA 1.XX 2. XXX 3. XXX) SE ME DESORDENA TODO EL MENU COMO QUE SE ENLOQUESE Y NO HE PODIDO SABER PORQUE RAZON PASA ESTO
AGRADEZCO SUS REPUESTAS (AHH.. YO TRABAJO LA SIMULACION CON EL SOFTWARE PIC SIMULATOR IDE DE LA OSHONSOFT)
;*****************************************************************************************
; Realiza un escaneo en un teclado matricial de 4x4 teclas,
; el escaneo lo realiza poniendo un cero logico en las filas correspondientes (RB0-RB3)
; y verificando las columnas para encontrar la interseccion provocada por
; el accionamiento de una tecla y asi saber la fila y columna de la tecla.
; ESTA SUBRUTINA CONVIERTE LA TECLA PULSADA EN SU EQUIVALENTE ASCII
; para ser usada con el display LCD.
; El PIC 16f877 tiene 5 puertos el puerto A tiene solo 6 entradas, el puerto B,C,D tienen de a 8 ; entradas y el puerto E tiene solo 3 entradas.
;***********************************************************************************************
;***********************************************************************************************
;***********************************LCD********************************************************
; PORTA,0 BIT RS (Registro de datos o instruccion)
; PORTA,1 BIT RW (Registro de lectura o escritura)
; PORTA,2 BIT EN (Bit de ON/OFF de la LCD)
; PORTD,<0;7> Salida de datos de la LCD
;***************************************************************************************************;
;
; PORTB,<0:3> BITS de SALIDA del micro, envia dato hacia el teclado para conocer la tecla ; pulsada (FILAS).
; PORTB,<4:7> BITS de ENTRADA al micro, estos se chequean en el micro para conocer la letra
; pulsada (COLUMNAS)
LIST P=16F877
INCLUDE <P16F877.INC>
STATUS EQU 03 ;Dirección del registro STATUS
LCD_EN EQU 2 ;Bit del puerto A para control de E.
LCD_RW EQU 1 ;Bit del puerto A para control de R/W.
LCD_RS EQU 0 ;Bit del puerto A para control de RS.
RETARDO1 EQU 26 ;Constante del temporizador 1;****
RETARDO2 EQU 27 ;Constante del temporizador 2;** UBICACION DEL DATO EN LA RAM
TECLA EQU 21
VALOR_TECLA EQU 22 ;Tabla que convierte la tecla presionada a codigo ASCII para ;que la acepte la LCD
F_E EQU 23 ;Constante FLEXION_EXTENSION
AB_AD EQU 24 ;Constante ABDUCCION_ADDUCCION
MIX EQU 25 ;Constante MIX (combinacion de F_E y AB_AD
ORG 20 ;Inicio de los registros de Uso general
CONTA1 RES 1 ;Reserva un Byte para la Variable CONT1
CONTA2 RES 1 ;Reserva un Byte para la Variable CONT2
;*****************************************************************************************
;Inicializa la puerta B para las entradas del teclado. Programa RB0-3 como salidas y RB4-7
;entradas con las resistencias de polarizacion habilitadas (Pull-Up);esto con el fin de evitar ;esistencias externas. Para la lectura los (1) seran niveles bajos y viceversa; esto a causa de ;las resistencia pull-up que ponen las entradas del puerto B a +5V, con el fin de evitar que esta ;se de por la alta impedancia (ojo las entradas de los puertos del PIC son por lo general TTL
;*****************************************************************************************
ORG 00
ORG 04 ;Salta el vector de interrupccion.
BSF STATUS,RP0 ;Selecciona Página o banco 1
MOVLW B'11110000' ;Puerto B RB0-RB3 como salidas y RB4-RB7 como entradas
MOVWF TRISB
MOVLW B'00000000' ;Puerto D como salida, RD0 A RD7 seran el bus de datos de ;la LCD.
MOVWF TRISD
MOVLW 0X06
MOVWF ADCON1 ;Configura el puerto A como salida digital
MOVLW B'00000000' ;Puerto A ontrolara algunas funciones de la LCD (bits de ;control (RS,RW,E) e indicadores luminosos (LED) y sonoros ;(BUZZER)
MOVWF TRISA ;Se da la configuracion del puerto A
BCF OPTION_REG,7 ;Habilita las resistencias Pull-Up de polarizacion
;Necesarias para el manejo de teclados matriciales
BCF STATUS,RP0 ;Me devuelvo al banco o página 0.
MOVLW 0X31 ;Codigo equivalente a 1 en decimal
MOVWF F_E ;FLEXION_EXTENSION
MOVLW 0X32 ;Codigo equivalente a 2 en decimal
MOVWF AB_AD ;ABDUCCION_ADDUCCION
MOVLW 0X33 ;Codigo equivalente a 3 en decimal
MOVWF MIX ;MIX COMBINACION DE F_E Y AB_AD
;*********************************CONFIGURACION DE LA LCD***********************************
CONFIGURA_LCD
CALL RETARDO_15ms ;Subrrutina de 15 ms, da espera al encendido de la LCD
MOVLW B'00110000' ;Configura el pic para trabajar con un bus de 8 datos
CALL LCD_INSTRUCCION
MOVLW B'00111000' ;Configura la LCD para trabajar con 2 lineas
CALL LCD_INSTRUCCION
MOVLW B'00001110' ;Activa la LCD y el cursor de la misma, el cursor NO parpadea
CALL LCD_INSTRUCCION
MOVLW B'00000110' ;Configura el cursor para desplzarse depues de la letra hacia
CALL LCD_INSTRUCCION ;la derecha
;******** MUESTRA LA PALABRA************ "TIPO DE TERAPIA"*********************
;*************************************** "1.FE 2.AB 3.MIX"***************************
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "P"
CALL LCD_ESCRIBIR
MOVLW 0XC0
CALL LCD_INSTRUCCION
MOVLW "1"
CALL LCD_ESCRIBIR
MOVLW "."
CALL LCD_ESCRIBIR
MOVLW "F"
CALL LCD_ESCRIBIR
MOVLW "E"
CALL LCD_ESCRIBIR
MOVLW " "
CALL LCD_ESCRIBIR
MOVLW "2"
CALL LCD_ESCRIBIR
MOVLW "."
CALL LCD_ESCRIBIR
MOVLW "A"
CALL LCD_ESCRIBIR
MOVLW "B"
CALL LCD_ESCRIBIR
MOVLW " "
CALL LCD_ESCRIBIR
MOVLW "3"
CALL LCD_ESCRIBIR
MOVLW "."
CALL LCD_ESCRIBIR
MOVLW "M"
CALL LCD_ESCRIBIR
MOVLW "I"
CALL LCD_ESCRIBIR
MOVLW "X"
CALL LCD_ESCRIBIR
MENU_OPCION
MOVLW B'00000001'
CALL LCD_INSTRUCCION
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "P"
CALL LCD_ESCRIBIR
MOVLW "C"
CALL LCD_ESCRIBIR
MOVLW "I"
CALL LCD_ESCRIBIR
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "N"
CALL LCD_ESCRIBIR
MOVLW "="
CALL LCD_ESCRIBIR
CALL RETARDO_15ms
GOTO SCAN_TECLADO
MENU_1
MOVLW B'00000001'
CALL LCD_INSTRUCCION
MOVLW "G"
CALL LCD_ESCRIBIR
MOVLW "R"
CALL LCD_ESCRIBIR
MOVLW "A"
CALL LCD_ESCRIBIR
MOVLW "D"
CALL LCD_ESCRIBIR
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "S"
CALL LCD_ESCRIBIR
MOVLW " "
CALL LCD_ESCRIBIR
MOVLW "F"
CALL LCD_ESCRIBIR
MOVLW "L"
CALL LCD_ESCRIBIR
MOVLW "E"
CALL LCD_ESCRIBIR
MOVLW "X"
CALL LCD_ESCRIBIR
MOVLW "I"
CALL LCD_ESCRIBIR
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "N"
CALL LCD_ESCRIBIR
MOVLW "="
CALL LCD_ESCRIBIR
CALL RETARDO_15ms
RETURN
MENU_2
MOVLW B'00000001'
CALL LCD_INSTRUCCION
MOVLW "G"
CALL LCD_ESCRIBIR
MOVLW "R"
CALL LCD_ESCRIBIR
MOVLW "A"
CALL LCD_ESCRIBIR
MOVLW "D"
CALL LCD_ESCRIBIR
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "S"
CALL LCD_ESCRIBIR
CALL RETARDO_15ms
MOVLW B'00000001'
CALL LCD_INSTRUCCION
RETURN
MENU_3
MOVLW B'00000001'
CALL LCD_INSTRUCCION
MOVLW "M"
CALL LCD_ESCRIBIR
MOVLW "O"
CALL LCD_ESCRIBIR
MOVLW "V"
CALL LCD_ESCRIBIR
MOVLW "I"
CALL LCD_ESCRIBIR
MOVLW "M"
CALL LCD_ESCRIBIR
MOVLW "I"
CALL LCD_ESCRIBIR
MOVLW "E"
CALL LCD_ESCRIBIR
MOVLW "N"
CALL LCD_ESCRIBIR
CALL RETARDO_15ms
MOVLW B'00000001'
CALL LCD_INSTRUCCION
RETURN
SCAN_TECLADO ;Escanea el teclado
CLRF TECLA ;Borra TECLA y
INCF TECLA,F ;Prepara TECLA para primer codigo
MOVLW B'00001110' ;Saca 0 a la primera fila
MOVWF PORTB ;de la Puerta B
NOP ;Nada, para estabilizaci¢n de señal (rebotes de la señal).
CHEQUEO_COLUMNA
BTFSS PORTB,4 ;Primera (COLUM 1) columna = 0, leo la columna
GOTO ANTIRREBOTES ;Sale si se ha pulsado tecla (retardo de 20 ms).
INCF TECLA,F ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,5 ;Segunda (COLUM 2) columna = 0
GOTO ANTIRREBOTES ;Sale si se ha pulsado tecla.
INCF TECLA,F ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,6 ;Tercera (COLUM 3) columna = 0
GOTO ANTIRREBOTES ;Sale si se ha pulsado tecla.
INCF TECLA,F ;Si no tecla pulsada, incrementa tecla.
BTFSS PORTB,7 ;Cuarta (COLUM 4) columna = 0
GOTO ANTIRREBOTES ;Sale si se ha pulsado tecla.
INCF TECLA,F ;Si no tecla pulsada,incrementa Tecla.
ULTIMA_TECLA
MOVLW d'17' ;.Es D'17' (11H) porque hace referencia a las 4 filas que ;hay que verificar en el teclado. 16 veces mas 1 puesta en ;el inicio del programa.Carga entonces W con el numero de ;Teclas + 1
SUBWF TECLA,W ;y lo compara con el valor actual de Tecla.
BTFSC STATUS,Z ;Si Tecla + 1 = valor actual. es decir 17, Z=0, no salta ; ;la siguiente instruccion
GOTO TECLAS_OFF ;No ha sido pulsada ninguna tecla.
BSF STATUS,C ;Pone a 1 Bit C.
RLF PORTB,F ;as¡ la Fila 1 pasa a 1 con la rotaci¢n a izqda.
;Pasaria a verificar otra fila del teclado
GOTO CHEQUEO_COLUMNA
TECLAS_OFF
CLRF TECLA ;Coloca variable Tecla a 0
;y regresa.
GOTO SCAN_TECLADO
ANTIRREBOTES ;ahora se espera a que la tecla sea soltada para evitar ;rebotes y reactivaciones de tecla
Espera1 BTFSS PORTB,4 ;Si no se suelta la tecla FILA 1
GOTO Espera1 ;vuelve a esperar.
Espera2 BTFSS PORTB,5 ;Si no se suelta la tecla FILA 2
GOTO Espera2 ;vuelve a esperar.
Espera3 BTFSS PORTB,6 ;Si no se suelta la tecla FILA 3
GOTO Espera3 ;vuelve a esperar.
Espera4 BTFSS PORTB,7 ;Si no se suelta la tecla FILA 4
GOTO Espera4 ;vuelve a esperar.
MOVF TECLA,W ;El contenido de TECLA es movido a W
CALL ASCII ;Llama a la tabla de conversion (del teclado) y retorna
CALL LCD_ESCRIBIR
;NUEVOS PASOS
TECLA_1 CLRF STATUS
MOVF PORTD,W ;W=PORTD
MOVWF VALOR_TECLA ;VALOR_TECLA=W
MOVF F_E,W ;W=0X31
SUBWF VALOR_TECLA,W ;VALOR_TECLA-W
BTFSS STATUS,Z ;¿EL RESULTADO ES CERO?
GOTO TECLA_2 ;NO ES CERO, ENTONCES REVISE SI LA TECLA ES 2
CALL MENU_1 ;SI.... ES CERO ENTONCES MUESTRE "GRADOS" EN LA LCD
TECLA_2
MOVF AB_AD,W
SUBWF VALOR_TECLA,W
BTFSS STATUS,Z
GOTO TECLA_3
CALL MENU_2
TECLA_3
MOVF MIX,W
SUBWF VALOR_TECLA,W
BTFSS STATUS,Z
GOTO NO_PULSO_TECLA ; NO SE PULSO LA TECLA QUE ERA
CALL MENU_3
NO_PULSO_TECLA
GOTO MENU_OPCION
CLRF INTCON ;Borro el registro de interrupcciones
;********************************************
LCD_INSTRUCCION
BCF PORTA,LCD_EN ;Coloca "0" en el Pin RW.
BCF PORTA,LCD_RS ;Coloca "0" en el Pin RS.
BSF PORTA,LCD_EN ;Coloca "1" en el Pin E
MOVWF PORTD ;Coloca el contenido de "W" en el bus de datos del modulo ;LCD.
BCF PORTA,LCD_EN ;Coloca "0" en el Pin E
CALL RETARDO_40us ;Llamada de una subrutina de tiempo de 40 micro segundos.
RETURN ;Finaliza la Rutina de tiempo.
;********************SUBRRUTINA QUE ESCRIBE UN DATO O CARACTER***************************
LCD_ESCRIBIR
BCF PORTA,LCD_RW ;Coloca "0" en el Pin RW.
BSF PORTA,LCD_RS ;Coloca "1" en el Pin RS.
BSF PORTA,LCD_EN ;Coloca "1" en el Pin E
MOVWF PORTD ;Coloca el contenido de "W" en elbus de datos del modulo LCD.
BCF PORTA,LCD_EN ;Coloca "0" en el Pin E
CALL RETARDO_40us ;Llamada de una subrutina de tiempo de 40 micro segundos.
RETURN ;Finaliza la Rutina de tiempo.
RETARDO_40us
MOVLW RETARDO1
MOVWF CONTA1
DELAY_TIME1
NOP
DECFSZ CONTA1,F
GOTO DELAY_TIME1
RETURN
RETARDO_15ms
MOVLW RETARDO2
MOVWF CONTA2
DELAY_TIME_2
CALL RETARDO_40us
DECFSZ CONTA2,F
GOTO DELAY_TIME_2
RETURN
ASCII
ADDWF PCL,1
RETLW '0' ;No se pulsò bien la tecla, falsa alarma
;CODIGO HEX* CODIGO MAQUINA TECLA PULSADA
RETLW "1" ;0xEE * $31 ;Tecla=1
RETLW "2" ;0xDE * $32 ;Tecla=2
RETLW "3" ;0xBE * $33 ;Tecla=3
RETLW "F" ;0X7E * $46 ;Tecla=F
RETLW "4" ;0XED $34 ;Tecla=4
RETLW "5" ;0xDD $35 ;Tecla=5
RETLW "6" ;0xBD $36 ;Tecla=6
RETLW "E" ;0x7D $45 ;Tecla=ESC
RETLW "7" ;0xEB $37 ;Tecla=7
RETLW "8" ;0xDB $38 ;Tecla=8
RETLW "9" ;0xBB $39 ;Tecla=9
RETLW "D" ;0x7B $44 ;Tecla=PAUSA
RETLW "A" ;0xE7 $41 ;Tecla=OFF
RETLW "0" ;0xD7 $30 ;Tecla=0
RETLW "B" ;0xB7 $42 ;Tecla=STOP
RETLW "C" ;0x77 $43 ;Tecla=ENTER
END