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

Cyberdevil Messages postés 483 Date d'inscription mardi 10 juillet 2001 Statut Membre Dernière intervention 12 juillet 2006 - 8 juin 2003 à 10:59
 Tommy - 10 nov. 2016 à 22:33
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/15311-afficheur-lcd-2x16-en-mode-8bit-pour-pic-16xxx

CHECK_BUSY: ; ATTENTION: Sur les CPU rapides (quartz 20 MHz) il faut tenir compte du "Hold time" de l'afficheur (environ 500 ns). Dans ce cas rajouter 2 NOP dans le doute.
BCF STATUS,RP1 ; Si on ne travaille autour qu'avec les deux premières banques, cette ligne peut etre supprimée
BSF STATUS,RP0 ; On passe en banque 1 pour TRISx
MOVLW b'11111111'
MOVWF LCD_DATA_TRIS ; On passe en entrée le port LCD_DATA ENTIER.
BCF STATUS,RP0 ; On passe en banque 0
BCF LCD_RS ; RS a 0
BSF LCD_RW ; LCD en lecture
BSF LCD_E
TEST_BUSY:
BTFSC LCD_DATA,7 ; On vérifie si le bit busy est à 1 (occupé)
GOTO TEST_BUSY ; Occupé? On re-teste...
BCF LCD_E ; L'afficheur n'est plus occupé: Enable a 0
BCF LCD_RW ; LCD en écriture comme d'hab
BSF STATUS,RP0 ; On passe en banque 1 pour TRISx
CLRF LCD_DATA_TRIS ; On remet le port LCD_DATA en sortie
BCF STATUS,RP0 ; On repasse finalement en banque 0 (tout le reste est en banque 0 de toutes facons)
RETURN ; on rend la main


La mise en page va surement être crado (la zone commentaire oblige), mais ceci est un code qui permet de se passer de la plupart des temporisations d'afficheur. Il lit le Busy Flag (broche 7 de l'afficheur), qui passe a zéro quand ce dernier est apte à recevoir la suite. Ca permet de faire éventuellement autre chose en attendant plutôt que de tourner dans des boucles d'attente.

On mettra un CALL CHECK_BUSY avant d'envoyer des trucs à l'afficheur, et le tour est joué.
En fonction de l'endroit où on incorpore cette routine, il sera peut-être nécessaire de sauvegarder W dans une variable, et de la restaurer juste avant le RETURN. En effet cette routine a elle-même besoin de W.
ATTENTION: lors de la phase d'initialisation (ta routine LCD_INIT), il n'est pas encore possible à ce stade, de se servir du Busy Flag: ici il faut passer par des temporisations, il n'y a pas le choix.

J'ai changé de banque directement avec des BCF/BSF. Si on met des BANKSEL, c'est plus évident mais cette ligne est digérée par le compilateur et est remplacé par DEUX LIGNES à chaque fois, au total ça en fera 2 de trop.
Ne pas oublier un petit:
LCD_DATA_TRIS equ TRISx (x étant le port sur lequel se trouve les lignes de données du LCD) sinon ca foire, évidemment.

Voilàvoilà.
J'ai du mal à comprendre comment des lignes vides (ligne 39 et ligne 45) peuvent faite des "tempo de 39 microsecondes", dixit le commentaire de ces mêmes lignes.

De plus, tu indiques en commentaire ligne 30, les "variables à définir dans le programme principal", deux variables qui ne sont pas utilisés du tout dans ton code: DATA_TMP et J.

Ligne 38, 43, 50, 55 (commentés 'sauvegarde des paramètres'): je ne vois pas bien l'intérêt: ces variables ne sont jamais réutilisées (sauf erreur de ma part).

Bref, j'avoue ne pas avoir testé ton code, sans vouloir te vexer, j'ai de gros doutes sur la qualité de ton travail.
radioham Messages postés 39 Date d'inscription mardi 2 septembre 2003 Statut Membre Dernière intervention 7 décembre 2006
3 oct. 2005 à 08:38
Bonjour tranqilos,
Voila, je ne connais rien en matiere d'asm. Aussi, pourriez vous ajouter à vos informations les cyclogrammes que vous avez utilises en reference ? La notation qui vous a ete attribuee temoigne d'une excellente prestation dont je vous felicite et qui vous vaut mon admiration !
A partir de cette information, je pourrais tenter, avec votre permission, de reprendre mes sources c pour "coller" a ce qui vous avez realise.
En effet, je viens de realiser sur un PIC18F458 une surveillance de vitesse utilisant les donnees GPS de la trame NMIA. Je voudrais rajouter l'affichage en clair des vitesses (consigne et actuelle) ainsi que, pour le plaisir, la position geographique. Mais j'ai beaucoup de deboires avec ces damnes timings et la sequence lcd_init() ne se realise jamais !!! En vous remerciant, bien cordiales salutations, radioham
Cyberdevil Messages postés 483 Date d'inscription mardi 10 juillet 2001 Statut Membre Dernière intervention 12 juillet 2006
8 juin 2003 à 10:59
euhmm... la fréquence du pic doit être de cmb car tu utlise un tempo de 40 ms mais ça dépend du quartz.. tuarais du préciser.. sinon c pas mal !
A+