La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé1 Driver de port parallèle Commande dun module daffichage LCD.

Présentations similaires


Présentation au sujet: "Jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé1 Driver de port parallèle Commande dun module daffichage LCD."— Transcription de la présentation:

1 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé1 Driver de port parallèle Commande dun module daffichage LCD

2 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé2 Objectif du chapitre Faire fonctionner un module daffichage 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 dun driver pour ce module –Écriture dune application pour afficher deux lignes sur le module LCD –Téléchargement dans le CEPC –Exécution

3 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé3 Port Parallèle dun PC (1) Le port parallèle standard (SPP) est un port prévu dès lorigine 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

4 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé4 Port Parallèle dun PC (2) Il était possible dinstaller sur le bus ISA deux cartes série/parallèle en choisissant par des straps deux décodages dadresse possibles –0x378 : Parallel Printer 1 (LPT1) associé à lIRQ7 –0x278 : Parallel Printer 2 associé à lIRQ5 Cet adaptateur parallèle nétait même pas un boîtier spécifique mais lassociation dun PAL et de quelques latches et drivers constituant trois registres Plus tard sont apparus des circuits spécifiques plus polyvalents

5 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé5 Port Parallèle dun PC (3) Registre de données (D0-D7) –à ladresse de base du port Registre de Status (S3-S7) –à ladresse 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) –à ladresse de base du port + 2 –Utilisé pour ses cinq bits de poids faibles C0-C4, C5- C7 inutilisés ou inexistants –ici nous nutilisons que C0-C4

6 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé6 Registres du port parallèle Adresse de base Registre de données D7D0 Adresse de base + 1 Registre de status (lecture) S7 Adresse de base + 2 Registre de contrôle C0 Poids fort Poids faible S5S6S4S3 C3C2C1 D6D5D4 D3 D2D1 C4

7 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé7 Registres données et commande D0 D1 D2 D3 D4 D5 D6 D7 Registre donnéesBuffer D5 D2 D3 D4 D1 D6 D7 C0 C1 C2 C3 Registre commande Buffer C2 C3 C1

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

9 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé9 É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.

10 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé10 Module daffichage 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 lafficheur utilisé : –Nombre de lignes daffichage : 2 –Nombre de caractères par ligne : 20

11 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé11 Signaux du module LCD Port de données D0-D7 RSRegister Select EEnable R/W Lecture/écriture, pour nous 0, écriture V DD Alimentation, pour nous sera prise sur le port sur la broche C2 V SS Masse V L Contrôle du contraste, pour nous 0, contraste maximal

12 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé12 Câblage du module LCD sur le port parallèle Module daffichage LCD R/W V SS V L V DD Port parallèle D7 D6 D5 D4 D3 D2 D1 D0 RS E C0 C3 V DD V L à la masse donne le contraste maximum 10 KΩ

13 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé13 Registres internes du module LCD Deux registres internes –IR registre dinstruction –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 lintroduction des données dans les registres

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

15 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé15 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 doù : commande x x 1 (RS=0 E=0) Mettre linstruction sur le port parallèle D0-D7 Écrire cette instruction dans le registre IR commande x x 0 (RS=0 E=1) Retour à létat de repos commande x x 1 (RS=0 E=0)

16 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé16 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 doù : commande 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 x x 0 (RS=1 E=1) Retour à létat de repos commande x x 1 (RS=1 E=0)

17 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé17 Options On peut commander la tension V DD 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 1N4148 V DD 1 µF +

18 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé18 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 dune 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 dune 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

19 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé19 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 dadresse interne (AC) AC incrémenté à chaque écriture dans DR AC initialisé par écriture de linstruction Set DDRAM address dans le registre IR

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

21 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé21 Instructions pour le LCD (1) Clear Display: 0x01 Return Home: 0x02 Entry Mode Set: 0x04 à 0x07 (% 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

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

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

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

25 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé25 Séquence dinitialisation RESET:Instruction 0x30 (Function Set: interface 8 bits) envoyée 3 fois Display OFF Display ON Clear Display Function Set: taille de linterface, nombre de lignes et police. (non modifiable ensuite) Mode Set: gestion affichage (décalage texte, incrément dadresse mémoire)

26 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé26 Exemple denvoi 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

27 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé27 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 lapplication sans linclure avec le noyau Télécharger le noyau dans la cible Exécuter lapplication

28 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé28 Driver Le driver comprendra deux IOCTL –Écriture dun 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 lon inclura dans le projet PARA_DRV

29 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé29 Application Lapplication –é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 lapplication PARA_APP de type WCE Application à ne pas inclure dans le noyau

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

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

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

33 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé33 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)

34 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé34 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 CTRL0xD #define CTRLEN0xC #define DATA0x5 #define DATAEN0x4

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

36 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé36 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);

37 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé37 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);

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

39 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé39 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); WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(10);

40 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé40 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); WRITE_PORT_UCHAR(PARCOMMAND,CTRLEN); Sleep(2); WRITE_PORT_UCHAR(PARCOMMAND,CTRL); Sleep(10);

41 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé41 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; }

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

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

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

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

46 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé46 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;

47 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé47 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);

48 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé48 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

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

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

51 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé51 Application (1) // #include nécessaires #include "stdafx.h" #include // 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)

52 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé52 Application (2) int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

53 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé53 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;

54 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé54 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; }

55 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé55 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; }

56 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé56 Application (6) // Envoi première chaîne for(i=0;i

57 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé57 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

58 jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé58 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; }

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


Télécharger ppt "Jc/md/lp-01/05Module d'affichage LCD sur le port parallèle : corrigé1 Driver de port parallèle Commande dun module daffichage LCD."

Présentations similaires


Annonces Google