本帖最后由 jinglixixi 于 2021-8-31 00:43 编辑
OLED屏有多种形式,按色彩分有单色、双色及彩色型,按尺寸规格分有0.91、0.96寸等类型,按接口分有I2C和SPI型。 从使用的角度看,0.96寸的彩色屏是一种比较有特色显示屏,其使用的接口为SPI方式,其引脚排列如图1所示。
图1 引脚排列 为了便于连接,本打算直接使用扩展接口,但无奈的是扩展接口与OLED屏的引脚排列方向与顺序有异。为此只好尽力按顺序来使用引脚,故OLED 屏与开发板的连接关系如下: VCC --- 3.3V GND --- GND SCL --- SCL SDA --- SDA RST ---D13 DC ---D12 CS ---D11 LEDB ---D10
图2 扩展接口 为了以I/O口来模拟SPI接口通讯,故对引脚输出高低电平的语句定义如下: #defineOLED_SCLK_Set() digitalWrite(SCL, HIGH) #defineOLED_SCLK_Clr() digitalWrite(SCL, LOW) #defineOLED_SDIN_Set() digitalWrite(SDA, HIGH) #defineOLED_SDIN_Clr() digitalWrite(SDA, LOW) #defineOLED_RST_Set() digitalWrite(RST, HIGH) #defineOLED_RST_Clr() digitalWrite(RST, LOW) #define OLED_DC_Set() digitalWrite(DC, HIGH) #defineOLED_DC_Clr() digitalWrite(DC, LOW) #defineOLED_CS_Set() digitalWrite(CS, HIGH) #defineOLED_CS_Clr() digitalWrite(CS, LOW) #defineOLED_BLK_Set() digitalWrite(LEDB, HIGH) #defineOLED_BLK_Clr() digitalWrite(LEDB, LOW) 为使OLED 屏的相关引脚能实现输出功能,其引脚的配置函数为:
- void App_OledInit(void)
- {
- pinMode(SCL,OUTPUT);
- pinMode(SDA,OUTPUT);
- pinMode(DC, OUTPUT);
- pinMode(RST,OUTPUT);
- pinMode(CS,OUTPUT);
- pinMode(LEDB, OUTPUT);
- }
复制代码
对OLED屏进行初始化的函数为:
- void Lcd_Init(void)
- {
- OLED_RST_Clr();
- delay(200);
- OLED_RST_Set();
- delay(200);
- LCD_WR_REG(0x11);
- delay(100);
- LCD_WR_REG(0x21);
- LCD_WR_REG(0xB1);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_REG(0xB2);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_REG(0xB3);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x05);
- LCD_WR_DATA8(0x3A);
- LCD_WR_DATA8(0x3A);
- LCD_WR_REG(0xB4);
- LCD_WR_DATA8(0x03);
- LCD_WR_REG(0xC0);
- LCD_WR_DATA8(0x62);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x04);
- LCD_WR_REG(0xC1);
- LCD_WR_DATA8(0xC0);
- LCD_WR_REG(0xC2);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x00);
- LCD_WR_REG(0xC3);
- LCD_WR_DATA8(0x8D);
- LCD_WR_DATA8(0x6A);
- LCD_WR_REG(0xC4);
- LCD_WR_DATA8(0x8D);
- LCD_WR_DATA8(0xEE);
- LCD_WR_REG(0xC5);
- LCD_WR_DATA8(0x0E);
- LCD_WR_REG(0xE0);
- LCD_WR_DATA8(0x10);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x07);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x12);
- LCD_WR_DATA8(0x27);
- LCD_WR_DATA8(0x37);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x10);
- LCD_WR_REG(0xE1);
- LCD_WR_DATA8(0x10);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x03);
- LCD_WR_DATA8(0x0F);
- LCD_WR_DATA8(0x06);
- LCD_WR_DATA8(0x02);
- LCD_WR_DATA8(0x08);
- LCD_WR_DATA8(0x0A);
- LCD_WR_DATA8(0x13);
- LCD_WR_DATA8(0x26);
- LCD_WR_DATA8(0x36);
- LCD_WR_DATA8(0x00);
- LCD_WR_DATA8(0x0D);
- LCD_WR_DATA8(0x0E);
- LCD_WR_DATA8(0x10);
- LCD_WR_REG(0x3A);
- LCD_WR_DATA8(0x05);
- LCD_WR_REG(0x36);
- LCD_WR_DATA8(0x78);
- LCD_WR_REG(0x29);
- OLED_BLK_Set();
- }
复制代码
完成OLED屏清屏的函数为:
- void LCD_Clear(u16 Color)
- {
- u16 i,j;
- LCD_Address_Set(0,0,LCD_W-1,LCD_H-1);
- for(i=0;i
- {
- for (j=0;j
- {
- LCD_WR_DATA(Color);
- }
- }
- }
复制代码
由于OLED屏并没有配置相应的显示字库,故需用相应的工具软件来提取字模,在字模提取软件中,PCtoLCD2002就是一种不错的功能软件。 在提取字模过程中,是有相应格式要求的,按图3所示的格式来进行设置即可。
图3提取格式 以提取汉字“中”的字模为例,需在输入框内录入相应“中”字,然后点击“生成字模”键即可完成提取,其结果如图4所示。
图4 提取字模 实现字符显示的函数为:
- void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color)
- {
- u8 temp;
- u8 pos,t;
- u16 x0=x;
- if(x>LCD_W-16||y>LCD_H-16) return;
- num=num-' ';
- LCD_Address_Set(x,y,x+8-1,y+16-1);
- if(!mode)
- {
- for(pos=0;pos<16;pos++)
- {
- temp=asc2_1608[(u16)num*16+pos];
- for(t=0;t<8;t++)
- {
- if(temp&0x01)LCD_WR_DATA(color);
- else LCD_WR_DATA(BACK_COLOR);
- temp>>=1;
- x++;
- }
- x=x0;
- y++;
- }
- }
- else
- {
- for(pos=0;pos<16;pos++)
- {
- temp=asc2_1608[(u16)num*16+pos];
- for(t=0;t<8;t++)
- {
- if(temp&0x01)LCD_DrawPoint(x+t,y+pos,color);
- temp>>=1;
- }
- }
- }
- }
复制代码
此外,为实现汉字的显示其程序如图5所示。
图5 汉字显示程序 实现图6所示效果的主程序为:
- void setup() {
- char Str4[ ] = "FireBeetle-ESP32";
- u8 i,N=123;
- pinMode(LED_PIN, OUTPUT);
- App_OledInit();
- Lcd_Init();
- LCD_Clear(RED);
- LCD_ShowChinese(0,2,0,16,WHITE);
- LCD_ShowChinese(16,2,1,16,WHITE);
- for(i=0;i<16;i++)
- {
- LCD_ShowChar(8*i,40,Str4[i],1,WHITE);
- }
- LCD_ShowNum(0,20,N,3,YELLOW);
- }
- void loop() {
- digitalWrite(LED_PIN, HIGH);
- delay(500 );
- digitalWrite(LED_PIN, LOW);
- delay(500 );
- }
复制代码
在程序中,由于Arduino IDE不支持指针类型,故在显示字符串时需用数组来解决。 有了字符、数值、字符串及中文显示功能的支持,后面再有相应的显示需要就可轻松实现了。 |