logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

LCD - av display 0802A. Nic się nie dzieje. Czy gdzieś jest błąd?

grudziu 08 Wrz 2006 11:05 1607 2
REKLAMA
  • #1 2999064
    grudziu
    Poziom 16  
    Posty: 211
    Pomógł: 14
    Ocena: 14
    Witam, zakupiłem taki o to wyświetlacz LCD (sztuk 2): http://www.artronic.pl/o_produkcie.php?id=606?

    Na aukcji napisali ze sterownik zgodny z hd44780, zrobiłem sobie taki układ ze łacze go z at89s52 (kwarc 11,0592) poprzez wtyk i gniazdo LPT, tak żeby zawsze była możliwość wyjęcia LCDka. Gdzieś przeczytałem ze jeżeli jest inicjalizacja to LCD jest wyczyszczony, wyłaczony jest wyswietlacz , kursor i migotanie. Wyglada na to ze mi sie poprawnie inicjalizuje. Następnie chcę dla próby włączyć wyświetlacz i migotanie kursora, napisałem krótki programik, korzystając z instrukji rozkazów sterujących dla hd44780:


    #include <regx51.h>

    void main(void)
    {
    unsigned long int i;

    for(i;i<2500;i++); //odczekanie na wew inicjalizacje
    {
    }

    P1_2=0; //RS
    P1_3=0; //RW
    P1_4=1; //E
    //display on

    P2_0=1; //D0
    P2_1=1;
    P2_2=1;
    P2_3=1;
    P2_4=0;
    P2_5=0;
    P2_6=0;
    P2_7=0; //D7

    p1_4=0; //E

    }


    w rezultacie powinien pojawić sie kursor i migać, nic sie nie dzieje,
    o co biega?


    połaczenia sprawdzałem z 5 razy, na innych programach przetestowałem ze wystawianie 0 i 1 na te piny działa poprawnie

    pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 2999124
    Bigfoot
    Poziom 25  
    Posty: 982
    Pomógł: 74
    Ocena: 13
    Troche za prosty ten Twoj kod :) Na koncu powinienes - dla scislosci - dac petle nieskonczona while(1); bo inaczej wszystko bedzie krecilo sie w kolko. Jesli chcesz gotowca to masz dzis szczesliwy dzien:) Kod ponizej dziala na 100% - ustal tylko swoje piny.

    
    #include <REG51F.h> 
    #include <stdio.h> 
    
    //RW na stale do masy 
    //cztery starsze bity P1 steruja czterema starszymi LCD 
    sbit RS  = P1^1; 
    sbit EN  = P1^0; 
    
    void delay (int czas) 
    { 
       int k=0; 
       while (k!=czas) 
        {  k++; 
       } 
    } 
    
    void waitms (int ile)// Czekanie ok 1ms   dla zegara 11059200Hz 
    {  int m=0; 
       while(m!=ile) 
       { delay(69);     //opoznienie 1ms =69 
         m++; 
       } 
    }    
    
    void WriteByteToLcd(char X) //zapis najpierw starszej a potem mlodszej czesci 
    {  
       EN = 1;        
       P1|=0xF0;    
       P1&=(X|0x0F); 
       EN = 0;    
       EN = 1; 
       X<<=4; 
       P1|=0xF0; 
       P1&=(X|0x0F); 
       EN = 0; 
       waitms(2); 
    } 
    
    void WriteToLcdCtrlRegister(char X) //zapis bajtu do rejestru kontrolnego 
    {  RS = 0; 
       WriteByteToLcd(X); 
    } 
    
    void LcdWrite(char X)       //   zapis bajtu do pamieci obrazu 
    {  RS = 1; 
       EN = 1; 
       WriteByteToLcd(X); 
    } 
    
    void LcdClrScr(void) 
    {  
      WriteToLcdCtrlRegister(0x01); 
    } 
    
    void LcdInit(void) 
    {  char i; 
       waitms(15); 
       RS = 1; 
       EN = 1; 
          for(i=0; i<3; i++) 
       {    EN = 1; 
       P1&=0x3F; 
       EN = 0; 
       waitms(5); 
       } 
       EN = 1; 
       P1&=0x2F; 
       EN = 0; 
       waitms(1); 
       WriteToLcdCtrlRegister(0x28); 
       WriteToLcdCtrlRegister(0x08); 
       WriteToLcdCtrlRegister(0x01); 
       WriteToLcdCtrlRegister(0x06); 
       WriteToLcdCtrlRegister(0x0C);  //miganie kursora 0x0F, brak 0x0C 
    } 
    
    void GotoXY(char x, char y) 
    {switch(y) 
       { 
         case 0:  x+=0x80; 
             break; 
         case 1:  x+=0xC0; 
             break; 
         case 2:  x+=0x94; 
             break; 
         case 3:  x+=0xD4; 
                    break; 
       } 
       WriteToLcdCtrlRegister(x); 
    } 
    
    void WriteTextXY(char x, char y, char*String) 
    {  while(*String) 
       {   GotoXY(x, y); 
           LcdWrite(*String); 
           x++; 
           String++; 
           if(x>15)   //w zaleznosci od liczby pozycji wyswietlacza 
                      //np. 15 dla 2x16 
           {   x=0; 
          y++; 
           } 
        } 
    } 
    
    void WriteText(char*String) 
    {  while(*String) 
       {   LcdWrite(*String); 
           String++; 
       } 
    } 
    
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    void main() 
    { 
      unsigned char buffer[10]; 
      float result; 
      
      LcdInit(); 
      WriteTextXY(0, 0, "Hello!");
      while(1);                   
    
    } 
    
    
  • #3 3007200
    grudziu
    Poziom 16  
    Posty: 211
    Pomógł: 14
    Ocena: 14
    Bigfoot napisał:
    Troche za prosty ten Twoj kod :) Na koncu powinienes - dla scislosci - dac petle nieskonczona while(1);


    hehe moze troche za prosty kod ale idealnie pasuje zeby na szybko zbadać czy LCD działa, dzięki za wskazówke -->while(1)<--- ; wlasnie udało mi sie sprawdzic działanie LCDka, wszystkiemu winien był... kontrast

    LCD - av display 0802A. Nic się nie dzieje. Czy gdzieś jest błąd?
    LCD - av display 0802A. Nic się nie dzieje. Czy gdzieś jest błąd?
REKLAMA