TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: superprp en 30 de Marzo de 2008, 09:46:51
-
Mirando en el foro sobre ésto he visto que practicamente el 80% de los mensajes que se refieren al LCD de 4 bits lo hacen con el código que proporciona el libro de aplicaciones del 16F84, pero mi duda es que aquí realmente lo que dice que hace es esto:
; Envía el dato del registro de trabajo W al bus de dato y produce un pequeño pulso en el pin
; Enable del LCD. Para no alterar el contenido de las líneas de la parte baja del Puerto B que
; no son utilizadas para el LCD (pines RB3:RB0), primero se lee estas líneas y después se
; vuelve a enviar este dato sin cambiarlo.
entiendo que lo que hace es usar los 8 bits del puerto B pero después vuelve a sacar por 4 de ellos el dato que tenía anteriormente para no modificarlo, ésto para mi no es usar 4 bits, ¿hay alguna forma de hacerlo con 4 bits realmente? no dispongo de 8 pines para la conexión y los otros 4 no se pueden cambiar ni si quiera un instante
Además, parece que solo envia los 4 bits de más peso del dato a enviar, ¿y los otros 4 bits? no acabo de entender ese código
aquí lo pongo para que lo veais los que no lo hayais visto aun:
LCD_EscribeLCD
andlw b'11110000' ; Se queda con el nibble alto del dato que es el
movwf LCD_Dato ; que hay que enviar y lo guarda.
movf LCD_BusDatos,W ; Lee la información actual de la parte baja
andlw b'00001111' ; del Puerto B, que no se debe alterar.
iorwf LCD_Dato,F ; Enviará la parte alta del dato de entrada
; y en la parte baja lo que había antes.
bsf STATUS,RP0 ; Acceso al Banco 1.
movf TRISB,W ; Guarda la configuración que tenía antes TRISB.
movwf LCD_GuardaTRISB
movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan
andwf PORTB,F ; como estaban y las 4 superiores como salida. ¿¿¿¿¿AQUÍ NO SERÍA TRISB???????
bcf STATUS,RP0 ; Acceso al Banco 0.
;
movf LCD_Dato,W ; Recupera el dato a enviar.
movwf LCD_BusDatos ; Envía el dato al módulo LCD.
bsf LCD_PinEnable ; Permite funcionamiento del LCD mediante un pequeño
bcf LCD_PinEnable ; pulso y termina impidiendo el funcionamiento del LCD.
bsf STATUS,RP0 ; Acceso al Banco 1. Restaura el antiguo valor en
movf LCD_GuardaTRISB,W ; la configuración del Puerto B.
movwf PORTB ; Realmente es TRISB.
bcf STATUS,RP0 ; Acceso al Banco 0.
return
-
Me parece que ese código está mal, en realidad si es un bus de datos para el lcd de 4 bits, lo que está faltando es un SWAPF ya que utiliza 4 pines para enviar los 8 bits al lcd EN PARALELO, y el método normal en un lcd de la norma hitachi es enviar los 4 bits de mayor peso y luego los restantes.
saludos
-
superprp
La conexión del Microcontrolador al LCD se puede realizar con conexión a 4 bits(Utiliza 4 Lineas de Salida) y 8bits(8 Lineas de Salida). Al utilizar el modo de conexión a 4 bits se utiliza la tecnica de multiplexación, que como lo indica flacoclau envia los 4 bits de mayor peso y luego los restantes.
¿hay alguna forma de hacerlo con 4 bits realmente?
No tengo muy clara tu pregunta, pero debes tener en cuenta que todo dato que se envie al LCD debe ser de 8bits, solo que para ahorrar lineas de entrada/salidas que pueden ser indispensables para otras aplicaciones se deja a criterio del Usuario el tipo de conexión a utilizar.
Con las subrutinas que utilizas no se deben alterar el estado de los bits de menor peso, ya que solo haces uso de los de mayor peso, por medio de multiplexación.
bsf STATUS,RP0 ; Acceso al Banco 1. Cambiamos al Banco 1
movf TRISB,W ; Guarda la configuración que tenía antes TRISB.
movwf LCD_GuardaTRISB
movlw b'00001111' ; Las 4 líneas inferiores del Puerto B se dejan
andwf PORTB,F ; como estaban y las 4 superiores como salida. ¿¿¿¿¿AQUÍ NO SERÍA TRISB???????
bcf STATUS,RP0 ; Acceso al Banco 0.
Como se cambio al Banco 1, es por eso que da igual que se escriba PORTB,F como TRISB ya que al estar en ese banco se apunta directamente al registro 0x86h .
Saludos!