Jag kan nog få ner tiden en hel del men jag måste av någon anledning vänta ca 8µs mellan varje data byte till oled-skärmen. Sedan kan jag öka en buffer och få ner antalet läsningar från kortet.
Men härnäst ska jag nog försöka lista ut varför jag behöver vänta så "lång" tid mellan byten.
Om jag inte väntar eller väntar för kort tid så tar den inte emot alla pixlar.
Kod: Markera allt
#include "global_phone.h"
#include "oled.h"
#include "spi.h"
#include "font.h"
#include <math.h>
unsigned char oledOn=0;
unsigned char oledTermBuffer[128],oledTermX=0,oledTermY=0;
unsigned short oledTermColors[128];
void initOled()
{
unsigned char i;
OLED_CE=1;
OLED_SCK=1;
OLED_RESET=1;
__delay_ms(10);
OLED_RESET=0;
__delay_ms(100);
OLED_RESET=1;
oledCommand(0xAE);
OLED_12V_EN=1;
__delay_ms(100);
oledCommand(0xA0);
oledCommand(0x72);
oledCommand(0xA1);
oledCommand(0x00);
oledCommand(0xA2);
oledCommand(0x00);
oledCommand(0xA4);
oledCommand(0xA8);
oledCommand(0x3F);
oledCommand(0xAD);
oledCommand(0x8E);
oledCommand(0xB0);
oledCommand(0x0B);
oledCommand(0xB1);
oledCommand(0x31);
oledCommand(0xB3);
oledCommand(0xF0);
oledCommand(0x8A);
oledCommand(0x64);
oledCommand(0x8B);
oledCommand(0x78);
oledCommand(0x8C);
oledCommand(0x64);
oledCommand(0xBB);
oledCommand(0x3A);
oledCommand(0xBE);
oledCommand(0x3E);
oledCommand(0x87);
oledCommand(0x04);
oledCommand(0x81);
oledCommand(0x91);
oledCommand(0x82);
oledCommand(0x50);
oledCommand(0x83);
oledCommand(0x7D);
oledCommand(0xAF);
oledCommand(0x15);
oledCommand(0);
oledCommand(95);
oledCommand(0x75);
oledCommand(0);
oledCommand(63);
oledRectFill(0,0,95,63,0,0);
for(i=0;i<128;i++)
oledTermBuffer[i]=' ';
__delay_ms(1);
//oledOn=1;
}
void exitOled()
{
oledCommand(0xAE);
__delay_ms(200);
OLED_12V_EN=0;
__delay_ms(100);
}
void oledCommand(unsigned char cmd)
{
OLED_DC=0;
OLED_CE=0;
WriteSPI2(cmd);
while(SPI2_Tx_Buf_Full);
__delay_us(10);
OLED_CE=1;
}
void oledData(unsigned short cmd)
{
OLED_DC=1;
OLED_CE=0;
WriteSPI2((cmd&0xFF00)>>8);
while(SPI2_Tx_Buf_Full);
__delay_us(8);
OLED_CE=1;
OLED_CE=0;
WriteSPI2(cmd&0x00FF);
while(SPI2_Tx_Buf_Full);
__delay_us(8);
OLED_CE=1;
}
void oledRectFill(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned short colorLine, unsigned short colorFill)
{
oledCommand(0x26);
oledCommand(0x01);
oledCommand(0x22);
oledCommand(x1);
oledCommand(y1);
oledCommand(x2);
oledCommand(y2);
oledCommand((colorLine&0xF800)>>10);
oledCommand((colorLine&0x001F)<<1);
oledCommand((colorLine&0x07E0)>>5);
oledCommand((colorFill&0xF800)>>10);
oledCommand((colorFill&0x001F)<<1);
oledCommand((colorFill&0x07E0)>>5);
}
void oledRect(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned short colorLine)
{
oledCommand(0x26);
oledCommand(0x00);
oledCommand(0x22);
oledCommand(x1);
oledCommand(y1);
oledCommand(x2);
oledCommand(y2);
oledCommand((colorLine&0xF800)>>10);
oledCommand((colorLine&0x001F)<<1);
oledCommand((colorLine&0x07E0)>>5);
oledCommand(0);
oledCommand(0);
oledCommand(0);
}
void oledLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned short colorLine)
{
oledCommand(0x21);
oledCommand(x1);
oledCommand(y1);
oledCommand(x2);
oledCommand(y2);
oledCommand((colorLine&0xF800)>>10);
oledCommand((colorLine&0x001F)<<1);
oledCommand((colorLine&0x07E0)>>5);
}
void oledBatt(unsigned char level)
{
unsigned char boxes=ceil(level/20.0),i;
oledRect(73,5,74,9,0xFFFF);
oledRect(75,2,94,12,0xFFFF);
oledRectFill(76,3,93,11,0xFFFF,0);
if(level==200)
{
oledLine(86,5,88,5,0xFFFF);
oledLine(85,6,90,6,0xFFFF);
oledLine(79,7,88,7,0xFFFF);
oledLine(85,8,90,8,0xFFFF);
oledLine(86,9,88,9,0xFFFF);
}
else
{
for(i=0;i<5;i++)
{
if(boxes)
{
boxes--;
oledRect(90-(i*3),5,91-(i*3),9,0xFFFF);
}
else
oledRect(90-(i*3),5,91-(i*3),9,color(12,23,12));
}
}
}
void oledCSQ(unsigned char level)
{
unsigned char boxes=ceil(level/6.0),i;
for(i=0;i<5;i++)
{
if(boxes)
{
boxes--;
oledRect(2+(i*3),10-(i*2),3+(i*3),12,0xFFFF);
}
else
oledRect(2+(i*3),10-(i*2),3+(i*3),12,color(12,23,12));
}
}
void oledPutChar(unsigned char x, unsigned char y, unsigned char chr, unsigned short color)
{
unsigned char i,byte,j;
oledCommand(0xA0);
oledCommand(0x73);
oledCommand(0x15);
oledCommand(x*6);
oledCommand(x*6+4);
oledCommand(0x75);
oledCommand(y*8);
oledCommand(y*8+7);
for(i=0;i<5;i++)
{
byte=font[(chr-' ')*5+i];
for(j=0;j<8;j++)
{
if((byte<<j)&0x80)
oledData(color);
else
oledData(0);
}
}
}
void oledPutStr(unsigned char x, unsigned char y, char *str, unsigned short color)
{
while(*str)
oledPutChar(x++,y,*str++,color);
}
void oledPushStr(char *str, unsigned short color)
{
unsigned char i,j;
while(*str)
{
switch(*str)
{
case '\n':
oledTermX=0;
/*for(i=oledTermX;i<16;i++)
{
oledTermBuffer[oledTermX+oledTermY*16]=' ';
oledPutChar(oledTermX+i,oledTermY,' ',0);
}*/
oledTermY++;
*str++;
break;
default:
oledTermBuffer[oledTermX+oledTermY*16]=*str;
oledTermColors[oledTermX+oledTermY*16]=color;
oledPutChar(oledTermX++,oledTermY,*str++,color);
break;
}
if(oledTermX>15)
{
oledTermX=0;
oledTermY++;
}
if(oledTermY>7)
{
oledTermY=7;
for(j=0;j<7;j++)
{
for(i=0;i<16;i++)
{
oledTermBuffer[i+j*16]=oledTermBuffer[i+j*16+16];
oledTermColors[i+j*16]=oledTermColors[i+j*16+16];
oledPutChar(i,j,oledTermBuffer[i+j*16],oledTermColors[i+j*16]);
}
}
for(i=0;i<16;i++)
oledPutChar(i,7,' ',0);
}
}
}