I2C yi özetlemek gerekirse, oldukça yaygın, iki kablo üzerinden çalışan, pek çok projede yer bulan iki yönlü haberleşme protokolüdür.

Bu protokolü kullanan cihazlar aynı iki kabloya bağlandıkları için birbirlerinden ayırt etmenin tek yolu hepsini farklı isimlerle (Adreslerle) çağırmaktır. İyi bilinen elemanlarda veya dökümanı olan elemanlarda adresi bulmak kolay, peki elinizde dökümanı olmayan bir şeyler varsa? Adresini nasıl buluruz?

Basit. Bir I2C Tarayıcısı yaparak! Peki en ucuz şekilde böyle bir cihazı nasıl yaparız? Gene basit. 12F508 kullanarak! Neden 12f508? Çünkü biz mazoşistiz!

Elbetteki bu işe en uymayan, en zorlayıcı mikrokontrolör olduğu ve elimin altında hep bir kaç tane boşta gezeni olduğu için! Mükemmel bir boş iş fırsatı!

Üstelik bu ihtiyar chip in kullanıcıya bilgi verebilmesi için gösterge elemanı olarak gene I2C kullanan gencecik 128x32 dot matrix OLED gösterge kullanacağızki işin en zor yanı bu OLED i çalıştırmak. Neden OLED? Çünkü LCD için en az dört pin gerekiyor. Artı iki de I2C için olunca maalesef 12F508 in bacak kapasitesini aşıyoruz. malum GP3 sadece giriş. Oysa bu işte LCD kullanırsak 6 adet çıkışa ihtiyacımız var, üstelik I2C yi tam kapasite kullanmak istersek bunlardan biri girişede dönüşebilmeli.

Dolayısı ile göstergeyide I2C ile çalışan türde seçmek daha mantıklı. Ayrıca I2C iki kablo olayı yüzünden cazip olmakla beraber bazı kötü huylarıda olabilen bir iletişim şekli. I2C üzerindeki cihazlarla bazen anlaşamayabiliyorsunuz. Böyle bir durumda I2C ile kullandığımız ekrana bilgi yazamayacağız, PIC in kitlimi hayattamı olduğunu anlamak için bir adette led e ihtiyacımız var ki 12F508 in bacak sayısı LCD ye yetmesede iki kablo + bir Led'e yetiyor!

OLED göstergeler hızla düşen fiyatları, I2C desteği ve grafik gösterebilme yetenekleriyle giderek popülerleşiyor. Bu cihazları öğrenmekte fayda var.

Bu yazıda I2C nin çalışmasını değil OLED in kontrolünü ve 12F508 in sınırlarını nasıl zorlayabileceğimizi anlatmaya çalışacağım. Çünkü işin içine dot matrix grafik gösterge girdimi hafızaya aç bir canavarla karşılaşıyoruz. Şöyle düşünün; 128x32 noktalık bir grafik göstergenin tamamını doldurmak için 8 bitlik 128x4 = 512byte a ihtiyacınız var. 12F508 in tüm hafızası bu kadar! Üstelik ilk 256byte lık kısmı dışına çağrı veya dönüş yapamaz, yani sık tekrarlanan işlemleri alt rutin olarak yazıp gerektikçe çağırma ve/veya veri tabloları yapma imkanımız 256 byt ile sınırlı. Sadece ekrana yazı yazabilmek için alfabeyi tablo yapmakla yetinsek bile 29*5 = 145byte ediyor oysa I2C yazılımımız bundan çok yer kaplıyor, sonuçta 12F508 e böyle bir programı sıkıştırmak ciddi zor iş.

I2C yi taramak kolay. 0x10 dan 0xEF ye kadar Adreslere çağrı yapıp ACK bekliyoruz. ACK gelirse hatta bir cihaz var, ekrana yazıyoruz, ACK yoksa bir sonraki adrese gidiyoruz ve son adreste bitince bulduğumuz adres sayısını yazıyoruz. Yani mantık basit, tasarlamak kolay ancaaaak, sadece OLED i ayarlamak için 30 küsur komut göndermek gerekiyor. Bu komut dizisini tablodan okuyamayız çünkü hafızanın çağrıyla ulaşılabilir kısmını grafik tablosu (Sayı ve harfler) ve sunuçları sayıdan yazıya çevirip bu tablodan uygun karakterleri seçip OLED e gönderen kritik yazılım işlerinde kullanacağız.

Call ve return kullanamadığımız hafızanın alt bölümünü ise 30 küsür ayar prosedürü için sadece GOTO ve sayaçlar kullanarak yapacağız. Öyle taklalar atacağızki yazılımın son halinde 9 byte arttırmayı bile başaracağız!

Nasıl yeterince zorlumu? Mümkün olan tüm açıklamalar kodun içinde. Doğal olarak assembler kullanıyoruz.

Peki ne taklalar attık? Öncelikle iki tablomuz var. Birincisi (Tablo1) 5x8 lik 0-9 A-F ve 15 baytlık "det" hecesini içeriyor. Böylece ekrana yazılacak her karakteri sadece 100 baytta saklamayı başarıyoruz. İkinci tablo hemen Tablo1 in altında devam eden 15 baytlık "sayı" indekslerini içeren tablo.

Birinci tablo kaçınılmaz. Olmazsa ekrana yazacak karakter olmaz. İkinci tablo ise çok yer kaplayacak sayı-karakter hesabını kısaltıp hafıza kazanmaya yardımcı olacak. Normalde sayıları yazıya dönüştürmek için hane büyüklüklerini ölçüp her hanenin sayısal karşılığını bulduktan sonra bu sayıları karakter grafik genişliğiyle çarpıp, grafik hafızanın başlangıcından ne kadar uzakta olduğunu bulup bayt bayt OLED göstergeye aktarmamız lazım. Tabii aktarmadan önce gene bir dizi komutla OLED e bu aktardıklarımızı nereye yerleştireceğini söylememiz lazım. Bütün bunlar eldeki hafızanın boyunu aşar.

Öncelikle hesaplanacak hane sayısnı en aza indirmek için sayıları hexedesimal yazıyoruz. Hatta şık gözüksün diye başına "0x" de yazıyoruz! Bu iki sembol hiç değişmeyeceği için tablodaki yerlerini hesaplamak gerekmiyor, yani yazılıma bir kaç satırdan fazla yükü yok ama sonucu güzelleştiriyor, o birkaç satıra değer. Çarpma gibi uzun boylu işlere girmemek için sayı-yazı çevriminide basitçe atlıyoruz! Nasılmı? Şöyle; Assemblerde swap diye oldukça faydalı bir komut var. Yazılacak sayı, yani adres 0-255 arasında, yani 8bit. Swap komutu son 4 bit ile ilk 4 bit in yerini değiştiriyor. Adresi swap edip 0F ile AND lediğimizde elimize 0-15 arasında bir sayı oluyor. Ama bu sayı hekedesimal (16 tabanlı) sayımızın sol hanesi ve 0-F arası bir karakterle yazılıyor. İkinci tablomuzun bulduğumuz sayıya denk gelen satırında bu sayının grafik karakterinin başlangıç adresi var. Bu adresi alıp Tablo1 den 5 baytlık veriyi OLED e aktarıyoruz, ardından 1 baytlık sıfır gndererek karakterler arasındaki boşluğuda hafızada (tabloda) saklamadan ekliyoruz.

İkinci hane için adresi swap etmeden 0x0F ile AND liyoruz ve son 4bit bize adresimizin son hanesini veriyor. Aynı işlemi yapıyoruz. Hiç uzun matematik işlere girmeden ekrana sayıları yazı şeklinde aktarmış oluyoruz.

Bütün adresleri taradıktan sonra aynı yöntemle adres sayacını yazıyoruz, A karakterini yazıyoruz, gene hesap gerektirmiyor adresi sabit, "det" hecesini bir seferde aktarıp yazıyoruz ve işimiz bitti gibi.

Gibi, çünkü, tarayıcı çalışırken I2C hattına cihaz ilave eder veya çıkartırsanız satırlar uzar veya kısalır. Uzaması sorun değil ancak kısaldığı taktirde önceden yazılan yazılar görünür kalı bu yüzden yazının bittiği yerden sonrasını temizlememiz gerek. Peki nekadar alanı temizleyeceğimizi nereden bileceğiz? Bunu hesaplamakta çok satır alacaktır. O yüzden gene bir takla atacağız ve hesaplamayacağız! Kullandığımız OLED 128x32 lik yani 8 bit lik 4 satırı var. Oysa bu göstergeyi süren ve bizim muhattabımız olan SSD1306 chip i 128x64 yani 8bitlik 8 satır gösterecek kapasitede. Bu fazla 4 satır bizi hesap kitaptan kurtaracak. Açılışta OLED in ayarlarını yaparken satır sayısı olarak 4 değil 8 dedik. Böylece ekranda görüntülenmeyen fazladan 4 satırımız oldu. Ekrana son karakteri yazdıktan sonra 3x128 baytlık sıfır yazdığımızda ekranın kalan kısmı temizlenmiş oluyor. Nekadarını temizleyeceğimizi hesaplamaya gerek yok çünkü fazladan yolladığımız sıfırlar görünmeyen satırlara doluyor. Eğer açılışta satır sayısını 4 verseydik fazla sıfırlar ilk başa eklenerek ilk yazdıklarımızı silerdi. Dolayısı ile illaki ne kadar sıfır yollayacağımızı hesaplamak zorunda kalırdık.

Ve finale yaklaşıyoruz. Adresleri taradık, bulduğumuzu yazdık, son adreste bitince kaç adres bulduğumuzu yazdık ve geri kalan görünür alanı temizledik. Şimdi sıra HAYATTAYIM sinyali vermeye geldi. Bunun için LED i yaktık, yaklaşık yarım saniye ara verdik, LED i kapattık, yaklaşık yarım saniye ara verdik ve başa dönüp sonraki taramaya geçtik. Bitti!

Neden yaklaşık yarım saniye? Çünkü hassas zaman aralığı için işlem alanımız yok. Mümkün alan en az satırla yarım saniyelik döngü oluşturmalıyız. Yarım saniye 500.000 clock ediyorki 8 bit ile 256 dan yukarı sayamadığımız için ölçemeyiz. Tek yolu üç tane iç içe döngü ile 500.000 clock harcamak. Ama buda elimizde olmayan fazlaca satır alanı ister. En kısa yol timer ı kullanmak ama 12F508 in interrupt ı yok. Yani TMR0 ın istenen sayıysa ulaştığını kontrol etmek pek mümkün değil. Çünkü kontrol ederken TMR0 saymaya devam edecek ve değeri değişecek. Neyseki TMR0 ın sayma işini ölçeklendirebiliyoruz. Prescaler ı TMR0 a atıyoruz ve oranı 1:256 yapıyoruz. Yani TMR0 her 256 clock ta bir kez artacak. Şimdi bir şekilde TMR0 ın sonuna kadar saydığını anlamamız lazım. Normalde 256 ya kadar sayar sonra tekrar sıfırdan başlar. 256 clock ta bir artacağı için eğer TMR0 ın kaç olduğunu sorgularsak 256 kez aynı cevabı alırız anlamsız olur. Bunun yerine 7 bit ini kontrol ediyoruz. Eğer 7. bit bir olmuşsa TMR0 127 yi geçmiş demektir. Bu geçişi yakalamak için 256 clock zamanımız var yani zor değil. Bit karşılaştırması tek satırlık iş, sayı karşılaştırmasından kolay. Tek bir döngü içinde bu işi yaparsak 512*127*döngü sayısı kadar zaman harcarız. Böylece tam 500.000 i tutturamasakta en az satırla en yakın sayıyı elde edebiliriz.

Umarım faydalı bir cihaz olur. Test için bağladığım elemanların ikisi adreslerini bilmediğim EPROM chipleri. Birinin dökümanını buldum ama diğeri sır idi, resimde gördüğünüz üzere tüm cihazların adresleri bulundu!

Aslında 0x50 hafıza chipleri için ayrılmıştır yani çokta sır değil ama denek lazımdı ne yapalım? :D



















Kaynak kodunu ve HEX dosyasını sağdaki linklerden indirebilirsiniz.

; ***********************   Proje Tanımı   ***********************
; ***                   12F508_I2C_tarayici                    ***
; ***********************   © 06.01.2018   ***********************
; ***  Sürüm          : 1.0                                    ***
; ***  Yapımcı        : Birhan TAŞKIRAN                        ***
; ***  Tarih          : 03 Haziran 2017                        ***
; ***  Mikrokontrolör : 12F508                                 ***
; ****************************************************************
; *** Tüm olası adresleri tarayarak I2C ye bağlı birimlerin    ***
; *** adreslerini bulur ve OLED ekrana yazar.                  ***
; ***                     _______  _______                     ***
; ***                    |       \/       |                    ***
; ***          (+5V) -> [1 Vdd        Vss 8] <- (GND)          ***
; ***                    |                |                    ***
; ***            SCL <> [2 GP5        GP0 7] <- ICP/Dat        ***
; ***                    |                |                    ***
; ***            SDA <- [3 GP4        GP1 6] <- ICP/Clk        ***
; ***                    |                |                    ***
; ***        ICP/Vpp -> [ GP3         GP2 5] -> Track          ***
; ***                    |   (PIC12f508)  |                    ***
; ***                     ----------------                     ***
; ***                                                          ***
; *** Ekran : SSD1306 Chip li 128x32 OLED (Banggood ürünü OEM) ***
; *** Chip Hafızası (OLED Display ekranı)                      ***
; *** 8 x 128 byte lık statik RAM dan oluşur.                  ***
; *** Byte lar soldan sağa, bit ler yukarıdan aşağıya doğru    ***
; *** görüntülenir.                                            ***
; ***     Sayfa  Pixel (Bit)                                   ***
; ***       0    000 001 002 003 . . . . . . . . . . . 127     ***
; ***       1    128 129 130 140 . . . . . . . . . . . 254     ***
; ***       2    255 256 257 258 . . . . . . . . . . . 381     ***
; ***       3    382 383 384 385 . . . . . . . . . . . 508     ***
; ***       .                                                  ***
; ***       .                                                  ***
; ***       7    895 896 897 898 . . . . . . . . . . . 1023    ***
; ***                                                          ***
; *** Örn. 5x8 pixellik A Harfi (5byte):                       ***
; ***  Bit  Adres                                              ***
; ***       0 1 2 3 4      Adres Veri                          ***
; ***  +-+ +-+-+-+-+-+       0   01111110b                     ***
; ***  |7| | |1|1| | |       1   00001001b                     ***
; ***  |6| |1| | |1| |       2   00001001b                     ***
; ***  |5| |1| | |1| |       3   01111110b                     ***
; ***  |4| |1| | |1| |       4   00000000b                     ***
; ***  |3| |1|1|1|1| |                                         ***
; ***  |2| |1| | |1| |                                         ***
; ***  |1| |1| | |1| |                                         ***
; ***  |0| | | | |1| |                                         ***
; ***  +-+ +-+-+-+-+-+                                         ***
; ***                                                          ***
; *** SSD1306 Komut düzeni:                                    ***
; *** Start -> Write Adress -> Write 0 -> Write Komut -> Stop  ***
; *** SSD1306 Veri düzeni:                                     ***
; *** Start -> Write Adress -> Write 0x40 -> Write Data ->     ***
; *** Write Data -> ........ -> Stop                           ***
; ****************************************************************
; **************************   Başlık   **************************
      title "I2C Tarayıcı V1.0"   ; Proje Başlığı                   
      list    p=12f508            ; İşlemci tanımı                  
      #include <p12f508.inc>      ; İşlemci tanımlamalar dosyası    
      errorlevel  -302, -207      ; Gereksiz hata mesajlarını kaldır
      radix   dec                 ; Yazılım Desimal (On) tabanlı    
 
     __CONFIG _CP_OFF & _MCLRE_OFF & _WDT_OFF & _IntRC_OSC
 
; **************************  Sabitler  **************************
Bos1     EQU 0   ; GP0                                         ***
Bos2     EQU 1   ; GP1                                         ***
TrackPin EQU 2   ; GP2                                         ***
Bos3     EQU 3   ; GP3                                         ***
SDA      EQU 4   ; GP4                                         ***
SCL      EQU 5   ; GP5                                         ***
                 ;                                             ***
komut    EQU 0   ; Flag                                        ***
konfig   EQU 1   ; Flag                                        ***
temiz    EQU 2   ; Flag                                        ***
zor      EQU 3   ; Flag                                        ***
ack      EQU 4   ; Flag                                        ***
sonuc    EQU 5   ; Flag                                        ***
bosluk   EQU 6   ; Flag                                        ***
pozisyon EQU 7   ; Flag                                        ***
; *******************  Tanımlar / Kısayollar  ********************
#define Track   GPIO,TrackPin   ; Osiloskop Takip Sinyali/Led  ***   
#define DatLO   bcf GPIO,SDA    ; SDA = LOW                    ***
#define DatHI   bsf GPIO,SDA    ; SDA = HIGH                   ***
#define ClkLO   bcf GPIO,SCL    ; SCL = LOW                    ***
#define ClkHI   bsf GPIO,SCL    ; SCL = HIGH                   ***
                                ;                              ***
#define I2C_Adres     01111000b ; 0x3C+1bit  OLED adresi       ***                 
; *******************  Değişkenler (25 Byte)  ********************
      cblock  0x07    ; Değişkenler başlangıç adresi           *** 
;   isim         Addr No Açıklama                              ***  
    d1         ; 0x07 01 Döngü değişkenleri                    ***
    d2         ; 0x08 02 Döngü değişkenleri                    ***
    d3         ; 0x09 03 Döngü değişkenleri                    ***
    d4         ; 0x0a 04 Döngü değişkenleri                    ***
    veri       ; 0x0b 05 okunan/yazılan veri                   ***
    flag       ; 0x0c 06 işaretçi                              ***
    VeriS      ; 0x0d 07 I2C ACK bekleme sayacı                *** 
    TabloS     ; 0x0e 08 Veri adedi                            ***
    xadres     ; 0x0f 09 Tablo Sayacı                          ***
    Xbyte      ; 0x10 10 Led Sıra 4                            ***
    sayac      ; 0x11 11 Led Sıra 5                            ***
    YS_Sayac   ; 0x12 12 Test Sayacı                           ***
    Hane       ; 0x13 13 Aranacak adres 0x10-0xEF              ***
    Bos14      ; 0x14 14 Bulunan adres sayısı                  ***
    Bos15      ; 0x16 15 Herhangi bir byte ı aktarmak için     ***
    Bos16      ; 0x16 16                                       ***
    Bos17      ; 0x17 17                                       ***
    Bos18      ; 0x18 18                                       ***
    Bos19      ; 0x19 19                                       ***
    Bos20      ; 0x1a 20                                       ***
    Bos21      ; 0x1b 21                                       ***
    Bos22      ; 0x1c 22                                       ***
    Bos23      ; 0x1d 23                                       ***
    Bos24      ; 0x1e 24                                       ***
    Bos25      ; 0x1f 25                                       ***
    endc       ;                                               ***
; ****************************************************************
 
; ****************************************************************
; ***                      Kod Başlangıcı                      ***
; **********************  Donanım Ayarları  **********************
    ORG       0x0000          ; PIC hafızası başlangıç adresi  ***
    movwf     OSCCAL          ; Fabrika OSCCAL ayar değeri     ***
    goto      Ayarlar         ; Ayarlar Alt hafızada           ***
Basla                         ;                                ***
    call      VeriS_5         ; Hafızadan Tasarruf             ***
    call      YarimSaniye     ; Bağlı cihazlar toparlansın     ***
; ****************************************************************
; ***********************  OLED ayarları  ************************
; ****************************************************************
    goto      Zor_Hayat     ; OLED Init Hafızanın alt kısmında ***
InitSonu                    ; Hafızanın altından dönüş         ***
bidaa                       ;                                  ***
    call      I2C_Stop      ; Takılan slave varsa diye tedbir  ***
; ***  Yazma pozisyonu nu 0,0 yap  *******************************
    clrf      flag          ; flag ı sıfırla                   ***
    movlw     25            ; Pozisyon ayarı konfig satırı     ***
    movwf     Bos25         ; Komut No 25                      ***
    clrf      Xbyte         ; Boşluk karakteri                 ***
    bsf       flag,pozisyon ;                                  ***
    goto      OLED_Komut    ;                                  ***
PozisyonTamam               ;                                  ***
; ****************************************************************
; ********************  Aramaya Başlayalım  **********************
    movlw     0x10          ; Arama başlangıcı                 ***
    movwf     xadres        ; Sayaca yükleyelim                ***
    clrf      sayac         ;                                  ***
AramaLoop                   ;                                  ***
    call      I2C_Start     ; İletişimi başlat.                ***
    movfw     xadres        ; Adresi al                        ***
    bcf       flag,ack      ; ACK flag ını indir               ***
    call      I2C_Write     ; Çağrı yap                        ***
    call      I2C_Stop      ; İletişimi bitir.                 ***
    btfss     flag,ack      ; ACK yoksa                        ***
    goto      ACK_Gelmedi   ; ACK_Gelmedi ye git.              ***
    incf      sayac,f       ; Bulundu sayacını 1 arttır        ***
; ****************************************************************
; ***  0x yazalım  ***********************************************
    clrc                    ; Carry i temizle                  ***
    rrf       xadres,w      ; adresi 1 bit kaydıralım          ***
    movwf     Hane          ; çünkü adresler 7 bit             ***
SayiYaz                     ;                                  ***
    movlw     0             ; 0 karakteri                      ***
    call      OLED_B        ; Blok olarak yaz                  ***
    movlw     _X - Tablo1 - 1 ; x karakteri                    ***
    call      OLED_B        ; Blok olarak yaz                  ***
    ; Şimdi adresi yazalım  **************************************
    swapf     Hane,w        ; Sol 4 biti sağa aldık            ***
    andlw     00001111b     ; Sol 4 biti yok ettik             ***
    addwf     Bos25,w       ;                                  ***
    call      Tablo1        ;                                  ***
    call      OLED_B        ; Blok olarak yaz                  ***
    ; Son hane                                                 ***
    movfw     Hane          ; 8biti de aldık                   ***
    andlw     00001111b     ; Sol 4 biti yok ettik             ***
    addwf     Bos25,w       ;                                  ***
    call      Tablo1        ;                                  ***
    call      OLED_B        ; Blok olarak yaz                  ***
    ; Sayı tamam şimdi boşluk yazalım                          ***
    ; Boşluk için biraz hile yapacağız.                        ***
    bsf       flag,bosluk   ; hafızada sıfır saklamak gereksiz ***
    movlw     7             ; 8 byte lık boşlukla 4 adres      ***
    movwf     VeriS         ; yanyana sığıyor. 2bytla 5 adr.   ***
    call      OLED_B        ;                                  ***
ACK_Gelmedi                 ;                                  ***
    btfsc     flag,sonuc    ;                                  ***
    goto      AdetYaz       ;                                  ***
    incf      xadres,f      ; iki kez arttır çünkü             ***
    incfsz    xadres,f      ; ilk bit RW anlamına geliyor ve   ***
    goto      AramaLoop     ; hep sıfır (Write) olmalı         ***
    ; ************************************************************
    ; *** En azından 1 adres yazılmış olmalı... (OLED)         ***
    ; *** Sıra Adet yazmakta....                               ***
    ; **************** Yazma işi bitti ***************************
    bsf       flag,sonuc    ;                                  ***
    movfw     sayac         ;                                  ***
    movwf     Hane          ;                                  ***
    goto      SayiYaz       ;                                  ***
AdetYaz                     ;                                  ***
    movlw     _A - Tablo1 - 1 ; A harfi                        ***
    call      OLED_B        ;                                  ***
    movlw     15            ;                                  ***
    movwf     VeriS         ;                                  ***
    movlw     _det - Tablo1 - 1 ; det kelimesi                 ***
    call      OLED_B        ;                                  ***
    bcf       flag,sonuc    ;                                  ***
                            ; Ekranın kalanını temizlemek için ***
    movlw     3             ; 3 kez 127 byte yolla             ***
    movwf     xadres        ; geçici değişken xadres i kullan  ***
Temizlik                    ;                                  ***
    bsf       flag,bosluk   ; hafızada sıfır saklamak gereksiz ***
    movlw     127           ;                                  ***
    movwf     VeriS         ;                                  ***
    call      OLED_B        ;                                  ***
    decfsz    xadres,f      ;                                  ***
    goto      Temizlik      ;                                  ***
    ; Yaklaşık yarım saniye ara ile LED yakıp kapat            ***
    ; Çalıştığından emin olalım. Sonra baştan başla....        ***
    bsf       Track         ;                                  ***
    call      YarimSaniye   ;                                  ***
    bcf       Track         ;                                  ***
    call      YarimSaniye   ;                                  ***
    goto      bidaa         ;                                  ***
;*****************************************************************
;*****************************************************************
 
; ****************************************************************
OLED_B; ***  OLED e Tablo1 den blok halinde veri gönderir.     ***
; ***  VeriS veri adedi, w alfabe indexi dir.                  ***
; ***  En sona boş bir byte ekler (Karakter aralığı)           ***
    movwf     TabloS        ; Tablo index                      ***
    movlw     TabloSonu - Tablo1 -1 ;                          ***
    movwf     Bos25         ; Hafızadan tasarruf               ***
    call      I2C_Start     ; Haberleşmeyi başlat              ***
    movlw     I2C_Adres     ; I2C adresi                       ***
    call      I2C_Write     ; OLED i çağır                     ***
    movlw     0x40          ; Veri geliyor de                  ***
    call      I2C_Write     ;                                  ***
Blok                        ; Blok döngüsü başlangıcı          ***
    btfss     flag,bosluk   ; Boşluk yazacakmıyız?             ***
    goto      Hayir         ;                                  ***
    movfw     Xbyte         ; X byte (Boşluk veya başka sayı)  ***
    goto      Gonder        ;                                  ***
Hayir                       ;                                  ***
    movfw     TabloS        ; Komut indexini al                ***
    call      Tablo1        ; veriyi al                        ***
Gonder                      ;                                  ***
    call      I2C_Write     ; I2C ye yolla                     ***
    incf      TabloS,f      ; tablo indeksini bir arttır       ***
    decfsz    VeriS,f       ; döngü sayacını bir eksilt        ***
    goto      Blok          ; sıfır olmadıysa döngüye devam.   ***
    movlw     0             ; Karakterler arasına boşluk ekle  ***
    call      I2C_Write     ;                                  ***
    call      I2C_Stop      ; Haberleşmeyi bitir               ***
    bcf       flag,bosluk   ; boşluk flag ını indir.           ***
VeriS_5                     ;                                  ***
    movlw     5             ; Ön hazırlık                      ***
    movwf     VeriS         ; Bir sonraki karakter 5 byte      ***
    retlw     0             ; Bitti. Geri dön......            ***
; ****************************************************************
; ****************************************************************
 
; ****************************************************************
; ***                      I2C İşlemleri                       ***
; ****************************************************************
I2C_Start ; **  Adıyla aynı işi yapar  ***************************
    ClkHI                   ; SCK High                         ***
    DatHI                   ; SDA High                         ***
    DatLO                   ; SDA Low                          ***
    ClkLO                   ; SCK Low                          ***
    retlw     0             ;                                  ***
;*****************************************************************
I2C_Stop  ; **  Adıyla aynı işi yapar  ***************************
    DatLO                   ; SDA Low                          ***
    ClkHI                   ; SCK Low                          ***
    DatHI                   ; SDA High                         ***
    retlw     0             ;                                  ***
;*****************************************************************
I2C_Write ; **  I2C ye veri değişkenini (8 bit) yazdırır.      ***
    movwf     d4            ; Yedekle                          ***
    movwf     veri          ;                                  ***
    movlw     8             ; d1 ve d4                         ***
    movwf     d1            ; geçici değişkenlerini kullanır   ***
i2cLoop ; XXXXXXX Bit Yaz XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ClkLO                   ; SCK LOW - Clock bitti            ***
    btfsc     veri,7        ; Bit = 1 mi?                      ***
    goto      Bit1          ;                                  ***
    DatLO                   ; SDA LOW - Data ancak SCK LOW iken değişir
    goto      Bitt          ;                                  ***
Bit1                        ;                                  ***
    btfsc     veri,7        ; Bit = 1 mi?                      ***
    DatHI                   ; 1 se SDA HI                      ***
Bitt                        ;                                  ***
    ClkHI                   ; SCK HI - Clock Başla             ***
    rlf       veri,f        ; Sonraki bit i sona getir         ***
    decfsz    d1,f          ; bit sayacını 1 eksilt            ***
    goto      i2cLoop       ; sıfır değilse sonraki biti yolla ***
    ClkLO                   ; SCK LOW - Clock bitti            ***
    ; XXXXXXX Bit Yaz Bitti XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    DatHI                   ; SDA HI                           ***
    ClkHI                   ; SCK LOW - Clock başla            ***
    btfss     GPIO,SDA      ; ACK (LOW) Varmı?                 ***
    bsf       flag,ack      ; ACK flag ını kaldır              ***
    ClkLO                   ; SCK LOW - Clock bitti            ***
    DatHI                   ; SDA HI  -                        ***
    retlw     0             ;                                  ***
;*****************************************************************
;*****************************************************************
 
;*****************************************************************
; ***  Yukarıda yer olmadığı için gecikme rutini alt hafızada  ***
YarimSaniye ;*****************************************************
    goto      AltYarimSaniye;                                  ***
YarimSaniyeDonus            ;                                  ***
    retlw     0             ;                                  ***
;*****************************************************************
;*****************************************************************
 
;*****************************************************************
; **********************  Karakter Bitmap  ***********************
Tablo1 ; *** Ekrana basılacak karakterler 0-7 A-F det          ***
    addwf     PCL,f           ;                                ***
    retlw     00111110b       ; 0001    11111                  ***
    retlw     01010001b       ; 0002   1 1   1                 ***
    retlw     01001001b       ; 0003   1  1  1                 ***
    retlw     01000101b       ; 0004   1   1 1                 ***
    retlw     00111110b       ; 0005    11111                  ***
_1  retlw     00000000b       ; 0006                           ***
    retlw     01000010b       ; 0007   1    1                  ***
    retlw     01111111b       ; 0008   1111111                 ***
    retlw     01000000b       ; 0009   1                       ***
    retlw     00000000b       ; 0010                           ***
_2  retlw     01000010b       ; 0011   1    1                  ***
    retlw     01100001b       ; 0012   11    1                 ***
    retlw     01010001b       ; 0013   1 1   1                 ***
    retlw     01001001b       ; 0014   1  1  1                 ***
    retlw     01000110b       ; 0015   1   11                  ***
_3  retlw     00100001b       ; 0016    1    1                 ***
    retlw     01000001b       ; 0017   1     1                 ***
    retlw     01000101b       ; 0018   1   1 1                 ***
    retlw     01001011b       ; 0019   1  1 11                 ***
    retlw     00110001b       ; 0020    11   1                 ***
_4  retlw     00011000b       ; 0021     11                    ***
    retlw     00010100b       ; 0022     1 1                   ***
    retlw     00010010b       ; 0023     1  1                  ***
    retlw     01111111b       ; 0024   1111111                 ***
    retlw     00010000b       ; 0025     1                     ***
_5  retlw     00100111b       ; 0026    1  111                 ***
    retlw     01000101b       ; 0027   1   1 1                 ***
    retlw     01000101b       ; 0028   1   1 1                 ***
    retlw     01000101b       ; 0029   1   1 1                 ***
    retlw     00111001b       ; 0030    111  1                 ***
_6  retlw     00111100b       ; 0031    1111                   ***
    retlw     01001010b       ; 0032   1  1 1                  ***
    retlw     01001001b       ; 0033   1  1  1                 ***
    retlw     01001001b       ; 0034   1  1  1                 ***
    retlw     00110000b       ; 0035    11                     ***
_7  retlw     00000011b       ; 0036        11                 ***
    retlw     01110001b       ; 0037   111   1                 ***
    retlw     00001001b       ; 0038      1  1                 ***
    retlw     00000101b       ; 0039       1 1                 ***
    retlw     00000011b       ; 0040        11                 ***
_8  retlw     00110110b       ; 0041    11 11                  ***
    retlw     01001001b       ; 0042   1  1  1                 ***
    retlw     01001001b       ; 0043   1  1  1                 ***
    retlw     01001001b       ; 0044   1  1  1                 ***
    retlw     00110110b       ; 0045    11 11                  ***
_9  retlw     00000110b       ; 0046       11                  ***
    retlw     01001001b       ; 0047   1  1  1                 ***
    retlw     01001001b       ; 0048   1  1  1                 ***
    retlw     00101001b       ; 0049    1 1  1                 ***
    retlw     00011110b       ; 0050     1111                  ***
_A  retlw     01111110b       ; 0051   111111                  ***
    retlw     00010001b       ; 0052     1   1                 ***
    retlw     00010001b       ; 0053     1   1                 ***
    retlw     00010001b       ; 0054     1   1                 ***
    retlw     01111110b       ; 0055   111111                  ***
_B  retlw     01111111b       ; 0056   1111111                 ***
    retlw     01001001b       ; 0057   1  1  1                 ***
    retlw     01001001b       ; 0058   1  1  1                 ***
    retlw     01001001b       ; 0059   1  1  1                 ***
    retlw     00110110b       ; 0060    11 11                  ***
_C  retlw     00111110b       ; 0061    11111                  ***
    retlw     01000001b       ; 0062   1     1                 ***
    retlw     01000001b       ; 0063   1     1                 ***
    retlw     01000001b       ; 0064   1     1                 ***
    retlw     00100010b       ; 0065    1   1                  ***
_D  retlw     01111111b       ; 0066   1111111                 ***
    retlw     01000001b       ; 0067   1     1                 ***
    retlw     01000001b       ; 0068   1     1                 ***
    retlw     01000001b       ; 0069   1     1                 ***
    retlw     00111110b       ; 0070    11111                  ***
_E  retlw     01111111b       ; 0071   1111111                 ***
    retlw     01001001b       ; 0072   1  1  1                 ***
    retlw     01001001b       ; 0073   1  1  1                 ***
    retlw     01001001b       ; 0074   1  1  1                 ***
    retlw     01000001b       ; 0075   1     1                 ***
_F  retlw     01111111b       ; 0076   1111111                 ***
    retlw     00001001b       ; 0077      1  1                 ***
    retlw     00001001b       ; 0078      1  1                 ***
    retlw     00001001b       ; 0079      1  1                 ***
    retlw     00000001b       ; 0080         1                 ***
_X  retlw     01000100b       ; 0081   1   1                   ***
    retlw     00101000b       ; 0082    1 1                    ***
    retlw     00010000b       ; 0083     1                     ***
    retlw     00101000b       ; 0084    1 1                    ***
    retlw     01000100b       ; 0085   1   1                   ***
_det                          ;                                ***
    retlw     00111000b       ; 0086    111                    ***
    retlw     01000100b       ; 0087   1   1                   ***
    retlw     01000100b       ; 0088   1   1                   ***
    retlw     01001000b       ; 0089   1  1                    ***
    retlw     01111111b       ; 0090   1111111                 ***
    retlw     00111000b       ; 0091    111                    ***
    retlw     01010100b       ; 0092   1 1 1                   ***
    retlw     01010100b       ; 0093   1 1 1                   ***
    retlw     01010100b       ; 0094   1 1 1                   ***
    retlw     00011000b       ; 0095     11                    ***
    retlw     00000100b       ; 0096       1                   ***
    retlw     00111111b       ; 0097    111111                 ***
    retlw     01000100b       ; 0098   1   1                   ***
    retlw     01000000b       ; 0099   1                       ***
    retlw     00100000b       ; 0100    1                      ***
TabloSonu                     ;                                ***
    retlw     0               ; Sıfır                          ***
    retlw     _1 - Tablo1 -1  ; Bir                            ***
    retlw     _2 - Tablo1 -1  ; İki                            ***
    retlw     _3 - Tablo1 -1  ; Üç                             ***
    retlw     _4 - Tablo1 -1  ; Dört                           ***
    retlw     _5 - Tablo1 -1  ; Beş                            ***
    retlw     _6 - Tablo1 -1  ; Altı                           ***
    retlw     _7 - Tablo1 -1  ; Yedi                           ***
    retlw     _8 - Tablo1 -1  ; Sekiz                          ***
    retlw     _9 - Tablo1 -1  ; Dokuz                          ***
    retlw     _A - Tablo1 -1  ; On                             ***
    retlw     _B - Tablo1 -1  ; OnBir                          ***
    retlw     _C - Tablo1 -1  ; Onİki                          ***
    retlw     _D - Tablo1 -1  ; OnÜç                           ***
    retlw     _E - Tablo1 -1  ; OnDört                         ***
    retlw     _F - Tablo1 -1  ; OnBeş                          ***
;*****************************************************************
;*****************************************************************
 
; *****************       ZOR HAYAT.....      ********************
; *** Buradan itibaren Call ve Return çalışmaz.                ***
; *** Kullanılmayacak...                                       ***
; ****************************************************************
Zor_Hayat                    ; Bos25 geçici değişkenimi kullanır *
    clrf      flag           ; flag ı sıfırla                  ***
    clrf      Bos25          ; Config satır sayacı             ***
    incf      Bos25,f        ; Komut No 1                      ***
OLED_Komut                   ;                                 ***
    ;I2C_Start ***************************************************
    ClkHI                    ; SCK High                        ***
    DatHI                    ; SDA High                        ***
    DatLO                    ; SDA Low                         ***
    ClkLO                    ; SCK Low                         ***
OLED_ilk_16bit               ;                                 ***
    ; Adresi çağır ***********************************************
    movlw I2C_Adres          ; Çağırılacak adres (OLED)        ***
I2CWrite ; *******************************************************
    movwf     veri           ; Çok kafa karıştırabilir.        ***
    movlw     8              ; Call ve return olmadan          ***
    movwf     d1             ; karmaşık bir GOTO ağı olacak... ***
i2cLoop2 ; XXXXXXX Bit Yaz XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    ClkLO                    ; SCK LOW - Clock bitti           ***
    btfsc     veri,7         ; Bit = 1 mi?                     ***
    goto      Bit12          ;                                 ***
    DatLO                    ; SDA LOW - Data ancak SCK LOW iken değişir
    goto      Bitt2          ;                                 ***
Bit12                        ;                                 ***
    btfsc     veri,7         ; Bit = 1 mi?                     ***
    DatHI                    ; 1 se SDA HI                     ***
Bitt2                        ;                                 ***
    ClkHI                    ; SCK HI - Clock Başla            ***
    rlf       veri,f         ; Sonraki bit i sona getir        ***
    decfsz    d1,f           ; bit sayacını 1 eksilt           ***
    goto      i2cLoop2       ; sıfır olmadıysa sonraki bit i yolla 
    ClkLO                    ; SCK LOW - Clock bitti           ***
    ; XXXXXXX Bit Yaz Bitti XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    DatHI                    ; SDA High                        ***
    ClkHI                    ; SCK LOW - Clock başla           ***
    btfsc     GPIO,SDA       ; ACK (LOW) Varmı?                ***
    bsf       flag,ack       ; ACK flag ını kaldır             ***
    ClkLO                    ; SCK LOW - Clock bitti           ***
    DatHI                    ; SDA HI                          ***
    ; ***** Bir byte yolladık şimdi flaglara bakalım           ***
    btfsc     flag,konfig   ; flag,konfig = 0 ise henüz konfig yazılmamış
    goto      SonrakiKomut  ;                                 ***
    bsf       flag,konfig   ; bundan sonraki turda komut yazılacak
    movlw     0             ;                                 ***
    goto      I2CWrite      ; İkinci 8 bit i yaz              ***
SonrakiKomut                ;                                 ***
    btfss     flag,komut    ; flag,komut = 0 ise henüz komut gitmedi
    goto      KomutSec      ; Doğru dallanmayı bul ve yap     ***
Bitir ; ***  I2C_Stop *******************************************
    DatLO                   ;                                 ***
    ClkHI                   ;                                 ***
    DatHI                   ;                                 ***
    btfsc     flag,zor      ;                                 ***
    goto      InitSonu      ;                                 ***
    ; Bu noktada sayacı 1 arttır ve flag ı sıfırla sonra tekrar *
    incf      Bos25,f       ; Config satırı sayacı            ***
    bcf       flag,konfig   ;                                 ***
    bcf       flag,zor      ;                                 ***
    bcf       flag,komut    ;                                 ***
    goto      OLED_Komut    ;                                 ***
KomutSec ; ******************************************************
    ; *** Ve karmaşık GOTO Ağı, Komut no ya bakarak dallanma  ***
; ***************************************************************
    bsf       flag,komut    ;                                 ***
    movlw     1             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 1 komut Kom_DISPLAYOFF    ***
    goto      Kom_DISPLAYOFF;                                 ***
                            ;                                 ***
    movlw     2             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 2 komut Kom_SETDISPLAYCLOCKDIV
    goto      Kom_SETDISPLAYCLOCKDIV;                         ***
                            ;                                 ***
    movlw     3             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 3 komut Kom_ratio         ***
    goto      Kom_ratio     ;                                 ***
                            ;                                 ***
    movlw     4             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 4 komut Kom_SETMULTIPLEX  ***
    goto      Kom_SETMULTIPLEX;                               ***
                            ;                                 ***
    movlw     5             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 5 komut Kom_LCDHEIGHT     ***
    goto      Kom_LCDHEIGHT ;                                 ***
                            ;                                 ***
    movlw     6             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 7 komut Kom_SETDISPLAYOFFSET 
    goto      Kom_SETDISPLAYOFFSET ;                          ***
                            ;                                 ***
    movlw     7             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 8 komut Kom_offset        ***
    goto      Kom_offset    ;                                 ***
                            ;                                 ***
    movlw     8             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 9 komut Kom_SETSTARTLINE  ***
    goto      Kom_SETSTARTLINE ;                              ***
                            ;                                 ***
    movlw     9             ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 10 komut Kom_CHARGEPUMP   ***
    goto      Kom_CHARGEPUMP ;                                ***
                            ;                                 ***
    movlw     10            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 11 komut Kom_VCC          ***
    goto      Kom_VCC       ;                                 ***
                            ;                                 ***
    movlw     11            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 12 komut Kom_MEMORYMODE
    goto      Kom_MEMORYMODE;                                 ***
                            ;                                 ***
    movlw     12            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 13 komut Kom_horiz
    goto      Kom_horiz     ;                                 ***
                            ;                                 ***
    movlw     13            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 14 komut Kom_SETCOMPINS
    goto      Kom_SETCOMPINS;                                 ***
                            ;                                 ***
    movlw     14            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 15 komut Kom_01
    goto      Kom_01        ;                                 ***
                            ;                                 ***
    movlw     15            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 16 komut Kom_SETCONTRAST
    goto      Kom_SETCONTRAST;                                 ***
                            ;                                 ***
    movlw     16            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 17 komut Kom_02
    goto      Kom_02        ;                                 ***
                            ;                                 ***
    movlw     17            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 18 komut Kom_SETPRECHARGE
    goto      Kom_SETPRECHARGE;                                 ***
                            ;                                 ***
    movlw     18            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 19 komut Kom_03
    goto      Kom_03        ;                                 ***
                            ;                                 ***
    movlw     19            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 20 komut Kom_SETVCOMDETECT
    goto      Kom_SETVCOMDETECT;                                 ***
                            ;                                 ***
    movlw     20            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 21 komut Kom_04
    goto      Kom_04        ;                                 ***
                            ;                                 ***
    movlw     21            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 22 komut Kom_DISPLAYALLON_RESUME
    goto      Kom_DISPLAYALLON_RESUME;                                 ***
                            ;                                 ***
    movlw     22            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 23 komut Kom_NORMALDISPLAY
    goto      Kom_NORMALDISPLAY;                                 ***
                            ;                                 ***
    movlw     23            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 24 komut Kom_DEACTIVATE_SCROLL
    goto      Kom_DEACTIVATE_SCROLL;                                 ***
                            ;                                 ***
    movlw     24            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 25 komut Kom_Kom_DISPLAYON
    goto      Kom_DISPLAYON ;                                 ***
                            ;                                 ***
    movlw     25            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 25 komut Kom_Kom_COLUMNADDR
    goto      Kom_COLUMNADDR;                                 ***
                            ;                                 ***
    movlw     26            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 25 komut Kom_Kom_CLMNSTR
    goto      Kom_CLMNSTR   ;                                 ***
                            ;                                 ***
    movlw     27            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 27 komut Kom_Kom_CLMNEND
    goto      Kom_CLMNEND   ;                                 ***
                            ;                                 ***
    movlw     28            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 28 komut Kom_Kom_PAGEADDR
    goto      Kom_PAGEADDR  ;                                 ***
                            ;                                 ***
    movlw     29            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 29 komut Kom_Kom_PGSTRT
    goto      Kom_PGSTRT    ;                                 ***
                            ;                                 ***
    movlw     30            ;                                 ***
    xorwf     Bos25,w       ;                                 ***
    btfsc     STATUS,Z      ; Sayaç 30 komut Kom_Kom_PGEND
    goto      Kom_PGEND     ;                                 ***
                            ;                                 ***
    bsf       flag,zor      ;                                 ***
    btfss     flag,pozisyon ;                                 ***
    goto      Bitir         ;                                 ***
    bcf       flag,pozisyon ;                                 ***
    goto      PozisyonTamam ;                                 ***
;****************************************************************
 
; ***************************************************************
; ***  Komut No ya göre aşağıki satırlara atlayan program,    ***
; ***  Komut içeriğini alır ve yollar.                        ***
; ***************************************************************
Kom_DISPLAYOFF              ;                                 ***
    movlw     0xAE          ; 10101110 DISPLAYOFF             ***
    goto      I2CWrite      ;                                 ***
Kom_SETDISPLAYCLOCKDIV      ;                                 ***
    movlw     0xD5          ; 11010101 SETDISPLAYCLOCKDIV     ***
    goto      I2CWrite      ;                                 ***
Kom_ratio                   ;                                 ***
    movlw     0x80          ; 10000000 the suggested ratio 0x80 *
    goto      I2CWrite      ;                                 ***
Kom_SETMULTIPLEX            ;                                 ***
    movlw     0xA8          ; 10101000 SETMULTIPLEX           ***
    goto      I2CWrite      ;                                 ***
Kom_LCDHEIGHT               ;                                 ***
    movlw     64- 1         ; 00011111 LCDHEIGHT              ***
    goto      I2CWrite      ;                                 ***
Kom_SETDISPLAYOFFSET        ;                                 ***
    movlw     0xD3          ; 11010011 SETDISPLAYOFFSET       ***
    goto      I2CWrite      ;                                 ***
Kom_offset                  ;                                 ***
    movlw     0x0           ; 00000000 no offset              ***
    goto      I2CWrite      ;                                 ***
Kom_SETSTARTLINE            ;                                 ***
    movlw     0x40 | 0x0    ; 01000000 SETSTARTLINE line #0   ***
    goto      I2CWrite      ;                                 ***
Kom_CHARGEPUMP              ;                                 ***
    movlw     0x8D          ; 10001101 CHARGEPUMP             ***
    goto      I2CWrite      ;                                 ***
Kom_VCC                     ;                                 ***
    movlw     0x14          ; 00010100 internal VCC           ***
    goto      I2CWrite      ;                                 ***
Kom_MEMORYMODE              ;                                 ***
    movlw     0x20          ; 00100000 MEMORYMODE             ***
    goto      I2CWrite      ;                                 ***
Kom_horiz                   ;                                 ***
    movlw     0x00          ; 00000000 horizontal addressing  ***
    goto      I2CWrite      ;                                 ***
Kom_SEGREMAP                ;                                 ***
    movlw     0xA0 | 0x0    ; 10100001 SEGREMAP rotate screen 180 Sağdan sola
    goto      I2CWrite      ;                                 ***
Kom_SETCOMPINS              ;                                 ***
    movlw     0xDA          ; SETCOMPINS                      ***
    goto      I2CWrite      ;                                 ***
Kom_01                      ;                                 ***
    movlw     0x02          ;                                 ***
    goto      I2CWrite      ;                                 ***
Kom_SETCONTRAST             ;                                 ***
    movlw     0x81          ; SETCONTRAST                     ***
    goto      I2CWrite      ;                                 ***
Kom_02                      ;                                 ***
    movlw     0x8F          ;                                 ***
    goto      I2CWrite      ;                                 ***
Kom_SETPRECHARGE            ;                                 ***
    movlw     0xd9          ; SETPRECHARGE                    ***
    goto      I2CWrite      ;                                 ***
Kom_03                      ;                                 ***
    movlw     0xF1          ;                                 ***
    goto      I2CWrite      ;                                 ***
Kom_SETVCOMDETECT           ;                                 ***
    movlw     0xDB          ; SETVCOMDETECT                   ***
    goto      I2CWrite      ;                                 ***
Kom_04                      ;                                 ***
    movlw     0x40          ;                                 ***
    goto      I2CWrite      ;                                 ***
Kom_DISPLAYALLON_RESUME     ;                                 ***
    movlw     0xA4          ; DISPLAYALLON_RESUME             ***
    goto      I2CWrite      ;                                 ***
Kom_NORMALDISPLAY           ;                                 ***
    movlw     0xA6          ; NORMALDISPLAY                   ***
    goto      I2CWrite      ;                                 ***
Kom_DEACTIVATE_SCROLL       ;                                 ***
    movlw     0x2E          ; DEACTIVATE_SCROLL               ***
    goto      I2CWrite      ;                                 ***
Kom_DISPLAYON               ;                                 ***
    movlw     0xAF          ; DISPLAYON -- turn on oled panel ***
    goto      I2CWrite      ;                                 ***
Kom_COLUMNADDR              ;                                 ***
    movlw     0x21          ; COLUMNADDR                      ***
    goto      I2CWrite      ;                                 ***
Kom_CLMNSTR                 ;                                 ***
    movlw     0             ; Column start address (0 = reset) **
    goto      I2CWrite      ;                                 ***
Kom_CLMNEND                 ;                                 ***
    movlw     128-1         ; Column end address (127 = reset) (LCDWIDTH)
    goto      I2CWrite      ;                                 ***
Kom_PAGEADDR                ;                                 ***
    movlw     0x22          ;                                 *** 
    goto      I2CWrite      ;                                 ***
Kom_PGSTRT                  ;                                 ***
    movlw     0             ; Page start address (0 = reset)  ***
    goto      I2CWrite      ;                                 ***
Kom_PGEND                   ;                                 ***
    movlw     7             ; Page end address                ***
    goto      I2CWrite      ;                                 ***
;****************************************************************
;****************************************************************
 
; ***************************************************************
; *** Yaklaşık yarım saniyelik zaman harcama döngüsü...       ***
; *** Hafızadan kazanmak için TMR0 ı kullanır..               ***
; *** Aksi taktirde 3 iç içe loop lazım, 14 satır eder.       ***
; *** aşağıki şekli ile  8 satır. 6byte tasarruftayız..       ***
; ***************************************************************
AltYarimSaniye              ;                                 ***
    btfss     TMR0,7        ;                                 ***
    goto      AltYarimSaniye; YarimSaniyeDonus                ***
    clrf      TMR0          ;                                 ***
    decfsz    YS_Sayac,f    ;                                 ***
    goto      AltYarimSaniye; YarimSaniyeDonus                ***
    movlw     15            ;                                 ***
    movwf     YS_Sayac      ;                                 ***
    goto      YarimSaniyeDonus ;                              ***
;****************************************************************
;****************************************************************
 
Ayarlar;*********************************************************
    movlw     00110000b     ; I2C hatları HI gerisi LOW       ***
    movwf     GPIO          ;                                 ***
    movlw     00001000b     ; I/O                             ***
    TRIS      GPIO          ;                                 ***
    ;         +---------------- WakeUp on Pin Change iptal    ***
    ;         |+--------------- Weak Pull Ups (GP0,GP1,GP3) iptal
    ;         ||+-------------- TMR0 kaynağı Fosc/4           ***
    ;         |||+------------- TMR0 Edge = Low2Hi            ***
    ;         ||||+------------ Prescaler WTD a               ***
    ;         |||||+++--------- Prescaler = 1:1               ***
    movlw     11000111b     ;                                 ***
    option                  ;                                 ***
    movlw 15                ;                                 ***
    clrf      TMR0          ;                                 ***
    movwf     YS_Sayac      ;                                 ***
    goto      Basla         ; Başa dön......                  ***
;****************************************************************
      org     0x01fe
      retlw   5               ; Sürüm Numarası.  
 
 
      END
 
Projemiz:

PIC12F508 I2C Adres Tarayıcı

Devrenin BreadBoard'a kurulması


Malzeme Listesi
  1. 128x32 OLED Modülü (SSD1306)
  2. PIC12F508 (dorukanstore.com | direnc.net)
  3. 10k direnç ( Hurda kutusunda )
  4. 120R direnç ( Hurda kutusunda )
  5. LED ( Hurda kutusunda )
  6. Breadboard, koblo vs. (Size kalmış)

PIC Programcı: Expkits PK3
NOT: Proje MPLAB IDE v9.82 ile derlenmiştir.
İlgili Dosyalar:
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )
Asm Dosyası : İndir  ( 0 indirme )
Hex Dosyası : İndir  ( 0 indirme )

Neden olmasın?


En Alt??