Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sterowanie wyświetlaczem LCD przez LPT w języku C++

zasoby 07 Cze 2005 12:00 6454 7
  • Edukacyjny przykład sterowania portem LPT w języku C++ celem wysterowania wyświetlacza LCD i wyświetleniu na nim wpisanego z klawiatury tekstu.

    Podłączenie wyświetlacza LCD do komputera jest bardzo proste. Powinien to być wyświetlacz 2x16 znaków czyli dwie linie po 16 znaków w linii. Dodatkowe rezystory podciągające umożliwiają uniknięcie problemów z różnym działaniem portów LPT. Potencjometr P1 umożliwia regulację kontrastu.

    Sterowanie wyświetlaczem LCD przez LPT w języku C++

    Omówmy krótko źródło programu w języku C++. Na wstępie znajdują się dołączone biblioteki jakie będą używane w programie. Później definiowany jest port LPT i przygotowywany do obsługi. Następnie inicjowany jest wyświetlacz i przygotowywany do wyświetlenia znaków. Wczytywana jest z klawiatury pierwsza linia znaków, po czym druga linia znaków do wyświetlenia na LCD. Program bada długość pierwszej linii i wpada w pętle, której ilość powtórzeń równa się ilości znaków w linii. Jest wyświetlany znak po znaku. Ta sama pętla została przygotowana dla linii drugiej.

    Code:

    #include <dos.h>
    #include <stdio.h>
    #include <string.h>

    #define BASE_ADR 0x378            // Printer Port Base Address (0x378 = LPT1)
    #define DATA_ADR BASE_ADR + 0     // Data Register of the Port Address (Bi-Directional)
    #define STATUS_ADR BASE_ADR + 1   // Status Register of the Port Address (Read Only)
    #define CONTROL_ADR BASE_ADR + 2  // Control Register of the Port Address (Bi-Directional)

    void main(void)
    {

     unsigned char init_sequence[10];
     unsigned char index, ucLength;
     char Line1[17], Line2[17];
     init_sequence[0] = 0x0F;               // Initialize the LCD
     init_sequence[1] = 0x01;               // Clear Screen
     init_sequence[2] = 0x38;               // Define 2-line, 8-bit
     Control_Byte = inportb(CONTROL_ADR);   // Read control register
     Control_Byte &= 0xDF;                  // Reset the 5th bit to zero
     outportb(CONTROL_ADR, Control_Byte);   // Write to control register
     Control_Byte = inportb(CONTROL_ADR);   // Read control register
     Control_Byte |= 0x08;                  // Set the 4th bit to one
     outportb(CONTROL_ADR, Control_Byte);   // Write to control register




     // Initialize sequence
     for (index = 0; index < 3; index++)
     {
       outportb(DATA_ADR, init_sequence[index]);  // Write the init_sequence byte to data register
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte |= 0x01;                      // Set EN pin to one (High)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(5);                                  // 5 mSec Delay
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte &= 0xFE;                      // Reset EN pin to zero (Low)   
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(5);                                  // 5 mSec Delay
     }
     Control_Byte = inportb(CONTROL_ADR);   // Read control register
     Control_Byte &= 0xF7;                  // Reset the 4th bit to zero
     outportb(CONTROL_ADR, Control_Byte);   // Write to control register
     
     printf("Enter the first line text:");
     scanf("%16s", Line1);
     printf("Enter the second line text:");
     scanf("%16s", Line2);
     
     ucLength = strlen(Line1);

     for (index = 0; index < uclength; index++)
     {
       outportb(DATA_ADR, Line1[index]);
       Control_Byte |= 0x01;                      // Set EN pin to one (High)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte &= 0xFE;                      // Reset EN pin to zero (Low)   
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
     }
     
     ucLength = strlen(Line2);
     
     for (index = 0; index < uclength; index++)
     {
       outportb(DATA_ADR, Line2[index]);
       Control_Byte |= 0x01;                      // Set EN pin to one (High)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte &= 0xFE;                      // Reset EN pin to zero (Low)   
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
     }
     
    }


    Fajne! Ranking DIY
  • #2 09 Cze 2005 19:20
    mikikonto
    Poziom 11  

    Witam.
    Naprawdę wszystko ślicznie, ale jestem zmuszony zadać, prawdopodobnie bardzo proste pytanie (jednak nie dla mnie :) ). Mianowicie: co to znaczy VCC ? Czy to jest zasilanie ( +5 V ) ?
    Przepraszam za kłopot i z góry dziękuję za odpowiedź. :]

  • #3 09 Cze 2005 20:58
    Rafraf
    Poziom 16  

    vcc to 5v , z innych takich .. vss to masa a vdd 12v (lub 15?)

  • #4 09 Cze 2005 21:19
    mikikonto
    Poziom 11  

    no fajnie, fajnie, ale ja dalej nie rozumiem prawej górnej części schematu :)
    Moze jestem jakiś szczególnie ciemny, ale czy mozna ominąć R1 i R2 ??
    I dlaczego do ostatnich 2 pinów nic sie nie podłącza ?
    thx in advance

  • #5 09 Cze 2005 22:16
    Rafraf
    Poziom 16  

    r1 i r2 mozna pominac , a dwa ostatnie piny to podswietlenie (nie kazdy modul ma je zaimplementowane)

    Dodano po 8 [minuty]:

    a tak przy okazji , zeby skompilowac ten prgoram z DJGPP (gcc 3 z hakiem) musialem go nieco zmodyfikowac:

    Code:


    #include <dos.h>
    #include <stdio.h>
    #include <string.h>

    #define BASE_ADR 0x378            // Printer Port Base Address (0x378 = LPT1)
    #define DATA_ADR BASE_ADR + 0     // Data Register of the Port Address (Bi-Directional)
    #define STATUS_ADR BASE_ADR + 1   // Status Register of the Port Address (Read Only)
    #define CONTROL_ADR BASE_ADR + 2  // Control Register of the Port Address (Bi-Directional)

    int Control_Byte;
    int uclength;

    int main(void)
    {

     unsigned char init_sequence[10];
     unsigned char index, ucLength;
     char Line1[17], Line2[17];
     init_sequence[0] = 0x0F;               // Initialize the LCD
     init_sequence[1] = 0x01;               // Clear Screen
     init_sequence[2] = 0x38;               // Define 2-line, 8-bit
     Control_Byte = inportb(CONTROL_ADR);   // Read control register
     Control_Byte &= 0xDF;                  // Reset the 5th bit to zero
     outportb(CONTROL_ADR, Control_Byte);   // Write to control register
     Control_Byte = inportb(CONTROL_ADR);   // Read control register
     Control_Byte |= 0x08;                  // Set the 4th bit to one
     outportb(CONTROL_ADR, Control_Byte);   // Write to control register
     // Initialize sequence
     for (index = 0; index < 3; index++)
     {
       outportb(DATA_ADR, init_sequence[index]);  // Write the init_sequence byte to data register
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte |= 0x01;                      // Set EN pin to one (High)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(5);                                  // 5 mSec Delay
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte &= 0xFE;                      // Reset EN pin to zero (Low)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(5);                                  // 5 mSec Delay
     }
     Control_Byte = inportb(CONTROL_ADR);   // Read control register
     Control_Byte &= 0xF7;                  // Reset the 4th bit to zero
     outportb(CONTROL_ADR, Control_Byte);   // Write to control register

     printf("Enter the first line text:");
     scanf("%16s", Line1);
     printf("Enter the second line text:");
     scanf("%16s", Line2);

     ucLength = strlen(Line1);

     for (index = 0; index < uclength; index++)
     {
       outportb(DATA_ADR, Line1[index]);
       Control_Byte |= 0x01;                      // Set EN pin to one (High)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte &= 0xFE;                      // Reset EN pin to zero (Low)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
     }

     ucLength = strlen(Line2);

     for (index = 0; index < uclength; index++)
     {
       outportb(DATA_ADR, Line2[index]);
       Control_Byte |= 0x01;                      // Set EN pin to one (High)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
       Control_Byte = inportb(CONTROL_ADR);       // Read control register
       Control_Byte &= 0xFE;                      // Reset EN pin to zero (Low)
       outportb(CONTROL_ADR, Control_Byte);               // Write to control register
       delay(2);                                  // 2 mSec Delay
     }

    return 0;
    }



    kompiluje sie:
    gcc plik.c -o plik.c

    :)

    PS. mecze sie teraz z modulem lcd ;-)

  • #6 10 Cze 2005 15:25
    mikikonto
    Poziom 11  

    OK, dzieki, mam nadzieję, że teraz bedzie śmigało :]

  • #7 10 Cze 2005 16:21
    Rafraf
    Poziom 16  

    mi niestety nie smiga , prawdopodobnie moj modul jest niesprawny (nic nie wyswietla w ogole , nawet wlaczenie go jalowo i zwarcie masy z V_kontrastu nie daje efektow , nie sadze aby wyswietlacze z kas optimus bravo (sdec 1x16 oraz 2x16) mialy ujemne zasilanie na kontrascie). jeszcze jak mi sie zachce to napisze programik ktory sprobuje sie pokomunikowac z kontrolerem modulu takze w kierunku ldc->pc i w ten sposob sprawdzilbym wpis danych do modulu... a moze ktos ma jakis lepszy pomysl? przejrzalem juz inne watki na ten temat ale nie znalalzem rozwiazania niestety.

  • #8 18 Paź 2006 16:59
    dibller1986
    Poziom 10  

    czy potencjometr p1 mozna pominac? jesli nie, to jakimi parametrami powinien sie charakteryzowac?