begin process at 2008 08 28 22:07:28
1 233 395 membres
487 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

AFFICHEUR LCD 2X16 EN MODE 4BIT POUR PIC 16XXX


Information sur la source

Catégorie :Les PIC Niveau : Débutant Date de création : 08/06/2003 Date de mise à jour : 08/06/2003 11:42:50 Vu / téléchargé: 11 761 / 898

Note :
Aucune note

Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

Description

Voici les routines nécessaires pour faire marcher simplement un afficheur LCD en mode 4bit.

Type de pic : PIC16FXXX (ou 16CXXX)
Quartz : 4Mhz (pour utiliser un autre quartz, il suffit de modifier le fichier q4mhz.asm qui contient les routines de temporisation).

Source

  • ;
  • ; Routines afficheur 2*16 en mode 4 Bits V1.0b
  • ;
  • ; O.REZE 06/2003
  • ;-----------------------------------------------------------------------------------------
  • ;
  • ;
  • ; LCD_INIT : initialisation de l'afficheur
  • ; LCD_WRITE_RAM_W : envoi un caractere ( contenu dans w ) sur l'afficheur
  • ; LCD_WRITE_CONTROL_W : envoi une commande ( contenue dans w) à l'afficheur
  • ; LCD_CLEAR_DISPLAY : efface l'afficheur
  • ; LCD_RETURN_HOME : renvoi le curseur en haut a gauche
  • ; LCD_LIGNE1 : renvoi le curseur au debut de la ligne 1
  • ; LCD_LIGNE2 : renvoi le curseur au debut de la ligne 2
  • ; LCD_ON/LCD_OFF : allume ou eteint l'affichage
  • ; LCD_CURSOR_ON/LCD_CURSOR_OFF : Affichage ou pas du curseur
  • ; LCD_BLINK_ON/LCD_BLINK_OFF : Mode BLINK on ou off
  • ; LCD_DIR_LEFT/LCD_DIR_RIGHT : Direction de l'écriture
  • ; LCD_SH_ON/LCD_SH_OFF :
  • ;
  • ; constantes a definir dans le programme principal:
  • ;
  • ; LCD_DATA ; LCD: Port ou est branche le bus de donnee ( bits 4 à 7 ) MSB IMPERATIF
  • ; LCD_E ; LCD: Ligne de commande de controle de l'afficheur
  • ; LCD_RW ; LCD: Ligne de Lecture/Ecriture de l'afficheur
  • ; LCD_RS ; LCD: Ligne de selection de l'afficheur
  • ;
  • ; variables a definir dans le programme principal:
  • ;
  • ; LCD_mode_set, LCD_disp_cont,DATA_TMP,J
  • ; LCD_curs_disp_shift, LCD_func_set,DATA_SWAP,PORT_SAVE
  • ;
  • LCD_INIT: ;Initialisation de l'afficheur
  • CALL Tempo_30ms
  • movlw h'20' ;Function set
  • call LCD_WRITE_CONTROL_W_1 ;Ecriture
  • movlw LCD_FUNCTION_SET ;Function set
  • movwf LCD_func_set ;Sauvegarde des paramètres
  • call LCD_WRITE_CONTROL_W ;Ecriture
  • ;Tempo de 39us
  • movlw LCD_DISPLAY_CONTROL ;Display ON/OFF
  • movwf LCD_disp_cont ;Sauvegarde des paramètres
  • call LCD_WRITE_CONTROL_W ;Ecriture
  • ;Tempo de 39us
  • call LCD_CLEAR_DISPLAY
  • movlw LCD_ENTRY_MODE_SET ;Entry mode set
  • movwf LCD_mode_set ;Sauvegarde des paramètres
  • call LCD_WRITE_CONTROL_W ;Ecriture
  • CALL Tempo_43us
  • movlw LCD_CURSOR_DISPLAY_SHIFT
  • movwf LCD_curs_disp_shift ;Sauvegarde des paramètres
  • return ;Init end
  • LCD_WRITE_CONTROL_W_1:
  • andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
  • movwf PORT_SAVE
  • bcf LCD_RW ;Write
  • bcf LCD_RS ;RS a 0
  • bsf LCD_E ;Enable a 1
  • movf LCD_DATA,w
  • andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
  • iorwf PORT_SAVE,w
  • movwf LCD_DATA ;Copie W sur le bus DATA
  • bcf LCD_E ;Enable a 0
  • CALL Tempo_43us
  • return
  • LCD_WRITE_CONTROL_W:
  • movwf DATA_SWAP
  • andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
  • movwf PORT_SAVE
  • bcf LCD_RW ;Write
  • bcf LCD_RS ;RS a 0
  • bsf LCD_E ;Enable a 1
  • movf LCD_DATA,w
  • andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
  • iorwf PORT_SAVE,w
  • movwf LCD_DATA ;Copie W sur le bus DATA
  • bcf LCD_E ;Enable a 0
  • CALL Tempo_43us
  • swapf DATA_SWAP,w
  • andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
  • movwf PORT_SAVE
  • bcf LCD_RW ;Write
  • bcf LCD_RS ;RS a 0
  • bsf LCD_E ;Enable a 1
  • movf LCD_DATA,w
  • andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
  • iorwf PORT_SAVE,w
  • movwf LCD_DATA ;Copie W sur le bus DATA
  • bcf LCD_E ;Enable a 0
  • CALL Tempo_43us
  • return
  • LCD_WRITE_RAM_W:
  • movwf DATA_SWAP
  • andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
  • movwf PORT_SAVE
  • bcf LCD_RW ;Write
  • bsf LCD_RS ;RS a 1
  • bsf LCD_E ;Enable a 1
  • movf LCD_DATA,w
  • andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
  • iorwf PORT_SAVE,w
  • movwf LCD_DATA ;Copie W sur le bus DATA
  • bcf LCD_E ;Enable a 0
  • CALL Tempo_43us
  • swapf DATA_SWAP,w
  • andlw b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
  • movwf PORT_SAVE
  • bcf LCD_RW ;Write
  • bsf LCD_RS ;RS a 1
  • bsf LCD_E ;Enable a 1
  • movf LCD_DATA,w
  • andlw b'00001111' ;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
  • iorwf PORT_SAVE,w
  • movwf LCD_DATA ;Copie W sur le bus DATA
  • bcf LCD_E ;Enable a 0
  • CALL Tempo_43us
  • return
  • LCD_LIGNE1:
  • movlw h'80'
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_LIGNE2:
  • movlw h'C0'
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_CLEAR_DISPLAY:
  • movlw h'01'
  • CALL LCD_WRITE_CONTROL_W
  • CALL Tempo_1530us
  • return
  • LCD_RETURN_HOME:
  • movlw h'02'
  • CALL LCD_WRITE_CONTROL_W
  • CALL Tempo_1530us
  • return
  • LCD_ON:
  • bsf LCD_disp_cont,2
  • movf LCD_disp_cont,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_OFF:
  • bcf LCD_disp_cont,2
  • movf LCD_disp_cont,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_CURSOR_ON:
  • bsf LCD_disp_cont,1
  • movf LCD_disp_cont,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_CURSOR_OFF:
  • bcf LCD_disp_cont,1
  • movf LCD_disp_cont,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_BLINK_ON:
  • bsf LCD_disp_cont,0
  • movf LCD_disp_cont,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_BLINK_OFF:
  • bcf LCD_disp_cont,0
  • movf LCD_disp_cont,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_DIR_LEFT:
  • bcf LCD_mode_set,1
  • movf LCD_mode_set,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_DIR_RIGHT:
  • bsf LCD_mode_set,1
  • movf LCD_mode_set,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_SH_ON:
  • bsf LCD_mode_set,2
  • movf LCD_mode_set,0
  • CALL LCD_WRITE_CONTROL_W
  • return
  • LCD_SH_OFF:
  • bcf LCD_mode_set,2
  • movf LCD_mode_set,0
  • CALL LCD_WRITE_CONTROL_W
  • return
;
;			Routines afficheur 2*16 en mode 4 Bits  	V1.0b
;
;									O.REZE	06/2003
;-----------------------------------------------------------------------------------------
;
;
;	LCD_INIT 		: initialisation de l'afficheur
;	LCD_WRITE_RAM_W 	: envoi un caractere ( contenu dans w ) sur l'afficheur
;	LCD_WRITE_CONTROL_W : envoi une commande ( contenue dans w) à l'afficheur
;	LCD_CLEAR_DISPLAY  	: efface l'afficheur
;	LCD_RETURN_HOME 	: renvoi le curseur en haut a gauche
;	LCD_LIGNE1 	: renvoi le curseur au debut de la ligne 1
;	LCD_LIGNE2 	: renvoi le curseur au debut de la ligne 2
;	LCD_ON/LCD_OFF		: allume ou eteint l'affichage
;	LCD_CURSOR_ON/LCD_CURSOR_OFF  : Affichage ou pas du curseur
;	LCD_BLINK_ON/LCD_BLINK_OFF	: Mode BLINK on ou off
;	LCD_DIR_LEFT/LCD_DIR_RIGHT	: Direction de l'écriture
;	LCD_SH_ON/LCD_SH_OFF	:
;
;	constantes a definir dans le programme principal:
;
;	LCD_DATA	; LCD: Port ou est branche le bus de donnee ( bits 4 à 7 ) MSB IMPERATIF
;	LCD_E	; LCD: Ligne de commande de controle de l'afficheur
;	LCD_RW	; LCD: Ligne de Lecture/Ecriture de l'afficheur
;	LCD_RS	; LCD: Ligne de selection de l'afficheur
;
;	variables a definir dans le programme principal:
;
;       LCD_mode_set, LCD_disp_cont,DATA_TMP,J    		       
;       LCD_curs_disp_shift, LCD_func_set,DATA_SWAP,PORT_SAVE
;


LCD_INIT:			;Initialisation de l'afficheur

	CALL	Tempo_30ms
	movlw	h'20'			;Function set
	call 	LCD_WRITE_CONTROL_W_1	;Ecriture

	movlw	LCD_FUNCTION_SET	;Function set
	movwf	LCD_func_set	;Sauvegarde des paramètres
	call 	LCD_WRITE_CONTROL_W	;Ecriture
	               			                ;Tempo de 39us

	movlw	LCD_DISPLAY_CONTROL	;Display ON/OFF
	movwf	LCD_disp_cont	;Sauvegarde des paramètres
	call 	LCD_WRITE_CONTROL_W	;Ecriture
					;Tempo de 39us

	call 	LCD_CLEAR_DISPLAY

	movlw	LCD_ENTRY_MODE_SET	;Entry mode set
	movwf	LCD_mode_set	;Sauvegarde des paramètres
	call 	LCD_WRITE_CONTROL_W	;Ecriture
 	CALL	Tempo_43us

	movlw	LCD_CURSOR_DISPLAY_SHIFT
	movwf	LCD_curs_disp_shift	;Sauvegarde des paramètres

	return				;Init end

LCD_WRITE_CONTROL_W_1:
	andlw	b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
	movwf	PORT_SAVE
	bcf	LCD_RW			;Write
	bcf	LCD_RS			;RS a 0
	bsf	LCD_E			;Enable a 1
	movf	LCD_DATA,w
	andlw	b'00001111'	;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
	iorwf	PORT_SAVE,w
 	movwf	LCD_DATA		;Copie W sur le bus DATA
	bcf	LCD_E			;Enable a 0
 	CALL	Tempo_43us

	return

LCD_WRITE_CONTROL_W:
	movwf	DATA_SWAP
	andlw	b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
	movwf	PORT_SAVE
	bcf	LCD_RW			;Write
	bcf	LCD_RS			;RS a 0
	bsf	LCD_E			;Enable a 1
	movf	LCD_DATA,w
	andlw	b'00001111'	;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
	iorwf	PORT_SAVE,w
	movwf	LCD_DATA		;Copie W sur le bus DATA
	bcf	LCD_E			;Enable a 0
 	CALL	Tempo_43us

	swapf	DATA_SWAP,w
	andlw	b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
	movwf	PORT_SAVE
	bcf	LCD_RW			;Write
	bcf	LCD_RS			;RS a 0
	bsf	LCD_E			;Enable a 1
	movf	LCD_DATA,w
	andlw	b'00001111'	;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
	iorwf	PORT_SAVE,w
	movwf	LCD_DATA		;Copie W sur le bus DATA
	bcf	LCD_E			;Enable a 0
 	CALL	Tempo_43us

	return

LCD_WRITE_RAM_W:
	movwf	DATA_SWAP
	andlw	b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
	movwf	PORT_SAVE
	bcf	LCD_RW			;Write
	bsf	LCD_RS			;RS a 1
	bsf	LCD_E			;Enable a 1
	movf	LCD_DATA,w
	andlw	b'00001111'	;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
	iorwf	PORT_SAVE,w
	movwf	LCD_DATA		;Copie W sur le bus DATA
	bcf	LCD_E			;Enable a 0
 	CALL	Tempo_43us

	swapf	DATA_SWAP,w
	andlw	b'11110000' ;Masque tout le poid faible (non utilisé par l'afficheur)
	movwf	PORT_SAVE
	bcf	LCD_RW			;Write
	bsf	LCD_RS			;RS a 1
	bsf	LCD_E			;Enable a 1
	movf	LCD_DATA,w
	andlw	b'00001111'	;Sauvegarde tout le poid faible (non utilisé par l'afficheur)
	iorwf	PORT_SAVE,w
	movwf	LCD_DATA		;Copie W sur le bus DATA
	bcf	LCD_E			;Enable a 0
 	CALL	Tempo_43us

	return

LCD_LIGNE1:
	movlw	h'80'
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_LIGNE2:
	movlw	h'C0'
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_CLEAR_DISPLAY:
	movlw	h'01'
 	CALL	LCD_WRITE_CONTROL_W
 	CALL	Tempo_1530us
	return

LCD_RETURN_HOME:
	movlw	h'02'
 	CALL	LCD_WRITE_CONTROL_W
 	CALL	Tempo_1530us
	return

LCD_ON:
	bsf  	LCD_disp_cont,2		
	movf	LCD_disp_cont,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_OFF:
	bcf  	LCD_disp_cont,2		
	movf	LCD_disp_cont,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_CURSOR_ON:
	bsf  	LCD_disp_cont,1		
	movf	LCD_disp_cont,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_CURSOR_OFF:
	bcf  	LCD_disp_cont,1		
	movf	LCD_disp_cont,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_BLINK_ON:
	bsf  	LCD_disp_cont,0		
	movf	LCD_disp_cont,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_BLINK_OFF:
	bcf  	LCD_disp_cont,0		
	movf	LCD_disp_cont,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_DIR_LEFT:
	bcf  	LCD_mode_set,1		
	movf	LCD_mode_set,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_DIR_RIGHT:
	bsf  	LCD_mode_set,1		
	movf	LCD_mode_set,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_SH_ON:
	bsf  	LCD_mode_set,2		
	movf	LCD_mode_set,0
 	CALL	LCD_WRITE_CONTROL_W
	return

LCD_SH_OFF:
	bcf  	LCD_mode_set,2		
	movf	LCD_mode_set,0
 	CALL	LCD_WRITE_CONTROL_W
	return





Conclusion

*** IMPORTANT *** : Les 4bits de data doivzent être sur les bist 4 à 7 du port utilisé. Sinon, il est nécessaire de retoucher la routine.

Première étape indispensable : passer par un call LCD_INIT pour initialiser l'écran.
Ensuite pour écrire un caractère, rien de plus simple :

movlw d'41' (A en ascii)
call LCD_WRITE_RAM_W

et c tout !

le fichier lcd_4b.inc contient toutes les données d'initialisations.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de taao le 10/10/2006 21:05:49

    Salut,
    je voudrais juste savoir si ce code la est aussi valable pour le PIC16F676, et puis si on a un crystal 1.8432Mhz,que doit on changer dans le code?

    ; constantes a definir dans le programme principal:
    ;
    ; LCD_DATA ; LCD: Port ou est branche le bus de donnee ( bits 4 à 7 ) MSB IMPERATIF
    ; LCD_E ; LCD: Ligne de commande de controle de l'afficheur
    ; LCD_RW ; LCD: Ligne de Lecture/Ecriture de l'afficheur
    ; LCD_RS ; LCD: Ligne de selection de l'afficheur
    ;
    ; variables a definir dans le programme principal:
    ;
    ;       LCD_mode_set, LCD_disp_cont,DATA_TMP,J           
    ;       LCD_curs_disp_shift, LCD_func_set,DATA_SWAP,PORT_SAVE


    Que veux tu dire par constante a definir ou variable a definir? comment on peut definir ces variables?
    Merci
    TT

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS