显示效果如下图:
(图10)文字显示效果
9.OLED屏幕图片显示
照片显示和文字显示原理相同,也是点亮相对应的像素点。
该函数当中,x0 ,y0表示的是图片所显示的的起始坐标,x1 表示的是图片像素的x轴所占的像素,y1表示的是页数(0-7)
将想要显示的图片,转换成BMP格式之后,通过PCtolCD2002的图片模式进行转换。设置如下:选择阴码,逆向,十六进制输出。
(图11)图片取模选项设置
(图12)图片取模界面
将所生成的十六进制数据进行,修改对齐后,装到BMP数组当中。在主函数当中就可以直接显示了,效果如下图。
(图13)图片显示效果
后记
在调试当中遇到的一些需要注意的点:
1、在freeRTOS下,使用OLED屏幕的话,需要预先启用SPI相对于的IOM 口。
需要用到函数:
am_hal_pwrctrl_periph_enable(uint32_t ui32Peripheral)进行相应的配置。同理在进行低功耗处理的时候,可以关闭SPI接口。
am_hal_pwrctrl_periph_enable(uint32_t ui32Peripheral)
{
am_hal_debug_assert_msg(ONE_BIT(ui32Peripheral),
"Cannot enable more than one peripheral at a time.");
//
// Begin critical section.
//
AM_CRITICAL_BEGIN_ASM
//
// Enable power control for the given device.
//
AM_REG(PWRCTRL, DEVICEEN) |= ui32Peripheral;
//
// End Critical Section.
//
AM_CRITICAL_END_ASM
//
// Wait for the power to stablize. Using a simple delay loop is more
// power efficient than a polling loop.
//
am_hal_flash_delay(AM_HAL_PWRCTRL_DEVICEEN_DELAYCYCLES / 3);
//
// Quick check to guarantee we're good (should never be more than 1 read).
//
POLL_PWRSTATUS(ui32Peripheral);
}
2、OLED屏幕在进行Clear的时候,屏幕不干净
(图14)屏幕刷新有残留
原因是:写到寄存器第一列和第二列的数据被驱动芯片当做乱码并在 显示屏的最后一列显示出来。修改如下:
把程序中“所有 X”轴的值改成 132,如下图定义的是 X 轴与 Y 轴。
同时,clear函数里面,循环发送数据的次数,也应该从n<128 改为 n<132。
3、图片显示函数
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1,
unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
if(y1%8==0) y=y1/8;
else y=y1/8+1;
for(y=y0;y<y1;y++)
{
OLED_Set_Pos(x0,y);
for(x=x0;x<x1;x++)
{
OLED_WR_Byte(BMP[j++],OLED_DATA);
}
}
}
在使用该函数的时候,首先要注意的是,y1表示的是页数(0-7)也就是前文指的page,而不是你所给照片取模的Y轴的像素。其次在照片取模当中,尽量控制为128*64的大小。如果图片大小无法满足,则在使用OLED_DrawBMP()的时候,x与x1的数据差应该就是你图片的像素大小。
例如:
我的照片大小为 (92 X 60 ),如果选择屏幕显示的起始坐标点为(0,0)
则函数为:OLED_DrawBMP(0,0,92,7,BMP);
但是当你想移动图片的位置,修改为
OLED_DrawBMP(18,0,92,7,BMP);显示的结果会出现乱码。正确的方式是改为OLED_DrawBMP(18,0,110,7,BMP);
文章来源:润欣科技Fortune微信公众号