Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Bonjour à toute l'équipe du forum
folkeu08
Membre
Membre
Messages : 20
Âge : 52
Enregistré en : novembre 2017
Localisation : Ardennes (08)
Contact :

#11 Message par folkeu08 » dim. 18 nov. 2018 18:39

Bonjour à tous,
Jean Marc, le lien que tu communique est pour un afficheur LCD controlé par un KS0108. Celui de nondediode utilise un T6963C.
De plus, c'est un modèle de 240x64 et ton exemple est un afficheur 128x64.
Je n'ai jamais utilisé un afficheur graphique donc ce que je dis est peut être faux (pour le contôleur différent donc gestion différente ?)
Pour le mode de contrôle, les étapes sont indiquées au dessus du programme en C. Pas besoin de se le faire traduire par les utilisateur du C.
L'assembleur, j'y arrive pas du tout. J'y suis hermétique :mur: et ca m'énerve car j'ai parfois besoin de coder au plus prêt de la CPU pour gagner du temps.
Bonne soirée.

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#12 Message par nondediode » dim. 18 nov. 2018 18:56

JMarc a écrit :Bonjour tout le monde

Ça tombe bien, avec asm tout est gratuis, logiciel d’assemblage et les cours

J’ai trouvé ce lien https://exploreembedded.com/wiki/Interfacing_GLCD(128x64)_with_PIC16F877A , c’est du C mais avec les foromeur fana du C pourront facilement nous expliquer ce que nous devons codé en asm :langue:

Poste déjà ton programme voir si l’on peut t’aider


Bonjour Jean Marc,

Je l'avais vu celui-ci mais c'est du C et le contrôleur n'est pas le T6963C.
Mon programme? J'ai pas grand chose à fournir, si ce n'est ce que j'ai déjà posté plus haut mais c'est pas grand chose.
Actuellement, j'essaie d'écrire avec le peu que j'ai trouvé sur le net.

Bonjour à toute l'équipe du forum
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1136
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » lun. 19 nov. 2018 12:22

Bonjour à tous et bienvenue NondeDiode


J'ai eu l'occasion de tester un afficheur 128x64 mais de marque Digitron SG1264-J5 proc ST7920 et en C
avec un 18F26K22 !
Un afficheur graphique necessite une table de definition des carateres pour pouvoir ecrire du texte .
meme si la finalité est d'afficher une image ou un dessin

quelques pistes :

Cette table , dans mon cas faisait 1Ko de RAM

Code : Tout sélectionner

static unsigned char graphic[]=[ // size = 64x16=1024=400h soit 4 bank
0x00, 0x80, 0x00, 0x40,....
.....,
.0x00
}; 


Extrait de MAP file : 18F26K22_ST7920_128x64.map

Code : Tout sélectionner

 memoryGDRAM      udata   0x000500       data   0x000402
 memoryFONT      idata   0x000a00       data   0x000400



voila un exemple de table necessaire à l'affichage de caracteres ascii

Code : Tout sélectionner

#pragma idata memoryFONT

//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------

static unsigned char graphic [] = { // size =64*16 =1024=400h {
0x00, 0x80, 0x00, 0x40, 
0x00
, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x30, 0x30, 0x30, 0x30, 0x70, 0x60, 0x60, 0x60, 0xE0,
0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0,
0xF0, 0xF8, 0xFC, 0xFC, 0x7E, 0x7E, 0x7E, 0xFE, 0xFC, 0xF8, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0x1C,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0F, 0x1F, 0x1F, 0x3F, 0x7E, 0xFE, 0xFC, 0xFC,
0xFC, 0xF8, 0xB8, 0x30, 0x20, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFC, 0xFF, 0xFF,
0x3F, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x07, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
0x00, 0x00, 0xC0, 0xF8, 0xFE, 0xFF, 0x3F, 0x0F, 0x12, 0xFE, 0xFF, 0xFF, 0xFF, 0x3F, 0x3F, 0x1F,
0x80, 0xF8, 0xFF, 0xFF, 0xFF, 0x7E, 0x3F, 0x3F, 0x1F, 0xE2, 0xF8, 0xFC, 0xFE, 0x7F, 0x3F, 0x1F,
0x3F, 0xFF, 0xFE, 0xFC, 0xE0, 0x00, 0x00, 0xC0, 0xFE, 0xFF, 0xFF, 0x7F, 0x3E, 0x1F, 0xFF, 0xFF,
0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03,
0x07, 0x0F, 0x3F, 0xFE, 0xF8, 0xE0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xC0, 0x80, 0xC0, 0xC0, 0xF0, 0xFC, 0xFC, 0xFC, 0x3C, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0xFF,
0xFC, 0xFF, 0x7F, 0x1F, 0x07, 0x01, 0x00, 0x80, 0xFC, 0xFF, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0xF8,
0xFF, 0xFF, 0x7F, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0x81, 0x80, 0xC0, 0xE0,
0xFC, 0xFF, 0xFF, 0x3F, 0x03, 0xC0, 0xFC, 0xFF, 0xFF, 0x3F, 0x03, 0x00, 0xC0, 0xFC, 0xFF, 0xFF,
0x3F, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F,
0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0x00, 0xE0, 0xC0, 0xE0, 0xFF, 0xFF, 0xFF, 0x3F,
0x0F, 0x03, 0x80, 0x80, 0x80, 0x80, 0x00, 0x03, 0x0F, 0x0F, 0x0F, 0x0F, 0x07, 0x00, 0x0F, 0x0F,
0x0F, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
0x07, 0x03, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x0F, 0x03, 0x00, 0x00, 0x04, 0x0F, 0x0F, 0x0F, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0,
0xE0, 0xF0, 0x78, 0x3F, 0x1F, 0x07, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x07, 0x07, 0x07, 0x03, 0x00, 0x00,
0x00, 0x00, 0x01, 0xFF, 0x01, 0x01, 0xF8, 0xB4, 0xB4, 0x18, 0x70, 0x8C, 0x84, 0x4C, 0xC0, 0x1F,
0x04, 0xFC, 0x00, 0xFC, 0x04, 0xFC, 0x00, 0xF8, 0x8C, 0x84, 0x7C, 0x80, 0x3F, 0x70, 0x8C, 0x84,
0xFC, 0x00, 0xF8, 0x84, 0xEC, 0x0C, 0xF0, 0x05, 0xF8, 0xBC, 0xB4, 0x18, 0xC0, 0xBC, 0xF4, 0xEC,
0xC0, 0x40, 0x40, 0x60, 0x20, 0x30, 0x30, 0x18, 0x18, 0x08, 0x0C, 0x06, 0x06, 0x03, 0x03, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0xC0, 0x80, 0x00, 0x00, 0xC0, 0x40,
0x40, 0xC0, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC1, 0x80, 0x00, 0x80, 0xC1, 0x41, 0xC0, 0xC0, 0x00,
0x00, 0xC0, 0xC0, 0xC0, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x01,
0xC0, 0x02, 0x06, 0xC7, 0xC3, 0xC0, 0x40, 0x00, 0x00, 0x81, 0xC0, 0x80, 0x00, 0x01, 0x01, 0xC0,
0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x40, 0x00, 0xC0, 0x40, 0x40,
0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0xC0, 0xC0, 0x40, 0x00, 0x00, 0xC0, 0x40, 0x40, 0xC0,
0x00, 0x00, 0x80, 0xC0, 0xC0, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x03, 0x03, 0x07, 0x01, 0x00, 0x07, 0x06, 0x04,
0x04, 0x07, 0x00, 0x00, 0x07, 0x05, 0x05, 0x07, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x03, 0x00,
0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x01, 0x01, 0x07,
0x03, 0x00, 0x04, 0x07, 0x05, 0x04, 0x00, 0x00, 0x06, 0x03, 0x02, 0x07, 0x00, 0x00, 0x07, 0x04,
0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x02, 0x07, 0x04, 0x04,
0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x00, 0x00, 0x07, 0x04, 0x04, 0x04, 0x07,
0x00, 0x00, 0x07, 0x05, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00
//, 0x00, 0x00, 0x00, 0x00, 0x00
};

#pragma idata
 


donc il te faudrait reserver un espace semblable ..en RAM => mais pas possible avec un 16F877
ou en memoire FLASH .. mais difficile à manier byte par byte en lecture !


je pense que pour un GLCD, il te faut un PIC plus costaud
le 18F26K22 en DIP28 ou le 18F46K22 en DIP40 est un PIC facile et puissant.
Aides toi, le ciel ou Fantastpic t'aideras

Bonjour à toute l'équipe du forum
satinas
Passioné
Passioné
Messages : 355
Enregistré en : novembre 2015

#14 Message par satinas » lun. 19 nov. 2018 13:23

Bonjour à tous,
Paul, le T6963 a déjà une police de 128 caractères 5x7 intégrée en rom , et la possibilité de définir d'autres caractères stockés en ram.
De mémoire, il a une ram mixte texte/graphique. On programme l'adresse de départ de la mémoire du mode texte, et celle du mode graphique.
On peut ainsi choisir combien de pages texte ou graphique on aura, cela permet de faite du scroll par exemple.
Pour afficher on envoie un octet soit dans la ram texte pour afficher un caractère, soit dans la ram graphique, pour afficher une ligne (ou une colonne ?) de 8 pixels.
Il se pilote comme les autres lcd avec la broche C/D. elle permet de sélectionner l'envoi d'une commande ou une data.

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#15 Message par nondediode » lun. 19 nov. 2018 13:51

paulfjujo a écrit :Bonjour à tous et bienvenue NondeDiode


J'ai eu l'occasion de tester un afficheur 128x64 mais de marque Digitron SG1264-J5 proc ST7920 et en C
avec un 18F26K22 !
Un afficheur graphique necessite une table de definition des carateres pour pouvoir ecrire du texte .
meme si la finalité est d'afficher une image ou un dessin

donc il te faudrait reserver un espace semblable ..en RAM => mais pas possible avec un 16F877
ou en memoire FLASH .. mais difficile à manier byte par byte en lecture !


je pense que pour un GLCD, il te faut un PIC plus costaud
le 18F26K22 en DIP28 ou le 18F46K22 en DIP40 est un PIC facile et puissant.


Bonjour paulfjujo,

D'abord j'utilise un afficheur 240X64 qui date des années 80. Dans les années 80, l'exploitation d'un afficheur ne nécessitait pas forcement bcp de ressources eu égard aux microcontrôleurs utilisés à l'époque. Il y a plein d'exemples sur le net avec des afficheurs graphiques et des PICs 16F876 et 77. Seul soucis pour moi c'est qu'ils n'utilisent parfois pas le même langage et le contrôleur concerné n'est pas le T6963C. Mais avec tout ce que j'ai vu et lu, je suis convaincu que le 16F877 est largement capable de suffire à cette mission. En revanche, il ne sera peut-être pas capable de gérer plusieurs écrans en mode graphique ou d'afficher des dessins très compliqués mais c'est pas mon but non plus. Cela dit, je cherche pas à faire une usine à gaz, juste à afficher un peu de texte sur un écran d'une surface qui ne ridiculise pas la surface d'une face avant de 600 X 200. Si je trouvait un écran de grande dimension d'un minimum identique au DMF5005 qui utilise le HD44780, je prends tout de suite et j'abandonne le graphique. Le pb c'est que ce type d'afficheur est très difficile à trouver. Au pire j'ai un modèle carré de 7cm X 5,5cm qui utilise le contrôleur HD44780 plus un décodeur 14 segments (D7225G) la ref de l'afficheur est: OPTREX DMC2006 je n'ai pas le datasheet il demeure introuvable sur le net. Ce sont des afficheurs dédiés à l'automobile mais qui n'ont pas été retenus en fab. Cet afficheur pourrait me convenir mais sa forme me plait pas trop
C'est donc avec le DMF5005 que j'ai décidé de réaliser mon projet. J'ai déjà construit sa platine avec le PIC ce dont pourquoi je m'encourage à vouloir continuer avec lui sauf si je trouvais un LCD du même format.

Bonjour à toute l'équipe du forum
JMarc
Confirmé
Confirmé
Messages : 552
Enregistré en : août 2016
Localisation : Dans le Sud...

#16 Message par JMarc » sam. 24 nov. 2018 03:29

Bonjour nondediode et tout le monde


Alors ce programme, tu en es où ?

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#17 Message par nondediode » sam. 24 nov. 2018 09:12

Bonjour Jean Marc,

ça patine dur! :mur:

En plus j'y suis en pointillé. Je me fait opérer jeudi et j'ai pas mal d'examens médicaux à passer qui me fatigue pas mal.
J'ai reconstruit un programme à partir d'un lien qui m'a été fourni et j'essaie de l'adapter pour le 16f877.
Avec ce programme, j'obtiens juste un trait horizontale qui traverse l'écran.
https://www.electro-tech-online.com/art ... oller.482/

Voici le prg que j'ai retravaillé:

Code : Tout sélectionner

---------------------------------------------------------GESTION AFFICHEUR-----------------------------------------------------------------

TITREGestion d'un afficheur LCD graphique
; DATE: 10/11/2018
; AUTEUR: nondediode
; PIC UTILISE: PIC16F877
; Gestion PP845 version 2019
; le quartz est de 4MHz
 

;----------------------------------------------------Brochage du PIC sur la carte--------------------------------------------------------- 
;
;  Port | Broche | E/S | Description

;  RA0  |    02  |  S  | Relais "MUTE"
;  RA1  |    03  |  S  | Relais "PHASE"
;  RA2  |    04  |  S  | LED droite
;  RA3  |    05  |  S  | LED gauche
;  RA4  |    06  |  S  | Relais de cde HT gauche et droit
;  RA5  |    07  |  S  | Relais statique gauche et droit

;  RB0  |    33  |  E  | Inter "on / off"
;  RB1  |    34  |  E  | Bouton poussoir "OK"
;  RB2  |    35  |  S  | Data Write afficheur  
;  RB3  |    36  |  S  | Data Read afficheur
;  RB4  |    37  |  S  | Chip Enable
;  RB5  |    38  |  S  | C/D
;  RB6  |    39  |  S  | Font Size Select
;  RB7  |    40  |  S  | Reset

;  RC0  |    15  |  S  | Adressage entrée audio bit A
;  RC1  |    16  |  S  | Adressage entrée audio bit B
;  RC2  |    17  |  S  | Adressage entrée audio bit C
;  RC3  |    18  |  S  | Adressage entrée audio bit D
;  RC4  |    23  |  S  | LEDs Rouge droit et gauche
;  RC5  |    24  |  E  | Bouton poussoir "INPUT"
;  RC6  |    25  |  E  | Bouton poussoir "PHASE"
;  RC7  |    26  |  E  | Bouton poussoir "MUTE"

;  RD0  |    19  |  S  | Sortie bit D7 du LCD
;  RD1  |    20  |  S  | Sortie bit D6 du LCD
;  RD2  |    21  |  S  | Sortie bit D5 du LCD
;  RD3  |    22  |  S  | Sortie bit D4 du LCD
;  RD4  |    27  |  S  | Sortie bit D3 du LCD
;  RD5  |    28  |  S  | Sortie bit D2 du LCD
;  RD6  |    29  |  S  | Sortie bit D1 du LCD
;  RD7  |    30  |  S  | Sortie bit D0 du LCD

;--------------------------------------------------DIRECTIVE D'
ASSEMBLAGE POUR MPLAB-------------------------------------------------------

     list 
p=16f877
    
#include <p16f877.inc>

__CONFIG   _CP_OFF _DEBUG_OFF _WRT_ENABLE_OFF _CPD_OFF _LVP_OFF _BODEN_OFF _PWRTE_ON _WDT_OFF _XT_OSC 


;-------------------------------------------------Definition de la RAM------------------------------------------------------


        
cblock        0x20
                TEMP            
;temp buffer
                DATAL            
;instruction donnée =0
                DATAH            
;instruction donnée =1
                COMMAND            
;instruction
                TABLECOUNT        
;tablecounter
        endc

        cblock        0x70
                W_TEMP            
;interruptcontextsave for W
                STATUS_TEMP        
;interruptcontextsave for STATUS
                PCLATH_TEMP        
;interruptcontextsave for PCLATH
                COUNT1            
;delaycounter 1
                COUNT2            
;delaycounter 2
                COUNT3            
;delaycounter 3
                DATA_EE_ADDR        
;data EEPROM address buffer
                DATA_EE_DATA        
;data EEPROM data buffer
        endc

;-------------------------------------------------Definition des constantes------------------------------------------------------


        
#define        WRITE        PORTB,2            ; GLCD writeenable/disable (active low)
        #define        READ        PORTB,3            ; GLCD readenable/disable (active low)
        #define        CE        PORTB,4            ; GLCD chip enable/disable (active low)
        #define        CD        PORTB,5            ; GLCD command/data
        #define        FONT        PORTB,6            ; GLCD font select (6x8 or 8x8)
        #define        RST        PORTB,7            ; GLCD reset

        #define        D0        PORTD,RD0        ; GLCD data port bit 0
        #define        D1        PORTD,RD1        ; GLCD data port bit 1
        #define        D2        PORTD,RD2        ; GLCD data port bit 2
        #define        D3        PORTD,RD3        ; GLCD data port bit 3
        #define        D4        PORTD,RD4        ; GLCD data port bit 4
        #define        D5        PORTD,RD5        ; GLCD data port bit 5
        #define        D6        PORTD,RD6        ; GLCD data port bit 6
        #define        D7        PORTD,RD7        ; GLCD data port bit 7

;--------------------------------------------Definition des registres temporaires------------------------------------------------------


        
WR_EN        EQU 2
        WR_DIS        EQU 7
        RD_EN        EQU 1
        RD_DIS        EQU 7

;--------------------------------------------Directives des programmes------------------------------------------------------


        
org        0x000            Debut du programme principale
        
goto        START            Saut à START

        org        0x004            
Debut du programme d'interruption
        goto        ISR            ; Sautà ISR

;-------------------------------------------------INITIALISATION------------------------------------------------------


START
        CLRF        PORTA            ; Remise à 0 du port A
        CLRF        PORTB            ; Remise à 0 du port B
        CLRF        PORTC            ; Remise à 0 du port C
        CLRF        PORTD            ; Remise à 0 du port D
        CLRF        PORTE            ; Remise à 0 du port E
;;;;;;;;;;    banksel        ANSEL            ; bank 3
;;;;;;;;;;    CLRF        ANSEL            ; all ports digital I/O
;;;;;;;;;;    CLRF        ANSELH            ; 
;;;;;;;;;;    banksel        TRISA            ; bank 1
        CLRF        TRISA            ; PORTA, PORTB, PORTC, and PORTE outputs
        CLRF        TRISB            ; PORTD defaults to input
        CLRF        TRISC            ; 
        CLRF        TRISE            ; 
;;;;;;;;;;    banksel        0             ; bank 0

GLCD_INIT
        BCF        RST            ; reset du GLCD
        MOVLW        B'
01111100'         ; On charge la valeur dans le registre W
        MOVWF        PORTB            ; Command mode and 6x8 font, disableread, write, and chip enable
        call        Delay50mS        ; Appel de la tempo de 50ms
        BSF        RST            ; disable reset



;-------------------------------------------------INITIALISATION afficheur------------------------------------------------------


ModeSet
        MOVLW        0x84            ; Charge la valeur dans W
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        NoData            ; Appel de l'
étiquette NoData
GraphicsHome
        MOVLW        0x00            
Charge la valeur dans W
        MOVWF        DATAL            
Transfert de W sur DATAL
        MOVLW        0x00            
Charge la valeur dans W
        MOVWF        DATAH            
Transfert de W sur DATAH
        MOVLW        0x42            
Charge la valeur dans W
        MOVWF        COMMAND            
Transfert de W sur COMMAND
        CALL        TwoData            
Appel de l'étiquette TwoData
GraphicsArea
        MOVLW        0x28            ; Charge la valeur dans W
        MOVWF        DATAL            ; Transfert de W sur DATAL
        MOVLW        0x0            ; Charge la valeur dans W
        MOVWF        DATAH            ; Transfert de W sur DATAH
        MOVLW        0x43            ; Charge la valeur dans W
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        TwoData            ; Appel de l'
étiquette TwoData
TextHome
        MOVLW        0x00            
Charge la valeur dans W
        MOVWF        DATAL            
Transfert de W sur DATAL
        MOVLW        0x17            
Charge la valeur dans W
        MOVWF        DATAH            
Transfert de W sur DATAH
        MOVLW        0x40            
Charge la valeur dans W
        MOVWF        COMMAND            
Transfert de W sur COMMAND
        CALL        TwoData            
Appel de l'étiquette TwoData
TextArea
        MOVLW        0x28            ; Charge la valeur dans W
        MOVWF        DATAL            ; Transfert de W sur DATAL
        MOVLW        0x00            ; Charge la valeur dans W
        MOVWF        DATAH            ; Transfert de W sur DATAH
        MOVLW        0x41            ; Charge la valeur dans W
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        TwoData            ; Appel de l'
étiquette TwoData
CGROMSet
        MOVLW        0x03            
Charge la valeur dans W
        MOVWF        DATAL            
Transfert de W sur DATAL
        MOVLW        0x0            
Charge la valeur dans W
        MOVWF        DATAH            
Transfert de W sur DATAH
        MOVLW        0x22            
Charge la valeur dans W
        MOVWF        COMMAND            
Transfert de W sur COMMAND
        CALL        TwoData            
Appel de l'étiquette TwoData

cleargraphicsRAM

        MOVLW        0x00            ; Charge la valeur dans W
        MOVWF        DATAL            ; Setaddress pointer to 0x0000
        MOVLW        0x00            ; Charge la valeur dans W
        MOVWF        DATAH            ; Transfert de W sur DATAH
        CALL        ADDR_PTR        ; Appel de l'
étiquette ADDR_PTR
        MOVLW        0x20            
Charge la valeur dans W
        MOVWF        COUNT2            
Transfert de W sur COUNT2
        CALL        DisplayClear        
Appel de l'étiquette DisplayClear

cleartextRAM

        MOVLW        0x00            ; Charge la valeur dans W
        MOVWF        DATAL            ; Setaddress pointer to 0x0000
        MOVLW        0x17            ; Charge la valeur dans W
        MOVWF        DATAH            ; Transfert de W sur DATAH
        CALL        ADDR_PTR        ; Appel de l'
étiquette ADDR_PTR
        MOVLW        0x08            
Charge la valeur dans W
        MOVWF        COUNT2            
Transfert de W sur COUNT2
        CALL        DisplayClear        
Appel de l'étiquette DisplayClear
CSRPattern
        MOVLW        0xA0            ; Charge la valeur dans W  (A0) 
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        NoData            ; Appel de l'
étiquette NoData
CSRPointer
        MOVLW        0x00            
Charge la valeur dans W
        MOVWF        DATAL            
Transfert de W sur DATAL
        MOVLW        0x00            
Charge la valeur dans W
        MOVWF        DATAH            
Transfert de W sur DATAH
        CALL        CSR_PTR            
Appel de l'étiquette CSR_PTR
ADDRPointer
        MOVLW        0x00            ; Charge la valeur dans W
        MOVWF        DATAL            ; Transfert de W sur DATAL
        MOVLW        0x00            ; Charge la valeur dans W
        MOVWF        DATAH            ; Transfert de W sur DATAH
        CALL        ADDR_PTR        ; Appel de l'
étiquette ADDR_PTR
DisplayOn
        MOVLW        0x9F            
Charge la valeur dans W
        MOVWF        COMMAND            
Transfert de W sur COMMAND
        CALL        NoData            
Appel de l'étiquette NoData

        GOTO        $            ; Comptage de boucle


;-------------------------------------------------Programme tempo------------------------------------------------------

Delay50mS
        MOVLW        0x40            ; Charge la valeur dans W
        MOVWF        COUNT1            ; Transfert de W sur COUNT1
        MOVWF        COUNT2            ; Transfert de W sur COUNT2
        DECFSZ        COUNT1,F        ; On décrémente COUNT1,F
        GOTO        $-1            ; Comptage de boucle
        DECFSZ        COUNT2,F        ; On décrémente COUNT2,F
        GOTO        $-3            ; Comptage de boucle
        RETURN
Delay    
        MOVWF        COUNT3            ; Transfert de W sur COUNT3
        CALL        Delay50mS        ; Appel de l'
étiquette Delay50mS
        DECFSZ        COUNT3
,F        On décrémente COUNT3,F
        
GOTO        $-2            Comptage de boucle
        
RETURN


;-------------------------------------------------
Position Address Pointer ------------------------------------------------------


ADDR_PTR
        MOVLW        0x24            
Charge la valeur dans W
        MOVWF        COMMAND            
Transfert de W sur COMMAND
        CALL        TwoData            
Appel de l'étiquette TwoData
        RETURN

;-------------------------------------------------Position Cursor Pointer ------------------------------------------------------


CSR_PTR    
        MOVLW        0x21            ; Charge la valeur dans W
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        TwoData            ; Appel de l'
étiquette TwoData
        
RETURN

;-------------------------------------------------
Command Send Routines ------------------------------------------------------

TwoData    
        CALL        LCDStat            
Appel de l'étiquette LCDStat
        MOVWF        DATAL            ; Transfert de W sur DATAL
        CALL        DWrite            ; Appel de l'
étiquette DWrite        
OneData    
        CALL        LCDStat            
Appel de l'étiquette LCDStat
        MOVWF        DATAH            ; Transfert de W sur DATAH
        CALL        DWrite            ; Appel de l'
étiquette DWrite
NoData    
        CALL        LCDStat            
Appel de l'étiquette LCDStat
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        Command            ; Appel de l'
étiquette Command
        
RETURN

;------------------------------------------------
GLCD Read/Write/Status Check------------------------------------------------------

Command    
        BSF        CD            
CD=1
        
GOTO        $+2            Permet de sauter 2 lignes de code
DWrite
        BCF        CD            
CD=0
        MOVWF        PORTD            
Transfert de W sur port D
        MOVLW        WR_EN            
Charge WR_EN dans W
        MOVWF        PORTB            
Transfert de W sur port B
        BSF        STATUS
,5        Accès à la 2ème page mémoire TRISD
        MOVLW        
B'00000000'        Charge la valeur dans W
        MOVWF        TRISD            
Le port D est en sortie
        MOVLW        WR_DIS            
Charge WR_DIS dans W
        MOVWF        PORTB            
Transfert de W sur port B
        BCF        STATUS
,5        Accès à la 1ère page mémoire TRISD        
        call        Delay50mS        
Appel de la tempo de 50ms
        BSF        STATUS
,5        Accès à la 2ème page mémoire TRISD
        MOVLW        
B'11111111'        Charge la valeur dans W
        MOVWF        TRISD            
Le port D est en entrée
        BCF        STATUS
,5        Accès à la 1ère page mémoire TRISD
        
RETURN
LCDStat    
        CALL        StatReadEn        
Appel de l'étiquette StatReadEn
        BTFSC        PORTD,0            ; D0 = 0?
        BTFSS        PORTD,1            ; D1 = 1?
        GOTO        $-2            ; Comptage de boucle
        CALL        StatReadDis        ; Appel de l'
étiquette StatReadDis
        
RETURN
DAWStat    
        CALL        StatReadEn        
Appel de l'étiquette StatReadEn
        BTFSS        PORTD,3            ; D3 = 1?
        GOTO        $-1            ; Comptage de boucle
        CALL        StatReadDis        ; disablestatusread
        RETURN
StatReadEn
        BSF        CD            ; CD=1
        MOVLW        RD_EN            ; Charge RD_EN dans W
        MOVWF        PORTB            ; Transfert de W sur port B
        RETURN
StatReadDis
        MOVLW        RD_DIS            ; Charge RD_DIS dans W
        MOVWF        PORTB            ; Transfert de W sur port B
        RETURN

;---------------------------------------------Data Auto Read/Write Routines--------------------------------------------------

DAWSet
        MOVLW        0xB0            ; Charge la valeur dans W
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        NoData            ; Appel de l'
étiquette NoData
        CALL        LCDStat            
Appel de l'étiquette LCDStat
        CALL        DAWStat            ; Appel de l'
étiquette DAWStat
        
RETURN
DAWReset
        CALL        DAWStat            
Appel de l'étiquette DAWStat
        MOVLW        0xB2            ; Charge la valeur dans W
        MOVWF        COMMAND            ; Transfert de W sur COMMAND
        CALL        NoData            ; Appel de l'
étiquette NoData
        
RETURN

;------------------------------------------------
Clear Display------------------------------------------------------


DisplayClear
        MOVLW        160            
Charge la valeur dans W
        MOVWF        COUNT1            
Transfert de W sur COUNT1
        CALL        DAWSet            
Appel de l'étiquette DAWSet 
        CALL        DAWStat            ; Appel de l'
étiquette DAWStat
        MOVLW        0            
Charge la valeur dans W
        CALL        DWrite            
Appel de l'étiquette DWrite
        DECFSZ        COUNT1,F        ; On décrémente COUNT1,F
        GOTO        $-4            ; Comptage de boucle
        MOVLW        160            ; Charge la valeur dans W
        MOVWF        COUNT1            ; Transfert de W sur COUNT1
        DECFSZ        COUNT2,F        ; On décrémente COUNT2,F
        GOTO        $-8            ; Comptage de boucle    
        CALL        DAWReset        ; Appel de l'
étiquette DAWReset
        
RETURN                    

;------------------------------------------------
Interrupt Handler------------------------------------------------------

ISR
        MOVWF        W_TEMP            
Transfert de W sur W_TEMP
        SWAPF        STATUS
,W        Echange de quartet entre status et W
;;;;;;;;;;    BANKSEL        0            bank 0
        MOVWF        STATUS_TEMP        
Transfert de W sur STATUS_TEMP
        MOVFW        PCLATH            
Transfert de PCLATH sur W
        MOVWF        PCLATH_TEMP        
Transfert de W sur PCLATH_TEMP
ISRExit    
        MOVFW        PCLATH_TEMP        
Transfert de PCLATH_TEMP sur W
        MOVWF        PCLATH            
Transfert de W sur PCLATH
        SWAPF        STATUS_TEMP
,W        Echange de quartet entre STATUS_TEMP et W
        MOVWF        STATUS            

        
SWAPF        W_TEMP,F        Echange de quartet entre W_TEMP et F
        SWAPF        W_TEMP
,W        Echange de quartet entre W_TEMP et F
        RETFIE

        END






Bonjour à toute l'équipe du forum
JMarc
Confirmé
Confirmé
Messages : 552
Enregistré en : août 2016
Localisation : Dans le Sud...

#18 Message par JMarc » sam. 24 nov. 2018 18:25

Bonjour nondediode et tout le monde

Les leds sur ra2 et 3 sont elles opérationnelles ?

c'est pour avoir des témoins de développement du programme. si oui je modifie ton programme en conséquence

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#19 Message par nondediode » sam. 24 nov. 2018 19:03

Les leds font parti de la seconde parti du programme, actuellement je n'ai pas raccordé la petite carte avec les boutons et les leds.
Vous pouvez modifier le prg à votre guise.
Ce que je veux dans un premier tps c'est arriver à faire fonctionner cet afficheur et comprendre comment ça fonctionne.
Ensuite faire fonctionner le programme dans son ensemble sera une seconde étape pour moi.

Merci :wink:

Bonjour à toute l'équipe du forum
nondediode
Débutant
Débutant
Messages : 78
Enregistré en : novembre 2018
Localisation : Entre l'emetteur et le collecteur

#20 Message par nondediode » sam. 24 nov. 2018 20:31

Le mieux est certainement d'adjoindre les schémas
schema affichage.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités