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

Zakłócenia w działaniu LCD 2x16 przy integracji z I2C - co sprawdzić?

cristof_w 10 Lip 2007 07:55 1211 2
REKLAMA
  • #1 4067120
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    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.
  • REKLAMA
  • #2 4067139
    redart
    Poziom 23  
    Posty: 529
    Pomógł: 51
    Ocena: 30
    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ą.
  • #3 4067165
    cristof_w
    Poziom 17  
    Posty: 338
    Pomógł: 3
    Ocena: 9
    Witam. Dziękuję za odpowiedź.
    Procek to AT89S52
    Wyśweiltacz LCD 2x16
    Język programowania C
    Programator issprog Dybkowskiego
    Środowisko M-IDE
    Kwarc 6Mhz
    #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);				
    	}				
    }
    
    
    
    
REKLAMA