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

czy I2C może zakłócać pracę LCD?

10 Lip 2007 07:55 944 2
  • Poziom 17  
    Witam.
    Mam program do obsługi LCD 2x16 i działa prawidłowo, wyświetla tekst taki jaki powinien.
    Mam też program do obsługi I2C (samo I2C jest skończone, brakuje jeszcze konwersji 2 bajtów na wysweitlacz). Nie mniej jednak, gdy uruchomiam program, to gdy program do LCD zawiera program do obsługi LCD, to wtedy na LCD nie moge nić wyświetlić (nie wyświetla tekstu).
    W czym może tkwić problem?? Zaznaczam, że sam prgoram do LCD oddzielnie działa prawidłowo.
    Jest problem w inicjalizacji?? W opóźnieniach? Czy tez może to być coś innego?
    Jak możecie, to poradźcie bo nie mam pmysłów a program nie chce działać.
    Pozdrawiam.
  • Poziom 23  
    Wszystko jasne oprócz kwesti rodzaju procka, sposobu podpięcia do niego lcd'ka i przede wszystkim języka w jakim to napisałeś...
    Wrzuć tu listing, to niewątpliwie dobrzy ludzie pomogą.
  • Poziom 17  
    Witam. Dziękuję za odpowiedź.
    Procek to AT89S52
    Wyśweiltacz LCD 2x16
    Język programowania C
    Programator issprog Dybkowskiego
    Środowisko M-IDE
    Kwarc 6Mhz
    Code:
    #include <8051.h> 
    
    #include <stdio.h>
    // kwarc 6 MHz srodowisko M-IDE programator ISPPROG
    // definiowanie portow wyswietlacza LCD
    #define PORT P1  //deklaracja portu podlaczenia wyswietlacza LCD
    #define  RS P1_2 //deklaracja bitow sterujacych
    #define  E P1_3  //deklaracja bitow sterujacych

    // definiowanie porotw I2C podlaczenie czujnika temperatury
    #define SDA P0_0 // definiowanie sygnalow
    #define SCL P0_1 // polaczenia I2C

    char msb;
    char lsb;

    ///////////////////////////////////////////////////////////

    //Funkcja opozniajaca
    void Delay (unsigned int time)//funkcja delay(opoznienie)
    //podstawa do odmierzania czasu to 0.01s
    {
       unsigned int j;
       {
             while (time >=1)
             {
             for (j=0; j<1; j++) //1 oznacza 0.01 sekund, 1*0.01
                {
                TH1 = 0xC350;
                TL1 = 0;
                TR1 = 1;
                while (!TF1);
       
                TF1 = 0;
                }
                TR1 = 0;
             time--;
             }
       }
    }

    //Program obslugujacy wyswietlacz LCD
    void Delay2(char k)
    {
    unsigned int i,j;
    for (j=0;j<k;j++)
    for (i=0; i<=296;i++);
    }



    void WriteToLcd(char X) //zapis bajtu do LCD
       {      //schemat kasiazkowy
          E = 1;
          PORT |= 0xF0;
          PORT &= (X | 0x0F);
          E = 0;
          E = 1;
          X <<= 4;
          PORT |= 0xF0;
          PORT &= (X | 0x0F);
          E = 0;
          Delay2(1);
       }

    void WriteCommand(char X) //zapis bajtu do rejestru
       {
          RS = 0;
          WriteToLcd(X);
       }

    void WriteChar(char X)
    {
    RS = 1;
    /*E = 1; */
    WriteToLcd(X);
    }

    void LcdClrScr(void) //czyszczenie ekranu
       {   
          WriteCommand(0x01);
       }


    void LcdInit(void) //inicjalizacja w trybie 4 bity
       {         //schemat ksiazkowy
          char i;
          Delay(15);
          PORT = 0x0F;
          for (i = 0; i<3; i++)
          {
             E = 1;
             PORT &= 0x3F;
             E = 0;
             Delay(5);
          }
          E = 1;
          PORT &= 0x2F;
          E = 0;
          Delay2(1);
          WriteCommand(0x28);
          WriteCommand(0x08);
          WriteCommand(0x01);
          WriteCommand(0x06);
          WriteCommand(0x0C);
       }

    void WriteText(char *S)//wyswietla tekst
       {          //od aktualnego polozenia kursora
          while(*S)
          {
             WriteChar(*S);
             S++;
          }
       }
    //koniec programu obslugujacego wyswietlacz LCD   
    ////////////////////////////////////////////////////////////////////////////////////
       
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    //Program obslugujacy szyne I2C

    //start
    void Start(void)
    {
       SDA=1;
       SCL=1;
       Delay(1);
       SDA=0;
       Delay(1);
       SCL=0;
       Delay(1);
    }

    //stop
    bit Stop(void)
    {
       SDA=0;
       Delay(1);
       SCL=1;
       Delay(1);
       SDA=1;
       Delay(1);                
    }

    //Wysylanie bitu na magistrale I2C
    bit I2C_Write(unsigned char byte)
    {
       unsigned char i;
       i=8;
       
       while (1)
       {
          --i;
          SDA=(byte>>i)&1;
          Delay(1);
          SCL=1;
          Delay(1);
          SCL=0;
          Delay(1);
       }
       
       SDA=1;
       
       Delay(1);
       SCL=1;
       Delay(1);
       i=SDA;//odczyt bitu potwierdzenia
       SCL=0;
       Delay(1);
       
       return i;//zwrócenie wartosci bitu potwierdzenia
    }   


    //Odczyt bajtu z magistrali I2C
    unsigned char I2C_Read(unsigned char potwierdzenie)
    {
       unsigned char i,byte;
       byte=0;
       i=8;
       SDA=1;
       
       while(1)
       {
          --i;
          
          SCL=1;
          Delay(1);
          byte=byte|((unsigned char)(SDA)<<i);
          
          SCL=0;
          Delay(1);
          
       }
       
       SDA=potwierdzenie;//wysłanie bitu potwierdzenia
       Delay(1);
       SCL=1;
       Delay(1);
       SCL=0;
       Delay(1);
       
       return byte;//zwrócenie odebranej danej
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    void main(void) //program glowny
    {

       //Konfiguracja czujnika   
       Start();
       I2C_Write(0x90);
       I2C_Write(0x01);
       I2C_Write(0x60);
       Stop();


       Start();  //poczatek transmisji
       I2C_Write(0x90);  //adres ukladu
       I2C_Write(0x00);  //adres rejestru
       Start();//powtórzony start
       I2C_Write(0x91);  //adres ukladu+1
       msb= I2C_Read(1);//odczyt starszej części temperatury(wlasnie z tym trzeba cos zrobic teraz)
       lsb = I2C_Read(0);//odczyt młodszej części temperatury(wlasnie z tym trzeba cos zrobic teraz)
       Stop();
       
       TMOD = 0x10;  //Timer 16-sto bitowy   
       
       
       LcdInit();//Inicjalizacja LCD

       while (1)// glowna petla programu
       {

          WriteText("Proba");//wyswietlenie tekstu na ekranie LCD
          Delay2(50);            
       }            
    }