• Domingo 22 de Diciembre de 2024, 13:17

Autor Tema:  Lcd Desplegada Por Teclado (dudita)  (Leído 4510 veces)

diego_castano00

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Lcd Desplegada Por Teclado (dudita)
« en: Viernes 18 de Noviembre de 2005, 19:04 »
0
HOLA TENGO UN PEQUEÑO PROBLEMA CON MI CODIGO ASSEMBLER :scream:

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

Alternative

  • Miembro MUY activo
  • ***
  • Mensajes: 176
    • Ver Perfil
Re: Lcd Desplegada Por Teclado (dudita)
« Respuesta #1 en: Lunes 21 de Noviembre de 2005, 22:45 »
0
Que hayyyyy
saludos
oyes mira, creo que puedo ayudarte, espero que lo pongas comprimido tu programa, porque me es dificil ver tus etiquetas, quiero checar si estas poniendo bien los valores de tu DDRAM del LCD que debe ser como 0x85 en la linea 1, y 0xc5 en la linea2, asi como darle sus comandos adecuados.

Saludos

P.D. nose si tengas el libro RA-MA Editorial: Microcontrolador PIC16F84. Desarrollo de proyectos. y si  me puedes scanear el capitulos

26. PCF8574, EXPANSOR DE BUS I2C
27. PCF8591, ADC Y DAC EN BUS I2C
28. BUS DE UNA LÍNEA

bye.

voy estar conectado hoy, si me mandas tu duda,  hoy mismo te lo resuelvo

Alternative

  • Miembro MUY activo
  • ***
  • Mensajes: 176
    • Ver Perfil
Re: Lcd Desplegada Por Teclado (dudita)
« Respuesta #2 en: Lunes 21 de Noviembre de 2005, 22:46 »
0
Que hayyyyy
saludos
oyes mira, creo que puedo ayudarte, espero que lo pongas comprimido tu programa, porque me es dificil ver tus etiquetas, quiero checar si estas poniendo bien los valores de tu DDRAM del LCD que debe ser como 0x85 en la linea 1, y 0xc5 en la linea2, asi como darle sus comandos adecuados.

Saludos

P.D. nose si tengas el libro RA-MA Editorial: Microcontrolador PIC16F84. Desarrollo de proyectos. y si  me puedes scanear el capitulos

26. PCF8574, EXPANSOR DE BUS I2C
27. PCF8591, ADC Y DAC EN BUS I2C
28. BUS DE UNA LÍNEA

bye.

voy estar conectado hoy, si me mandas tu duda,  hoy mismo te lo resuelvo

Mi correo es

pmluis@gmail.com