PIC16F877A y LCD

Buenas tardes desde Venezuela:
Estoy armando un sistema de ultrasonido para detectar presencia en un pasillo de 10 metros de largo por tres de ancho. Estoy interesado en conectarle una pantalla LCD para que me indique cuando se active, este próximo a apagar la luz, indique la fecha y hora... Ya he creado parte de la rutina, pero no tengo experiencia en con las Pantallas LCD conectadas al PIC16F877a (en este caso), por lo que me sería de gran ayuda cualquier comentario o diagrama. Muchas gracias de antemano.
 
Buenas, la verdad no se si ya cerraron el tema (soy nuevo en esto)
pero tengo el mismo problema con la LCD, me muestra solo los cuadros negros el la segunda fila y queria saber si lo pudieron resolver.
ya probe el pic y esta bien programado

agradeceria la ayuda
 
Muy buenos Dias, me gustaria pedirles el favor si tienen el diagrama de conexiones electricas del pic (Proteus o jpg) con los diferentes elementos, ya compile el programa pero no he podido configurar las otras conexiones. Agradeceria la ayuda ya que soy nuevo en el mundo de la programacion
 
hola otra vez!!! en serio necesito ayuda, ya llevamos mucho haciendo librerías y subrutinas y solo necesitamos que diga HOLA MUNDO o cualquier cosa nada complicado... lo digo por que vi que hiciste uno de un termómetro y no tenemos suficientes materiales aquí para hacerlo.... por favor. Por ahí dime de donde eres y tu edad

hola mira yo tengo dice hola y después despliega el nombre te pongo la simulación y el programa cabe decir que la base es ensamblador pero lo hice en pic c, ojala te sirva :unsure: saludos :apreton:

si necesitas algo mas mándame un e-mail políticas@delforo.com

a en la simulación esta para un lcd de una línea y ahí viene el otro lcd son las mismas conexiones vale.


Como no cumplo las Políticas del Foro. Me editaron el mensaje.
 

Adjuntos

  • LCD FINAL.zip
    38.1 KB · Visitas: 447
Última edición por un moderador:
hola necesito programar en picbasic una pantalla lcd 16x2 por el puerto a y lo he intentado y no me da resultado por el famoso puerto a4, adjunto el codigo de la configuracion de la pantalla y la foto del montaje, estare agradecido por la ayuda saludos

DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 5
define LCD_BITS 4
DEFINE LCD_LINES 2
define OSC 4

alldigital
TRISA=0 'LCD
TRISB=%01110000 'TECLADO

 
Buenas. Soy de Venezuela y estoy realizando un proyecto bastante simple pero en cuando simulo en "pic simulator ide" se queda en un ciclo y no muestra nada en la lcd! El proyecto consiste en un contador de pulsaciones para que entiendan mejor: hay que llevar el conteo de los puntos marcados en un combate "una pelea" hay 4 jueces cada uno tiene 2 pulsadores uno para cada peleador. Para que el punto pueda ser contado 3 de los 4 jueces tienen que presionar los pulsadores para que el pic lo pueda contar como valido es allí donde lo va a mostrar por el lcd de 2x16 utilizo un 16f877a


pd: en cuanto a que 4 de los 4 jueces deben pulsar para que sea valido hay como un error ya que tomo referencia b`0111` hago una simple comparación pero si se dan cuenta a lo mejor los jueces pueden pulsar así b`1011` y eso en este programa lo tomo como no valido aquí les dejo el programa.
 

Adjuntos

  • contador.txt
    6.7 KB · Visitas: 52
Última edición por un moderador:
Hola, tengo un mi termómetro hecho, pero necesito agregarle una alarma auditiva, para que cuando la temperatura sea mayor a 38 grados suene. Quisiera saber que le agrego a mi código?


Código:
processor 16f877
  include<p16f877.inc>

  ;Variable para el DELAY del ADC
val equ h'20'

  ;Variables para el DELAY del ENABLE LCD
val2 equ 0x30
val1 equ 0x31

  ;Variables para separar el resultado de ADC
  ; en valor BCD
Unidades equ 0x32     
Decenas equ 0x33      
Centenas equ 0x34   
Resto equ 0x35

  org 0h
  goto INICIO
  org 05h

INICIO:
      clrf PORTA        ;Limpia el puerto A
      clrf PORTB        ;Limpia el puerto B
      clrf PORTC        ;Limpia el puerto C    
      clrf PORTD        ;Limpia el puerto D
      bsf STATUS,RP0    
      bcf STATUS,RP1    ;Cambio al banco 1
      
      ;Configuración de puertos C-D para el LCD
      clrf TRISC        ;Configura PORTC como salida
      clrf TRISD        ;Configura PORTD como salida
      
      ;Configuración del puerto A para ADC
      movlw 00h         
      movwf ADCON1      ;Configura puerto A y E como analógicos
      movlw 3fh         
      movwf TRISA       ;Configura el puerto A como entrada
      movlw h'0'
      
      ;Configuración del puerto B para mostrar el resultado ADC
      movwf TRISB       ;Configura puerto B como salida
      bcf STATUS,RP0    ;Regresa al banco 0
      
      ;Inicio del programa
START
      call START_LCD   ;Inicializa LCD
      goto START_ADC   ;Comienza la lectura del Conv. A/D
      
      ;Inicia LCD
START_LCD:
      bcf PORTC,0      ; RS=0 MODO INSTRUCCION
      movlw 0x01       ; 0x01 limpia la pantalla en el LCD
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      movlw 0x0C       ; Selecciona la primera línea
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      movlw 0x3C       ; Se configura el cursor
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      bsf PORTC, 0     ; Rs=1 MODO DATO
      return
      
      ;Rutina para enviar un dato
ENVIA:
      bsf PORTC, 0    ; RS=1 MODO DATO
      call COMANDO    ; Se da de alta el comando
      return 
       
      ;Rutina para enviar comandos
COMANDO:
      bsf PORTC, 1    ; Pone la señal ENABLE en 1
      call DELAY2     ; Tiempo de espera
      call DELAY2
      bcf PORTC, 1    ; ENABLE=0    
      call DELAY2
      return     
      
      ;Rutina para limpar pantalla LCD  
ERASE_LCD
      bcf PORTC,0      ; RS=0 MODO INSTRUCCION
      movlw 0x01       ; 0x01 limpia la pantalla en el LCD
      movwf PORTD
      call COMANDO     ; Se da de alta el comando
      bsf PORTC, 0     ; Rs=1 MODO DATO
      return
      
      ;Configuración Convertidor A/D
START_ADC
      movlw b'11000001' ;Configuración ADCON0 
      movwf ADCON0      ;ADCS1=1 ADCS0=1 CHS2=0 CHS1=0 
                        ;CHS0=0 GO/DONE=0 - ADON=1

CICLO: bsf ADCON0,2      ;Conversión en progreso GO=1
       call DELAY1       ;Espera que termine la conversión
ESPERA btfsc ADCON0,2    ;Pregunta por DONE=0?(Terminó conversión)
       goto ESPERA       ;No, vuelve a preguntar
       movf ADRESH,0     ;Si
       movwf PORTB       ;Muestra el resultado en PORTB
       
       ;Rutina que muestra temperatura
PRINT_TEMP
       call ERASE_LCD    ;Limpia LCD
       movlw 'T'
       movwf PORTD
       call ENVIA
       movlw '='
       movwf PORTD
       call ENVIA

       call READ_TEMP    ;Llamada a rutina que obtine el 
                         ;valor de la temperatura a partir
                         ;del  resultado del Conv a/D

       movf Centenas,W   ;Imprime el dígito de las centenas
       movwf PORTD
       call ENVIA
       movf Decenas,W    ;Imprime el dígito de las decenas
       movwf PORTD
       call ENVIA
       movf Unidades,W   ;Imprime el dígito de las unidades
       movwf PORTD
       call ENVIA
       movlw ' '
       movwf PORTD
       call ENVIA
       movlw h'DF'       ;Imprime el simbolo "°"
       movwf PORTD
       call ENVIA 
       movlw 'C'
       movwf PORTD
       call ENVIA 

       goto CICLO        ;Repite el ciclo de lectura ADC

       ;Rutina que obtine el valor de la temperatura
       ;a partir del  resultado del Conv a/D
READ_TEMP:
       clrf Centenas
       clrf Decenas
       clrf Unidades
      
       movf ADRESH,W   
       addwf ADRESH,W     ;Dupilca el valor de ADRESH para 
       ;obtener un valor de temperatura real aprox
       movwf Resto        ;Guarda el valor de ADRESH en Resto  
        
       ;Comienza el proceso de otención de valores BCD 
       ;para Centenas, Decenas y unidades atraves de restas
       ;sucesivas.
CENTENAS1
       movlw d'100'      ;W=d'100'
       subwf Resto,W     ;Resto - d'100' (W)
       btfss STATUS,C    ;Resto menor que d'100'?
       goto DECENAS1     ;SI
       movwf Resto       ;NO, Salva el resto
       incf Centenas,1   ;Incrementa el contador de centenas BCD
       goto CENTENAS1    ;Realiza otra resta
DECENAS1
       movlw d'10'       ;W=d'10'
       subwf Resto,W     ;Resto - d'10' (W)
       btfss STATUS,C    ;Resto menor que d'10'?
       goto UNIDADES1    ;Si
       movwf Resto       ;No, Salva el resto
       incf Decenas,1    ;Incrementa el contador de centenas BCD
       goto DECENAS1     ;Realiza otra resta
UNIDADES1
       movf Resto,W      ;El resto son la Unidades BCD
       movwf Unidades
       ;clrf Resto
       
       ;Rutina que obtiene el equivalente en ASCII       
OBTEN_ASCII
       movlw h'30' 
       iorwf Unidades,f      
       iorwf Decenas,f
       iorwf Centenas,f      
       return

;Rutina que genera un Delay de 20 microSeg aprox.
;para el Conv. A/D
DELAY1:             
       movlw h'30'
       movwf val
Loop   decfsz val,1
       goto Loop
       return

;Subrutina de retardo para ENABLE_LCD 
DELAY2:            
       movlw 0xFF
       movwf val1 
Loop1:
       movlw 0xFF
       movwf val2    
Loop2:
       decfsz val2,1
       goto Loop2
       decfsz val1,1
       goto Loop1
       return
    end
 
Última edición por un moderador:
señores tengan un buen dia

tengo el siguiente problema con un display lcd y un pic 16f877a, solo aparecen cuadros en el display y en la linea de abajo,es un display 2 por 16.

q

Hola

cacharrero no se si ya lograste resolver tu problema te dejo el archivo para la lcd 16x2 con la libreria para manejarla en CCS que no es de mi autoria y la simulacion en proteus y el HEX para que lo grabes en el PIC para verficar su funcionamiento saludos y suerte:)
 

Adjuntos

  • LCD16X2_foros.rar
    16.9 KB · Visitas: 180
Mi pantalla LCD hace lo mismo que habeis dicho la mayoria, se pone toda la primerla Fila en Negro ! y ya he probado con muchos programas que habeis puesto aqui y nada... Mi Pic es 16F877.
 
Lnar92 dijo:
AyÚdenme plis,necesito poner la alarma auditiva cuando la temperatura sea mayor a 38° pero lo q he hecho no me ha servido

Mi pantalla LCD hace lo mismo que habeis dicho la mayoria, se pone toda la primerla Fila en Negro ! y ya he probado con muchos programas que habeis puesto aqui y nada... Mi Pic es 16F877.
A ambos les aconsejo que adjunten el código de su programa actual y sus conexiones.
Si tienen la simulación de sus proyectos es mejor. Y si no, suban las fotos de sus proyectos.
Con esos detalles es como se les puede ayudar mejor.

Un comentario:
A mi me paso que un LCD JHD 162A Azul, mostraba solo la primer línea con cuadros negros.
Igualmente probe con programas que tengo funcionando, y seguia con el problema.
Así que probe con otro LCD del mismo modelo, y funciono sin problemas.
En conclusión, el LCD paso a mejor vida. :cry:
Esto también pasa cuando no esta bien ajustado el pin de contraste (VEE)

Saludos.
 
Hola tengo el problema de los cuadritos que salen el la parte de abajo!
Mi programa si funciona en proteus, lo hice en ccs, y no se que sea.
¿Si me pueden ayudar?

Mi programa es el siguiente.
Código:
 #include <16F877A.H>
   #device adc=8
   #device ccs2
   #fuses XT, NOWDT, NOPROTECT, NOLVP
   #use delay(clock=4000000)
   
   #byte PORT_A=0X05
   #byte TRIS_A=0X85
   #define PIN_A1 40
   #define PIN_A2 41
   #byte PORT_D=0X07
   #byte TRIS_D=0X87
   #define PIN_D0 42
   #define PIN_D1 43
   
#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_C0
#define LCD_RW    PIN_C1
#define LCD_E     PIN_C2

   #INCLUDE <flex_lcd.c>
   
   int temp;   

   void main(void)
   {
      lcd_putc clif;
      delay_ms(1000);
      lcd_init();
      lcd_gotoxy(2,1);
      lcd_putc("    Temp:");
      delay_ms(2000);
      lcd_gotoxy(2,2);
      delay_ms(100);
      setup_adc(ADC_CLOCK_INTERNAL);
      setup_adc_ports(RA0_ANALOG);
      set_adc_channel(0);
      
      while(1)
      {
      delay_ms(70);
      temp=read_adc();//esta istrucion lee el puerto a0
      delay_ms(25);
      temp=(temp/2)-1;
      lcd_gotoxy(7,2);
      printf(lcd_putc,"%u",temp);
      
         if(PIN_A1 == 0 && PIN_A0 == 1)
         {
            output_bit (PIN_B1,0);
            output_bit (PIN_B0,1);
         }

         if(PIN_A1 == 1 && PIN_A0 == 0)
         {
            output_bit (PIN_B0,0);
            output_bit (PIN_B1,1);                                 
         }   
         
        }
      }
 
Última edición por un moderador:
Buenas a todos, estoy trabajando con el PIC16F887 en Assembler y tengo un problema ya que debo introducir un valor en hexadecimal y hacer sus respectivas conversiones y mediante 3 botones mostrarlo en un LCD donde cada botón muestra el valor de hexa a decimal, binario y octal según que botón fue pulsado. Y el problema esta en que como los PIC solo realizan sumas y restas no entiendo como lograr pasar desde la base hexadecimal a otras y poder mostrar en pantalla si alguien tiene idea de como hacerlo se lo agradecería mucho!!!!

PD: Tengo trabajando ya el lcd y probando de un valor binario mostrarlo en el LCD en su asci pero es lo que e podido lograr ya que en la red no consigo en pic conversiones de Hexa---> otras bases
 

Adjuntos

  • PIC y LCD.rar
    42 KB · Visitas: 2
Quien te dijo que solo hacen sumas y restas solamente?
Que acaso no sabes que el producto de A X B es sumar B +B tantas veces lo indica A?
y que la división es la resta A/B es restar B de A, tantas veces como lo A?
es muy sencillo....

La net esta llena de ejmplos
Te pongo uno solo para que te sirva de ejemplo
http://angel-danny.blogspot.com.ar/2010/05/suma-resta-multiplicacion-y-division-en.html

Tal vez sería mejor que utilizaras Basic o C que ya tienen muchas funciones definidas ya sea las básicas, trigonómetricas booleanas e incluso la conversion que deseas

Te haces una rutina que luego llamas
para pasar de decimal a binario divides por 2, y el resto que te va quedando forman el número en binario, para octal divides por 8, y para hexadecimal divices por 16
Las otras conversiones son similares
 
Última edición:
gracias por responder, pero me confundo demasiado ya que tengo entendido que el LCD lee codigo Ascii y debo pasar lo que tenga a su equivalente osea no veo como emplear una conversion ya de hexa a otra base y luego pasarlo a ascii para mostrar sea en binario, decimal o octal.
PD: resondiendo solo puedo usar Assembler en la porgramacion del pic.
 
El LCD no lee, muestra la información que se le muestra en el formato adecuado, lo único que tenes que hacer es conformar el resultado en en ese formato para que te lo muestre
Te dejo una información en el idioma de Cervantes que te puede ser de mucha utilidad
 

Adjuntos

  • TEORIALCDV1.pdf
    358 KB · Visitas: 3
Pandacba quiero hacer una pregunta ya que quiero adquirir uno.

En cierta web hay un lcd 4x20 de tamaño grande, los normales de los cuales tengo aunos cuantos, miden sobre 90mm mas-menos, este mide sobre 160mm y utiliza, segun la informacion, el controlador KS0066.

Aqui viene mi pregunta, se puede usar como si fuese el HD44780?.
 
hola, ya e podido avanzar en las conversiones, pero me da mucha duda como pasar de hexadecimal a octal , estuve intentando realizando con and e ir tomando de 3 en 3 bits pero no me resulta, quiero de alguna forma tomar 3 bits de un registro de 8bits y guardar solo los 3 bits que yo quiero mostrar, existe una forma de hacerlo?
 
Bajate la hoja de datos de ese chip para ver como se maneja, yo he utilizado LCD 20x4 pero no recuerdo que controlador llevaba, se conectaba con el mismo número de pines, no estan en el mismo orden que los de 16X2 pero no represento ningún problema
 
Buenas, ya logre realizar las conversiones que planteaba anteriormente aquí, pero tengo un problema quiero pasar el registro W que esta asignado con 16bits a dos variables de 8 bits para trabajar con ellas,ya que el pic solo trabaja con 8bits como es el PIC16f887, si yo guardo directamente W a una variable se guardan los 8bits menos significativos automáticamente pero no tengo como guardar los 8 mas significativos si pudieran orientarme en esto se los agradecería mucho.!!
 
Atrás
Arriba