เข้าใจหลักการของจอ OLED - วิธีการใช้โมดูล OLED
โมดูล OLED มีสี่โหมดการทํางานคือ 6800 และ 8080 อินเตอร์เฟซคู่กัน โหมดอินเตอร์เฟส SPI ซีเรียล 4 สาย และโหมดอินเตอร์เฟส IICความสัมพันธ์ระหว่างการตั้งค่า BS1/BS2 และโหมดอินเตอร์เฟซโมดูลแสดงในตารางต่อไปนี้:
การตั้งค่าโดยกําหนดของโมดูล OLED SAEF Technology คือ BS0 เป็น GND, BS1 และ BS2 เป็น VCC (โหมด 8080) หากคุณต้องการตั้งมันเป็นโหมดอื่นคุณจําเป็นต้องปรับเปลี่ยนการตั้งค่า BS0-BS2 ด้วยเหล็กผสมบนด้านหลังของ OLED(เปลี่ยนฮาร์ดแวร์)
จากแผนภูมิ เราสามารถรู้ว่ามีทั้งหมด 16 จักรพรรณออก และจาก 16 เส้น เราใช้แค่ 15 จักรพรรณ และหนึ่งในนั้นแขวนอยู่และเหลือ 13 คนในโหมดต่าง ๆ จํานวนสายสัญญาณที่เราต้องการจะแตกต่างกัน ในโหมด 8080 เราต้องการทั้งหมด 13 สาย ซึ่งหนึ่งในนั้นเป็นธรรมดา คือสายรีเซ็ท RST (RES)ซึ่งเราสามารถเชื่อมต่อโดยตรงกับการรีเซ็ตของ MCU (เพื่อยืนยันว่าวิธีรีเซ็ตคือเหมือนกัน), เพื่อที่จะสามารถยกทิ้งเส้นหนึ่งในโหมด IIC, มีเพียง 2 เส้นที่จําเป็น!
เราเพิ่งเรียนรู้เกี่ยวกับมัน ระบบทํางานของ IIC ใช้แค่สองเส้น และระบบทํางานของ IIC คือการใช้สายสองสาย เพื่อจําลอง IIC เพื่อรับข้อมูล
เครื่องควบคุม OLED เป็น SSD1306 นั่นก็คือ: หน้าจอเปล่าถูกขับโดย SSD1306 ซึ่งยังเป็นชิปไดรเวอร์ LED ที่ใช้กันอย่างแพร่หลาย
เอมโมรีวีดีโอโมดูล OLED
OLED ตัวเองไม่มีความจําวิดีโอ และความจําวิดีโอของมันขึ้นอยู่กับ SSD1306 เพื่อให้ความจําทั้งหมดของ SSD1306 คือ 128 * 64 บิต และ SSD1306 แบ่งความจําเป็น 8 หน้าแต่ละหน้ามี 128 ไบท์มีทั้งหมด 8 หน้า ซึ่งเท่ากับขนาดเมทริกซ์จุด 128*64
อย่างไรก็ตาม เนื่องจาก OLED ไม่สามารถควบคุมเมทริกซ์จุดหนึ่งครั้งได้ มันสามารถควบคุมเมทริกซ์จุด 8 จุดเท่านั้น
เนื่องจากการเขียนแต่ละครั้งถูกเขียนในไบท์, มีปัญหา, ถ้าเราใช้โหมดเขียนเฉพาะเพื่อทํางานในโมดูล, แล้ว, เราต้องเขียน 8 จุดในเวลา, ดังนั้นเมื่อเราวาดจุด,เราต้องหาสถานะปัจจุบันของแต่ละบิตของไบท์ที่จุดที่จะตั้งอยู่ (0/1?) ไม่เช่นนั้น, ข้อมูลที่เขียนจะ overwrite สถานที่ก่อนหน้านี้, และผลลัพธ์จะเป็นที่บางจุดที่ไม่จําเป็นต้องแสดงแสดง,หรือที่ควรจะแสดงไม่ได้ในโหมดที่อ่านได้ เราสามารถอ่านไบทที่จะเขียนออกก่อน, รับสถานการณ์ปัจจุบัน, แล้วเขียนมันลงในกราม หลังจากปรับปรุงบิตที่จะเขียนใหม่,เพื่อไม่ให้เกิดผลกระทบต่อสถานการณ์เดิม. อย่างไรก็ตาม, นี้ต้องการความสามารถในการอ่าน GRAM, สําหรับ 3 สายหรือ 4 สาย SPI โหมด, โมดูลไม่สนับสนุนการอ่าน, และการอ่าน->-to-> โหมดการเขียนยังค่อนข้างช้า.
ดังนั้นวิธีที่เราใช้คือการสร้าง OLED GRAM (ทั้งหมด 128 ไบท์) ภายใน STM32 และในการปรับปรุงแต่ละครั้ง เพียงปรับปรุง GRAM บน STM32เขียน GRAM บน STM32 ไปยัง OLED GRAM ครั้งเดียวแน่นอนว่าวิธีนี้ยังมีข้อเสีย, นั่นคือสําหรับไมโครคอนโทรลเลอร์ที่มี SRAM เล็กมาก (เช่น 51 ซีรีส์), มันมีปัญหามากขึ้น.
ความจําวีดีโอของ OLED
รูปแบบการเก็บคือดังนี้:
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];
อัพเดทความจําวิดีโอสู่จอ LCD
void OLED_Refresh_Gram (ไม่มีค่า)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_Byte (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: กําหนดความแตกต่าง มี 2 ไบท์ 0X81 เป็นคําสั่ง และ 1 ไบท์ถัดไปคือค่าของความแตกต่างที่จะกําหนดสีหน้าจอจะสว่างขึ้น.
2: คําสั่ง 0XAE/0XAF: 0XAE ปิดคําสั่งแสดงภาพ; 0XAF เปิดคําสั่งแสดงภาพ
3: คําสั่ง 0X8D: ประกอบด้วย 2 ไบท, หนึ่งแรกคือคําสั่ง, สองคือค่าตั้ง, ไบทที่สองของ BIT2 แสดงว่าสภาพสลับของปั๊มการชาร์จ, บิตคือ 1,ปั๊มชาร์จเปิด, และ 0 ได้ปิด เมื่อโมดูลเริ่มต้น, นี้ต้องเปิด, ไม่เช่นนั้นคุณจะไม่เห็นการแสดงจอ.
4: คําสั่ง 0XB0 ~ B7: ใช้ในการตั้งที่อยู่ของหน้า และสามหลักด้านล่างตรงกับที่อยู่ของหน้าของ GRAM
5: คําสั่ง 0X00~0X0F: ใช้ในการตั้งหลักสี่หลักล่างของที่อยู่แถวเริ่มต้นเมื่อแสดง
6: คําสั่ง 0X10~0X1F: ใช้ในการตั้งที่อยู่เสาเริ่มต้นของจอสูงกว่า 4 หลัก
สําหรับคําสั่งเพิ่มเติม, โปรดอ้างอิงนี้, มันแนะนําอย่างมากที่จะเห็นมัน, มันมีรายละเอียดมาก: SSD1306 (OLED ชิปไดรเวอร์) คําแนะนําในรายละเอียด
หลังจากแนะนําโหมดการทํางานและชิป Driver เราสามารถเริ่มต้นการใช้ IIC โมดูล OLED นี้
รหัสรายละเอียด
#define OLED_CMD 0 // เขียนคําสั่ง
#กําหนด OLED_DATA 1 //เขียนข้อมูล
เปิดตัว OLED
เริ่มต้น SSD1306
void OLED_Init ((void)
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);//set segment remap
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);//-set display offset
OLED_WR_Byte ((0x00,OLED_CMD);//
OLED_WR_Byte ((0xD5,OLED_CMD);//set osc แบ่ง
OLED_WR_Byte ((0x80,OLED_CMD);//
OLED_WR_Byte ((0xD8,OLED_CMD);//กําหนดรูปแบบสีพื้นที่ปิด
OLED_WR_Byte ((0x05,OLED_CMD);//
OLED_WR_Byte ((0xD9,OLED_CMD);//กําหนดระยะเวลาชาร์จก่อน
OLED_WR_Byte ((0xF1,OLED_CMD);//
OLED_WR_Byte ((0xDA,OLED_CMD);//set com pin การตั้งค่า
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 ((void)
{
u8 i,n;
for ((i=0; i<8; i++)
{
OLED_WR_Byte (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);
} // อัพเดทหน้าจอ
}
ในตัวจําลองตัวตนที่เราใช้กันมักมี 2 วิธีที่ใช้กันทั่วไปในการนําตัวจําลองตัวหนึ่งคือ 6 * 8 และอีกตัวคือ 8 * 16อย่างแรกคือการเอาตัวอักษรที่เราต้องการออกจากตารางทรงสี่เหลี่ยมที่มี 8 แถวและ 6 คอลัมน์, และข้อที่สองคือการเอาตัวอักษรออกในตารางทรงสี่เหลี่ยมที่มี 16 แถวและ 8 คอลัมน์ ดังที่เขียนในคําอธิบายรหัสด้านล่าง เนื่องจากมีเพียง 8 เส้นต่อหน้าใน OLEDสเปซสําหรับหน้าถัดไปต้องใช้ดังนั้นเรามีขนาดตัวอักษรที่เรามักจะใช้ แน่นอน, นี่คือขนาดตัวอักษรที่ใช้กันทั่วไป, เรายังสามารถสร้างขนาดตัวอักษรโปรดของเราเองได้
/* แสดงตัวอักษรที่ตําแหน่งที่กําหนด รวมถึงตัวอักษรบางตัว
x:0~127
y:0~63
ขนาด: เลือก Font 16/12*/
void OLED_ShowChar ((u8 x,u8 y,u8 chr,u8 Char_Size)
{
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, จุดถูกวาดในวงจร, และทั้งหมด 8 แถวของคอลัมน์ที่สองในหน้า 2 ถูกเขียนลงในข้อมูล
OLED_Set_Pos(x,y+1); เนื่องจากจํานวนจุดไม่เพียงพอ, คุณจําเป็นต้องดําเนินการจุดในคอลัมน์ 2 บนหน้า 3
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); ในอารมณ์สองมิติ C ควบคุมแถว และ I ควบคุมคอลัมน์ ดังนั้นไม่จําเป็นต้องใช้การปฏิบัติอื่น ๆ เพื่อจบการวาด
}
}
if ((x>120) ต่อไปนี้ไม่ใช่ความผิดพลาด เพราะ x+=8 ก่อนหน้านี้ มีคําอธิบายในข้อความต่อไปนี้ คุณสามารถคิดดูได้
void OLED_ShowString ((u8 x,u8 y,u8 *chr,u8 Char_Size) // แสดงสตริง
{
char j=0 ไม่ลงนาม
while (chr[j]!='0') // ตรวจสอบว่า string จะจบหรือไม่
{
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 หมายเลขถูกแสดงออก ทั้งสองถูกเขียนในรหัสด้านล่าง และควรสังเกตว่า "" ด้านล่างแสดงค่า ASCII ของ 32
m^n ฟังก์ชัน
u32 oled_pow ((u8 m,u8 n)
{
u32 ผล = 1;
while ((n--) ผลลัพธ์*=m
ผลตอบแทน
}
แสดง 2 ตัวเลข
x,y: ตําแหน่งเริ่มต้น
len: จํานวนหลักของตัวเลข
ขนาด: ขนาดตัวอักษร
โหมด: โหมด 0, โหมดเติม;
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); ต่อไป }else enshow=1; } การแสดงภาพ OLED Char ((x+(size2/2) *t,y,temp+'0',size2) } หลายอย่างข้างต้นเป็นการใช้หลักของเรา บาง Xi ต้องการที่จะใช้มันเพื่อดําเนินการที่แตกต่างกันมากขึ้นก่อนอื่นก็แนะนําโปรแกรมจําลองที่ใช้กันทั่วไป. PC เป็น LCD 2002 นี่คือวิธีการทํางาน! เมื่อเราใช้มัน, เราเปิดไฟล์ในมุมซ้ายบนและสร้างไฟล์ใหม่. กรอกความกว้างและความสูงของเรา, 6 * 8 หรือ 8 * 16 เป็นพื้นฐานนี้ที่จะใช้หม้อ, คุณสามารถตั้งขนาดด้วยตัวเองมีเครื่องยนต์ในมุมด้านบน, และเราต้องเปิดมันเมื่อเราตั้งขนาด เมื่อคุณมีทุกอย่างอยู่บนนั้น คุณสามารถวาดสิ่งที่คุณต้องการได้ เพราะ OLED คือ 128*64 ขนาดสูงสุดของเราคือนี่ เราสามารถเขียนได้บน 128*64 การวาด เป็นต้นซึ่งยังเป็นวิธีการที่จะเติมจอ, และมีโปรแกรมประดิษฐ์ภาพในด้านหลัง ซึ่งได้รับเป็นภาพ เช่นตัวละครอานิเมะบางตัว ตอนนี้เรานําเครื่องมือมาใช้แล้ว เราพร้อมที่จะดําเนินการ 1ดึงเส้นตรง 2: แสดงภาพ (เช่นตัวละครอานิเมะบางตัว) มันดูยาวไปหน่อย มีอีกหลายวิธีที่จะเล่น เพื่ออัพเดทต่อไป
โดยปกติเราใช้จุดเดียวกันกับในรูปด้านล่าง เมื่อเราอยากวาดเส้นตรง เรามักจะได้จุด เพราะขนาดตัวอักษรที่เราใช้โดยทั่วไปคือ 6 * 8 หรือ 8 * 16และขนาดจุดภายในไม่เต็มทั้งสี่เหลี่ยม (อธิบายไว้ข้างบน)สิ่งที่เราต้องทําคือเปิดโปรแกรมตัวละครของเรา และทําให้จุดที่ใหญ่กว่า!
ผู้ติดต่อ: Mrs. Christina
โทร: +8618922869670
แฟกซ์: 86-755-2370-9419