list p=16f877
include <p16f877.inc>
radix hex
;******NOTA!!!******
; PORTB0 ---> GLCD DB0
; PORTB1 ---> GLCD DB1
; PORTB2 ---> GLCD DB2
; PORTB3 ---> GLCD DB3
; PORTB4 ---> GLCD DB4
; PORTB5 ---> GLCD DB5
; PORTB6 ---> GLCD DB6
; PORTB7 ---> GLCD DB7
;
; PORTC4 ---> GLCD CD
; PORTC5 ---> GLCD /RD
; PORTC6 ---> GLCD /WR
; PORTC7 ---> GLCD /CE
;
; PORTA0 ---> GLCD RESET
;
; GLCD FS1 ---> 0V (font 8x8)
; GLCD MD2 ---> +5V (column. = 32)
cblock 0x20
byte_alto, byte_bajo
loop_h, loop_l
temp
delay
endc
org 0x00
goto inicio
org 0x05
inicio
bsf STATUS, RP0 ;cambio al banco 1
bcf STATUS, RP1
bcf RCSTA,SPEN ;Puerto serie deshabilitado
clrf OPTION_REG
bsf OPTION_REG,7 ;Resistencias pull-up del PORTB deshabilitadas
movlw 0x06 ;Configuro PORTA como puerto ed E/S digitales
movwf ADCON1
clrf TRISA ;Configuro a PORTA como salidas
clrf TRISC ;Configuro a PORTC como salidas
bcf STATUS, RP0 ;cambio a banco 0
aqui
call GLCD_INI
call limpiar_grafico
call limpiar_texto
clrf byte_bajo
movlw 0x10
movwf byte_alto
call add_point ;ubico el puntero en la posicion inicial del area de grafico en la pantalla
movlw 0x2d ;pixels que quiero mostrar
call enviar_dato
movlw 0xc4 ;0xc4 es el comando para escribir en
;memoria sin incrementar la posicion
;del address pointer
call enviar_comando
movlw 0x08
movwf byte_bajo
movlw 0x10
movwf byte_alto
call add_point ;ubico el puntero en la posicion inicial
;del area de grafico en la pantalla
movlw 0x41 ;pixels que quiero mostrar
call enviar_dato
movlw 0xc4 ;0xc4 (11000100) es el comando para escribir en memoria
;sin incrementar la posicion del address pointer
call enviar_comando
bucle
goto bucle
GLCD_INI
;Rutina de inicializacion del controlador del GLCD
bcf PORTA,0
nop ;Resteo el GLCD por mas de 80ns
bsf PORTA,0
;Configuro el inicio de la memoria de grafico en la direccion 0x0000
clrf byte_bajo
clrf byte_alto
call enviar_dos_datos
movlw 0x42 ;0x42 es el comando para setear el inicio del area de grafico
call enviar_comando
;Configuro el area de la memoria de grafico: 240 pixels / 8 bits (1 byte)= 30 bytes
;escojo 32 (0x0020) para facilitar operaciones logicas, tiene que coincidir con el tamaño de la pantalla
movlw 0x20
movwf byte_bajo
clrf byte_alto
call enviar_dos_datos
movlw 0x43 ;0x43 es el comando para setear el area de graficos
call enviar_comando
;Configuro el inicio de la memoria de texto: el area grafico es 32 byte * 128 lineas = 4096 (0x1000)
clrf byte_bajo
movlw 0x10
movwf byte_alto
call enviar_dos_datos
movlw 0x40 ;0x40 es el comando para setear el inicio del area de texto
call enviar_comando
;Configuro el area de la memoria de texto: 240 pixels / 8 bits (1 byte)= 30 bytes
;escojo 32 (0x0020) para facilitar operaciones logicas, tiene que coincidir con el tamaño de la pantalla
movlw 0x20
movwf byte_bajo
clrf byte_alto
call enviar_dos_datos
movlw 0x41 ;0x41 es el comando para setear el area de texto
call enviar_comando
;Configuro el modo como: CG=0 (uso caracteres internos), MD2=0 , MD0=0, MD0=0 para modo OR
modo_set
movlw b'10000000'
call enviar_comando
;Configuro el modo como: GRPH=1, TEXT=1, CUR=0, BLK=0 para texo y graficos a la vez sin cursor
display_set
movlw b'10011100'
call enviar_comando
;Configuro el offset register
movlw 0x02
movwf byte_bajo
clrf byte_alto
call enviar_dos_datos
movlw 0x22 ;0x22 es el comando para la direccion
;del offset register
call enviar_comando
return
check_estado
;Comprueba el estado STA0/STA1, si ambos son 1 al mismo tiempo el
;controlador esta listo para recibir datos/comandos
banksel TRISB
movlw 0xff
movwf TRISB ;Configuro PORTB como entradas
banksel PORTC
movlw b'01010000'
movwf PORTC ;Configuro /CE=0, /WR=1, /RD=0 y CD=1 para leer estdo del GLCD
nop
check1
btfss PORTB,0 ;Pregunto si el bit de STA0 es 1
goto check1 ;si no es 1 vulevo a preguntar hasta que lo sea
check1a
btfss PORTB,1 ;Pregunto si el bit de STA1 es 1
goto check1a ;si no es 1 vulevo a preguntar por el primero
movlw b'11110000'
movwf PORTC ;Configuro /CE=1, /WR=1, /RD=1 y CD=1
nop
banksel TRISB
clrf TRISB ;Configuro PORTB como salidas
banksel PORTB
return
enviar_dato
;Guarda en temp el dato a enviar, configura los pines de control (/CE, /WR, /RD y CD) y luego envia temp al PORTB
movwf temp
movlw b'11100000'
movwf PORTC ;Configuro /CE=1, /WR=1, /RD=1 y CD=0
movf temp,W
movwf PORTB
nop
movlw b'00100000'
movwf PORTC ;Configuro /CE=0, /WR=0, /RD=1 y CD=0 para escribir un dato al GLCD
nop
movlw b'11100000'
movwf PORTC ;Configuro /CE=1, /WR=1, /RD=1 y CD=0
nop
movlw b'11110000'
movwf PORTC ;Configuro /CE=1, /WR=1, /RD=1 y CD=1
nop
return
enviar_dos_datos
;Comprueba el estado STA0/STA1 para despues enviar los datos en byte_bajo y byte_alto
call check_estado
movf byte_bajo,W
call enviar_dato
call check_estado
movf byte_alto,W
call enviar_dato
return
enviar_comando
;Guarda el comando en el registro temp, comprueba el estado
;STA0/STA1 y despues envia temp por el PORTB
movwf temp
call check_estado
movf temp,W
movwf PORTB
nop
movlw b'00110000'
movwf PORTC ;Configuro /CE=0, /WR=0, /RD=1 y CD=1
nop
movlw b'11110000'
movwf PORTC ;Configuro /CE=1, /WR=1, /RD=1 y CD=1
nop
return
limpiar_grafico
;La memoria del GLCD es de 240 pixels / 8 bits = 30 (elijo 32 para facilitar calculos)
;de ancho y 128 pixels de alto, o sea 32 * 128 = 4096 bits (0x10000) de memoria
clrf byte_bajo
clrf byte_alto
call add_point
movlw 0xb0 ;0xb0 es el comando para setear el modo de auto escritura
call enviar_comando
movlw 0x10
movwf loop_l ;filas 128 pixels / 8 bits = 16
lazo1
movlw 0x00
movwf loop_h ;columnas 240 pixels / 8 bits = 30 (elijo 32)
lazo2
clrw
;movlw 0x00
call auto_escribir
decfsz loop_h,F
goto lazo2
decfsz loop_l,F
goto lazo1
call check_estado_sta3
movlw 0xb2 ;0xb2 es el comando para resetear el modo de auto escritura/lectura
call enviar_comando
return
limpiar_texto
;La memoria del GLCD es de 240 pixels / 8 bits = 30 (elijo 32 para facilitar calculos)
;de ancho y 128 pixels de alto, o sea 32 * 128 = 4096 bits (0x10000) de memoria
clrf byte_bajo
movlw 0x10
movwf byte_alto
call add_point
movlw 0xb0 ;0xb0 es el comando para setear el modo de auto escritura
call enviar_comando
movlw 0x10
movwf loop_l ;filas 128 pixels / 8 bits = 16
lazo1a
movlw 0x00
movwf loop_h ;columnas 240 pixels / 8 bits = 30 (elijo 32)
lazo2a
clrw
;movlw 0x00
call auto_escribir
decfsz loop_h,F
goto lazo2a
decfsz loop_l,F
goto lazo1a
call check_estado_sta3
movlw 0xb2 ;0xb2 es el comando para resetear el modo de auto escritura/lectura
call enviar_comando
return
check_estado_sta3
;Sub rutina que comprueba el estado del bit STA3 (Auto mode data write capability)
banksel TRISB
movlw 0xff
movwf TRISB ;Configuro PORTB como entradas
banksel PORTB
movlw b'01010000'
movwf PORTC ;Configuro /CE=0, /WR=1, /RD=0 y CD=1 para leer estdo del GLCD
nop
check_sta3
btfss PORTB,3 ;Pregunto si el bit de STA3 es 1
goto check_sta3 ;si no es 1 vulevo a preguntar hasta que lo sea
movlw b'11110000'
movwf PORTC ;Configuro /CE=1, /WR=1, /RD=1 y CD=1
nop
banksel TRISB
clrf TRISB ;Configuro PORTB como salidas
banksel PORTB
return
add_point
;Configuro el address pointer en la ubicacion dada por byte_bajo (low address) y byte_alto (high address)
call check_estado
movf byte_bajo,W
call enviar_dato
call check_estado
movf byte_alto,W
call enviar_dato
movlw 0x24 ;0x24 es el comando para el address pointer
call enviar_comando
return
auto_escribir
;Rutina que escribe en memoria con "auto write mode" el valor en el registro temp
movwf temp
call check_estado_sta3
movf temp,W
call enviar_dato
return
retardo
movlw 0xff
movwf loop_l
la1a
movlw 0xff
movwf loop_h ;columnas 240 pixels / 8 bits = 30 (elijo 32)
la2a
decfsz loop_h,F
goto la2a
decfsz loop_l,F
goto la1a
return
fin
END
;PORT_B0...PORT_B7 GLCD_D0...GLCD_D7
;PORT_C4 GLCD_CD
;PORT_C5 GLCD_/RD
;PORT_C6 GLCD_/WR
;PORT_C7 GLCD_/CE