OLED ekranının prensibini anlamak - OLED modüllerini kullanmanın çeşitli yolları
OLED modülünün dört çalışma modu vardır, yani 6800 ve 8080 paralel arayüzleri, 4 telli seri SPI arayüz modu ve IIC arayüz modu.BS1/BS2 ayarları ile modül arayüzü modu arasındaki ilişki aşağıdaki tabloda gösterilmiştir.:
SAEF Technology OLED modülünün varsayılan ayarları BS0'dan GND'ye, BS1 ve BS2'den VCC'ye (8080 modu), eğer diğer modlara ayarlamak istiyorsanız,OLED'in arkasında bir lehimle BS0-BS2 ayarlarını değiştirmeniz gerekiyor(Alat değişikliği)
Şemadan, toplam 16 iğnenin çizildiğini ve 16 çizgiden sadece 15 iğne kullandığımızı ve bunlardan birinin asılı olduğunu öğrenebiliriz. 15 çizgiden 2'si güç ve zemin,Ve 13 tane kaldı.Farklı modlarda, ihtiyacımız olan sinyal hatlarının sayısı farklıdır, 8080 modunda, 13'ün hepsine ihtiyaç vardır, bunlardan biri yaygın, yani sıfırlama hattı RST (RES),MCU'nun sıfırlanmasına doğrudan bağlayabileceğimiz (sıfırlama yönteminin aynı olduğunu doğrulamak için)IIC modunda, sadece 2 satıra ihtiyacınız var!
IIC'nin çalışma moduna sadece iki hat gereklidir ve IIC'nin çalışma modu, verileri elde etmek için IIC'yi simüle etmek için iki tel kullanmaktır.
OLED denetleyicisi SSD1306, yani çıplak ekran, aynı zamanda daha yaygın olarak kullanılan LED sürücü çipi olan SSD1306 tarafından çalıştırılır.
OLED modülü video belleği
OLED'in kendisi video belleğine sahip değildir ve video belleğinin sağlanması SSD1306'ya bağlıdır. SSD1306'nın toplam belleği 128 * 64 bit'tir ve SSD1306 belleği 8 sayfaya ayırır.Her sayfa 128 bayt içerir., toplam 8 sayfa, tam olarak 128*64 nokta matris boyutu.
Ancak, OLED bir kerede tek nokta matrisini kontrol edemediğinden, sadece 8 nokta matrisini kontrol edebilir.
Çünkü her yazma baytlarla yazılır. Eğer modülü çalıştırmak için sadece yazma modunu kullanırsak, bir seferde 8 nokta yazmamız gerekir.Biz ayarlanacak noktanın bulunduğu byte her bitin mevcut durumunu bulmak gerekir (0/1Aksi takdirde, yazılı veriler önceki durumun üzerine yazılır ve sonuç, görüntülenmesi gerekmeyen bazı noktaların görüntülenmesi olacaktır.ya da gösterilmesi gerekenler gösterilmiyor. Okulabilir modda, önce yazılacak baytı okuyabilir, mevcut durumu alabilir ve sonra yeniden yazılacak bit'i değiştirdikten sonra gramlara yazabiliriz,Böylece önceki durumu etkilemez.Bununla birlikte, bu, GRAM'i okuma yeteneği gerektirir, 3 tel veya 4 tel SPI modu için, modül okuma desteklemez ve okuma->-> yazma modu da nispeten yavaştır.
Bu yüzden kullandığımız yöntem, STM32'nin içinde bir OLED GRAM (toplam 128 bayt) oluşturmak ve her değişiklikte sadece STM32'deki GRAM'i (aslında SRAM) değiştirmek ve değişiklikten sonra,STM32'deki GRAM'ı bir kerede OLED GRAM'a yazTabii ki, bu yöntemin dezavantajları da vardır, yani çok küçük SRAM (51 serisi gibi) olan mikro denetleyiciler için daha rahatsız edicidir.
OLED video belleği
Depolama biçimi şöyledir:
1 2 3... 127
//[1]0 1 2 3... 127
//[2]0 1 2 3... 127
//[3]0 1 2 3... 127
//[4]0 1 2 3... 127
//[5]0 1 2 3... 127
//[6]0 1 2 3... 127
//[7]0 1 2 3... 127
u16 OLED_GRAM[128][8];
Video belleğini LCD'ye güncelle
boş OLED_Refresh_Gram (boş)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Sayfa adresini ayarla (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Ekran konumunu ayarla
OLED_WR_Byte (0x10,OLED_CMD); Ekran konumunu sütun yüksekliği adresini belirleyin
for ((n=0; n<128; n++)OLED_WR_Byte ((OLED_GRAM[n][i],OLED_DATA);
}
}
SSD1306 komutu
1: Komut 0X81: Kontrastı ayarlayın. İki bayt içerir, ilk 0X81 komut ve sonraki bir bayt ayarlanacak kontrastın değeri. Bu değer ne kadar büyükse,Ekran ne kadar parlaksa.
2: Komut 0XAE/0XAF: 0XAE görüntü komutunu kapatmak için; 0XAF görüntü komutunu açmak için.
3: Komut 0X8D: 2 bayt içerir, birincisi komut kelimesidir, ikincisi ayar değeridir, BIT2'nin ikinci baytı şarj pompasının geçiş durumunu gösterir, bit 1,Şarj pompası açık., ve 0 kapalıdır. Modül başlatıldığında, bu etkinleştirilmelidir, aksi takdirde ekran gösterimini göremezsiniz.
4: Komut 0XB0~B7: Sayfa adresini ayarlamak için kullanılır ve alt üç basamak GRAM'ın sayfa adresine karşılık gelir.
5: Komut 0X00~0X0F: Görüntüleme sırasında başlangıç sütununun altındaki dört rakamı ayarlamak için kullanılır.
6: Komut 0X10~0X1F: Ekranın başlangıç sütunu adresini dört basamak daha yüksek ayarlamak için kullanılır.
Daha fazla komut için, lütfen bu bakmak için tavsiye edilir, çok ayrıntılı: SSD1306 (OLED sürücü çipi) ayrıntılı talimatlar
Çalışma modunu ve sürücü çipi tanıttıktan sonra, bu IIC OLED modülünü kullanmaya başlayabiliriz
Detaylı kod
#define OLED_CMD 0 // komutu yaz
#define OLED_DATA 1 //Verileri yaz
OLED'i başlat
SSD1306'yı başlat.
boş OLED_Init (boş)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd ((RCC_APB2Periph_GPIOA, ENABLE); A portundaki saati etkinleştir
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; İt-çek çıkışı
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; Hız 50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO'yu başlat
GPIO_SetBits ((GPIOA,GPIO_Pin_5 içindeGPIO_Pin_7);
delay_ms ((200);
OLED_WR_Byte ((0xAE,OLED_CMD);
OLED_WR_Byte ((0x00,OLED_CMD);//---düşük sütun adresini ayarla
OLED_WR_Byte ((0x10,OLED_CMD);//---yüksek sütun adresini ayarla
OLED_WR_Byte ((0x40,OLED_CMD);//--başlangıç satırı adresini belirle
OLED_WR_Byte ((0xB0,OLED_CMD);
OLED_WR_Byte ((0x81,OLED_CMD); // sözleşme kontrolü
OLED_WR_Byte ((0xFF,OLED_CMD);//-128
OLED_WR_Byte ((0xA1,OLED_CMD);//set segment yeniden haritası
OLED_WR_Byte ((0xA6,OLED_CMD);//--normal / ters
OLED_WR_Byte ((0xA8,OLED_CMD);//--set multiplex ratio ((1 ile 64)
OLED_WR_Byte ((0x3F,OLED_CMD);//--1/32 görev
OLED_WR_Byte ((0xC8,OLED_CMD);//Com tarama yönü
OLED_WR_Byte ((0xD3,OLED_CMD);//-set display offset
OLED_WR_Byte ((0x00,OLED_CMD);//
OLED_WR_Byte ((0xD5,OLED_CMD);//set osc bölümü
OLED_WR_Byte ((0x80,OLED_CMD);//
OLED_WR_Byte ((0xD8,OLED_CMD);//Aranın renk modunu kapat
OLED_WR_Byte ((0x05,OLED_CMD);//
OLED_WR_Byte ((0xD9,OLED_CMD);//Önceden Şarj Süresi Ayarla
OLED_WR_Byte ((0xF1,OLED_CMD);//
OLED_WR_Byte ((0xDA,OLED_CMD);//set com pin konfigürasyonu
OLED_WR_Byte ((0x12,OLED_CMD);//
OLED_WR_Byte ((0xDB,OLED_CMD);//set Vcomh
OLED_WR_Byte ((0x30,OLED_CMD);//
OLED_WR_Byte ((0x8D,OLED_CMD);//set charge pump enable
OLED_WR_Byte ((0x14,OLED_CMD);//
OLED_WR_Byte ((0xAF,OLED_CMD);//-- OLED panelini aç}
OLED_Clear ((); Ekranı temizleyin, her başlangıç tamamlandıktan sonra önce ekranı temizlemek önerilir
Ekranı temizleme fonksiyonu, ekranı temizledikten sonra, tüm ekran siyahtır!
boş OLED_Clear (boş)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Sayfa adresini ayarla (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Ekran konumunu ayarla
OLED_WR_Byte (0x10,OLED_CMD); Ekran konumunu sütun yüksekliği adresini belirleyin
for ((n=0; n<128; n++)OLED_WR_Byte(0,OLED_DATA);
} // Ekranı güncelle
}
Genellikle kullandığımız modülde modülü almak için iki ortak yol var. Biri 6 çarpı 8, diğeri de 8 çarpı 16.Birincisi, 8 satır ve 6 sütunlu dikdörtgen bir tabloda istediğimiz karakterleri çıkarmak., ve ikincisi, 16 satır ve 8 sütundan oluşan dikdörtgen bir tablodaki karakterleri çıkarmaktır.Bir sonraki sayfa için boşluk kullanılması gerekiyorBu yüzden genellikle kullandığımız yazı tipi boyutu var, tabii ki bunlar yaygın olarak kullanılan yazı tipi boyutları, ayrıca karakter modülasyon yazılımı aracılığıyla kendi favori yazı tipi boyutumuzu da yapabiliriz.
/* Belirtilen konumda bazı karakterler de dahil olmak üzere bir karakter görüntüler
x:0~127
y:0~63
Boyut: 16/12*/ yazı tipini seçin
boş OLED_ShowChar ((u8 x,u8 y,u8 chr,u8 Char_Size)
{
İşaretlenmemiş char c=0,i=0;
c=chr-' '; Ofset değeri yazı tipi örneğinden elde edilebilir, ilk olanı'' ve karşılık gelen karakter çıkararak elde edilebilir
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: Maksimum sütun: 128; x: sütun sayısını belirler; y: Sayfa sayısını belirler
if(Char_Size ==16) // Bu durumda iki sayfadan oluşan aynı sütun gereklidir ve 8*16'nın nokta matrisi gereklidir
{
OLED_Set_Pos(x,y); Eğer x = y = 2, o zaman sayfa 3 sütuna ayarlayın, not: sayfa başına sadece sekiz satır vardır
for ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i],OLED_DATA); i'yi arttırarak noktalar bir döngü halinde çizilir ve sayfa 2'deki ikinci sütunun tüm 8 satırı verilere yazılır
OLED_Set_Pos(x,y+1); Nokta sayısı yeterli olmadığı için, sayfa 3'teki sütun 2'deki noktalara devam etmeniz gerekir
for ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA); çizimi 16. noktanın sonuna kadar tamamlamaya devam edin.
}
Diğerleri
{
OLED_Set_Pos ((x,y); 6x8 nokta matrisi, resim yapmaya devam etmek için başka sayfalara gerek yok
for ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); İki boyutlu bir dizide, C satırları ve I sütunları kontrol eder, bu nedenle çizimi tamamlamak için başka işlemlere gerek yoktur
}
}
Aşağıdaki if(x>120) bir hata değildir, çünkü önceki x+=8; Aşağıdaki notlarda bir açıklama var, bu yüzden bunu düşünebilirsiniz.
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // Diziyi gösterir
{
imzalanmamış char j=0;
while (chr[j]!='0') // Dizinin bitip bitmediğini kontrol edin
{
OLED_ShowChar ((x,y,chr[j],Char_Size); Karakterleri teker teker çiz
x + = 8; x bir sütuna ayarlanmıştır, bir karakter boyutu 8 * 16, yani satır 16 ve sütun 8 ve her bir olarak görüntülenir, daha yüksek sütuna 8 sütun taşımak gerekir
if(x>120) {x=0; y+=2; } // Maksimum 128 sütundur, eğer aşılırsa, sıfır sütundan tekrar başlamanız gerekir, çünkü bu anda resim yapmaya devam etmek için başka sayfalara ihtiyacınız var,Birbiriyle örtüşmemek için., y += 2'ye ihtiyacınız var.
j++; Bir döngüde dizileri çiz
}
}
İkisi de aşağıdaki kodda yazılmış olan 2 sayı görüntülenir ve aşağıdaki ""'nin 32'nin ASCII değerini temsil ettiğini belirtmek gerekir.
m^n fonksiyon
U32 oled_pow ((u8 m,u8 n)
{
u32 sonucu=1;
while ((n--) result*=m;
Geri dönüş sonucu;
}
2 numara göster
x,y: başlangıç koordinatları
len: Sayının sayısal sayısı
boyut: yazı tipi boyutu
Mod: Mod 0, doldurma modu; 1. Üst üşütme modu
num: sayısal değer (0~4294967295);
boş OLED_ShowNum ((u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
t=0; t { Temp=(num/oled_pow(10,len-t-1))%10; if(show==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar ((x+(size2/2) *t,y,' ',size2); Devam edin. {\pos (192,230) }gerekirse göster=1; } OLED Display Char ((x+(size2/2) *t,y,temp+'0',size2); } Yukarıdaki birkaç bizim en temel kullanımı, bazı Xi daha farklı işlemleri tamamlamak için kullanmak istiyorum, aşağıdaki, tanıtım önce,Öncelikle yaygın olarak kullanılan modelleme yazılımımızı tanıtayım.. PC'den LCD'ye 2002 İşler böyle yürür! Kullandığımızda, ilk önce sol üst köşedeki dosyayı açıp yeni bir dosya oluştururuz. genişliğimizi ve yüksekliğimizi girin, 6 * 8 veya 8 * 16 kalıbı almak için buna dayanır, boyutu kendiniz ayarlayabilirsiniz.En üst köşede bir vites gibi bir şey var., ve boyutu ayarladıktan sonra açmamız gerekiyor. Üstündeki herşeyi aldıktan sonra istediğinizi çizebilirsiniz. OLED 128*64 olduğu için maksimum boyutumuz şudur, 128*64'e yazabiliriz, çizebiliriz vb.Bu da ekranı doldurmanın bir yolu., ve arka tarafta bir tür görüntüleme yazılımı var, bazı anime karakterleri gibi bir resim olarak elde edilir. Artık aletleri tanıttığımız için operasyonlara geçmeye hazırız! 1Düz bir çizgi çiz. 2: Resimler göster (örneğin bazı anime karakterleri) Biraz uzun gibi geliyor, oynamanın daha fazla yolu var, sonraki güncelleme için.
Genellikle aşağıdaki resimde olduğu gibi bir nokta kullanırız. Düz bir çizgi çizmek istediğimizde, her zaman bir nokta alırız. Çünkü genellikle kullandığımız karakter boyutu 6*8 veya 8*16'dır.ve içindeki nokta boyutu tüm dikdörtgenin dolusu değil (yukarıda açıklandı), yapmamız gereken karakter yazılımımızı açıp noktayı daha büyük hale getirmek!
İlgili kişi: Mrs. Christina
Tel: +8618922869670
Faks: 86-755-2370-9419