Programació en mpasm 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.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Caracter		; Caràcter o codi a enviar
Retard1			; Variables de retard	
Retard2
Retard3
	endc
	org 0
Inici
	movlw		.10		; Retard de 2 s
	call		Rets		; Esperem que arrenqui la pantalla
	bsf		STATUS,RP1	; Tria el banc 2
	movlw		b'00000101'
	movwf		ANSEL		; Configura AN0 i AN2 com entrada analògica
	clrf		ANSELH		; Desactiva les altres entrades analògiques
	bcf		STATUS,RP1
	bsf		STATUS,RP0	; Tria el banc 1
	clrf		TRISC		; Tot el port C és de sortida
	clrf		TRISB		; Tot el port B és de sortida
	bsf		TXSTA,BRGH	; Configuració de velocitat
	bcf		BAUDCTL,BRG16	; Paràmetre de velocitat de 8 bits
	movlw		.25		; Velocitat de 9600 baud
	movwf		SPBRG		; Paràmetre de velocitat
	bcf		TXSTA,SYNC 	; Comunicació asíncrona
	bcf		TXSTA,TX9 	; Comunicació de 8 bits
	bcf		STATUS,RP0	; Tria el banc 0
	bsf		RCSTA,SPEN	; Activa comunicació sèrie
	bsf		STATUS,RP0	; Tria el banc 1
	bsf		TXSTA,TXEN 	; Activa comunicació
	bcf		STATUS,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		b'10000000'	; 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		PIR1,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

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.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Caracter		; Caràcter o codi a enviar
Retard1			; Variables de retard	
Retard2
Retard3
	endc
	org 0
Inici
	movlw		.10		; Retard de 2 s
	call		Rets		; Esperem que arrenqui la pantalla
	bsf		STATUS,RP1	; Tria el banc 2
	movlw		b'00000101'
	movwf		ANSEL		; Configura AN0 i AN2 com entrada analògica
	clrf		ANSELH		; Desactiva les altres entrades analògiques
	bcf		STATUS,RP1
	bsf		STATUS,RP0	; Tria el banc 1
	clrf		TRISC		; Tot el port C és de sortida
	clrf		TRISB		; Tot el port B és de sortida
	bsf		TXSTA,BRGH	; Configuració de velocitat
	bcf		BAUDCTL,BRG16	; Paràmetre de velocitat de 8 bits
	movlw		.25		; Velocitat de 9600 baud
	movwf		SPBRG		; Paràmetre de velocitat
	bcf		TXSTA,SYNC 	; Comunicació asíncrona
	bcf		TXSTA,TX9 	; Comunicació de 8 bits
	bcf		STATUS,RP0	; Tria el banc 0
	bsf		RCSTA,SPEN	; Activa comunicació sèrie
	bsf		STATUS,RP0	; Tria el banc 1
	bsf		TXSTA,TXEN 	; Activa comunicació
	bcf		STATUS,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		b'01000000'	; Posa el bit de caràcter especial a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00000000'	; Primera filera
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00001110'
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00010001'
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00010001'
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00001010'
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00001010'
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00011011'
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		b'00000000'	; Darrera filera
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
					; Fi caràcters especials
					; Enviem l'adreça i els valors
	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		b'10000000'	; 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		b'10000000'	; 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		b'10000000'	; 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		PIR1,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

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

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Caracter		; Caràcter o codi a enviar
Compt			; Comptador per al bucle d'enviar text
AdreL			; Adreça per al salt
AdreH			; Adreça per al salt
Retard1			; Variables de retard	
Retard2
Retard3
	endc
	org 0
Inici
	movlw		.10		; Retard de 2 s
	call		Rets		; Esperem que arrenqui la pantalla
	bsf		STATUS,RP1	; Tria el banc 2
	movlw		b'00000101'
	movwf		ANSEL		; Configura AN0 i AN2 com entrada analògica
	clrf		ANSELH		; Desactiva les altres entrades analògiques
	bcf		STATUS,RP1
	bsf		STATUS,RP0	; Tria el banc 1
	clrf		TRISC		; Tot el port C és de sortida
	clrf		TRISB		; Tot el port B és de sortida
	bsf		TXSTA,BRGH	; Configuració de velocitat
	bcf		BAUDCTL,BRG16	; Paràmetre de velocitat de 8 bits
	movlw		.25		; Velocitat de 9600 baud
	movwf		SPBRG		; Paràmetre de velocitat
	bcf		TXSTA,SYNC 	; Comunicació asíncrona
	bcf		TXSTA,TX9 	; Comunicació de 8 bits
	bcf		STATUS,RP0	; Tria el banc 0
	bsf		RCSTA,SPEN	; Activa comunicació sèrie
	bsf		STATUS,RP0	; Tria el banc 1
	bsf		TXSTA,TXEN 	; Activa comunicació
	bcf		STATUS,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		.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		STATUS,Z	; 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		b'10000000'	; 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		STATUS,Z	; 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
	dt	"PIC"
Text2	
	dt	"kit"
					;
					; Enviem caràcters a visualitzar
					;
EnviaL					
	movf		Caracter,w	; Agafa el caràcter
	movwf		TXREG		; L'envia
	nop			
	nop				; Espera 2 us
	btfss		PIR1,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

 

 

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