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 ---
- 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 ---
Modérateur : mazertoc
Bonjour à toute l'équipe du forum
-
folkeu08
Débutant- Messages : 45
- Âge : 57
- Enregistré en : novembre 2017
- Localisation : Ardennes (08)
- Contact :
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 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.
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 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
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
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
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
Extrait de MAP file : 18F26K22_ST7920_128x64.map
voila un exemple de table necessaire à l'affichage de caracteres ascii
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.
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.
Bonjour à toute l'équipe du forum
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.
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
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
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
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Bonjour Jean Marc,
ça patine dur!
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é:
ça patine dur!
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-----------------------------------------------------------------
; TITRE: Gestion 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
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
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
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
Bonjour à toute l'équipe du forum
-
nondediode
Amateur- Messages : 148
- Enregistré en : novembre 2018
- Localisation : Lyon
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 59 invités