以原子的HIFI中OLED的界面为目标,玩转OLED

2019-07-19 20:36发布

           原子的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,宽度,高度,“字符串”);


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。