Driver de port parallèle

Slides:



Advertisements
Présentations similaires
FICHE DE PREPARATION D’UNE SEQUENCE DE COURS
Advertisements

Premier programme en C :
Génération de plate-forme
Le Concept du programme enregistré
Les procédures et interruptions en Assembleur (Tasm)
Journées académiques Microsoft 2005
ARCHITECTURE INTERNE d’un MICROPROCESSEUR
Portée des variables VBA & Excel
Synchronisation des processus père - fils
FICHE DE PREPARATION D’UNE SEQUENCE DE COURS
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
Le Concept du programme enregistré
M. BENJELLOUN : Info II Mohammed BENJELLOUN Service dInformatique Faculté Polytechnique de Mons
Revision.
Jc/md/lp-01/05TTY_IT : présentation1 TTY_IT Présentation.
Gestion mémoire : présentation
Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé
Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé
Driver UART en polling : présentation
Driver de port parallèle
Jc/md/lp-01/06Kernel Tracker1 Debugging Kernel Tracker.
Jc/md/lp-01/05Principe des drivers1 Généralités sur les drivers Présentation.
Jc/md/lp-01/05TTY_IT : corrigé1 TTY_IT Corrigé. jc/md/lp-01/05TTY_IT : corrigé2 Objectif du chapitre Proposer une solution pour les exercices suggérés.
Jc/md/lp-01/05Essai ligne série COM1 : corrigé1 Essai ligne série CEPC Application écho sur COM1 Présentation.
Driver UART en polling : corrigé
Jc/md/lp-01/05Driver élémentaire : corrigé1 Driver élémentaire Émulateur Corrigé
Jc/md/lp-01/05Trains_presentation1 Threads et Synchronisation Application train Présentation.
Jc/md/lp-01/05Boot Loader1 BOOT LOADER. jc/md/lp-01/05Boot Loader2 Objectif du chapitre Introduire la notion de Boot Loader Donner un aperçu de lorganisation.
Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.
Jc/md/lp-01/05Trains_corrigé1 Threads et Synchronisation Application train Corrigé
FLSI602 Génie Informatique et Réseaux
Les microprocesseurs A. Objectifs de la séquence:
Système d’exploitation : Assembleur
Système d’exploitation : Assembleur
Les systèmes à microprocesseur
Affichage LCD RS: Register Selection Transfert de données
ARCHITECTURE GLOBALE CAPTAGE Traitement DES des données GRANDEURS
Récursivité.
Initiation aux bases de données et à la programmation événementielle
Automates Programmables Industriels Automates Programmables
Architecture des Ordinateurs
Fonction COMMUNIQUER les liaisons série
1 CLUB DES UTILISATEURS SAS DE QUÉBEC COMMENT TRANSFORMER UN PROGRAMME SAS EN TÂCHE PLANIFIÉE SOUS WINDOWS Présentation de Jacques Pagé STRiCT Technologies.
Dan Bismuth Tutrices : Marie-Lise Flottes - Joanne Acland
Les fichiers binaires en C++
Programmation Initiation Aux Langages C et C++ (2) Bruno Permanne 2006.
Modules Afficheurs LCD Alphanumériques
LES SYSTEMES AUTOMATISES
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
©Frédéric Bastien 2006 Université de Montréal 1 LISATek LISATek pour concevoir des processeurs.
IFT 6800 Atelier en Technologies d’information
COMPTAGE DE PIECES ETUDE D’UN SYSTEME DE Réalisés et presentés par :
Christine Bonnet SOURCES : « Samples » dOracle, « Oracle 8 » R. Chapuis PRO*C – C ++
Synchronisation Classique
FICHE DE PREPARATION D’UNE SEQUENCE DE TD
Afficheur industriel « AIW » MAT Électronique
Gérer la sécurité des mots de passe et les ressources
3-Présentation d’un µP simple
Microprocesseur famille 68'000 Interface matériel
République Algérienne Démocratique et Populaire Ministère de l'enseignement supérieur et de herche scientifique Université de Ferhat Abbas -Sétif.
1 LE BUS PCI 8 ième partie: L ’espace de configuration Sommaire - Repère zHuitième partieL ’espace de configuration yQu ’est-ce? yEspace de configuration.
18/09/2013JC LP MD1 Cours_2. 18/09/2013JC LP MD2 Mapping de configuration.
Simulateur de microcontrôleur Intel 80C51
Patricia Renault UPMC 2005/2006
Représentation digitale des données Trois formats de base: 1) Décimale: base 10 (Une constante i.e dimension d ’1 vecteur) 2) Binaire: base 2 ( Mask, set/reset.
Encadrer par Mr Chelly Nizar
Les bascules et registres
Formations Système Embarqué & Informatique Industrielle
ARCHITECTURE MATERIELLE D’UN SYSTEME A MICROPROCESSEUR
Intervention sur un système technique Afficheur industriel « AIW »
Transcription de la présentation:

Driver de port parallèle B-208 (2/2) CE4.2 Driver de port parallèle Commande d’un module d’affichage LCD jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Module d'affichage LCD sur le port parallèle : corrigé Objectif du chapitre Faire fonctionner un module d’affichage LCD couplé sur le port parallèle de la cible CEPC Étude sommaire du port parallèle standard des PC Étude sommaire du module LCD Écriture d’un driver pour ce module Écriture d’une application pour afficher deux lignes sur le module LCD Téléchargement dans le CEPC Exécution jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Port Parallèle d’un PC (1) Le port parallèle standard (SPP) est un port prévu dès l’origine du PC pour obtenir une liaison plus rapide que la liaison série de l’époque, utile pour commander une imprimante Dans un PC-XT ou dans un PC-AT le SPP n’était pas sur la carte mère mais sur une carte additionnelle qui contenait aussi un port série Carte à installer dans un connecteur du bus ISA jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Port Parallèle d’un PC (2) B-208 (2/2) CE4.2 Port Parallèle d’un PC (2) Il était possible d’installer sur le bus ISA deux cartes série/parallèle en choisissant par des straps deux décodages d’adresse possibles 0x378 : Parallel Printer 1 (LPT1) associé à l’IRQ7 0x278 : Parallel Printer 2 associé à l’IRQ5 Cet adaptateur parallèle n’était même pas un boîtier spécifique mais l’association d’un PAL et de quelques latches et drivers constituant trois registres Plus tard sont apparus des circuits spécifiques plus polyvalents En fait, il existait une troisième possibilité d’installation d’une imprimante dans la plage des adresses 0x3B0-0x3BF ; cette plage était partagée avec un contrôleur d’écran monochrome et donc disponible dès qu’on utilisait un contrôleur d’écran couleur/graphique logé à un autre endroit (0x3D0-0x.3DF). Le port série était dès l’origine réalisé avec un circuit spécialisé NS 16450. PAL : circuit de logique programmable, en l’occurrence, le circuit utilisé contenait très peu de circuits logiques. Le circuit spécialisé PPI (Programmable Peripheral Interface) Intel 82C55A (deux ports) est un exemple de circuit beaucoup plus souple que la réalisation d’origine. Aujourd’hui, ces ports, en voie d’extinction, quand ils existent sont regroupés avec les chipsets ou dans un adaptateur chipset-ISA ou PCI-ISA. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Port Parallèle d’un PC (3) B-208 (2/2) CE4.2 Port Parallèle d’un PC (3) Registre de données (D0-D7) à l’adresse de base du port Registre de Status (S3-S7) à l’adresse de base du port + 1 utilisé pour ses cinq bits de poids forts seulement S3-S7, S0-S2 inutilisés ou inexistants Registre de commande (C0-C4) à l’adresse de base du port + 2 Utilisé pour ses cinq bits de poids faibles C0-C4, C5-C7 inutilisés ou inexistants ici nous n’utilisons que C0-C4 En fait on retrouve dans de vieux documents le bit C4 qui fut, à l’origine, utilisé pour autoriser ou interdire des interruptions lors du changement d’état du bit 6 du registre de status. Les bits C4 et C5 sont utilisés dans le port parallèle modernisé EPP. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Registres du port parallèle B-208 (2/2) CE4.2 Registres du port parallèle Registre de données Adresse de base D7 D6 D5 D4 D3 D2 D1 D0 Poids fort Registre de status (lecture) Poids faible Adresse de base + 1 S7 S6 S5 S4 S3 Les noms attribués dans la littérature aux bits des registres de commande et de status sont à géométrie variable du fait de l’inversion de certains signaux et suivant qu’on se réfère à l’attribution du signal ou au nom porté par la broche. Par exemple, le bit C3 du registre de contrôle est dénommé +SLCT IN dans le document de base IBM. Une écriture avec un 1 dans le bit C3 permet de sélectionner une imprimante. Il est présenté sur la broche 17 du connecteur DB25 après inversion, ce qui est cohérent avec le nom donné à la broche : -SLCT IN. Quand on lit le registre de commande, le signal présent sur la broche est inversé et on récupère bien dans le registre un bit +SLCT IN. Registre de contrôle Adresse de base + 2 C4 C3 C2 C1 C0 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Registres données et commande B-208 (2/2) CE4.2 Registres données et commande D0 D0 C0 C0 D1 D1 C1 C1 D2 D2 C2 C2 D3 D3 C3 C3 D4 D4 D5 D5 Nous ne montrons que ce qui concerne l’écriture puisque nous n’utiliserons pas de lecture avec notre afficheur. D6 D6 D7 D7 Registre données Buffer Registre commande Buffer jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Module d'affichage LCD sur le port parallèle : corrigé Registre status Inutilisé dans notre application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé B-208 (2/2) CE4.2 Écriture sur un port VOID WRITE_PORT_UCHAR(PUCHAR Port, UCHAR Value); Parameters Port [in] Pointer to the port that must be a mapped memory range in I/O space. Value [in] Byte to be written to the port. Return Values None. Nota : les sorties C0, C1, C3 du registre de commande sont inversées, pour être directement compatibles avec les signaux standards d’une imprimante. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Module d’affichage LCD HD44780 Le module possède Une mémoire de 80 caractères : Display Data RAM (DD RAM) Un générateur de police de caractère Deux registres internes DR et IR Taille de l’afficheur utilisé : Nombre de lignes d’affichage : 2 Nombre de caractères par ligne : 20 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Signaux du module LCD Port de données D0-D7 RS Register Select E Enable R/W Lecture/écriture, pour nous 0, écriture VDD Alimentation, pour nous sera prise sur le port sur la broche C2 VSS Masse VL Contrôle du contraste, pour nous 0, contraste maximal jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Câblage du module LCD sur le port parallèle CE4.2 Câblage du module LCD sur le port parallèle Module d’affichage LCD D7 D6 D5 D4 D3 D2 D1 D0 RS E R/W VSS VL VDD VDD VDD 10 KΩ 10 KΩ VDD VL à la masse donne le contraste maximum Les nombres 1 à 9 et 17 correspondent au brochage de la prise DB25 du port parallèle. Nous utiliserons aussi la broche 16 associée au bit C2 du registre de commande pour alimenter le module : un 1 dans la position C2 qui n’est pas inversée, permet d’appliquer une tension correcte à la broche VDD du module. D7 D6 D5 D4 D3 D2 D1 D0 C3 C0 Port parallèle 9 8 7 6 5 4 3 2 17 1 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Registres internes du module LCD Deux registres internes IR registre d’instruction DR registre de données Commande des registres par deux signaux RS : Register Selector relié à la broche C3 du port parallèle différencie ces deux registres E : Enable relié à la broche C0 du port parallèle valide l’introduction des données dans les registres jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Séquence d’écriture dans IR et DR Repos IR RS=0 E=0 Repos DR RS=1 E=0 Donnée → IR RS=0 E→0 Donnée → DR RS=1 E→0 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Commandes pour écrire IR Signaux de commande en position de repos RS relié à C3 et E relié à C0 mais C3 et C0 sont complémentées d’où : commande . . . . 1 x x 1 (RS=0 E=0) Mettre l’instruction sur le port parallèle D0-D7 Écrire cette instruction dans le registre IR commande . . . . 1 x x 0 (RS=0 E=1) Retour à l’état de repos commande . . . . 1 x x 1 (RS=0 E=0) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Commandes pour écrire DR Signaux de commande en position de repos RS relié à C3 et E relié à C0 mais C3 et C0 sont complémentées d’où : commande . . . . 0 x x 1 (RS=1 E=0) Mettre la donnée sur le port parallèle D0-D7 Écrire cette donnée dans le registre DR commande . . . . 1 x x 0 (RS=1 E=1) Retour à l’état de repos commande . . . . 1 x x 1 (RS=1 E=0) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Options On peut commander la tension VDD avec la ligne C2, ce qui évite une alimentation externe La ligne C1 est réservée pour avoir un second signal Enable utilisé avec un afficheur à 4 lignes C2 VDD 1N4148 + 1 µF jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Détail des commandes IR et DR B-208 (2/2) CE4.2 Détail des commandes IR et DR Afficheur LCD à deux lignes → C1 inutilisé, à 0 Alimentation par le port → C2 toujours à 1 Repos en prévision d’une commande pour IR %1101 = 0xD «CTRL» C2=1 RS=0 E=0 Entrée de la commande dans IR %1100 = 0xC «CTRLEN» C2=1 RS=0 E=1 Repos en prévision d’une commande pour DR %0101 = 0x5 «DATA» C2=1 RS=1 E=0 Entrée de la commande dans DR %0100 = 0x4 «DATAEN»  C2=1 RS=1 E=1 Les noms utilisés seront définis dans le programme par des #define. CTRL : pour la sélection du registre de contrôle CTRLEN : pour registre de contrôle enable DATA : pour la sélection du registre de données DATAEN : pour registre de contrôle enable jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Module d'affichage LCD sur le port parallèle : corrigé DDRAM du module LCD Le module LCD contient une DDRAM gérée automatiquement par les écritures dans le registre DR La donnée écrite dans le registre DR est transférée systématiquement dans la DDRAM à une adresse définie par un compteur d’adresse interne (AC) AC incrémenté à chaque écriture dans DR AC initialisé par écriture de l’instruction Set DDRAM address dans le registre IR jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

LCD à 2 lignes de 20 caractères DDRAM 0x00 Première ligne 20 caractères 0x13 20 caractères 0x27 0x40 Seconde ligne 20 caractères 0x53 0x54 20 caractères 0x67 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Instructions pour le LCD (1) B-208 (2/2) CE4.2 Instructions pour le LCD (1) Clear Display: 0x01 Return Home: 0x02 Entry Mode Set: 0x04 à 0x07 (%000001 I/D S) I/D = 1 incrément S = 0 pas de décalage Display ON/OFF: 0x08 à 0x0F (%00001 D C B) D = 0 display OFF C = 0 cursor OFF B = 0 blink OFF Pour les détails de ces commandes il faut consulter la documentation du module LCD. Ici, ce sont les valeurs utilisées dans notre application qui sont mentionnées. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Instructions pour le LCD (2) Function Set: 0x38 pour nous (%001 DL N F 00) DL=1 Interface 8 bits N=0 LCD à deux lignes (0 pour une ligne) F=0 Matrice 5x7 Set DDRAM address: 0x80 à 0xFF (%1AAAAAAA) AAAAAAA Adresse à placer dans le compteur AC jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Initialisation du LCD Timing à respecter après la mise sous tension Séquence de commande obligatoire de configuration du LCD jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Timing à respecter après Power On jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Séquence d’initialisation B-208 (2/2) CE4.2 Séquence d’initialisation RESET:Instruction 0x30 (Function Set: interface 8 bits) envoyée 3 fois Display OFF Display ON Clear Display Function Set: taille de l’interface, nombre de lignes et police. (non modifiable ensuite) Mode Set: gestion affichage (décalage texte, incrément d’adresse mémoire) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Exemple d’envoi de commande // Mise du port dans l’état repos commande WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(15); // Attente de 15ms après la mise sous tension // Function Set 1 (interface 8 bits) WRITE_PORT_UCHAR(PARDATA,0x30); WRITE_PORT_UCHAR(PARCOMMAND, CTRLEN); Sleep(2); // Attente de 2 ms WRITE_PORT_UCHAR(PARCOMMAND, CTRL); Sleep(5); // Attente de 5 ms jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Travail à réaliser Préparer une plate-forme Préparer un driver à inclure Générer le noyau avec le driver Préparer une application Générer l’application sans l’inclure avec le noyau Télécharger le noyau dans la cible Exécuter l’application jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver Le driver comprendra deux IOCTL Écriture d’un caractère Positionnement du curseur On définira un projet PARA_DRV de type WCE Dynamic Link Library à inclure dans le noyau On créera un fichier PARA.def que l’on inclura dans le projet PARA_DRV jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application L’application écrira un texte sur la ligne 1 du LCD puis positionnera le curseur en début de ligne 2 écrira un deuxième texte sur la ligne 2 On définira l’application PARA_APP de type WCE Application à ne pas inclure dans le noyau jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver Corrigé jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé PARA.def jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (1) // #include nécessaires #include "stdafx.h" #include <tchar.h> #include <nkintr.h> #include <wdm.h> #include <windev.h> jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (2) // Définition des IOCTL #define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_CURSEUR \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (3) // Définition des adresses du port parallèle #define PARBASE ((PUCHAR) 0x0378) #define PARDATA PARBASE #define PARCOMMAND PARBASE+2 // Définition des mots de commande #define CTRL 0xD #define CTRLEN 0xC #define DATA 0x5 #define DATAEN 0x4 jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (4) BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (5) DWORD PAR_Init(DWORD dwContext) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Init\n"))); // Mise du port dans l’état repos commande WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(15); jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (6) // Envoi des trois Function Set de RESET // Positionnement de la donnée : 0x30 WRITE_PORT_UCHAR(PARDATA,0x30); // Function Set 1 WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(5); jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (7) // Function Set 2 WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(1); // Function Set 3 Sleep(10); jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (8) // Display OFF WRITE_PORT_UCHAR(PARDATA,0x08); WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(10); // Display ON WRITE_PORT_UCHAR(PARDATA,0x0F); jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (9) // Clear Display WRITE_PORT_UCHAR(PARDATA,0x01); WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(10); // Function Set (2 lignes, 8 bits) WRITE_PORT_UCHAR(PARDATA,0x38); jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (10) // Mode Set (incrément, pas de décalage) WRITE_PORT_UCHAR(PARDATA ,0x06); WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(10); // Mise du port dans l’état repos data WRITE_PORT_UCHAR(PARCOMMAND,DATA); return dwRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (11) BOOL PAR_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Deinit\n"))); return bRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (12) DWORD PAR_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Open\n"))); return dwRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (13) BOOL PAR_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PARA_DRV: PAR_Close\n"))); return bRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (14) BOOL PAR_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { int val; BOOL bRet; jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (15) switch(dwCode) { case IOCTL_PUTC: WRITE_PORT_UCHAR(PARDATA,pBufIn[0]); WRITE_PORT_UCHAR(PARCOMMAND, DATAEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,DATA); break; jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Driver (16) case IOCTL_CURSEUR: // Positionnement du curseur val=pBufIn[0]; // Commande 1xxxxxxx (xxxxxxx position curseur) val=val+0x80; // Mise du port en repos commande WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(2); jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé B-208 (2/2) CE4.2 Driver (17) // Envoi de la commande de positionnement WRITE_PORT_UCHAR(PARDATA,val); WRITE_PORT_UCHAR(PARCOMMAND, CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); // Mise du port en repos data WRITE_PORT_UCHAR(PARCOMMAND,DATA); break; }// switch jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Module d'affichage LCD sur le port parallèle : corrigé Driver (18) *pdwActualOut=1; return bRet; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application Corrigé jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application (1) // #include nécessaires #include "stdafx.h" #include <windev.h> // Définition des IOCTL #define IOCTL_PUTC \ CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS) #define IOCTL_CURSEUR \ CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\ METHOD_BUFFERED,FILE_ANY_ACCESS) jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé B-208 (2/2) CE4.2 Application (2) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé port_parallèle_corrigé.V1.0.ppt

Module d'affichage LCD sur le port parallèle : corrigé Application (3) // Déclarations et réservations HANDLE hDevice; CHAR carac1[1]; DWORD dwNb; HANDLE hPara; CHAR* pstring1 = "essai port parallèle\n"; CHAR* pstring2 = "miracle ca marche\n"; unsigned int i; jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application (4) // Chargement du driver hDevice=RegisterDevice(TEXT("PAR"),1, TEXT("PARA_DRV.dll"),NULL); if(hDevice==0) { MessageBox(NULL,_T("Pb Register PAR1:"), _T("PARA_APP"),MB_OK); return 0; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application (5) // Ouverture du driver hPara=CreateFile(TEXT("PAR1:"),GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,0); if(hPara==INVALID_HANDLE_VALUE) { MessageBox(NULL,_T("Pb Ouverture PAR1:"), _T("PARA_APP"),MB_OK); DeregisterDevice(hDevice); CloseHandle(hDevice); return 0; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application (6) // Envoi première chaîne for(i=0;i<strlen(pstring1);i++) { carac1[0]=pstring1[i]; DeviceIoControl(hPara,IOCTL_PUTC,carac1,1, carac1,1,&dwNb,NULL); Sleep(10); } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application (7) // Positionnement du curseur au début de la ligne 2 carac1[0]=0x40; DeviceIoControl(hPara,IOCTL_CURSEUR, carac1,1,carac1,1,&dwNb,NULL); // Envoi deuxième chaîne for(i=0;i<strlen(pstring2);i++) { carac1[0]=pstring2[i]; DeviceIoControl(hPara,IOCTL_PUTC,carac1,1, carac1,1,&dwNb,NULL); Sleep(10); } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Application (8) // Fermeture des handles CloseHandle(hPara); DeregisterDevice(hDevice); CloseHandle(hDevice); MessageBox(NULL,_T("Fin application PARA_APP"), _T("PARA_APP"),MB_OK); return 0; } jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé

Module d'affichage LCD sur le port parallèle : corrigé Conclusion Nous avons construit un driver et une application rudimentaires pour commander un module d’affichage LCD installé sur un port parallèle standard de PC. jc/md/lp-01/05 Module d'affichage LCD sur le port parallèle : corrigé