Autor Tema: Dos tablas para GLCD  (Leído 2234 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Dos tablas para GLCD
« en: 26 de Marzo de 2012, 14:21:34 »
Hola comparto este programa que me relaciona dos tablas para mostrar en un LCD Nokia 3310, se puede adaptar a otros manteniendo lo pincipal.

Este es el cuerpo principal:

Código: ASM
  1. GetASCIIByte
  2.     MOVLW   0X07                       ; Repeticiones para la busqueda de las partes del caracter.
  3.     MOVWF   CounterA                   ; Registro temporal
  4.  
  5.         movlw   UPPER   TABLA_ASCII
  6.         movwf   MsnAddressUpper_ASCII
  7.         movlw   HIGH    TABLA_ASCII
  8.         movwf   MsnAddressHigh_ASCII
  9.         movlw   LOW     TABLA_ASCII
  10.         movwf   MsnAddressLow_ASCII
  11.  
  12.         movff   MsnAddressUpper_ASCII,TBLPTRU
  13.         movff   MsnAddressHigh_ASCII,TBLPTRH
  14.         movff   MsnAddressLow_ASCII,TBLPTRL
  15.  
  16. ; Expresado en decimal      =(ASCII-32)*12     :32 es el caracter de inicio Space en decimal
  17. ; Expresado en hexadecimal  =(ASCII-20)*0C     :20 es el caracter de inicio Space en hexadecimal
  18. ; ASCIICode es quien trae el caracter en memoria para ser mostrado
  19.  
  20.     movlw      0x20
  21.     SUBWF      ASCIICode,W             ; Resto al valor ASCII el valor 0x20
  22.     MULLW      0X0C                    ; y lo multiplico 0X0C * W -> PRODH:PRODL
  23.                                        ; obteniendo asi en PRODH:PRODL la direccion de mi caracter
  24.                                        ; a mostrar.
  25.     MOVF    PRODL,W
  26.     ADDWF   TBLPTRL,F                  ; Sumo para formar la direccion del caracter
  27.  
  28.     btfsc       STATUS,C               ; Si hubo un acarreo incremento.
  29.     incf        TBLPTRH,F
  30.  
  31.     MOVF    PRODH,W                    ; Sumo para formar la direccion del caracter
  32.     ADDWF   TBLPTRH,F                  ; Ya tengo la direccion de mi caracter.
  33.  
  34. BUSCO2
  35.     tblrd *+                          ; Incrementa puntero de tabla antes de su lectura
  36.     NOP                                ; Nada solo por las dudas.
  37.     movff     TABLAT,TEMP_CARACTER     ; Cargo el caracter para luego enviarlo con TX_SPI_D.
  38.     DCFSNZ  CounterA,F                 ; Decremento el contador para obtener el caracter entero.
  39.     RETLW   0X00                   ; Se termino la cuenta y mi cod. también
  40.     CALL        TX_SPI_D                   ; Lo envio al LCD
  41.     TBLRD *+                           ; Leo la tabla nuevamente para saltearme un dato, ya que va de dos en dos.
  42.     movff       TABLAT,TEMP_CARACTER       ; Cargo el dato, esto no es necesario.
  43.     CLRF    TEMP_CARACTER              ; y lo borro
  44.     GOTO    BUSCO2                     ; Vuelvo a buscar
  45.  
  46. FIN
  47.     RETLW    0X00


Esta es la primer tabla que llamo:

Código: ASM
  1. COMANDO_A
  2.      MOVFF   PCL,W        ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
  3.      ADDWF   PCL,F        ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
  4.         dt "Hola Mundo!!!",0xfd;ontrol  LCD  NOKIA3310 x-robotics.com ",0xFD
  5.  
  6. mensaje2
  7.      MOVFF   PCL,W        ; antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
  8.      ADDWF   PCL,F        ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+W
  9.         dt "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 @#$%&/()*+-,.:;<>?[]^",0xFD
  10.  
  11.  
  12. SEND_COMANDO_1_1         
  13.     CLRF    TABLA_START        ; Borro el puntero de las Tablas
  14. ESCMEN1_1      
  15.     RLNCF   TABLA_START,W,0    ; Roto un bit a la izquierda y lo guardo en W
  16.     CALL        mensaje2          ; Llamo a la Tabla a enviar y regreso con el caracter en W
  17.     MOVWF   ASCIICode
  18.     MOVLW   0XFD    
  19.     XORWF   ASCIICode,W      
  20.     BTFSC   STATUS,Z           ;SI LOS DATOS SON IGUALES,
  21.         bz          FIN                ; Si llego al fin salto
  22.     CALL    GetASCIIByte
  23.     INCF    TABLA_START,F      ; Incremento el puntero para el proximo caracter
  24.     GOTO    ESCMEN1_1


Y esta es parte de la tabla de donde obtengo los datos a enviar;

Código: ASM
  1. TABLA_ASCII                           ;         HEX   DEC
  2.         dt 0x00,0x00,0x00,0x00,0x00,0x00 ;SP 0x20  00   00
  3.         dt 0x00,0x00,0x2f,0x00,0x00,0x00 ; ! 0x21  0C   12
  4.         dt 0x00,0x07,0x00,0x07,0x00,0x00 ; " 0x22  18   24
  5.         dt 0x14,0x7f,0x14,0x7f,0x14,0x00 ; # 0x23  24   36
  6.         dt 0x24,0x2a,0x7f,0x2a,0x12,0x00 ; $ 0x24  30   48
  7.         dt 0xc4,0xc8,0x10,0x26,0x46,0x00 ; % 0x25  3C   60
  8.         dt 0x36,0x49,0x55,0x22,0x50,0x00 ; & 0x26  48   72
  9.         dt 0x00,0x05,0x03,0x00,0x00,0x00 ; ' 0x27  54   84
  10.         dt 0x00,0x1c,0x22,0x41,0x00,0x00 ; ( 0x28  60   96
  11.         dt 0x00,0x41,0x22,0x1C,0x00,0x00 ; ) 0x29  6C   108
  12.         dt 0x14,0x08,0x3E,0x08,0x14,0x00 ; * 0x2A  78
  13.         dt 0x08,0x08,0x3E,0x08,0x08,0X00 ; + 0x2B  84    132
  14.         dt 0x00,0x00,0x50,0x30,0x00,0X00 ; , 0x2C  90
  15.         dt 0x10,0x10,0x10,0x10,0x10,0X00 ; - 0x2D  9C
  16.         dt 0x00,0x60,0x60,0x00,0x00,0X00 ; . 0x2E  A8
  17.         dt 0x20,0x10,0x08,0x04,0x02,0X00 ; / 0x2F  B4                16    (2F - 20)=15

Espero que les sirva
Saludos



Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Dos tablas para GLCD
« Respuesta #1 en: 27 de Marzo de 2012, 05:35:15 »
Al final lo has conseguido  :-/ :-/ :-/

Gracias por compartirlo

Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Dos tablas para GLCD
« Respuesta #2 en: 27 de Marzo de 2012, 12:01:19 »
Costo pero salio!
Coloco otra parte, la inicializacion y envio:

Código: ASM
  1. INIT_LCD       
  2.  
  3.        bcf    PIR1,SSP1IF       ; borra flag interrupcion
  4.  
  5.        BCF    LCD_RST       ; Activa reset a nivel bajo
  6.        MOVLW  D'5'
  7.        CALL   DELAY         ; Retardo en ms, que se carga en W.
  8.        BSF    LCD_RST       ; Activa reset a nivel alto
  9.  
  10. SET_LCD
  11.        MOVLW   D'1'
  12.        CALL    DELAY         ; Retardo en ms, que se carga en W.
  13.        movlw   0x21              ; Chip enable solamente.
  14.        call    TX_SPI_C
  15.        movlw   0xC8              ; Vop
  16.        call    TX_SPI_C
  17.        movlw   0x06              ; Set Temp coefficent.
  18.        call    TX_SPI_C
  19.        movlw   0x13              ; LCD bias mode 1:48.
  20.        call    TX_SPI_C
  21.        movlw   0x20          ; Horizontal mode, normal set command.
  22.        call    TX_SPI_C      
  23.        movlw   0x08              ; Mod control all dots on 9
  24.        call    TX_SPI_C      
  25.        movlw   0x0C              ; Mod control normal.
  26.        CALL    TX_SPI_C      ; Transmicion por SPI de comandos
  27.  
  28.        CALL    CLR_LCD
  29. ;      CALL    CLEAR_LCD
  30.  
  31.        CALL    DELAY_200us
  32.        CALL    X_address
  33.        CALL    Y_address
  34.  
  35.       RETLW   0X00
  36.  
  37. ;*******************LIMPIA MEMORIA RAM del LCD ******************************          
  38. ; dos formas de borrar, que estaban en la red.
  39.  
  40. CLR_LCD
  41.     movlw       b'00001000'     ;mode   [Pantalla Blanca]
  42.     call        TX_SPI_C        ;para que no se vea el borrado.
  43.     movlw       d'2'
  44.     movwf       CounterB
  45. Bint
  46.     movlw       d'252'          ;carga 252 vueltas que seran x2=504
  47.     movwf       CounterA        ;para borrar todo el LCD
  48.                
  49. Bint2
  50.     movlw       b'00000000'
  51.     MOVWF   TEMP_CARACTER
  52.     call        TX_SPI_D
  53.     decfsz      CounterA        ;espera 252 vueltas
  54.     goto        Bint2
  55.     decfsz      CounterB        ;da 2 x 252 = 504 vueltas
  56.     goto        Bint
  57.     movlw       b'00001100'     ;mode   [Normal mode]
  58.     call        TX_SPI_C
  59.     RETLW   0X00
  60.  
  61. CLEAR_LCD
  62.    MOVLW   .6          ; Columnas del caracter
  63.    movwf   CounterC
  64. PIXEL_84
  65.    movlw   .84         ; Cantidad de pixel
  66.    movwf   CounterA
  67. BITS_FILAS
  68.    movlw   .8          ; Cantidad de bits de las columnas
  69.    movwf   CounterB
  70. SPI_to_LCD
  71.     MOVLW   0X00
  72.     MOVWF   TEMP_CARACTER
  73.     CALL    TX_SPI_D
  74. SPI_LOOP
  75.     nop
  76.     decfsz  CounterB   
  77.     goto        SPI_to_LCD
  78.    decfsz  CounterA    
  79.    goto         BITS_FILAS             
  80.    decfsz  CounterC  
  81.    goto    PIXEL_84        
  82.    retlw        00
  83.  
  84. ;********************** Posicion X ******************************************
  85. X_address
  86.         iorlw   b'10000000'     ;añade bit de comando
  87.         call    TX_SPI_C
  88.         RETLW   0X00
  89. ;*********************** Posicion Y *****************************************
  90. Y_address
  91.         iorlw   b'01000000'     ;añade bit de comando
  92.         call    TX_SPI_C
  93.         RETLW   0X00
  94. ;_________________________video invertido____________________________________
  95. Invert_video
  96.         movlw   b'00001101'     ;mode   [Inverse video mode]
  97.         call    TX_SPI_C
  98.         return
  99. ;_________________________video normal____________________________________
  100. normal_video
  101.         movlw   b'00001100'     ;mode   [normal mode]
  102.         call    TX_SPI_C
  103.         return
  104. ;________________Transmision de datos por puerto serie SPI___________________
  105. TX_SPI_C
  106.         bcf         PIR1,SSP1IF                ; borra flag interrupcion
  107.  
  108.         MOVWF   TEMP_CARACTER
  109.         bcf         LCD_SCE                    ; Enable display!!!!!!!!!!!!!!!!!!!!!!
  110.         NOP
  111.         NOP
  112.         bcf         LCD_DorC                   ; Modo COMANDO
  113.         movFf   TEMP_CARACTER, SSP1BUF     ; Transmision por puerto SPI        
  114.         GOTO    SPI_DELAY
  115.  
  116. TX_SPI_D
  117. ;        MOVWF   TEMP_CARACTER
  118.          bcf        PIR1,SSP1IF                 ; borra flag interrupcion
  119. ;        MOVWF   TEMP_CARACTER
  120.         bcf         LCD_SCE                     ; Enable display!!!!!!!!!!!!!!!!!!!!!!
  121.         NOP
  122.         NOP
  123.         bsf         LCD_DorC                    ; Modo DATO (por defecto)
  124.         movFf   TEMP_CARACTER, SSP1BUF          ; Transmision por puerto SPI           
  125.  
  126. SPI_DELAY
  127.         NOP
  128.         NOP
  129.         btfss   PIR1,SSP1IF                 ; Espera a que se envie el dato
  130.         goto    SPI_DELAY
  131.         bcf     PIR1,SSP1IF                     ; borra flag interrupcion
  132.         bsf     LCD_SCE                         ; display OFF
  133.         RETLW   0X00
  134.  
  135. ;******************************************************************************

El modulo que use es de Olimex, el PIC_LCD3310 que usa el PIC18F67J50 y esta en http://www.olimex.com/dev/,  entran en PIC  y ahí lo seleccionan, esta el diagrama y dos demos en C con sus librerías para bajar, yo C no lo manejo.
Saludos


Desconectado macedo

  • PIC18
  • ****
  • Mensajes: 270
Re: Dos tablas para GLCD
« Respuesta #3 en: 10 de Abril de 2012, 15:58:32 »
Hola mejore la primer tabla, ya que dependiendo del sector del programa donde se colocaba el Pic se volvia inestable, le paso el cod.

Código: ASM
  1. BUSCO_CARACTER
  2.         movff   AddrTablaUpper,TBLPTRU
  3.         movff   AddrTablaHigh,TBLPTRH
  4.         movff   AddrTablaLow,TBLPTRL
  5.  
  6. LOOP_CARACTER
  7.     tblrd *+                                           ; Incrementa puntero de tabla antes de su lectura
  8.     movff    TBLPTRU,TBLPTRU_TEMP
  9.     movff    TBLPTRH,TBLPTRH_TEMP
  10.     movff    TBLPTRL,TBLPTRL_TEMP
  11.     movff    TABLAT,ASCIICode           ; Cargo el caracter para luego enviarlo con TX_SPI_D.
  12.     MOVLW    0XFd    
  13.     XORWF    ASCIICode,W      
  14.     BTFSC    STATUS,Z                   ;SI LOS DATOS SON IGUALES,
  15.     goto     Termina2                   ; Si llego al fin salto
  16.     call     GetASCIIByte                  ; Lo envio a la segunda tabla para
  17.                                        ; codificar y luego al LCD
  18.  
  19. RESTAURO_TABLAS        
  20.     movff       TBLPTRU_TEMP,TBLPTRU
  21.     movff       TBLPTRH_TEMP,TBLPTRH
  22.     movff       TBLPTRL_TEMP,TBLPTRL
  23.     TBLRD *+                           ; Leo la tabla nuevamente para saltearme un dato, ya que va de dos en dos.
  24.     GOTO        LOOP_CARACTER
  25.  
  26. Termina2
  27.     RETLW    0X00


Con esto se llama la tabla:
Código: ASM
  1. EnvMSG_Mensaje_Hola_Mundo
  2.         movlw   UPPER   Mensaje_Hola_Mundo
  3.         movwf   AddrTablaUpper
  4.         movlw   HIGH    Mensaje_Hola_Mundo
  5.         movwf   AddrTablaHigh
  6.         movlw   LOW     Mensaje_Hola_Mundo
  7.         movwf   AddrTablaLow
  8.  
  9.     goto    BUSCO_CARACTER
  10.  
  11. Mensaje_Hola_Mundo
  12.      dt "Hola Mundo!!!",0xfd

Espero que les sirva.
Saludos