OLED डिस्प्ले के सिद्धांत को समझें - OLED मॉड्यूल का उपयोग करने के विभिन्न तरीके
ओएलईडी मॉड्यूल में चार कार्य मोड हैं, अर्थात् 6800 और 8080 समानांतर इंटरफेस, 4-वायर सीरियल एसपीआई इंटरफेस मोड और आईआईसी इंटरफेस मोड।BS1/BS2 सेटिंग्स और मॉड्यूल इंटरफ़ेस मोड के बीच संबंध निम्नलिखित तालिका में दिखाया गया है:
SAEF Technology OLED मॉड्यूल की डिफ़ॉल्ट सेटिंग BS0 से GND, BS1 और BS2 से VCC (8080 मोड) है, यदि आप इसे अन्य मोड पर सेट करना चाहते हैं,आप ओएलईडी के पीछे पर एक मिलाप लोहे के साथ BS0-BS2 सेटिंग्स को संशोधित करने की जरूरत है(हार्डवेयर परिवर्तन)
स्कीमा से, हम जानते हैं कि कुल मिलाकर 16 पिन हैं, और 16 लाइनों में से, हमने केवल 15 पिन का उपयोग किया, और उनमें से एक लटक रहा है। 15 लाइनों में से, 2 पावर और ग्राउंड हैं,और 13 शेष हैं. विभिन्न मोड में, सिग्नल लाइनों की संख्या हम की जरूरत अलग है, 8080 मोड में, सभी 13 की जरूरत है, जिनमें से एक आम है, अर्थात् रीसेट लाइन आरएसटी (आरईएस),जो हम सीधे MCU के रीसेट से कनेक्ट कर सकते हैं (पुष्टि करने के लिए कि रीसेट विधि एक ही है), ताकि एक पंक्ति को छोड़ दिया जा सके। IIC मोड में, केवल 2 पंक्तियों की आवश्यकता है!
हमने अभी इसके बारे में सीखा है. आईआईसी के काम करने के मोड में केवल दो लाइनों की आवश्यकता होती है, और आईआईसी के काम करने के मोड में दो तारों का उपयोग करना है आईआईसी का अनुकरण करने के लिए डेटा प्राप्त करने के लिए.
ओएलईडी नियंत्रक एसएसडी 1306 है, यानी नंगे स्क्रीन को एसएसडी 1306 द्वारा संचालित किया जाता है, जो एक अधिक व्यापक रूप से इस्तेमाल किया जाने वाला एलईडी ड्राइवर चिप भी है।
OLED मॉड्यूल वीडियो मेमोरी
ओएलईडी में स्वयं वीडियो मेमोरी नहीं है, और इसकी वीडियो मेमोरी प्रदान करने के लिए एसएसडी 1306 पर निर्भर है। एसएसडी 1306 की कुल मेमोरी 128 * 64 बिट्स है, और एसएसडी 1306 मेमोरी को 8 पृष्ठों में विभाजित करता है।प्रत्येक पृष्ठ में 128 बाइट होते हैं, कुल 8 पन्ने, जो कि 128*64 डॉट मैट्रिक्स का आकार है।
हालाँकि, क्योंकि OLED एक समय में एक डॉट मैट्रिक्स को नियंत्रित नहीं कर सकता है, यह केवल 8 डॉट मैट्रिक्स को नियंत्रित कर सकता है; और यह एक ऊर्ध्वाधर स्वीप नियंत्रण है;
क्योंकि प्रत्येक लिखना बाइट्स में लिखा जाता है, वहाँ एक समस्या है, अगर हम मॉड्यूल संचालित करने के लिए केवल लिखना मोड का उपयोग करते हैं, तो, हम एक समय में 8 अंक लिखना होगा, तो जब हम एक बिंदु आकर्षित,हमें बाइट के प्रत्येक बिट की वर्तमान स्थिति का पता लगाना होगा जहां बिंदु सेट किया जाना है (0/1?) अन्यथा, लिखित डेटा पिछले राज्य को ओवरराइट करेगा, और परिणाम यह होगा कि कुछ बिंदु जो प्रदर्शित करने की आवश्यकता नहीं है प्रदर्शित किए जाते हैं,या जो प्रदर्शित किया जाना चाहिए प्रदर्शित नहीं कर रहे हैं. पठनीय मोड में, हम पहले लिखा जा करने के लिए बाइट बाहर पढ़ सकते हैं, वर्तमान स्थिति प्राप्त, और फिर इसे फिर से लिखा जा करने के लिए बिट को संशोधित करने के बाद ग्राम में लिखते हैं,ताकि यह पिछली स्थिति को प्रभावित न करेहालाँकि, इसके लिए GRAM को पढ़ने की क्षमता की आवश्यकता होती है, 3-वायर या 4-वायर SPI मोड के लिए, मॉड्यूल पढ़ने का समर्थन नहीं करता है, और रीड->-टू-> लेखन मोड भी अपेक्षाकृत धीमा है।
तो विधि हम का उपयोग करने के लिए एक OLED ग्रैम (कुल 128 बाइट्स) बनाने के लिए है STM32 के अंदर, और प्रत्येक संशोधन पर, केवल STM32 पर ग्रैम संशोधित (वास्तव में SRAM), और संशोधन के बाद,एक बार में STM32 पर GRAM को OLED GRAM पर लिखेंबेशक, इस पद्धति के नुकसान भी हैं, अर्थात बहुत कम SRAM वाले माइक्रोकंट्रोलर (जैसे 51 सीरीज) के लिए यह अधिक कष्टप्रद है।
ओएलईडी की वीडियो मेमोरी
भंडारण प्रारूप निम्नानुसार है:
//[0]0 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];
वीडियो मेमोरी को एलसीडी पर अपडेट करें
void OLED_Refresh_Gram (अमान्य)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_बाइट (0xb0+i,OLED_CMD); पृष्ठ पता सेट करें (0~7)
OLED_WR_Byte (0x00,OLED_CMD); प्रदर्शन स्थिति सेट करें
OLED_WR_Byte (0x10,OLED_CMD); प्रदर्शन स्थिति सेट करें
for(n=0; n<128; n++)OLED_WR_Byte(OLED_GRAM[n][i],OLED_DATA);
}
}
SSD1306 कमांड
1: कमांड 0X81: कंट्रास्ट सेट करें. दो बाइट्स होते हैं, पहला 0X81 कमांड है, और अगला एक बाइट कंट्रास्ट का मान है जिसे सेट किया जाना है. जितना बड़ा यह मान सेट किया जाता है,जितनी अधिक चमक स्क्रीन होगी.
2: कमांड 0XAE/0XAF: 0XAE डिस्प्ले कमांड को बंद करने के लिए; 0XAF डिस्प्ले कमांड को चालू करने के लिए।
3: कमांड 0X8D: 2 बाइट शामिल हैं, पहला कमांड शब्द है, दूसरा सेट मान है, BIT2 का दूसरा बाइट चार्ज पंप की स्विचिंग स्थिति को दर्शाता है, बिट 1 है,चार्ज पंप चालू है, और 0 बंद है. जब मॉड्यूल आरंभ किया जाता है, यह सक्षम किया जाना चाहिए, अन्यथा आप स्क्रीन डिस्प्ले नहीं देखेंगे.
4: कमांड 0XB0~B7: पृष्ठ पता सेट करने के लिए प्रयोग किया जाता है, और निचले तीन अंक GRAM के पृष्ठ पते से मेल खाते हैं.
5: कमांड 0X00~0X0F: प्रदर्शित करते समय प्रारंभ स्तंभ पते के निचले चार अंकों को सेट करने के लिए प्रयोग किया जाता है.
6: कमांड 0X10~0X1F: प्रदर्शन के प्रारंभ स्तंभ का पता चार अंकों से अधिक सेट करने के लिए प्रयोग किया जाता है.
अधिक आदेशों के लिए, कृपया यह देखें, यह देखने के लिए अत्यधिक अनुशंसित है, यह बहुत विस्तृत हैः SSD1306 (OLED ड्राइवर चिप) विवरण में निर्देश
कार्य मोड और ड्राइवर चिप का परिचय देने के बाद, हम इस आईआईसी ओएलईडी मॉड्यूल का उपयोग शुरू कर सकते हैं
विस्तृत कोड
#define OLED_CMD 0 // कमांड लिखें
#define OLED_DATA 1 //डेटा लिखें
ओएलईडी आरंभ करें
एसएसडी1306 आरंभ करें
void OLED_Init (अमान्य)
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); A पोर्ट पर घड़ी सक्षम करें
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; पुश-पुल आउटपुट
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; गति 50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO को आरंभ करें
GPIO_SetBits ((GPIOA,GPIO_Pin_5 के लिए GPIO_Pin_7);
delay_ms(200);
OLED_WR_Byte ((0xAE,OLED_CMD);//--प्रदर्शन बंद
OLED_WR_Byte ((0x00,OLED_CMD);//---निम्न स्तंभ पता सेट करें
OLED_WR_Byte ((0x10,OLED_CMD);//---उच्च स्तंभ पता सेट करें
OLED_WR_Byte ((0x40,OLED_CMD);//--सेट प्रारंभ पंक्ति पता
OLED_WR_Byte ((0xB0,OLED_CMD);//--पृष्ठ पता सेट करें
OLED_WR_Byte ((0x81,OLED_CMD); // अनुबंध नियंत्रण
OLED_WR_Byte ((0xFF,OLED_CMD);//- 128
OLED_WR_Byte ((0xA1,OLED_CMD);//सेट सेगमेंट रीमैप
OLED_WR_Byte ((0xA6,OLED_CMD);//--सामान्य / रिवर्स
OLED_WR_Byte ((0xA8,OLED_CMD);//--सेट मल्टीप्लेक्स अनुपात ((1 से 64)
OLED_WR_Byte ((0x3F,OLED_CMD);//--1/32 कर्तव्य
OLED_WR_Byte ((0xC8,OLED_CMD);//Com स्कैन दिशा
OLED_WR_Byte ((0xD3,OLED_CMD);//-सेट डिस्प्ले ऑफसेट
OLED_WR_Byte ((0x00,OLED_CMD);//
OLED_WR_Byte ((0xD5,OLED_CMD);//सेट ओएससी विभाजन
OLED_WR_Byte ((0x80,OLED_CMD);//
OLED_WR_Byte ((0xD8,OLED_CMD);//क्षेत्र रंग मोड बंद सेट करें
OLED_WR_Byte ((0x05,OLED_CMD);//
OLED_WR_Byte ((0xD9,OLED_CMD);//Pre-Charge Period सेट करें
OLED_WR_Byte ((0xF1,OLED_CMD);//
OLED_WR_Byte ((0xDA,OLED_CMD);//set com pin configuration
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);//सेट चार्ज पंप सक्षम
OLED_WR_Byte ((0x14,OLED_CMD);//
OLED_WR_Byte ((0xAF,OLED_CMD);//-- OLED पैनल चालू करें}
OLED_Clear(); स्क्रीन को साफ़ करें, यह प्रत्येक आरंभिकरण पूरा होने के बाद पहले स्क्रीन को साफ करने के लिए सिफारिश की है
स्क्रीन को साफ करने के बाद, पूरी स्क्रीन काली हो जाती है! यह वही है जो रोशनी नहीं करता है!
void OLED_Clear (नष्ट)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_बाइट (0xb0+i,OLED_CMD); पृष्ठ पता सेट करें (0~7)
OLED_WR_Byte (0x00,OLED_CMD); प्रदर्शन स्थिति सेट करें
OLED_WR_Byte (0x10,OLED_CMD); प्रदर्शन स्थिति सेट करें
for ((n=0; n<128; n++)OLED_WR_Byte(0,OLED_DATA);
} // प्रदर्शन अद्यतन करें
}
आत्म मॉड्यूल में हम आमतौर पर उपयोग करते हैं, वहाँ मॉड्यूलर लेने के लिए दो आम तरीके हैं, एक 6 * 8 है, और दूसरे 8 * 16 है,पहली एक 8 पंक्तियों और 6 स्तंभों के साथ एक आयताकार तालिका में हम चाहते हैं वर्ण बाहर ले जाना है, और दूसरा 16 पंक्तियों और 8 स्तंभों वाली आयताकार तालिका में वर्णों को निकालना है। जैसा कि नीचे कोड टिप्पणी में लिखा गया है, क्योंकि OLED में प्रति पृष्ठ केवल 8 पंक्तियां हैं,अगले पृष्ठ के लिए जगह का उपयोग करने की आवश्यकता है. तो हम फ़ॉन्ट आकार हम आमतौर पर उपयोग करते हैं, बेशक, ये आम तौर पर इस्तेमाल फ़ॉन्ट आकार हैं, हम भी अपने पसंदीदा फ़ॉन्ट आकार के माध्यम से कर सकते हैं चरित्र मॉड्यूलेशन सॉफ्टवेयर.
/* निर्दिष्ट स्थान पर एक वर्ण प्रदर्शित करता है, जिसमें कुछ वर्ण शामिल हैं
x:0~127
y:0~63
आकारः फ़ॉन्ट का चयन करें 16/12*/
void OLED_ShowChar ((u8 x,u8 y,u8 chr,u8 Char_Size)
{
unsigned char c=0,i=0;
c=chr-' '; ऑफसेट मान फ़ॉन्ट पैटर्न से प्राप्त किया जा सकता है, पहला'' है, और संबंधित वर्ण को घटाकर प्राप्त किया जा सकता है
if(x>Max_Column-1) {x=0; y=y+2; } //Max_Column: अधिकतम स्तंभः 128; x: स्तंभों की संख्या सेट करें; y: पृष्ठों की संख्या सेट करें
if(Char_Size ==16) // इस मामले में दो पृष्ठों के एक ही कॉलम की आवश्यकता है, और 8*16 के डॉट मैट्रिक्स की आवश्यकता है
{
OLED_Set_Pos(x,y); यदि x = y = 2, तो इसे पृष्ठ 3 पर कॉलम 3 पर सेट करें, नोटः प्रति पृष्ठ केवल आठ पंक्तियाँ हैं
for ((i=0; i<8; i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA); i को बढ़ाकर, डॉट्स को लूप में खींचा जाता है, और पृष्ठ 2 पर दूसरे कॉलम की सभी 8 पंक्तियां डेटा में लिखी जाती हैं
OLED_Set_Pos(x,y+1); चूंकि डॉट्स की संख्या पर्याप्त नहीं है, तो आपको पृष्ठ 3 पर कॉलम 2 में डॉट्स जारी रखने की आवश्यकता है
for ((i=0; i<8; i++)
OLED_WR_Byte ((F8X16[c*16+i+8],OLED_DATA); बिंदु 16 के अंत तक ड्राइंग को पूरा करना जारी रखें
}
अन्य
{
OLED_Set_Pos ((x,y); 6x8 डॉट मैट्रिक्स, पेंटिंग जारी रखने के लिए अन्य पृष्ठों की आवश्यकता नहीं है
for ((i=0; i<6; i++)
OLED_WR_Byte ((F6x8[c][i],OLED_DATA); दो आयामी सरणी में, सी पंक्तियों को नियंत्रित करता है और मैं स्तंभों को नियंत्रित करता हूं, इसलिए ड्राइंग को पूरा करने के लिए किसी अन्य संचालन की आवश्यकता नहीं है
}
}
निम्नलिखित if(x>120) एक त्रुटि नहीं है, क्योंकि पिछले x + = 8; वहाँ निम्नलिखित नोट्स में एक स्पष्टीकरण है, तो आप इसके बारे में सोच सकते हैं।
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // स्ट्रिंग प्रदर्शित करता है
{
बिना हस्ताक्षर के char j=0;
जबकि (chr[j]!='0') // जांचें कि स्ट्रिंग समाप्त होती है या नहीं
{
OLED_ShowChar ((x,y,chr[j],Char_Size); अक्षरों को एक-एक करके खींचें
x + = 8; x एक कॉलम के लिए सेट है, एक चरित्र का आकार 8 * 16 है, यानी पंक्ति 16 है और कॉलम 8 है, और हर बार यह एक के रूप में प्रदर्शित किया जाता है, आप उच्च स्तंभ के लिए 8 कॉलम स्थानांतरित करने की जरूरत है
if(x>120) {x=0; y+=2; } // अधिकतम 128 कॉलम है, यदि यह पार कर लिया जाता है, तो आपको शून्य कॉलम से फिर से शुरू करने की आवश्यकता है, क्योंकि आपको इस समय पेंटिंग जारी रखने के लिए अन्य पृष्ठों की आवश्यकता है,ओवरलैपिंग से बचने के लिए, आपको y + = 2 की आवश्यकता है।
j++; लूप में स्ट्रिंग्स खींचें
}
}
2 संख्याएँ प्रदर्शित की जाती हैं, दोनों नीचे दिए गए कोड में लिखी गई हैं और यह ध्यान दिया जाना चाहिए कि नीचे दिया गया "" 32 के ASCII मान का प्रतिनिधित्व करता है
m^n कार्य
u32 oled_pow ((u8 m,u8 n)
{
u32 परिणाम=1;
जबकि n-- परिणाम*=m;
रिटर्न परिणाम;
}
दो संख्याएँ प्रदर्शित करें
x,y: आरंभ निर्देशांक
len: संख्या के अंकों की संख्या
आकारः फ़ॉन्ट का आकार
मोडः मोड 0, भरने का मोड; 1. ओवरले मोड
num: संख्यात्मक मान (0~4294967295);
void OLED_ShowNum ((u8 x,u8 y,u32 num,u8 len,u8 size2)
{
u8 t,temp;
u8 enshow=0;
for(t=0; t { temp=(num/oled_pow(10,len-t-1))%10; if(display==0&&t<(len-1)) { if(temp==0) { OLED_ShowChar ((x+(size2/2) *t,y,' ',size2); जारी रखें; }अन्यथा enshow=1; } OLED डिस्प्ले Char ((x+(size2/2) *t,y,temp+'0',size2); } उपरोक्त कई हमारे सबसे बुनियादी उपयोग कर रहे हैं, कुछ शी इसे और अधिक विभिन्न कार्यों को पूरा करने के लिए उपयोग करना चाहते हैं, निम्नलिखित है, परिचय से पहले,सबसे पहले हमारे आम तौर पर इस्तेमाल किया मॉडलिंग सॉफ्टवेयर का परिचय. पीसी से एलसीडी 2002 यह कैसे काम करता है! जब हम इसका उपयोग करते हैं, हम सबसे पहले ऊपरी बाएं कोने में फ़ाइल खोलने और एक नया बनाने. हमारी चौड़ाई और ऊंचाई दर्ज करें, 6 * 8 या 8 * 16 ढालना लेने के लिए इस पर आधारित हैं, आप अपने आप से आकार सेट कर सकते हैं.शीर्ष कोने में एक गियर की तरह कुछ है, और हम इसे खोलने की जरूरत है एक बार हम आकार सेट किया है. जैसा कि चित्र में दिखाया गया हैः एक बार जब आप सब कुछ ऊपर है, आप आप चाहते हैं क्या ड्राइंग कर सकते हैं. क्योंकि OLED 128 × 64 है, हमारे अधिकतम आकार यह है, हम 128 × 64 पर लिख सकते हैं, ड्राइंग, आदि, क्या बाहर निकलता है एक पूरी तस्वीर है,जो भी स्क्रीन भरने के लिए एक तरीका है, और पीछे एक प्रकार का इंप्रेशन सॉफ्टवेयर है, जिसे एक तस्वीर के रूप में प्राप्त किया जाता है, जैसे कुछ एनीमे पात्र। अब जब हमने उपकरण पेश किया है, हम अपने संचालन के लिए आगे बढ़ने के लिए तैयार हैं! 1: एक सीधी रेखा खींचें 2: चित्र दिखाएँ (जैसे कुछ एनीमे पात्र) यह थोड़ा लंबा लगता है. खेलने के लिए और भी तरीके हैं, अगले अद्यतन करने के लिए.
आम तौर पर हम नीचे चित्र में एक ही बिंदु का उपयोग करते हैं जब हम एक सीधी रेखा खींचना चाहते हैं, हम हमेशा एक बिंदु मिलता है, यह है क्योंकि वर्ण आकार हम आम तौर पर उपयोग 6 * 8 या 8 * 16 है,और अंदर बिंदु आकार पूरे आयत भर नहीं है (ऊपर समझाया), हम क्या करने की जरूरत है हमारे चरित्र सॉफ्टवेयर खोलने के लिए और बिंदु बड़ा बनाने के लिए है!
व्यक्ति से संपर्क करें: Mrs. Christina
दूरभाष: +8618922869670
फैक्स: 86-755-2370-9419