Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

128x64 OLED ile haberleşme

Başlatan baran123, 03 Ocak 2015, 17:12:39

baran123

Bugün 0.96 oled lcd aldım ama iletişim şekillerini tam oturtamadıgından kafam karışı
Mmodülün üstünde VCC, GND, CLK, MOSI, CS ,D/C pinleri var güç pinleri hariş diğer pinlerin anlamları nedir ? nasıl veri gönderebilirim bu module ?
Ekleme : Haberleşme saçma oldu biraz veri gönderme diyelim biz ona:)

ozayturay

Aldığınız modül SPI arayüzü destekliyor. CCS C ortamını bilemiyorum ama mutlaka bir kütüphane veya örnek vardır. CCS C SSD1306 olarak aratınca http://www.ccsinfo.com/forum/viewtopic.php?p=177464 adresinde birşeyler çıkıyor sanki. Hiç olmadı Arduino için Adafruit'in güzel bir kütüphanesi var https://github.com/adafruit/Adafruit_SSD1306 adresinde.  ;)

Pinlerin açılımına gelince:

CLK - Clock
MOSI - Master Out Slave In
CS - Chip Select
D/C - Data / Command

Bazı modüllerde MISO (Master In Slave Out) ve RST (Reset) pinleri de bulunabiliyor.

Bu modüllerin bir de dört pinli I2C destekli (VCC, GND, SDA, SCL) modelleri de var.

Umarım faydalı olur verdiğim bilgiler. :)

mistek

SPI ile haberleşiyor.

Önce onu araştırın.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Kabil ATICI

https://code.google.com/p/u8glib/
bir bakalım aradığını bulabilecek misin?

Yaptığım oled çalışmasında buradaki kütüphane iş görmüştü...
ambar7

baran123

#4
Hocam spı olduğuun biliyorum da bu pin isimlerini tam çözemedim şimdi CS pini GND ye bağlanıyor diye gördüm zaten tek ekran var doğrumudur ? diğeri ise şu MOSI, CLK, D/C bu pinler sırasıyla sda scl sdo mu oluyor ?

mesaj birleştirme:: 03 Ocak 2015, 18:09:04

@ambar7 hocam linkte ardino , atmega için diyor anladığım kadarıyla ccsc için kütüphane hatta internette hiç örnek bulamadım sadece arduino bulabildimbu ekranı spı kablolarını bağlayıp ccs c fonksiyonlarından direk spigönder(veri); şeklinde gönderebilir miyiz ?

Kabil ATICI

Biliyorum , artık onuda siz yaparsınız.
Mosi=sdo
CLK =scl
D/C= veri/komut
ekrandan bir şey okumak gibi bir durum yok o yüzden sdi kullanılmıyor.
cs pini istiyorsan gnd'ye bağlayıp sürekli ekranı sürekli veri alımında tutabilirsin.
spi üzerine nasıl veri gönderiyorsan aynen gönderebilirsin.
sadece veri/komut seçimini yapman gerekir.

Bu ürünün arduino kütüphanesi olması normal, çünkü o olmasaydı muhtemelen daha birkaç yıl daha göremeyebilirdik. Bu ürünler bir süreden beri piyasada var, fakat kullanıcı düzeyine inmemişti..

O kütüphaneleri kullanarak kendi kütüphaneni oluşturabilirsin. Komut sıralaması ve veri gönderimi ve kontrolu konusunda yardımcı olacaktır..
ambar7

iyildirim

Eastrising - www.buydisplay.com un 0.91- 0.96 SPI OLED lerinden bende almıştım. Aşağıdaki link iş görmüştü.
SPI olanların geneli aynı şekilde bağlantılı.  Chipset in uyumluluğuna dikkat edip 0.96 lardan birine ait şemayı ve kodu kullabilirsiniz.   

http://www.buydisplay.com/default/oled-display/128x64-dot-matrix-0-96-oled-display-module-with-datasheet-price-pinout-arduino-serial-spi-interface-from-china-manufacturer-supplier   
http://www.buydisplay.com/download/interfacing/
http://www.buydisplay.com/download/democode/

baran123

@ambar7 hocam 877a ile devreyi kurmaya başladım en iyisi adım adım gitmek, lcd nin mosi pinin, SDO pinine (25) bağladım, clk pinini scl (18) bağladım, lcd nin  cs pinini GND bağladım peki D/C pini hangisine bağlanmalı ?
Önce lcd ye metin yazdırmak istiyorum grafik daha sonra , metin yazdırmak için kütüphane gerekir mi ?
bu bağlantıları yapıp direk spi dan metin göndersek (librarysiz) calısır mı ?

Kabil ATICI

D/C bacağını sen beğen. ( Karakter LCD'deki RS bacağı gibi  düşün.)
Metin yazdırmak için kütüphane şart. Karakter tanımları.
İstiyorsan kendi spi yazılımını oluştur.
Bildiğim kadar karakter ROM yok. (Onun için spi'den karakter gönderirsen karşılığı olan veri olarak işleme konur.) Ekrana yazdıracağın metin resim olursa ancak görüntülenir. Yada kütüphaneden kendi metnini oluşturursun. (Yukarıdaki bağlantılardaki karakter kütüphanesini kullanabilirsin.)
Ekranda ne görmek istiyorsan ekrana onu gönder.

Elinde varsa 18Fxx serisin kullan.
ambar7

baran123

#9
hocam elimde 18F2550 var ama şimdi onun USB özelliği problem yapacak gibi daha ekranda bir nokta çizgi çıkartabilirsem ondan sonra yazı ve grafiğe başlayacağım.16F877A ile deneme yapıyorum modülü  LM1117 ile besliyorum PIC 5 volt ile çalışıyor bu sorun oluşturur mu ? alttaki kodlarla denedim ama bir şey çıkaramadım ekranda, iletişimi de tam kavrayamadığımdan biraz araştırdığım kadar ile böyle bir şey yaptım kod saçma olabilir affola:)

Bağlantılar

Modül -- PIC

CLK -- SCL/SCK pininde
MOSI -- SDO pininde
CS -- GND
D/C -- C0 pininde

#INCLUDE <16F877A.h>
#DEVICE ADC = 10
#FUSES XT, NOWDT, NODEBUG                
#USE DELAY(CLOCK = 4MHz, CRYSTAL = 4MHz)

#DEFINE DC PIN_C0
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H) 

void main(void)
{     
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);   
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC); 
   setup_psp(PSP_DISABLED);    
   setup_spi(SPI_MASTER | SPI_MODE_1 | SPI_CLK_DIV_64); 
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF); 
   setup_CCP1(CCP_OFF);        
   setup_CCP2(CCP_OFF); 
   setup_vref(FALSE);
   
   set_tris_a(0x00);
   output_a(0x00);
   
   output_high(pin_a0);
   
   for(;;)
   { 
      output_low(DC);
      delay_us(10);          
      spi_write("merhaba dünya");    
      delay_us(10);       
      output_high(DC);  
   }
}



mesaj birleştirme:: 03 Ocak 2015, 21:06:08

Ekleme : PIC deki  SDI/SDA boşta(pin 23)

Kabil ATICI

ambar7

baran123

#11
Hocam verdiğiniz örneğe baktım bir hayli karışık gözüküyor üstelik hiç görmediğim bir mikrodenetleyici galiba en iyisi arduino'dan çevirmeye çalışmak çünkü profesyonel olmadığım için kütüphane yazmak bir hayli zor olacak gibi gözüküyor :/ yardımlarınız için teşekkür ederim.

Ekleme : Hocam şöyle bir kod var bir göz atma şansınız var mı ?

#INCLUDE <18F2550.h>
#DEVICE ADC = 10

#FUSES NOWDT                 
#FUSES WDT128  
#FUSES NOLVP                   
#FUSES NOPROTECT
#FUSES HSPLL                   
#FUSES NOPROTECT               
#FUSES BROWNOUT_NOSL           
#FUSES BROWNOUT              
#FUSES PUT                  
#FUSES NOCPD                   
#FUSES STVREN               
#FUSES NODEBUG                
#FUSES NOLVP                   
#FUSES NOWRT                 
#FUSES NOWRTD                   
#FUSES NOIESO                
#FUSES NOFCMEN                 
#FUSES NOPBADEN               
#FUSES NOWRTC           
#FUSES NOWRTB      
#FUSES NOEBTR             
#FUSES NOEBTRB               
#FUSES NOCPB              
#FUSES NOMCLR                 
#FUSES LPT1OSC      
#FUSES NOXINST
#FUSES PLL5                  
#FUSES CPUDIV1 
#FUSES USBDIV 
#FUSES VREGEN

#USE DELAY(CLOCK = 48MHz, CRYSTAL = 20MHz)
#USE I2C(MASTER, FAST, SDA = PIN_B0, SCL = PIN_B1)

#INCLUDE <string.h> 
#INCLUDE <stdlib.h> 

#define OLED 0x78 

const BYTE TEXT[51][5] = 
{ 
0x00, 0x00, 0x00, 0x00, 0x00, // SPACE 
0x00, 0x00, 0x5F, 0x00, 0x00, // ! 
0x00, 0x03, 0x00, 0x03, 0x00, // " 
0x14, 0x3E, 0x14, 0x3E, 0x14, // # 
0x24, 0x2A, 0x7F, 0x2A, 0x12, // $ 
0x43, 0x33, 0x08, 0x66, 0x61, // % 
0x36, 0x49, 0x55, 0x22, 0x50, //& 
0x00, 0x05, 0x03, 0x00, 0x00, // ' 
0x00, 0x1C, 0x22, 0x41, 0x00, // ( 
0x00, 0x41, 0x22, 0x1C, 0x00, //) 
0x14, 0x08, 0x3E, 0x08, 0x14, // * 
0x08, 0x08, 0x3E, 0x08, 0x08, // + 
0x00, 0x50, 0x30, 0x00, 0x00, //, 
0x08, 0x08, 0x08, 0x08, 0x08, // - 
0x00, 0x60, 0x60, 0x00, 0x00, // . 
0x20, 0x10, 0x08, 0x04, 0x02, // / 
0x3E, 0x51, 0x49, 0x45, 0x3E, // 0 
0x04, 0x02, 0x7F, 0x00, 0x00, // 1 
0x42, 0x61, 0x51, 0x49, 0x46, // 2 
0x22, 0x41, 0x49, 0x49, 0x36, // 3 
0x18, 0x14, 0x12, 0x7F, 0x10, // 4 
0x27, 0x45, 0x45, 0x45, 0x39, // 5 
0x3E, 0x49, 0x49, 0x49, 0x32, // 6 
0x01, 0x01, 0x71, 0x09, 0x07, // 7 
0x36, 0x49, 0x49, 0x49, 0x36, // 8 
0x26, 0x49, 0x49, 0x49, 0x3E, // 9 
0x00, 0x36, 0x36, 0x00, 0x00, // : 
0x00, 0x56, 0x36, 0x00, 0x00, //; 

0x08, 0x14, 0x22, 0x41, 0x00, // < 
0x14, 0x14, 0x14, 0x14, 0x14, // = 
0x00, 0x41, 0x22, 0x14, 0x08, // > 
0x02, 0x01, 0x51, 0x09, 0x06, // ? 
0x3E, 0x41, 0x59, 0x55, 0x5E, // @ 
0x7E, 0x09, 0x09, 0x09, 0x7E, // A 
0x7F, 0x49, 0x49, 0x49, 0x36, // B 
0x3E, 0x41, 0x41, 0x41, 0x22, // C 
0x7F, 0x41, 0x41, 0x41, 0x3E, // D 
0x7F, 0x49, 0x49, 0x49, 0x41, // E 
0x7F, 0x09, 0x09, 0x09, 0x01, // F 
0x3E, 0x41, 0x41, 0x49, 0x3A, // G 
0x7F, 0x08, 0x08, 0x08, 0x7F, // H 
0x00, 0x41, 0x7F, 0x41, 0x00, // I 
0x30, 0x40, 0x40, 0x40, 0x3F, // J 
0x7F, 0x08, 0x14, 0x22, 0x41, // K 
0x7F, 0x40, 0x40, 0x40, 0x40, // L 
0x7F, 0x02, 0x0C, 0x02, 0x7F, // M 
0x7F, 0x02, 0x04, 0x08, 0x7F, // N 
0x3E, 0x41, 0x41, 0x41, 0x3E, // O 
0x7F, 0x09, 0x09, 0x09, 0x06, // P 
0x1E, 0x21, 0x21, 0x21, 0x5E, // Q 
0x7F, 0x09, 0x09, 0x09, 0x76 
}; // R 

const BYTE TEXT2[44][5]= 
{ 
0x26, 0x49, 0x49, 0x49, 0x32, // S 
0x01, 0x01, 0x7F, 0x01, 0x01, // T 
0x3F, 0x40, 0x40, 0x40, 0x3F, // U 
0x1F, 0x20, 0x40, 0x20, 0x1F, // V 
0x7F, 0x20, 0x10, 0x20, 0x7F, // W 
0x41, 0x22, 0x1C, 0x22, 0x41, // X 
0x07, 0x08, 0x70, 0x08, 0x07, // Y 
0x61, 0x51, 0x49, 0x45, 0x43, // Z 
0x00, 0x7F, 0x41, 0x00, 0x00, // [ 
0x02, 0x04, 0x08, 0x10, 0x20, // \ 
0x00, 0x00, 0x41, 0x7F, 0x00, // ] 
0x04, 0x02, 0x01, 0x02, 0x04, // ^ 
0x40, 0x40, 0x40, 0x40, 0x40, // _ 
0x00, 0x01, 0x02, 0x04, 0x00, // ` 
0x20, 0x54, 0x54, 0x54, 0x78, // a 
0x7F, 0x44, 0x44, 0x44, 0x38, // b 
0x38, 0x44, 0x44, 0x44, 0x44, // c 
0x38, 0x44, 0x44, 0x44, 0x7F, // d 
0x38, 0x54, 0x54, 0x54, 0x18, // e 
0x04, 0x04, 0x7E, 0x05, 0x05, // f 
0x08, 0x54, 0x54, 0x54, 0x3C, // g 
0x7F, 0x08, 0x04, 0x04, 0x78, // h 
0x00, 0x44, 0x7D, 0x40, 0x00, // i 
0x20, 0x40, 0x44, 0x3D, 0x00, // j 
0x7F, 0x10, 0x28, 0x44, 0x00, // k 
0x00, 0x41, 0x7F, 0x40, 0x00, // l 
0x7C, 0x04, 0x78, 0x04, 0x78, // m 
0x7C, 0x08, 0x04, 0x04, 0x78, // n 
0x38, 0x44, 0x44, 0x44, 0x38, // o 
0x7C, 0x14, 0x14, 0x14, 0x08, // p 
0x08, 0x14, 0x14, 0x14, 0x7C, // q 
0x00, 0x7C, 0x08, 0x04, 0x04, // r 
0x48, 0x54, 0x54, 0x54, 0x20, // s 
0x04, 0x04, 0x3F, 0x44, 0x44, // t 
0x3C, 0x40, 0x40, 0x20, 0x7C, // u 
0x1C, 0x20, 0x40, 0x20, 0x1C, // v 
0x3C, 0x40, 0x30, 0x40, 0x3C, // w 
0x44, 0x28, 0x10, 0x28, 0x44, // x 
0x0C, 0x50, 0x50, 0x50, 0x3C, // y 
0x44, 0x64, 0x54, 0x4C, 0x44, // z 
0x00, 0x08, 0x36, 0x41, 0x41, // 
};

const INT LOGOS [1024] = 
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xBE, 0xB6, 0xF6, 0xE6, 0x00, 0x00, 0xFE, 0xFE, 0x80, 
0x80, 0x80, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 0x84, 0x86, 0x86, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 
0xFE, 0x96, 0x96, 0x96, 0x9E, 0xDC, 0x00, 0x00, 0xFE, 0xFE, 0x0C, 0x06, 0x06, 0x00, 0x9C, 0xBE, 
0xB6, 0xF6, 0xE6, 0x00, 0x00, 0xFE, 0xFE, 0x80, 0x80, 0x80, 0xFE, 0xFE, 0x00, 0x00, 0xFE, 0xFE, 
0x84, 0x86, 0x86, 0xFE, 0xFC, 0x00, 0x00, 0xFC, 0xFE, 0x96, 0x96, 0x96, 0x9E, 0xDC, 0x00, 0x00, 
0xFE, 0xFE, 0x0C, 0x06, 0x06, 0x06, 0xFF, 0xFF, 0x06, 0x06, 0x00, 0xFE, 0xFE, 0x0C, 0x06, 0x06, 
0x00, 0xEC, 0xF6, 0x96, 0x96, 0xFE, 0xFC, 0x00, 0x00, 0xFE, 0xFE, 0x0C, 0x06, 0x06, 0xFE, 0xFC, 
0x00, 0x00, 0xC6, 0xE6, 0xB6, 0x9E, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 
0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 
0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0F, 0x0F, 
0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 
0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 
0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xE0, 0x30, 0xB0, 0xD8, 0xD8, 0xD8, 0xD8, 0x18, 
0x30, 0xF0, 0xC0, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x80, 
0xC0, 0xC0, 0xC0, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 
0x80, 0x00, 0x00, 0xD8, 0xD8, 0x00, 0x00, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x80, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 
0xC0, 0xC0, 0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x80, 0xC0, 0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x7F, 0x60, 0xCF, 0xDF, 0xD8, 0xCC, 0xDF, 0xDB, 0x18, 
0x1C, 0x0F, 0x07, 0x00, 0x00, 0xDB, 0xFF, 0xB6, 0xB6, 0xB7, 0xF3, 0xE0, 0x00, 0x3F, 0x3F, 0x01, 
0x00, 0x00, 0x3F, 0x3F, 0x01, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x1D, 0x3E, 0x32, 0x12, 0x3F, 
0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 
0x1F, 0x3F, 0x30, 0x30, 0x30, 0x19, 0x00, 0x1F, 0x3F, 0x30, 0x30, 0x30, 0x3F, 0x1F, 0x00, 0x00, 
0x3F, 0x3F, 0x01, 0x00, 0x00, 0x3F, 0x3F, 0x01, 0x00, 0x00, 0x3F, 0x3F, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x06, 0x06, 0x06, 0xFE, 0xFE, 0x06, 0x06, 0x06, 0x00, 0xF0, 0xF0, 0x60, 0x30, 0x30, 0x00, 
0xF6, 0xF6, 0x00, 0x00, 0xE0, 0xF0, 0xB0, 0xB0, 0xB0, 0xF0, 0xE0, 0x00, 0x00, 0xE0, 0xF0, 0xB0, 
0xB0, 0x30, 0x00, 0x30, 0xFC, 0xFC, 0x30, 0x30, 0x00, 0x00, 0xE0, 0xF0, 0xB0, 0xB0, 0xB0, 0xF0, 
0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0xF6, 0x00, 0x30, 0xFC, 
0xFC, 0x30, 0x30, 0x00, 0x00, 0x60, 0xB0, 0xB0, 0xB0, 0xF0, 0xE0, 0x00, 0x00, 0xFF, 0xFF, 0x00, 
0x30, 0xF0, 0xC0, 0x00, 0x00, 0xC0, 0xF0, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x00, 0x00, 
0x0F, 0x0F, 0x00, 0x00, 0x07, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 0x06, 0x00, 0x00, 0x0C, 0x0D, 0x0D, 
0x0F, 0x07, 0x00, 0x00, 0x07, 0x0F, 0x0C, 0x0C, 0x00, 0x00, 0x07, 0x0F, 0x0C, 0x0C, 0x0C, 0x0C, 
0x06, 0x00, 0x20, 0x3C, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x0F, 0x00, 0x00, 0x07, 
0x0F, 0x0C, 0x0C, 0x00, 0x00, 0x07, 0x0F, 0x0C, 0x04, 0x0F, 0x0F, 0x00, 0x00, 0x0F, 0x0F, 0x00, 
0x00, 0x01, 0x67, 0x7E, 0x1E, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 
}; 

int DISPLAY[1024]; 

void OLED_command(int ind, int com) 
{ 
   i2c_start(); 
   i2c_write(ind); 
   i2c_write(0x00); 
   i2c_write(com); 
   i2c_stop(); 
} 

void OLED_write(int ind) 
{ 
   long i; 
   
   OLED_command(ind, 0x21); 
   OLED_command(ind, 0x00); 
   OLED_command(ind, 127); 
   OLED_command(ind, 0x22); 
   OLED_command(ind, 0x00); 
   OLED_command(ind, 7); 
   i2c_start(); 
   i2c_write(ind) ; 
   i2c_write(0x40) ; 
   
   for(i = 0; i < 1024; i++) 
   { 
      i2c_write (DISPLAY[i]) ; 
   }
   i2c_stop (); 
} 

void OLED_init(int add) 
{ 
   OLED_command (add, 0xae); 
   OLED_command (add, 0xa8); 
   OLED_command (add, 0x3f); 
   OLED_command (add, 0xd3); 
   OLED_command (add, 0x00); 
   OLED_command (add, 0x40); 
   OLED_command (add, 0xa0); 
   OLED_command (add, 0xa1); 
   OLED_command (add, 0xc0); 
   OLED_command (add, 0xc8); 
   OLED_command (add, 0xda); 
   OLED_command (add, 0x12); 
   OLED_command (add, 0x81); 
   OLED_command (add, 0xfF); 
   OLED_command (add, 0xa4); 
   OLED_command (add, 0xa6); 
   OLED_command (add, 0xd5); 
   OLED_command (add, 0x80); 
   OLED_command (add, 0x8d); 
   OLED_command (add, 0x14); 
   OLED_command (add, 0xAF); 
   OLED_command (add, 0x20); 
   OLED_command (add, 0x00); 
} 

void OLED_pixel(long x ,long y) 
{ 
   long nt; 
   long pagina; 
   long bit; 
   
   pagina = y/8; 
   bit = y-(pagina*8); 
   nt = DISPLAY[pagina*128+x]; 
   nt |= 1 << bit; 
   DISPLAY[pagina*128+x] = nt; 
} 

void OLED_text(int x, int y, char* textptr, int size) 
{ 
   int i, j, k, l, m;     // Loop counters 
   BYTE pixelData[5];     // Stores character data
   
   for(i = 0; textptr[i] != '\0'; ++i, ++x) // Loop through the passed string 
   { 
      if(textptr[i] < 'S') // Checks if the letter is in the first text array 
         memcpy (pixelData, TEXT[textptr[i] - ' '], 5) ; 

      else if (textptr[i] <= '~') // Check if the letter is in the second array 
         memcpy (pixelData, TEXT2[textptr[i] - 'S'], 5) ; 

      else 
         memcpy (pixelData, TEXT[0], 5); // DEFAULT to space 
         
      if(x + 5 * size >= 128)  // Performs character wrapping 
      { 
         x = 0;       // Set x at far left position 
         y += 7*size + 1;    // Set y at next position down 
      } 

      for(j = 0; j < 5; ++j, x += size)  // Loop through character byte data 
      { 
         for(k = 0; k < 7 * size; ++k)  // Loop through the vertical pixels 
         { 
            if(bit_test (pixelData[j], k)) // Check if the pixel should be set 
            { 
               for(l = 0; l < size; ++l) // The next two loops change the 
               { 
                  // character's size 
                  for(m = 0; m < size; ++m) 
                  { 
                     OLED_pixel (x + m, y+k * size + l); // Draws the pixel 
                  } 
               } 
            } 
         } 
      } 
   } 
} 

void OLED_clear(void) 
{ 
   long x; 
   
   for(x = 0; x < 1024; x++) 
   { 
      DISPLAY[x] = 0x00; 
   } 
} 

void main(void) 
{ 
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);   
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC); 
   setup_adc_ports(NO_ANALOGS);    
   setup_adc(ADC_OFF); 
   setup_CCP1(CCP_OFF);        
   setup_CCP2(CCP_OFF); 
   setup_vref(FALSE);
   
   set_tris_a(0x00);
   output_a(0x00);
   output_high(pin_a0);
   
   char txt[100]; 
   OLED_init(OLED); 
   
   while(TRUE) 
   { 
      OLED_clear(); 
      OLED_write(OLED); 
      delay_ms(3000); 
      OLED_clear(); 
      sprintf(txt,"superfranz!"); 
      OLED_text(0,0,txt,2); 
      OLED_write(OLED); 
      delay_ms(3000); 
   } 
}