Programació en mpasm del PIC 16F690

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

Exemple P4 - Pantalla LCD amb connexió paral·lel de quatre bits

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
Control			; Bits de control (port B)
Caracter		; Caràcter o codi a enviar (port C)
Retard1			; Variables per als cicles de retard
Retard2
	endc
	org 0
Inici
	bsf		STATUS,RP0	; Banc 1
	clrf		TRISC		; Tot el port C és de sortida
	clrf		TRISB		; Tot el port B és de sortida
	bcf		STATUS,RP0	; Banc 0
	call		IniPant		; Inicialització del mode de funcionament de la pantalla
	movlw		.128
	call		Retard		; Esperem 0,1 s
	call		ConfPant	; Configuració de la pantalla
	movlw		.128
	call		Retard		; Esperem 0,1 s
					; Enviem l'adreça i els valors
	movlw		0x00		; Adreça DDRAM (Filera 1 - Posició 1)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; 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		0x40		; Adreça DDRAM (2 - 1)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; 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		$
					;
					; Inicialització del mode de funcionament de la pantalla
					;
IniPant					
	movlw		0		; Comença un cicle de durada fixa (0,2 s)
					; Temps que cal esperar després d'un reset
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movlw		b'00100000'	; Function set - Configuració inicial  0010 al nibble de l'esquerra
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaI		; Envia els 4 bits superiors
					; Ara enviem la configuració 2 línea, 5x8 píxels  0010 1000
	call		EnviaI		; Enviem la part esquerra (ja ho teníem a Caracter)
	movlw		b'10000000'	; I ara la part dreta (però posada a l'esquerra)
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaI		; Envia els 4 bits superiors
	return				; Fi de la inicialització del mode de funcionament
					;
					; Configuració de la pantalla
					;
ConfPant				
	movlw		b'00001111'	; Display ON/OFF control - Activa la pantalla amb cursor intermitent
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		b'00000001'	; Clear display - Buida la pantalla i inicialitza
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		.5		; El punt indica que es un valor decimal
					; Comença un cicle de durada fixa (3,9 ms)
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movlw		b'00000110'	; Entry mode - Buida la pantalla, sentit dreta i despl. automàtic
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	return				; Fi de la configuració de la pantalla
					;
					; Enviem caràcters 
					;
EnviaC					; Enviem caràcters de control
	bcf		Control,7	; Desactiva E
	bcf		Control,5	; Desactiva RS
	goto		Envia
EnviaL					; Enviem caràcters a visualitzar
	bcf		Control,7	; Desactiva E
	bsf		Control,5	; Activa RS
Envia	
	call		EnviaN		; Envia els 4 bits més alts
	swapf		Caracter,f	; Permuta els nibbles
	call		EnviaN		; Envia els 4 bits més alts
	swapf		Caracter,f	; Torna a deixar els nibbles com estaven
	return				; Tornem al lloc des d'on hem vingut
EnviaI					; Enviem nibbles de caràcters de control
	bcf		Control,7	; Desactiva E
	bcf		Control,5	; Desactiva RS
EnviaN					; Enviem nibbles
	decfsz		Retard1,f	; Funció de retard de 0,8 ms
	goto		EnviaN
	movf		Control,w	; Copia Control a l'acumulador
	movwf		PORTB		; I ho posa al PORTB
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	movf		Caracter,w	; Llegeix el caràcter
	andlw		0xF0		; Agafa els 4 bits més alts
	movwf		PORTC		; Envia el byte
	bsf		Control,7	; Activa E
	movf		Control,w	; Copia Control a l'acumulador
	movwf		PORTB		; I ho posa al PORTB
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	bcf		Control,7	; Desactiva E
	movf		Control,w	; Copia Control a l'acumulador
	movwf		PORTB		; I ho posa al PORTB
	return				; Tornem al lloc des d'on hem vingut
					;
					; Funció Retard, W conté el nombre de cicles de 771 us que cal fer 
					;
Retard					
	movwf		Retard2		; Ho copia a la variable Retard2
BucRet	
	decfsz		Retard1,f	; Decrementa la variable 1
					; si dona zero, no es fa la instrucció següent
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	decfsz		Retard2,f	; Decrementa la variable 2
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	return				; Tornem al lloc des d'on hem vingut
	end

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 CGRAM, que correspon als caràcters 0 i 8 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; però en un cas la cridem com a caràcter 0 i a l'altre com a caràcter 8.

#include <p16F690.inc>
	__config (_INTRC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_OFF&_MCLRE_OFF&_CP_OFF&_BOR_OFF&_IESO_OFF&_FCMEN_OFF)
	cblock 0x20
Control			; Bits de control (port B)
Caracter		; Caràcter o codi a enviar (port C)
Retard1			; Variables per als cicles de retard
Retard2
	endc
	org 0
Inici
	bsf		STATUS,RP0	; Banc 1
	clrf		TRISC		; Tot el port C és de sortida
	clrf		TRISB		; Tot el port B és de sortida
	bcf		STATUS,RP0	; Banc 0
	call		IniPant		; Inicialització del mode de funcionament de la pantalla
	movlw		.128
	call		Retard		; Esperem 0,1 s
	call		ConfPant	; Configuració de la pantalla
	movlw		.128
	call		Retard		; Esperem 0,1 s
					; Caràcters especials
	movlw		0x00		; Adreça CGRAM
	iorlw		b'01000000'	; Posa el bit de CGRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		b'00000100'	; Primera filera
	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'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
	movlw		.128
	call		Retard		; Esperem 0,1 s
					; Enviem l'adreça i els valors
	movlw		0x00		; Adreça DDRAM (Filera 1 - Posició 1)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; 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		0x40		; Adreça DDRAM (2 - 1)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; 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		0x0F		; Adreça DDRAM (1 - 16)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		0x00		; Caràcter especial
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	movlw		0x4E		; Adreça DDRAM (2 - 15)
	iorlw		b'10000000'	; Posa el bit de DDRAM a 1
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		0x08		; Caràcter especial
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaL		; Ho envia
	goto		$
					;
					; Inicialització del mode de funcionament de la pantalla 
					;
IniPant					
	movlw		.65		; Comença un cicle de durada fixa (0,2 s)
					; Temps que cal esperar després d'un reset
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movlw		b'00100000'	; Function set - Configuració inicial  0010 al nibble de l'esquerra
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaI		; Envia els 4 bits superiors
					; Ara enviem la configuració 2 línea, 5x8 píxels  0010 1000
	call		EnviaI		; Enviem la part esquerra (ja ho teníem a Caracter)
	movlw		b'10000000'	; I ara la part dreta (però posada a l'esquerra)
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaI		; Envia els 4 bits superiors
	return				; Fi de la inicialització del mode de funcionament
					;
					; Configuració de la pantalla 
					;
ConfPant				
	movlw		b'00001111'	; Display ON/OFF control - Activa la pantalla amb cursor intermitent
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		b'00000001'	; Clear display - Buida la pantalla i inicialitza
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	movlw		.5		; El punt indica que es un valor decimal
					; Comença un cicle de durada fixa (3,9 ms)
	call		Retard		; Crida a la funció Retard, el paràmetre està a W
	movlw		b'00000110'	; Entry mode - Buida la pantalla, sentit dreta i despl. automàtic
	movwf		Caracter	; Ho guarda a la variable
	call		EnviaC		; Ho envia
	return				; Fi de la configuració de la pantalla
					;
					; Enviem caràcters 
					;
EnviaC					; Enviem caràcters de control
	bcf		Control,7	; Desactiva E
	bcf		Control,5	; Desactiva RS
	goto		Envia
EnviaL					; Enviem caràcters a visualitzar
	bcf		Control,7	; Desactiva E
	bsf		Control,5	; Activa RS
Envia	
	call		EnviaN		; Envia els 4 bits més alts
	swapf		Caracter,f	; Permuta els nibbles
	call		EnviaN		; Envia els 4 bits més alts
	swapf		Caracter,f	; Torna a deixar els nibbles com estaven
	return				; Tornem al lloc des d'on hem vingut
EnviaI					; Enviem nibbles de caràcters de control
	bcf		Control,7	; Desactiva E
	bcf		Control,5	; Desactiva RS
EnviaN					; Enviem nibbles
	decfsz		Retard1,f	; Funció de retard de 0,8 ms
	goto		EnviaN
	movf		Control,w	; Copia Control a l'acumulador
	movwf		PORTB		; I ho posa al PORTB
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	movf		Caracter,w	; Llegeix el caràcter
	andlw		0xF0		; Agafa els 4 bits més alts
	movwf		PORTC		; Envia el byte
	bsf		Control,7	; Activa E
	movf		Control,w	; Copia Control a l'acumulador
	movwf		PORTB		; I ho posa al PORTB
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	nop				; Espera 1 us
	bcf		Control,7	; Desactiva E
	movf		Control,w	; Copia Control a l'acumulador
	movwf		PORTB		; I ho posa al PORTB
	return				; Tornem al lloc des d'on hem vingut
					;
					; Funció Retard, W conté el nombre de cicles de 771 us que cal fer 
					;
Retard					
	movwf		Retard2		; Ho copia a la variable Retard2
BucRet	
	decfsz		Retard1,f	; Decrementa la variable 1
					; si dona zero, no es fa la instrucció següent
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	decfsz		Retard2,f	; Decrementa la variable 2
	goto		BucRet		; Salta, excepte si el resultat ha estat zero
	return				; Tornem al lloc des d'on hem vingut
	end

 

 

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