Memahami prinsip tampilan OLED - Berbagai cara menggunakan modul OLED
Modul OLED memiliki empat mode kerja, yaitu 6800 dan 8080 antarmuka paralel, mode antarmuka SPI serial 4-kabel, dan mode antarmuka IIC.Hubungan antara pengaturan BS1/BS2 dan mode antarmuka modul ditunjukkan dalam tabel berikut::
Pengaturan default dari modul OLED SAEF Technology adalah BS0 ke GND, BS1 dan BS2 ke VCC (mode 8080), jika Anda ingin mengaturnya ke mode lain,Anda perlu memodifikasi pengaturan BS0-BS2 dengan soldering iron di bagian belakang OLED. (Perubahan perangkat keras)
Dari skemanya, kita bisa tahu bahwa ada total 16 pin yang ditarik, dan dari 16 garis, kita hanya menggunakan 15 pin, dan salah satunya tergantung. dari 15 garis, 2 adalah daya dan tanah,dan 13 tersisa. Dalam mode yang berbeda, jumlah jalur sinyal yang kita butuhkan berbeda, dalam mode 8080, semua 13 diperlukan, salah satunya yang umum, yaitu garis reset RST (RES),yang kita dapat langsung terhubung ke reset MCU (untuk mengkonfirmasi bahwa metode reset adalah sama), sehingga satu baris dapat dihilangkan. dalam modus IIC, hanya 2 baris yang diperlukan!
Kami baru saja belajar tentang hal itu. Modus kerja IIC hanya membutuhkan dua jalur, dan modus kerja IIC adalah menggunakan dua kabel untuk mensimulasikan IIC untuk mendapatkan data.
Kontroler OLED adalah SSD1306, yaitu: layar telanjang digerakkan oleh SSD1306, yang juga merupakan chip driver led yang lebih banyak digunakan.
Memori video modul OLED
OLED sendiri tidak memiliki memori video, dan memori videonya bergantung pada SSD1306 untuk menyediakan.Setiap halaman berisi 128 byte, total 8 halaman, yang persis 128 * 64 ukuran matriks titik.
Namun, karena OLED tidak dapat mengontrol satu matriks titik pada suatu waktu, itu hanya dapat mengontrol 8 matriks titik; dan itu adalah kontrol sapu vertikal;
Karena setiap menulis ditulis dalam byte, ada masalah, jika kita menggunakan mode menulis saja untuk mengoperasikan modul, maka, kita harus menulis 8 titik pada suatu waktu, jadi ketika kita menggambar titik,kita harus mencari tahu keadaan saat ini dari setiap bit dari byte di mana titik yang akan ditetapkan terletak (0/1?). Jika tidak, data tertulis akan menulis ulang keadaan sebelumnya, dan hasilnya adalah bahwa beberapa titik yang tidak perlu ditampilkan ditampilkan,atau yang harus ditampilkan tidak ditampilkan. Dalam mode yang dapat dibaca, kita dapat membaca byte yang akan ditulis terlebih dahulu, mendapatkan situasi saat ini, dan kemudian menuliskannya ke dalam gram setelah memodifikasi bit yang akan ditulis ulang,sehingga tidak akan mempengaruhi situasi sebelumnyaNamun, ini membutuhkan kemampuan untuk membaca GRAM, untuk mode SPI 3-kabel atau 4-kabel, modul tidak mendukung membaca, dan mode membaca->-ke-> menulis juga relatif lambat.
Jadi metode yang kami gunakan adalah untuk membuat sebuah GRAM OLED (total 128 byte) di dalam STM32, dan pada setiap modifikasi, hanya memodifikasi GRAM pada STM32 (sebenarnya SRAM), dan setelah modifikasi,menulis GRAM pada STM32 ke GRAM OLED pada satu waktuTentu saja, metode ini juga memiliki kelemahan, yaitu, untuk mikrokontroler dengan SRAM yang sangat kecil (seperti seri 51), itu lebih merepotkan.
Memori video dari OLED
Format penyimpanan adalah sebagai berikut:
{\fnCandara\fs60\b1\4cH000000\4aH80}Aku tidak tahu.
//[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];
Perbarui memori video ke LCD
tidak sah OLED_Refresh_Gram (tidak sah)
{
u8 i,n;
untuk ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Atur alamat halaman (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Tetapkan posisi tampilan alamat kolom rendah
OLED_WR_Byte (0x10,OLED_CMD); Tetapkan posisi tampilan alamat ketinggian kolom
untuk ((n=0; n<128; n++)OLED_WR_Byte ((OLED_GRAM[n][i],OLED_DATA);
}
}
Perintah SSD1306
1: Perintah 0X81: Tetapkan kontras. Berisi dua byte, yang pertama 0X81 adalah perintah, dan satu byte berikutnya adalah nilai kontras yang akan ditetapkan. Semakin besar nilai ini ditetapkan,semakin terang layar akan.
2: Perintah 0XAE/0XAF: 0XAE untuk mematikan perintah tampilan; 0XAF untuk mengaktifkan perintah tampilan.
3: Perintah 0X8D: berisi 2 byte, yang pertama adalah kata perintah, yang kedua adalah nilai yang ditetapkan, byte kedua dari BIT2 menunjukkan keadaan beralih dari pompa muatan, bit adalah 1,pompa muatan dihidupkan, dan 0 dimatikan. Ketika modul diinitialisasi, ini harus diaktifkan, jika tidak Anda tidak akan melihat tampilan layar.
4: Perintah 0XB0 ~ B7: Digunakan untuk mengatur alamat halaman, dan tiga digit bawah sesuai dengan alamat halaman GRAM.
5: Perintah 0X00~0X0F: Digunakan untuk mengatur empat digit bawah alamat kolom awal saat menampilkan.
6: Perintah 0X10~0X1F: Digunakan untuk mengatur alamat kolom awal tampilan empat digit lebih tinggi.
Untuk perintah lebih lanjut, silakan lihat ini, sangat disarankan untuk melihatnya, sangat rinci: SSD1306 (chip driver OLED) instruksi secara rinci
Setelah memperkenalkan mode kerja dan driver chip, kita dapat mulai menggunakan modul IIC OLED ini
Kode secara rinci
#define OLED_CMD 0 // menulis perintah
#define OLED_DATA 1 //Tulis data
Inisialisasi OLED
Inisialisasi SSD1306
void OLED_Init (tidak sah)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, MEMBUAT); Aktifkan jam pada port A
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; output dorong-tarik
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; Kecepatan 50MHz
GPIO_Init ((GPIOA, & GPIO_InitStructure); Inisialisasi GPIO
GPIO_SetBits ((GPIOA,GPIO_Pin_5 dalam GPIO_Pin_7);
delay_ms(200);
OLED_WR_Byte ((0xAE,OLED_CMD);//--tampilan mati
OLED_WR_Byte ((0x00,OLED_CMD);//---set low column address
OLED_WR_Byte ((0x10,OLED_CMD);//---menetapkan alamat kolom tinggi
OLED_WR_Byte ((0x40,OLED_CMD);//--set start line address
OLED_WR_Byte ((0xB0,OLED_CMD);//--set alamat halaman
OLED_WR_Byte ((0x81,OLED_CMD); // Kontrol kontrak
Perangkat lunak ini dapat digunakan untuk memutar video.
OLED_WR_Byte ((0xA1,OLED_CMD);//set segment remap
OLED_WR_Byte ((0xA6,OLED_CMD);//--normal / terbalik
OLED_WR_Byte ((0xA8,OLED_CMD);//--set multiplex ratio ((1 sampai 64)
Tugas OLED_WR_Byte ((0x3F,OLED_CMD);//-1/32
OLED_WR_Byte ((0xC8,OLED_CMD);//Com arah scan
OLED_WR_Byte ((0xD3,OLED_CMD);//-set display offset
OLED_WR_Byte ((0x00,OLED_CMD);//
OLED_WR_Byte ((0xD5,OLED_CMD);//set osc division
OLED_WR_Byte ((0x80,OLED_CMD);//
OLED_WR_Byte ((0xD8,OLED_CMD);//set area mode warna off
OLED_WR_Byte ((0x05,OLED_CMD);//
OLED_WR_Byte ((0xD9,OLED_CMD);//Set Periode Pra-Charge
OLED_WR_Byte ((0xF1,OLED_CMD);//
OLED_WR_Byte ((0xDA,OLED_CMD);//set com pin konfigurasi
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);//--hidupkan panel OLED}
OLED_Clear ((); Hapus layar, disarankan untuk membersihkan layar pertama setelah setiap inisialisasi selesai
Fungsi Clear screen, setelah membersihkan layar, seluruh layar menjadi hitam!
tidak valid OLED_Clear (tidak valid)
{
u8 i,n;
untuk ((i=0; i<8; i++)
{
OLED_WR_Byte (0xb0+i,OLED_CMD); Atur alamat halaman (0~7)
OLED_WR_Byte (0x00,OLED_CMD); Tetapkan posisi tampilan alamat kolom rendah
OLED_WR_Byte (0x10,OLED_CMD); Tetapkan posisi tampilan alamat ketinggian kolom
for ((n=0; n<128; n++)OLED_WR_Byte(0,OLED_DATA);
} // Perbarui tampilan
}
Dalam modulus diri yang biasanya kita gunakan, ada dua cara umum untuk mengambil modular, satu adalah 6 * 8, dan yang lain adalah 8 * 16,Yang pertama adalah mengambil karakter yang kita inginkan dalam tabel persegi panjang dengan 8 baris dan 6 kolom, dan yang kedua adalah untuk mengambil karakter dalam tabel persegi panjang dengan 16 baris dan 8 kolom. Seperti yang ditulis dalam komentar kode di bawah ini, karena hanya ada 8 baris per halaman di OLED,ruang untuk halaman berikutnya harus digunakanJadi kita memiliki ukuran font yang biasanya kita gunakan, tentu saja, ini adalah ukuran font yang biasa digunakan, kita juga bisa membuat ukuran font favorit kita sendiri melalui perangkat lunak modulasi karakter.
/* Menampilkan karakter di lokasi yang ditentukan, termasuk beberapa karakter
x:0~127
y:0~63
ukuran: Pilih font 16/12*/
void OLED_ShowChar ((u8 x,u8 y,u8 chr,u8 Char_Size)
{
char tak ditandatangani c=0,i=0;
c=chr-' '; Nilai offset dapat diperoleh dari pola font, yang pertama adalah'', dan karakter yang sesuai dapat diperoleh dengan mengurangi
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: Kolom maksimum: 128; x: mengatur jumlah kolom; y: mengatur jumlah halaman
if(Char_Size ==16) // Dalam hal ini kolom yang sama dari dua halaman diperlukan, dan matriks titik 8*16 diperlukan
{
OLED_Set_Pos(x,y); Jika x = y = 2, maka atur ke kolom 3 di halaman 3, catatan: hanya ada delapan baris per halaman
untuk ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i],OLED_DATA); Dengan meningkatkan i, titik-titik digambar dalam lingkaran, dan semua 8 baris kolom kedua di halaman 2 ditulis ke dalam data
OLED_Set_Pos(x,y+1); Karena jumlah titik tidak cukup, Anda perlu melanjutkan titik di kolom 2 di halaman 3
untuk ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA); Lanjutkan menyelesaikan gambar sampai akhir titik 16.
}
lainnya
{
OLED_Set_Pos ((x,y); matriks titik 6x8, tidak perlu halaman lain untuk melanjutkan lukisan
untuk ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); Dalam array dua dimensi, C mengontrol baris dan I mengontrol kolom, sehingga tidak ada operasi lain yang diperlukan untuk menyelesaikan gambar
}
}
Berikut ini if(x>120) bukan kesalahan, karena sebelumnya x+=8; Ada penjelasan dalam catatan berikut, jadi Anda bisa memikirkannya.
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // Menampilkan string
{
char tak ditandatangani j=0;
while (chr[j]!='0') // Periksa apakah string berakhir
{
OLED_ShowChar ((x,y,chr[j],Char_Size); Gambar karakter satu per satu
x + = 8; x diatur ke kolom, ukuran karakter adalah 8 * 16, yaitu baris adalah 16 dan kolom adalah 8, dan setiap kali ditampilkan sebagai satu, Anda perlu memindahkan 8 kolom ke kolom yang lebih tinggi
if(x>120) {x=0; y+=2; } // Maksimumnya adalah 128 kolom, jika melebihi, Anda perlu memulai dari kolom nol lagi, karena Anda membutuhkan halaman lain untuk melanjutkan lukisan pada saat ini,untuk menghindari tumpang tindih, Anda membutuhkan y + = 2.
j++; Menggambar string dalam loop
}
}
2 angka ditampilkan, keduanya ditulis dalam kode di bawah ini dan harus dicatat bahwa "" di bawah ini mewakili nilai ASCII dari 32
m^n fungsi
u32 oled_pow ((u8 m,u8 n)
{
U32 hasil = 1;
sementara n-- hasil*=m;
hasil pengembalian;
}
Tampilkan 2 angka
x,y: koordinat awal
len: Jumlah digit dari angka
ukuran: ukuran font
Mode: mode 0, mode pengisian; 1. mode overlay
num: nilai numerik (0~4294967295);
void OLED_ShowNum ((u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
untuk t=0; t { temp=(num/oled_pow(10,len-t-1))%10; jika (menampilkan) { jika ((temp==0) { OLED_ShowChar ((x+(size2/2) *t,y,' ',size2); melanjutkan; Jika tidak, menunjukkan = 1; } Tampilan OLED Char ((x+(size2/2) *t,y,temp+'0',size2); } Beberapa di atas adalah penggunaan paling dasar kita, beberapa Xi ingin menggunakannya untuk menyelesaikan operasi yang lebih berbeda, berikut adalah, sebelum pengenalan,pertama memperkenalkan perangkat lunak pemodelan kami yang umum digunakan. PC ke LCD 2002 Begini cara kerjanya! Ketika kita menggunakannya, kita pertama membuka file di sudut kiri atas dan membuat yang baru. masukkan lebar dan tinggi kita, 6 * 8 atau 8 * 16 didasarkan pada ini untuk mengambil cetakan, Anda dapat mengatur ukuran sendiri.Ada sesuatu seperti gigi di sudut atas., dan kita perlu membukanya setelah kita menetapkan ukuran. Setelah Anda memiliki semua di atas, Anda dapat menggambar apa yang Anda inginkan. karena OLED adalah 128 × 64, ukuran maksimum kami adalah ini, kita dapat menulis pada 128 × 64, menggambar, dll, apa yang keluar adalah gambar keseluruhan,yang juga merupakan cara untuk mengisi layar, dan ada semacam perangkat lunak imbasan di bagian belakang, yang diperoleh sebagai gambar, seperti beberapa karakter anime. Sekarang kami telah memperkenalkan alat, kami siap untuk melanjutkan operasi kami! 1: Tarik garis lurus 2: Tampilkan gambar (seperti beberapa karakter anime) Rasanya agak lama. Ada lebih banyak cara untuk bermain, untuk memperbarui berikutnya.
Biasanya kita menggunakan titik yang sama seperti dalam gambar di bawah ini ketika kita ingin menggambar garis lurus, kita selalu mendapatkan titik, ini karena ukuran karakter yang kita gunakan umumnya adalah 6 * 8 atau 8 * 16,dan ukuran titik di dalam tidak penuh dari seluruh persegi panjang (dijelaskan di atas), apa yang perlu kita lakukan adalah membuka perangkat lunak karakter kami dan membuat titik lebih besar!
Kontak Person: Mrs. Christina
Tel: +8618922869670
Faks: 86-755-2370-9419