本帖最后由 芯圣电子官方QQ 于 2023-7-20 09:40 编辑
OLED屏大体分为2种,一是基于I2C接口的;另一类则是SPI接口的。 为此,用HC89F0541开发板做了一下简单的尝试。 该OLED屏与MCU的连接关系为: CS --- P2_4 RST --- P3_5 DC --- P3_4 SCLK ---P3_3 SDIN ---P1_7
显示字符函数为: void OLED_ShowChar(u8 x,u8 y,u8 chr)
{
unsigned char c=0,i=0;
c=chr-' ';
if(x>Max_Column-1){x=0;y=y+2;}
if(SIZE ==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else
{
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
显示字符串的函数为: void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
unsigned char j=0;
while (chr[j]!='\0')
{ OLED_ShowChar(x,y,chr[j]);
x+=8;
if(x>120){x=0;y+=2;}
j++;
}
}
显示汉字的函数为: void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{
u8 t,adder=0;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
adder+=1;
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
adder+=1;
}
}
若主程序如下: void main(void)
{
unsigned char i;
while((CLKCON&0x20)!=0x20);
CLKSWR = 0x51;
while((CLKSWR&0xC0)!=0x40);
CLKDIV = 0x01;
P2M4 = 0xC2;
P3M5 = 0xC2;
P3M4 = 0xC2;
P3M3 = 0xC2;
P1M7 = 0xC2;
delay_ms(5000);
OLED_Init();
while(1)
{
OLED_Clear();
OLED_ShowString(22,0,"OLED TEST");
OLED_ShowString(8,2," Jinglixixi");
OLED_ShowString(20,4,"2020/07/01");
delay_ms(50000);
OLED_Clear();
OLED_ShowCHinese(0,0,0);
OLED_ShowCHinese(18,0,1);
OLED_ShowCHinese(36,0,2);
OLED_ShowCHinese(54,0,3);
OLED_ShowCHinese(72,0,4);
OLED_ShowCHinese(90,0,5);
OLED_ShowCHinese(108,0,6);
delay_ms(50000);
}
}
则OLED屏显示中文字符,如图1所示。 图1 中文显示
显示字符串信息,图2所示。 图2 字符串显示
当使用I2C接口的OLED屏时,使OLED屏与MCU的连接关系为: SDA --- P3_5 SCK --- P3_4
在使用相同中文字库的情况下,也可显示出中文,如图3所示。 图3 中文显示
结论:两种接口的OLED屏在SDK-HC89F0541开发板上均可实现显示功能,只是I2C接口的要更节省些GPIO资源。值得注意的是在定义字库时,其存储数组应定义为uc8型,否则容易出现异常。
|