Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Exemple PS - Pantalla LCD amb connexió sèrie

En aquest exemple volem enviar unes lletres a la pantalla. En el programa següent enviem "PIC" a la primera línia i "kit" a la segona. Hem posat els caràcters a enviar en el propi cos del programa però els podíem haver posat a la memòria de programa o a la memòria EEPROM i fer el programa més curt.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Caracter EQU 0x20  ; Caràcter o codi a enviar
Retard1 EQU 0x21  ; Variables de retard	
Retard2 EQU 0x22
Retard3 EQU 0x23
PSECT code, class=CODE, delta=2, abs
main:
  movlw 10  ; Retard de 2 s
  call Rets  ; Esperem que arrenqui la pantalla
  bsf RP1  ; Tria el banc 2
  movlw 00000101B
  movwf ANSEL  ; Configura AN0 i AN2 com entrada analògica
  clrf ANSELH  ; Desactiva les altres entrades analògiques
  bcf RP1
  bsf RP0  ; Tria el banc 1
  clrf TRISC  ; Tot el port C és de sortida
  clrf TRISB  ; Tot el port B és de sortida
  bsf BRGH  ; Configuració de velocitat
  bcf BRG16  ; Paràmetre de velocitat de 8 bits
  movlw 25  ; Velocitat de 9600 baud
  movwf SPBRG  ; Paràmetre de velocitat
  bcf SYNC  ; Comunicació asíncrona
  bcf TX9  ; Comunicació de 8 bits
  bcf RP0  ; Tria el banc 0
  bsf SPEN  ; Activa comunicació sèrie
  bsf RP0  ; Tria el banc 1
  bsf TXEN  ; Activa comunicació
  bcf RP0  ; Tria el banc 0
  movlw 254  ; Caràcter de control
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 1  ; Esborra la pantalla i posa el cursor a l'inici
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'P'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'I'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'C'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 254  ; Control de la posició del cursor
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 64  ; Filera 2 columna 1
  iorlw 10000000B  ; Posa el bit de posicionat a 1
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'k'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'i'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 't'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  goto $
;
; Enviem caràcters a visualitzar
;
EnviaL:
  movf Caracter,w  ; Agafa el caràcter
  movwf TXREG  ; L'envia
  nop			
  nop  ; Espera 2 us
  btfss TXIF  ; El registre TXREG ha quedat lliure?
  goto $-1  ; No, doncs esperem
  return  ; Tornem al lloc des d'on hem vingut
;
; Funció de retard de 0,2 W s
;
Rets:
  movwf Retard3
Bucles:
  decfsz Retard1,f		
  goto Bucles		
  decfsz Retard2,f		
  goto Bucles		
  decfsz Retard3,f	
  goto Bucles
  return
END main

Atenció: en alguns casos hem detectat problemes causats perquè s'envien coses a la pantalla abans que aquesta s'acabi d'inicialitzar. Si es detecta un mal funcionament de la pantalla, és recomanable posar un retard, per exemple d'aproximadament un segon, a l'inici del programa.

En la següent versió de l'exemple hem afegit un caràcter especial (la lletra Ω) que l'hem guardat a la posició 0 de la taula de caràcters. Aquesta Ω la fem sortir a la posició 16 de la primera línia i també a la posició 15 de la segona.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Caracter EQU 0x20  ; Caràcter o codi a enviar
Retard1 EQU 0x21  ; Variables de retard	
Retard2 EQU 0x22
Retard3 EQU 0x23
PSECT code, class=CODE, delta=2, abs
main:
  movlw 10  ; Retard de 2 s
  call Rets  ; Esperem que arrenqui la pantalla
  bsf RP1  ; Tria el banc 2
  movlw 00000101B
  movwf ANSEL  ; Configura AN0 i AN2 com entrada analògica
  clrf ANSELH  ; Desactiva les altres entrades analògiques
  bcf RP1
  bsf RP0  ; Tria el banc 1
  clrf TRISC  ; Tot el port C és de sortida
  clrf TRISB  ; Tot el port B és de sortida
  bsf BRGH  ; Configuració de velocitat
  bcf BRG16  ; Paràmetre de velocitat de 8 bits
  movlw 25  ; Velocitat de 9600 baud
  movwf SPBRG  ; Paràmetre de velocitat
  bcf SYNC  ; Comunicació asíncrona
  bcf TX9  ; Comunicació de 8 bits
  bcf RP0  ; Tria el banc 0
  bsf SPEN  ; Activa comunicació sèrie
  bsf RP0  ; Tria el banc 1
  bsf TXEN  ; Activa comunicació
  bcf RP0  ; Tria el banc 0
  ; Caràcters especials
  movlw 254  ; Control de la posició
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 0  ; Adreça de la primera línia
  iorlw 01000000B  ; Posa el bit de caràcter especial a 1
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00000000B  ; Primera filera
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00001110B
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00010001B
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00010001B
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00001010B
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00001010B
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00011011B
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 00000000B  ; Darrera filera
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  ; Fi caràcters especials
  movlw 254  ; Caràcter de control
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 1  ; Esborra la pantalla i posa el cursor a l'inici
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'P'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'I'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'C'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 254  ; Control de la posició del cursor
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 64  ; Filera 2 columna 1
  iorlw 10000000B  ; Posa el bit de posicionat a 1
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'k'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 'i'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 't'  ; Lletra
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 254  ; Control de la posició del cursor
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 15  ; Filera 1 columna 16
  iorlw 10000000B  ; Posa el bit de posicionat a 1
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 0  ; Caràcter especial
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 254  ; Control de la posició del cursor
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 78  ; Filera 2 columna 15
  iorlw 10000000B  ; Posa el bit de posicionat a 1
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 0  ; Caràcter especial
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  goto $
;
; Enviem caràcters a visualitzar
;
EnviaL:
  movf Caracter,w  ; Agafa el caràcter
  movwf TXREG  ; L'envia
  nop			
  nop  ; Espera 2 us
  btfss TXIF  ; El registre TXREG ha quedat lliure?
  goto $-1  ; No, doncs esperem
  return  ; Tornem al lloc des d'on hem vingut
;
; Funció de retard de 0,2 W s
;
Rets:
  movwf Retard3
Bucles:
  decfsz Retard1,f		
  goto Bucles		
  decfsz Retard2,f		
  goto Bucles		
  decfsz Retard3,f	
  goto Bucles
  return
END main

El següent programa fa el mateix que el primer que hem vist però guardant els textos amb la directiva IRP i recuperant-los modificant el comptador de programa.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
Caracter EQU 0x20  ; Caràcter o codi a enviar
Compt EQU 0x21  ; Comptador per al bucle d'enviar text
AdreL EQU 0x22  ; Adreça per al salt
AdreH EQU 0x23  ; Adreça per al salt
Retard1 EQU 0x24  ; Variables de retard	
Retard2 EQU 0x25
Retard3 EQU 0x26
PSECT code, class=CODE, delta=2, abs
main:
  bsf RP1  ; Tria el banc 2
  movlw 00000101B
  movwf ANSEL  ; Configura AN0 i AN2 com entrada analògica
  clrf ANSELH  ; Desactiva les altres entrades analògiques
  bcf RP1
  bsf RP0  ; Tria el banc 1
  clrf TRISC  ; Tot el port C és de sortida
  clrf TRISB ; Tot el port B és de sortida
  bsf BRGH  ; Configuració de velocitat
  bcf BRG16  ; Paràmetre de velocitat de 8 bits
  movlw 25  ; Velocitat de 9600 baud
  movwf SPBRG  ; Paràmetre de velocitat
  bcf SYNC  ; Comunicació asíncrona
  bcf TX9  ; Comunicació de 8 bits
  bcf RP0  ; Tria el banc 0
  bsf SPEN  ; Activa comunicació sèrie
  bsf RP0  ; Tria el banc 1
  bsf TXEN  ; Activa comunicació
  bcf RP0 ; Tria el banc 0
  movlw 10  ; Retard de 2 s
  call Rets  ; Esperem que arrenqui la pantalla
  movlw 254  ; Caràcter de control
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 1  ; Esborra la pantalla i posa el cursor a l'inici
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 3  ; Número de caràcters del primer missatge
  movwf Compt  ; Ho guarda al comptador
  movlw high Text1  ; Carrega la part alta de l'adreça de la taula
  movwf AdreH  ; Ho posa a la part alta de PC
  movlw low Text1  ; Carrega la part baixa de l'adreça de la taula
  movwf AdreL  ; Ho guarda per posar-ho a PCL
BucText1:
  call Llegir  ; Llegeix el caràcter
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  incf AdreL,f  ; Incrementa el punter	
  btfsc ZERO  ; S'ha activat Z?
  incf AdreH,f  ; Si s'ha activat, incrementem AdreH
  decfsz Compt  ; Decrementa el comptador
  goto BucText1  ; Si no és zero, envia el següent
  movlw 254  ; Control de la posició del cursor
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 64  ; Filera 2 columna 1
  iorlw 10000000B  ; Posa el bit de posicionat a 1
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  movlw 3  ; Número de caràcters del primer missatge
  movwf Compt  ; Ho guarda al comptador
  movlw high Text2  ; Carrega la part alta de l'adreça de la taula
  movwf AdreH  ; Ho posa a la part alta de PC
  movlw low Text2  ; Carrega la part baixa de l'adreça de la taula
  movwf AdreL  ; Ho guarda per posar-ho a PCL
BucText2:
  call Llegir  ; Llegeix el caràcter
  movwf Caracter  ; Ho guarda a la variable
  call EnviaL  ; Ho envia
  incf AdreL,f  ; Incrementa el punter	
  btfsc ZERO  ; S'ha activat Z?
  incf AdreH,f  ; Si s'ha activat, incrementem AdreH
  decfsz Compt  ; Decrementa el comptador
  goto BucText2  ; Si no és zero, envia el següent
  goto $
;
; Llegeix la taula amb els missatges
;
Llegir:
  movf AdreH,w  ; Agafa l'adreça de destí
  movwf PCLATH  ; Modifica el valor de PCLATH
  movf AdreL,w  ; Agafa l'adreça de destí
  movwf PCL  ; Modifica el valor de PCL (i, per tant, també el de PCH)
Text1:
IRP valors, 'P', 'I', 'C'
  retlw valors
ENDM
Text2:	
IRP valors, 'k', 'i', 't'
  retlw valors
ENDM
;
; Enviem caràcters a visualitzar
;
EnviaL:
  movf Caracter,w  ; Agafa el caràcter
  movwf TXREG  ; L'envia
  nop			
  nop  ; Espera 2 us
  btfss TXIF  ; El registre TXREG ha quedat lliure?
  goto $-1  ; No, doncs esperem
  return  ; Tornem al lloc des d'on hem vingut
;
; Funció de retard de 0,2 W s
;
Rets:
  movwf Retard3
Bucles:
  decfsz Retard1,f		
  goto Bucles		
  decfsz Retard2,f		
  goto Bucles		
  decfsz Retard3,f	
  goto Bucles
  return
END main

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.