This post is also available in: English

forum-banner


Forum Navigation
Konu ve mesaj oluşturabilmek için giriş yapmanız gerekmektedir.

MicroC i2c ile sabit bir yazıyı kayan yazı olarak değiştirme.

İyi günler, uzun zamandır uğraştığım ancak bugüne kadar çözüm bulamadığım bir konu var Bulduğum kaynak kod MicroC ile yazılmış, i2c ile haberleşen bir program. Karışıklık olmaması için değişiklik yapmaya çalıştığım kısmı yazıyorum.

I2C1_Start();          //Comienzo de la comunicación I2C ...
I2C1_Wr(0x25);     //...con la dirección del PIC esclavo...
I2C1_Wr(0x1E);    // Envia dato
I2C1_Wr(0x80);    // Envia dato
I2C1_Wr(0x7E);    // Envia dato  DEL
I2C1_Wr(0x45);    // Envia dato
I2C1_Wr(0xFF);    // Envia dato
I2C1_Wr(0xFF);    // Envia dato
I2C1_Wr(0x50);    // Envia dato
I2C1_Wr(0x01);    // Envia dato
///DATA TO LCD
I2C1_Wr(0x57);    // Envia dato   W
I2C1_Wr(0x4E);    // Envia dato   E
I2C1_Wr(0x4C);    // Envia dato   L
I2C1_Wr(0x4C);    // Envia dato   L
I2C1_Wr(0x43);    // Envia dato   C
I2C1_Wr(0x4F);    // Envia dato   O
I2C1_Wr(0x4D);    // Envia dato   M
I2C1_Wr(0x4E);    // Envia dato   E
I2C1_Stop();               // issue I2C stop signal

Bu kodda WELCOME yazısı sabit olarak ekranda duruyor. Yapmak istediğim sabit 8 karakter yazı yerine kayan yazı şeklinde uzunca bir metni ekrana yazdırmak. Örneğin '' Bugün 13 Ağustos 2019 Günlerden Salı günüdür'' gibi bir yazıyı yazdırmak istiyorum. Bununla ilgili yardımınızı rica ediyorum.

// bu alttaki değişkeni global olarak tanımla.
uint8_t  saga_kaydir = (0x10
|0x08 | 0x04 );
// bu alt satırdakileri de WELOCOME yazdırdıktan hemen sonra yapıştır.
uint8_t yuksek_nibble = saga_kaydir & 0xF0;
uint8_t dusuk_nibble = (saga_kaydir<<4 ) & 0xF0;
I2C1_Wr((yuksek_nibble)|0);

I2C1_Wr((dusuk_nibble)|0);
// daha sonra I2C sonlandır I2C1_Stop fonksiyonu ile bir dene bakalım işe yarıyacakmı.

 

 

not = uint8_t hata verebilir verememesi icin   #include <stdint.h> program başında belirtiniz.

 

Furkan bey, cevabınız için teşekkür ederim. Peki yazdırılmasını istediğim uzun metni programda nereye yazmam gerekiyor.

Merhabalar

Öncelikle mantığı anlamak açısında bir açıklama yapayım

I2C1_Wr(0x57);    // Envia dato   W  kodunu ele alırsak

I2C1_Wr();  anlaşılacağı gibi 8 bitlik bir veri yazma fonksiyonu ve parantez içine yazılan veriyi bağlı olduğu cihaza I2C protokolü ile yazdırıyor

(0x57) ise aslında W harfinin hexadesimal olarak karşılığı.

Yani sizin istediğiniz kayan yazıyı yapmak için örnekte gösterdiğiniz gibi tek tek yerine arka arkaya yazdırma yapmalıyız.

Bunun için en mantıklı yok bir karakter dizisi ve for döngüsü kullanmak.

örnek olarak;

unsigned char i=0;// for döngüsü için oluşturuldu
char karakter_dizisi[10]={'0','1','2','3','4','5','6','7','8'};//char dizilerinde mutlaka kullanacağımızdan 1 eleman fazla vermeliyiz yani 9 karakter kullanacağım ancak 10 elemanlı dizi oluşturdum çünkü 1 elemanda karakter dizilerinde null(/n) için ayrılır

for(i=0;i<9;i++)//for döngüsü 9 kez tekrar edecektir
  {
    I2C1_Wr(karakter_dizisi[i]);//buna göre for her döngüye girdiğinde "i" karakterine dizinin bir elemanı yüklenir ve I2C fonksiyonu ile yazdırma yapılır
 }

I2C1_Stop();  // döngü sona erince I2C protokolü sonlandırılır.

Bu basit bir örnek isterseniz yazılacak metni kullanıcı belirleyecek şekilde bir fonksiyon yazılabilir böylece istenilen yazı yazdırılır.

Bu tarz bir fonksiyon da ise standarc C fonksiyonu olan "strlen" i kullanmanız gerekir.

Bu fonksiyon bir karakter dizisinin uzunluğunu hesaplar böylece sizde buradan gelen sonuç ile for döngüsünün kaç adet olması gerektiğini hesaplayabilirsiniz.

Bu daha gelişmiş bir sistem kurmanıza yardımcı olur.

Takıldığınız noktaları tekrardan sorabilirsiniz.

İyi Çalışmalar

 

 

Bayram sona erdikten ve eve geldikten sonra açıklamalarınız doğrultusunda gerekli değişiklikleri yapmaya çalışacağım. Benim için işin zorluğu şurada: Ben MicroC 'ye oldukça yavbancıyım. Normalde Picbasic'te orta seviyede çalışmalar yapıyorum.

Şu kişiden alıntılanmıştır: malina45 tarhinde 13 Ağustos 2019, 14:35

Bayram sona erdikten ve eve geldikten sonra açıklamalarınız doğrultusunda gerekli değişiklikleri yapmaya çalışacağım. Benim için işin zorluğu şurada: Ben MicroC 'ye oldukça yavbancıyım. Normalde Picbasic'te orta seviyede çalışmalar yapıyorum.

Evet C ve Basic farklı diller. Eğer C dilini öğrenmek istiyorum diyorsanız aşağıda ki konuda paylaştığım kitapları alıp inceleyebilirsiniz. Oldukça faydası olacaktır.

C öğrenmek için hangi kitaplar ???

İyi Çalışmakar

Ercan bey, anlayabildiğim ölçüde belirttiğiniz değişiklikleri yapmaya çalıştım. Ancak sanırım doğru şekilde değişiklikleri yapamadım,derlemede bir sürü hata veriyor. Sizin için zor olmayacaksa dosyayı göndersem gerekli düzenlemeyi yapabilir misiniz? Yabancısı olduğum bir dilde gerekeni yapamıyorum.Bu konuda beni anlayışla karşılayabilir misiniz. Kesinlikle hazırcılık yapmak gibi bir düşüncem yok. Bu konuda elim kolum bağlı.

  • Dosyayı göndermek yerine kodları buraya yazabilirsiniz.
  • Buraya yazı yazarken yukarıda iki tane birbirine bakan süslü parantez işareti var, üzerinde gelince "code insert" yazıyor
  • Buna tıklayıp açılan pencereye tüm kodları yapıştırabilirsiniz.
  • İnceleyip yardımcı olmaya çalışırım

İyi Çalışmalar

unsigned short take;

void send()
{

PORTb = 0x00;
delay_us(665);
I2C1_Start(); //Comienzo de la comunicación I2C ...
I2C1_Wr(0x46); //...con la dirección del PIC esclavo...
I2C1_Wr(0x0F); // Envia dato
I2C1_Wr(0x90); // Envia dato
I2C1_Wr(0x7F); // Envia dato DEL
I2C1_Wr(0x55); // Envia dato 55=U
I2C1_Wr(0xFF); // Envia dato
I2C1_Wr(0xFF); // Envia dato
I2C1_Wr(0x60); // Envia dato
I2C1_Wr(0x01); // Envia dato
///DATA TO LCD
I2C1_Wr(0x57); // Envia dato W
I2C1_Wr(0x4E); // Envia dato E
I2C1_Wr(0x4C); // Envia dato L
I2C1_Wr(0x4C); // Envia dato L
I2C1_Wr(0x43); // Envia dato C
I2C1_Wr(0x4F); // Envia dato O
I2C1_Wr(0x4D); // Envia dato M
I2C1_Wr(0x4E); // Envia dato E
I2C1_Stop(); // issue I2C stop signal

delay_us(125);

}

void main(){
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
PORTb = 0x01; //=0000 0001 MRQ UCU
TRISb = 0x00; // Configure PORTB as output
PORTD = 0;
TRISD = 0x01;
PORTE = 0;
TRISE = 0x00;
I2C1_Init(12500); //I2C1_Init(10000); initialize I2C communication

while (1) {

if (RD0_bit==0)
{

send();//

}

PORTE = 0x04;
delay_ms(200);
PORTE = 0x00;
delay_ms(200); }
}

 

Kodlar 16f877A için yazılmıştır.


Hiçbir şahsi sosyal medya hesabım yoktur
Yanlızca tanıtım amaçlı sosyal hesaplar kullanılmaktadır
İletişim için sadece soru-cevap forumunu kullanınız