原子的OLED的界面很好看,所以自己就想一样也实现这种好看的显示功能,但是,原子的OLED界面不开源,那么,就
自己动动脑子想想是怎么实现的了。
我使用的是模拟SPI刷新OLED方式,每次都会刷一次全图,即128*8Byte的大小,所以,我建立了1K的缓冲,因为画板
的时候没有注意模拟SPI刷新这么大的图片慢的问题,所以帧率提不上去,下次会更换成硬件SPI方式。不过有的人喜欢用STM32,
以STM32的本事,模拟SPI能刷成STM8这些8位机的硬件SPI方式的速度也说不定,反正我不懂,哈哈哈。
不说废话,我说说我的方法,我首先建立一个可视缓冲区,OLED_Buff[8][128],不管什么图片,最后直接送进来缓冲区
然后再送到OLED显示就行了,下面贴上我的代码,目前实现的是:高度是8的倍数,长度任意的图片上下左右移动。
[mw_shl_code=c,true]void OLED_DrawBMP( int8_t StartX, int8_t StartY,
int8_t X_Len, int8_t Y_Len,
const uint8_t *pIMG)
{
uint8_t S_Page,E_Page;
uint8_t S_Line,E_Line;
uint8_t i,j,k =0;
if( (StartX+X_Len)>127 )//参数保护
return;
S_Page = StartY / 8;
E_Page = ( StartY+Y_Len ) /8;
S_Line = StartY % 8;
E_Line = (StartY+Y_Len)%8;
//坐标在页开始且高是页的倍数
if( (0 == S_Line) && ( 0 == E_Line ) )
{
k = 0;
for( i = S_Page; i< E_Page; i++ )
{
for( j = StartX; j< StartX+X_Len; j++ )
{
OLED_Buff[j] = pIMG[k++];
}
}
}
//坐标不在页开始且高是页的倍数
else if( S_Line == E_Line )
{
k = 0;
for( i = S_Page; i<= E_Page; i++ )
{
if( S_Page == i )//刷第一页
{
for( j = StartX; j< StartX + X_Len; j++)
{
// 用位或是为了不覆盖上方点阵显示
OLED_Buff[j] |= pIMG[k]<<(S_Line);
k++;
}
}
else if( (E_Page) == i )
{
for( j = StartX; j< StartX + X_Len; j++)
{
// 用位或是为了不覆盖下方点阵显示
OLED_Buff[j]| = pIMG[k-X_Len]>>(8-S_Line);
k++;
}
}
else
{
for( j = StartX; j< StartX + X_Len; j++)
{
OLED_Buff[j] = (pIMG[k-X_Len]>>(8-S_Line))|(pIMG[k]<<(S_Line));
k++;
}
}
}
}
}
[/mw_shl_code]
以上,还请原子等各路玩过OLED—GUI的指点指点!
一下,送上视频,http://v.youku.com/v_show/id_XOTQ0NzYxODk2.html
各位,请注意玩这个的时候,如果你不适用并口来刷屏,最好是使用RAM大一点的MCU,然后建立缓冲区来刷,当然,如果你静态显示1234,那当我没说。
写得不好的地方还请各位多多指教
2015/5/6更新:完成字符,汉字字库嵌入SpiFlash中并实现在OLED显示,支持ASCII,汉字混合显示(ASCII要求宽是汉字的一半,同长)
调用方式: OLED_DrawStr(x,y,宽度,高度,“字符串”);
|