Closed olikraus closed 8 years ago
/* Test code for driving UG2828GDEAF02 1,5# OLED ZhangFeng, PRC. zjjszhangf@gmail.com http://vfdclock.jimdo.com 01-18-2014 */
// 4-wire SPI(BS1=0; BS2=0)
// rst
// cs
// DC (Data or Command)
// data in
// clock
// HVEN(optional)
// Fast IO version // pin map please check: http://arduino.cc/en/Hacking/Atmega168Hardware // pin11 = pb3; pin12 = pb4; pin15 = pb5
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Delay Time //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void uDelay1(unsigned char l) { while(l--) { //asm("nop\n\t""nop\n\t""nop\n\t""nop\n\t"); //asm("nop\n\t""nop\n\t""nop\n\t""nop\n\t"); }; }
inline void Write_Command(unsigned char Data) { unsigned char i; OLED_CS_0; OLED_DC_0; for (i=0; i<8; i++) { OLED_CLK_0; if((Data&0x80)>>7) OLED_DIN_1; else OLED_DIN_0; Data = Data << 1; uDelay(1); OLED_CLK_1; uDelay(1); } OLED_CLK_0; OLED_DC_1; OLED_CS_1; }
inline void Write_Data(unsigned char Data) { unsigned char i;
OLED_CS_0; OLED_DC_1; for (i=0; i<8; i++) { OLED_CLK_0; if((Data&0x80)>>7) OLED_DIN_1; else OLED_DIN_0; Data = Data << 1; uDelay(1); OLED_CLK_1; uDelay(1); } OLED_CLK_0; OLED_DC_1; OLED_CS_1; }
void OLED_InitIOs(void) { OLED_RES_1; OLED_CS_1; OLED_CLK_1; OLED_DIN_1; OLED_DC_1; }
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Initialization //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void OLED_Init(void) { unsigned char i;
OLED_RES_0; for(i=0;i<200;i++) { delay(1); // delay } OLED_RES_1;
// Disp OFF Write_Command(0x06); Write_Data(0x00);
// OSC_CTL
Write_Command(0x02);
Write_Data(0x01);
// CLOCK_DIV
Write_Command(0x03);
Write_Data(0x30);
// REDUCE_CURRENT
Write_Command(0x04);
Write_Data(0x00);
// SOFT RET
Write_Command(0x05);
Write_Data(0x00);
// PRECHARGE_TIME_R
Write_Command(0x08);
Write_Data(0x03);
// PRECHARGE_TIME_G
Write_Command(0x09);
Write_Data(0x04);
// PRECHARGE_TIME_B
Write_Command(0x0A);
Write_Data(0x05);
// PRECHARGE_CURRENT_R
Write_Command(0x0B);
Write_Data(0x0B);
// PRECHARGE_CURRENT_G
Write_Command(0x0C);
Write_Data(0x0B);
// PRECHARGE_CURRENT_B
Write_Command(0x0D);
Write_Data(0x0E);
// DRIVING_CURRENT_R
Write_Command(0x10);
Write_Data(0x3E);
// DRIVING_CURRENT_G
Write_Command(0x11);
Write_Data(0x32);
// DRIVING_CURRENT_B
Write_Command(0x12);
Write_Data(0x3D);
// DISPLAY MODE SET
Write_Command(0x13);
Write_Data(0x00);
// RGB_IF
Write_Command(0x14);
Write_Data(0x01);
// RGB_POL
Write_Command(0x15);
Write_Data(0x00);
// MEMORY WRITE MODE
// 6bit3 262k color
/
Write_Command(0x16);
WriteData(0x76);
/
// 8bit_2 64k color
Write_Command(0x16);
Write_Data(0x66);
// MX1_ADDR
Write_Command(0x17);
Write_Data(0x00);
// MX2_ADDR
Write_Command(0x18);
Write_Data(0x7F);
// MY1_ADDR
Write_Command(0x19);
Write_Data(0x00);
// MY2_ADDR
Write_Command(0x1A);
Write_Data(0x7F);
// MEMORY ACCESS POINTER X
Write_Command(0x20);
Write_Data(0x00);
// MEMORY ACCESS POINTER Y
Write_Command(0x21);
Write_Data(0x00);
// DUTY
Write_Command(0x28);
Write_Data(0x7F);
// DSL
Write_Command(0x29);
Write_Data(0x00);
// D1 DDRAM FAC
Write_Command(0x2E);
Write_Data(0x00);
// D1 DDRAM FAR
Write_Command(0x2F);
Write_Data(0x00);
// D1 DDRAM SAC
Write_Command(0x31);
Write_Data(0x00);
// D1 DDRAM SAR
Write_Command(0x32);
Write_Data(0x00);
// SCR1_FX1
Write_Command(0x33);
Write_Data(0x00);
// SCR1_FX2
Write_Command(0x34);
Write_Data(0x7F);
// SCR1_FY1
Write_Command(0x35);
Write_Data(0x00);
// SCR1_FY2
Write_Command(0x36);
Write_Data(0x7F);
// IREF
Write_Command(0x80);
Write_Data(0x00);
// Display ON
// Write_Command(0x06);
// Write_Data(0x01);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Instruction Setting //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // "0x00" => 65,536 Colors Mode // "0x01" => 262,144 Colors Mode
// Set_Pixel_Format(0x66|((Color_Depth<<4)&0x70));
void Set_Pixel_Format(unsigned char d) { Write_Command(0x16); // Set Memory Access Control / Interface Pixel Format (MEMORY_WRITE_MODE) Write_Data(d); // Default => 0x06 // Enable 18-bit Bus Interface // 262,144 Colors // Horizontal address counter is increased. // Vertical address counter is increased. // The data is continuously written horizontally. }
void Set_Display_On_Off(unsigned char d) { Write_Command(0x06); // Set Display On/Off (DISP_ON_OFF) Write_Data(d); // Default => 0x00 // Scan signal is high level at pre-charge period. // Display Off }
inline void Set_Column_Address(unsigned char a, unsigned char b) { Write_Command(0x17); // Set Column Address of Start (MX1_ADDR) Write_Data(a); // Default => 0x00 Write_Command(0x18); // Set Column Address of End (MX2_ADDR) Write_Data(b); // Default => 0x9F }
inline void Set_Row_Address(unsigned char a, unsigned char b) { Write_Command(0x19); // Set Row Address of Start (MY1_ADDR) Write_Data(a); // Default => 0x00 Write_Command(0x1A); // Set Row Address of End (MY2_ADDR) Write_Data(b); // Default => 0x7F }
inline void Set_Display_Offset(unsigned char a, unsigned char b) { Write_Command(0x20); // Specify the Horizontal Start Position of a Window for Written in Memory (MEMORY_ACCESSPOINTER X) Write_Data(a); // Default => 0x00 Write_Command(0x21); // Specify the Vertical Start Position of a Window for Written in Memory (MEMORY_ACCESSPOINTER Y) Write_Data(b); // Default => 0x00 }
inline void Set_Write_RAM() { Write_Command(0x22); // Internal DDRAM Memory Access (DDRAM_DATA_ACCESS_PORT) }
void Fill_RAM(unsigned char a, unsigned char b) { unsigned char i,j;
Set_Display_Offset(0x00,0x00); Set_Column_Address(0x00,0x7F); Set_Row_Address(0x00,0x7F); Set_Write_RAM();
for(i=0;i<128;i++) { for(j=0;j<160;j++) { Write_Data(a); Write_Data(b); } } }
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Show Regular Pattern (Partial or Full Screen) // // a: Column Address of Start // b: Column Address of End // c: Row Address of Start // d: Row Address of End // e: RRRRRGGG // f: GGGBBBBB //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Fill_Block(unsigned char a, unsigned char b, unsigned char c, unsigned char d, unsigned char e, unsigned char f) { unsigned char i,j;
Set_Display_Offset(a,c); Set_Column_Address(a,b); Set_Row_Address(c,d); Set_Write_RAM();
for(i=0;i<(d-c+1);i++) { for(j=0;j<(b-a+1);j++) { Write_Data(e); Write_Data(f); } } }
void Fill_Block64k(unsigned char xLeft, unsigned char yTop, unsigned char xRight, unsigned char yBottom, unsigned short int colFill) { unsigned char i,j,w,h,col1,col2;
col1 = colFill>>8; //Line Color - CCCCCBBB col2 = colFill&0xff; // Line Color - BBBAAAAA w = (yBottom-yTop+1); h = (xRight-xLeft+1); Set_Display_Offset(xLeft,yTop); Set_Column_Address(xLeft,xRight); Set_Row_Address(yTop,yBottom);
Set_Write_RAM();
for(i=0;i<w;i++) {
for(j=0;j<h;j++) {
Write_Data(col1);
Write_Data(col2);
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// First Screen Active Range (Partial or Full Screen)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void First_Screen_Range(unsigned char x1, unsigned char x2, unsigned char y1, unsigned char y2)
{
Write_Command(0x2E); // Set Column Address of Start Point (D1_DDRAM_FAC)
Write_Data(x1); // Default => 0x00
Write_Command(0x2F); // Set Row Address of Start Point (D1_DDRAM_FAR)
Write_Data(y1); // Default => 0x9F
Write_Command(0x33); // Set Column Address of Start (SCR1_FX1)
Write_Data(x1); // Default => 0x00
Write_Command(0x34); // Set Column Address of End (SCR1_FX2)
Write_Data(x2); // Default => 0x9F
Write_Command(0x35); // Set Row Address of Start (SCR1_FY1)
Write_Data(y1); // Default => 0x00
Write_Command(0x36); // Set Row Address of End (SCR1_FY2)
Write_Data(y2); // Default => 0x7F
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Patterns //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Show_64k_Pattern_BigEndian(unsigned char Data_Pointer, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) { unsigned char Src_Pointer; unsigned char i,j;
Src_Pointer=Data_Pointer;
Set_Display_Offset(x1,y1); Set_Column_Address(x1,x2); Set_Row_Address(y1,y2); Set_Write_RAM();
for(i=0;i<(y2-y1+1);i++) { for(j=0;j<(x2-x1+1);j++) { Write_Data(_Src_Pointer); Src_Pointer++; Write_Data(_Src_Pointer); Src_Pointer++; } } }
void Show_64k_Pattern_LittleEndia(unsigned char Data_Pointer, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) { unsigned char Src_Pointer; unsigned char i,j;
Src_Pointer=Data_Pointer;
Set_Display_Offset(x1,y1); Set_Column_Address(x1,x2); Set_Row_Address(y1,y2); Set_Write_RAM();
for(i=0;i<(y2-y1+1);i++) { for(j=0;j<(x2-x1+1);j++) { WriteData((Src_Pointer+1)); WriteData((Src_Pointer)); Src_Pointer+=2; } } }
void Draw_Point64k_Slow(unsigned char x, unsigned char y, unsigned short int col) { Set_Display_Offset(x,y); Set_Column_Address(x,x); Set_Row_Address(y,y); Set_Write_RAM();
Write_Data(col>>8); // Line Color - CCCCCBBB Write_Data(col&0xff); // Line Color - BBBAAAAA }
/* Draw_line : algorithm by Jack Bresenham */
void Draw_Line64k(int X1, int Y1, int X2, int Y2, uint16_t col)
{
int dy;
int dx;
int StepX, StepY;
int Fraction;
dy = Y2 - Y1; dx = X2 - X1;
if (dy < 0) { dy = -dy; StepY = -1; } else StepY = 1;
if (dx < 0) { dx = -dx; StepX = -1; } else StepX = 1;
dy <<= 1; // dy is now 2_dy dx <<= 1; // dx is now 2_dx DrawPoint( X1, Y1, col);
if (dx > dy)
{
Fraction = dy - (dx >> 1); // same as 2_dy - dx
while (X1 != X2)
{
if (Fraction >= 0)
{
Y1 += StepY;
Fraction -= dx; // same as fraction -= 2_dx
}
X1 += StepX;
Fraction += dy; // same as fraction -= 2*dy
DrawPoint( X1, Y1, col);
}
}
else
{
Fraction = dx - (dy >> 1);
while (Y1 != Y2)
{
if (Fraction >= 0)
{
X1 += StepX;
Fraction -= dy;
}
Y1 += StepY;
Fraction += dx;
DrawPoint( X1, Y1, col);
}
}
}
// å «å¯¹ç§°æ§ inline void _draw_circle_8(int xc, int yc, int x, int y, unsigned short int c) { // åæ° c 为é¢è²å¼ DrawPoint(xc + x, yc + y, c); DrawPoint(xc - x, yc + y, c); DrawPoint(xc + x, yc - y, c); DrawPoint(xc - x, yc - y, c); DrawPoint(xc + y, yc + x, c); DrawPoint(xc - y, yc + x, c); DrawPoint(xc + y, yc - x, c); DrawPoint(xc - y, yc - x, c); }
//Bresenham's circle algorithm void Draw_Circle64k(int xc, int yc, int r, int fill, unsigned short int c) { // (xc, yc) 为åå¿ï¼r 为åå¾ // fill 为æ¯å¦å¡«å // c 为é¢è²å¼
// å¦æåå¨å¾çå¯è§åºåå¤ï¼ç´æ¥éåº
if (xc + r < 0 || xc - r >= Max_Column ||
yc + r < 0 || yc - r >= Max_Row) return;
int x = 0, y = r, yi, d;
d = 3 - 2 * r;
if (fill) {
// å¦æå¡«å
ï¼ç»å®å¿åï¼
while (x <= y) {
for (yi = x; yi <= y; yi ++)
_draw_circle_8(xc, yc, x, yi, c);
if (d < 0) {
d = d + 4 * x + 6;
} else {
d = d + 4 * (x - y) + 10;
y --;
}
x++;
}
} else {
// å¦æä¸å¡«å
ï¼ç»ç©ºå¿åï¼
while (x <= y) {
_draw_circle_8(xc, yc, x, y, c);
if (d < 0) {
d = d + 4 * x + 6;
} else {
d = d + 4 * (x - y) + 10;
y --;
}
x ++;
}
}
} //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Show Checkboard (Full Screen) //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Checkerboard() { unsigned char i,j;
Set_Display_Offset(0x00,0x00); Set_Column_Address(0x00,0x9F); Set_Row_Address(0x00,0x7F); Set_Write_RAM();
for(i=0;i<64;i++) { for(j=0;j<80;j++) { Write_Data(0xFF); Write_Data(0xFF); Write_Data(0x00); Write_Data(0x00); } for(j=0;j<80;j++) { Write_Data(0x00); Write_Data(0x00); Write_Data(0xFF); Write_Data(0xFF); } } }
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Show Color Bar (Full Screen) //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Rainbow() { // White => Column 1~20 Fill_Block(0x00,0x10,0x00,Max_Row,0xFF,0xFF);
// Yellow => Column 21~40 Fill_Block(0x10,0x20,0x00,Max_Row,0xFF,0xE0);
// Purple => Column 41~60 Fill_Block(0x20,0x30,0x00,Max_Row,0xF8,0x1F);
// Cyan => Column 61~80 Fill_Block(0x30,0x40,0x00,Max_Row,0x07,0xFF);
// Red => Column 81~100 Fill_Block(0x40,0x50,0x00,Max_Row,0xF8,0x00);
// Green => Column 101~120 Fill_Block(0x50,0x60,0x00,Max_Row,0x07,0xE0);
// Blue => Column 121~140 Fill_Block(0x60,0x70,0x00,Max_Row,0x00,0x1F);
// Black => Column 141~160 Fill_Block(0x70,Max_Column,0x00,Max_Row,0x00,0x00); }
const unsigned char Icon24x24x64k[] ={ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x7b,0xf7,0xd6,0xee,0x73,0xe6,0x52,0xe6,0x51,0xe6,0x93,0xe6,0xd6,0xee,0x7b,0xf7, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x18,0xef,0x30,0xde, 0x0e,0xe6,0x6f,0xee,0x8f,0xee,0xd0,0xf6,0xf0,0xf6,0x90,0xee,0x6f,0xee,0x0e,0xe6, 0x10,0xe6,0xf8,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xff,0x52,0xe6,0x0e,0xe6,0xf1,0xf6, 0x50,0xff,0x2e,0xff,0x0c,0xff,0xec,0xfe,0xec,0xfe,0xec,0xfe,0x0d,0xff,0x10,0xff, 0xd0,0xf6,0x0d,0xe6,0x31,0xe6,0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0xf7,0xef,0xdd,0x8f,0xee,0x2f,0xff,0xcb,0xfe, 0xa8,0xfe,0xc8,0xfe,0xa8,0xfe,0xa8,0xfe,0xa7,0xfe,0xa7,0xfe,0x87,0xfe,0x87,0xfe, 0x8a,0xfe,0xee,0xfe,0x4d,0xee,0xae,0xdd,0x9d,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xbd,0xff,0xef,0xdd,0x8e,0xf6,0x0c,0xff,0xa8,0xfe,0xa8,0xfe, 0xa9,0xfe,0xc8,0xfe,0xa9,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0x68,0xfe,0x67,0xfe, 0x66,0xfe,0x66,0xfe,0xaa,0xfe,0x2c,0xee,0xce,0xdd,0xbd,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0x93,0xe6,0x6c,0xee,0x0b,0xff,0xa8,0xfe,0xa9,0xfe,0xc9,0xfe, 0xa9,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0x88,0xfe,0x67,0xfe,0x67,0xfe, 0x67,0xfe,0x47,0xfe,0x06,0xfe,0x68,0xfe,0x0b,0xee,0x73,0xe6,0xff,0xff,0xff,0xff,
0xff,0xff,0x5a,0xf7,0x0b,0xe6,0xca,0xfe,0xa8,0xfe,0xa9,0xfe,0xc9,0xfe,0xc9,0xfe, 0xc8,0xfe,0xc8,0xfe,0xa8,0xfe,0xa8,0xfe,0x88,0xfe,0x67,0xfe,0x87,0xfe,0x87,0xfe, 0x26,0xfe,0x26,0xfe,0x26,0xfe,0x25,0xfe,0x28,0xfe,0xaa,0xe5,0x39,0xef,0xff,0xff,
0xff,0xff,0x52,0xe6,0x89,0xf6,0xe8,0xfe,0xc9,0xfe,0xa9,0xfe,0xa9,0xfe,0x88,0xfe, 0xc6,0xe5,0x27,0xee,0xa8,0xfe,0x67,0xfe,0x67,0xfe,0x67,0xfe,0xe6,0xed,0x65,0xe5, 0x26,0xfe,0x26,0xfe,0x26,0xfe,0xe6,0xfd,0xe5,0xfd,0xa6,0xf5,0x31,0xde,0xff,0xff,
0x9d,0xf7,0xeb,0xe5,0x87,0xfe,0xc7,0xfe,0xc8,0xfe,0xa8,0xfe,0xe8,0xfe,0x45,0xd5, 0xc0,0x8a,0xa2,0xab,0x47,0xf6,0x87,0xfe,0x87,0xfe,0x06,0xf6,0x82,0xa3,0xe1,0x92, 0x24,0xdd,0x26,0xfe,0xe6,0xfd,0xe5,0xf5,0xa4,0xfd,0x44,0xfd,0x49,0xdd,0x9d,0xf7,
0x19,0xef,0x86,0xe5,0x87,0xfe,0x67,0xfe,0x87,0xfe,0x87,0xfe,0xa7,0xfe,0xe3,0xb3, 0x80,0x8a,0xc0,0x92,0xa6,0xe5,0x67,0xfe,0x87,0xfe,0x45,0xe5,0xc0,0x92,0xa0,0x8a, 0x23,0xbc,0x06,0xfe,0xa5,0xf5,0x84,0xf5,0x44,0xf5,0x23,0xfd,0xe4,0xdc,0x39,0xef,
0xd7,0xee,0xc5,0xe5,0x87,0xfe,0x67,0xfe,0x67,0xfe,0x67,0xfe,0x87,0xfe,0x66,0xbc, 0x00,0x72,0xe2,0x8a,0xc8,0xed,0x06,0xfe,0x06,0xfe,0x87,0xed,0xc2,0x8a,0x40,0x72, 0x45,0xc4,0xa5,0xfd,0x64,0xf5,0x64,0xf5,0x24,0xf5,0x03,0xfd,0xc3,0xe4,0xd5,0xee,
0x95,0xe6,0xe5,0xed,0x87,0xfe,0x67,0xfe,0x67,0xfe,0x47,0xfe,0x26,0xfe,0x2b,0xf6, 0xec,0xbc,0x8c,0xd5,0x07,0xfe,0xe5,0xfd,0xc4,0xfd,0xc6,0xfd,0x2b,0xcd,0xab,0xbc, 0x89,0xf5,0x63,0xfd,0x44,0xf5,0x24,0xf5,0x24,0xf5,0x23,0xfd,0xc2,0xe4,0x73,0xe6,
0xb6,0xee,0xa5,0xed,0x67,0xfe,0x67,0xfe,0x27,0xfe,0x26,0xfe,0x26,0xfe,0x26,0xfe, 0x8b,0xfe,0x49,0xfe,0xe5,0xfd,0xc6,0xf5,0xa5,0xfd,0x84,0xf5,0xe7,0xfd,0x09,0xfe, 0x64,0xfd,0x43,0xf5,0x24,0xf5,0x04,0xf5,0x24,0xf5,0x23,0xf5,0xc2,0xe4,0x94,0xe6,
0xf8,0xee,0x85,0xe5,0x46,0xfe,0x27,0xfe,0x26,0xfe,0x25,0xfe,0xe5,0xf5,0xe6,0xf5, 0xe6,0xfd,0xe6,0xfd,0xe7,0xfd,0xc7,0xfd,0xa7,0xfd,0xa6,0xfd,0x65,0xf5,0x44,0xf5, 0x24,0xed,0x23,0xfd,0x24,0xfd,0x24,0xf5,0x04,0xf5,0x03,0xfd,0xa3,0xe4,0xf7,0xee,
0x5b,0xf7,0x87,0xe5,0x26,0xfe,0x26,0xfe,0x26,0xfe,0x45,0xdd,0xe6,0xd4,0xe6,0xfd, 0x07,0xfe,0x29,0xfe,0x2b,0xfe,0x2b,0xfe,0x0b,0xfe,0xe9,0xfd,0xc8,0xfd,0x86,0xfd, 0xe5,0xe4,0x44,0xcc,0x03,0xf5,0x24,0xf5,0x04,0xf5,0xe3,0xfc,0xc5,0xdc,0x5b,0xf7,
0xff,0xff,0xcd,0xdd,0xe5,0xf5,0x26,0xfe,0xe5,0xf5,0x07,0xcd,0x49,0xdd,0xe5,0xd4, 0x05,0xdd,0x87,0xed,0xea,0xf5,0x2c,0xfe,0x0c,0xfe,0xa9,0xf5,0x46,0xed,0x83,0xd4, 0x86,0xcc,0xa8,0xcc,0xa3,0xe4,0x03,0xfd,0x03,0xfd,0xc3,0xf4,0x6b,0xdd,0xde,0xff,
0xff,0xff,0x95,0xe6,0x86,0xe5,0x06,0xfe,0xe6,0xfd,0xa8,0xed,0xe7,0xfd,0xa9,0xe5, 0xe9,0xcc,0x67,0xbc,0x67,0xbc,0x67,0xbc,0x47,0xbc,0x27,0xb4,0x47,0xb4,0xc9,0xc4, 0x48,0xed,0x26,0xf5,0x04,0xf5,0x03,0xfd,0x03,0xfd,0xc4,0xe4,0x95,0xe6,0xff,0xff,
0xff,0xff,0xbe,0xff,0xac,0xdd,0xc6,0xf5,0xe6,0xfd,0xc6,0xfd,0x85,0xfd,0xc5,0xfd, 0xc7,0xfd,0xe9,0xf5,0xca,0xf5,0x8a,0xed,0x6a,0xed,0x8a,0xed,0xa9,0xf5,0x66,0xfd, 0x23,0xfd,0x04,0xf5,0x03,0xf5,0x03,0xfd,0x04,0xf5,0x6a,0xdd,0xbe,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0x19,0xef,0x47,0xdd,0xc6,0xfd,0xa5,0xfd,0x64,0xf5,0x65,0xf5, 0x64,0xf5,0x43,0xfd,0x23,0xfd,0x23,0xfd,0x23,0xfd,0x03,0xfd,0x02,0xfd,0x03,0xf5, 0x03,0xf5,0x03,0xf5,0x23,0xfd,0x25,0xfd,0xe6,0xdc,0x18,0xef,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0xe6,0x26,0xd5,0xc7,0xf5,0x85,0xfd,0x44,0xf5, 0x24,0xf5,0x44,0xf5,0x23,0xf5,0x24,0xf5,0x23,0xf5,0x23,0xf5,0x03,0xf5,0xe3,0xf4, 0xe3,0xf4,0x45,0xfd,0x66,0xf5,0xe5,0xdc,0x95,0xee,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb6,0xe6,0x49,0xdd,0x87,0xf5,0xa7,0xfd, 0x66,0xfd,0x24,0xf5,0x23,0xf5,0x23,0xf5,0x03,0xf5,0xe3,0xf4,0x04,0xf5,0x46,0xfd, 0x67,0xfd,0x46,0xed,0x07,0xd5,0xb6,0xe6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0xf7,0xce,0xdd,0x27,0xdd, 0x47,0xed,0x67,0xf5,0x87,0xfd,0x67,0xfd,0x67,0xfd,0x87,0xfd,0x67,0xfd,0x46,0xed, 0x06,0xdd,0xad,0xdd,0x3a,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x19,0xef, 0x10,0xe6,0x6b,0xdd,0x49,0xe5,0x48,0xe5,0x28,0xe5,0x48,0xdd,0x6a,0xdd,0x10,0xe6, 0x18,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x7c,0xf7,0x5a,0xf7,0x5a,0xef,0x7c,0xf7,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x7c,0xf7,0x5a,0xf7,0x5a,0xef,0x7c,0xf7,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, };
void draw_lines(void) { unsigned char x1,y1,x2,y2; unsigned short int i;
for (i=0; i<1000; i++) { x1=rand()%127; x2=rand()%127; y1=rand()%127; y2=rand()%127; Draw_Line64k(min(x1,x2),min(y1,y2),max(x1,x2),max(y1,y2), MAKECOLOR64k(rand(), rand(),rand())); } }
void draw_circles(void) { unsigned char x,y,r; unsigned short int i;
// draw unfilled circles for (i=0; i<200; i++) { x=rand()%128; y=rand()%128; r=rand()%60; Draw_Circle64k(x, y, r, 0, MAKECOLOR64k(rand(), rand(),rand())); } }
void setup() { long i; // set the digital pin as output: pinMode(RST_PIN, OUTPUT); pinMode(CS_PIN, OUTPUT); pinMode(DC_PIN, OUTPUT); pinMode(DIN_PIN, OUTPUT); pinMode(CLK_PIN, OUTPUT); // pinMode(HVEN_PIN, OUTPUT);
// OLED_HVEN_1; //+12V on
OLED_InitIOs();
OLED_Init();
Fill_RAM(0x00,0x00);
Set_Display_On_Off(1);
draw_circles();
delay(500);
Fill_RAM(0x00,0x00);
draw_lines();
delay(500);
// do filling color
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0x00,0x00));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0x00,0x00));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0xFF,0x00));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0x00,0xFF));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0xFF,0x00));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0x00,0xFF,0xFF));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0x00,0xFF));
delay(500);
Fill_Block64k(0x00,0x00,Max_Column,Max_Row,MAKECOLOR64k(0xFF,0xFF,0xFF));
delay(500);
Rainbow();
delay(500);
Checkerboard();
delay(500);
Show_64k_Pattern_LittleEndia((unsigned char *)Icon24x24x64k,50,50,50+23,50+23);
}
// do put code in loop func void loop() { while(1) { } }
Display hardware problem? The picture is generated with the provided example code:
/* Test code for driving UG2828GDEAF02 1,5# OLED ZhangFeng, PRC. zjjszhangf@gmail.com http://vfdclock.jimdo.com 01-18-2014 */
//#define FASTIO 1
// 4-wire SPI(BS1=0; BS2=0) //(/sclk=/ 13, /data=/ 11, /cd=/ 9 , /cs=/ 10, /reset=/ 8);
// rst
// cs
// DC (Data or Command)
// data in
// clock
// HVEN(optional)
// Fast IO version // pin map please check: http://arduino.cc/en/Hacking/Atmega168Hardware // pin11 = pb3; pin12 = pb4; pin15 = pb5
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Delay Time //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void uDelay1(unsigned char l) { while(l--) { //asm("nop\n\t""nop\n\t""nop\n\t""nop\n\t"); //asm("nop\n\t""nop\n\t""nop\n\t""nop\n\t"); }; }
inline void Write_Command(unsigned char Data) { unsigned char i; OLED_CS_0; OLED_DC_0; for (i=0; i<8; i++) { OLED_CLK_0; if((Data&0x80)>>7) OLED_DIN_1; else OLED_DIN_0; Data = Data << 1; uDelay(1); OLED_CLK_1; uDelay(1); } OLED_CLK_0; OLED_DC_1; OLED_CS_1; }
inline void Write_Data(unsigned char Data) { unsigned char i;
OLED_CS_0; OLED_DC_1; for (i=0; i<8; i++) { OLED_CLK_0; if((Data&0x80)>>7) OLED_DIN_1; else OLED_DIN_0; Data = Data << 1; uDelay(1); OLED_CLK_1; uDelay(1); } OLED_CLK_0; OLED_DC_1; OLED_CS_1; }
void OLED_InitIOs(void) { OLED_RES_1; OLED_CS_1; OLED_CLK_1; OLED_DIN_1; OLED_DC_1; }
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Initialization //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void OLED_Init(void) { unsigned char i;
OLED_RES_0; for(i=0;i<200;i++) { delay(1); // delay } OLED_RES_1;
// Disp OFF Write_Command(0x06); Write_Data(0x00);
// OSC_CTL
Write_Command(0x02);
Write_Data(0x01);
// CLOCK_DIV
Write_Command(0x03);
Write_Data(0x30);
// REDUCE_CURRENT
Write_Command(0x04);
Write_Data(0x00);
// SOFT RET
Write_Command(0x05);
Write_Data(0x00);
// PRECHARGE_TIME_R
Write_Command(0x08);
Write_Data(0x03);
// PRECHARGE_TIME_G
Write_Command(0x09);
Write_Data(0x04);
// PRECHARGE_TIME_B
Write_Command(0x0A);
Write_Data(0x05);
// PRECHARGE_CURRENT_R
Write_Command(0x0B);
Write_Data(0x0B);
// PRECHARGE_CURRENT_G
Write_Command(0x0C);
Write_Data(0x0B);
// PRECHARGE_CURRENT_B
Write_Command(0x0D);
Write_Data(0x0E);
// DRIVING_CURRENT_R
Write_Command(0x10);
Write_Data(0x3E);
// DRIVING_CURRENT_G
Write_Command(0x11);
Write_Data(0x32);
// DRIVING_CURRENT_B
Write_Command(0x12);
Write_Data(0x3D);
// DISPLAY MODE SET
Write_Command(0x13);
Write_Data(0x00);
// RGB_IF
Write_Command(0x14);
Write_Data(0x01);
// RGB_POL
Write_Command(0x15);
Write_Data(0x00);
// MEMORY WRITE MODE
// 6bit3 262k color
/
Write_Command(0x16);
WriteData(0x76);
/
// 8bit_2 64k color
Write_Command(0x16);
Write_Data(0x66);
// MX1_ADDR
Write_Command(0x17);
Write_Data(0x00);
// MX2_ADDR
Write_Command(0x18);
Write_Data(0x7F);
// MY1_ADDR
Write_Command(0x19);
Write_Data(0x00);
// MY2_ADDR
Write_Command(0x1A);
Write_Data(0x7F);
// MEMORY ACCESS POINTER X
Write_Command(0x20);
Write_Data(0x00);
// MEMORY ACCESS POINTER Y
Write_Command(0x21);
Write_Data(0x00);
// DUTY
Write_Command(0x28);
Write_Data(0x7F);
// DSL
Write_Command(0x29);
Write_Data(0x00);
// D1 DDRAM FAC
Write_Command(0x2E);
Write_Data(0x00);
// D1 DDRAM FAR
Write_Command(0x2F);
Write_Data(0x00);
// D1 DDRAM SAC
Write_Command(0x31);
Write_Data(0x00);
// D1 DDRAM SAR
Write_Command(0x32);
Write_Data(0x00);
// SCR1_FX1
Write_Command(0x33);
Write_Data(0x00);
// SCR1_FX2
Write_Command(0x34);
Write_Data(0x7F);
// SCR1_FY1
Write_Command(0x35);
Write_Data(0x00);
// SCR1_FY2
Write_Command(0x36);
Write_Data(0x7F);
// IREF
Write_Command(0x80);
Write_Data(0x00);
// Display ON
// Write_Command(0x06);
// Write_Data(0x01);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Instruction Setting //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // "0x00" => 65,536 Colors Mode // "0x01" => 262,144 Colors Mode
// Set_Pixel_Format(0x66|((Color_Depth<<4)&0x70));
void Set_Pixel_Format(unsigned char d) { Write_Command(0x16); // Set Memory Access Control / Interface Pixel Format (MEMORY_WRITE_MODE) Write_Data(d); // Default => 0x06 // Enable 18-bit Bus Interface // 262,144 Colors // Horizontal address counter is increased. // Vertical address counter is increased. // The data is continuously written horizontally. }
void Set_Display_On_Off(unsigned char d) { Write_Command(0x06); // Set Display On/Off (DISP_ON_OFF) Write_Data(d); // Default => 0x00 // Scan signal is high level at pre-charge period. // Display Off }
inline void Set_Column_Address(unsigned char a, unsigned char b) { Write_Command(0x17); // Set Column Address of Start (MX1_ADDR) Write_Data(a); // Default => 0x00 Write_Command(0x18); // Set Column Address of End (MX2_ADDR) Write_Data(b); // Default => 0x9F }
inline void Set_Row_Address(unsigned char a, unsigned char b) { Write_Command(0x19); // Set Row Address of Start (MY1_ADDR) Write_Data(a); // Default => 0x00 Write_Command(0x1A); // Set Row Address of End (MY2_ADDR) Write_Data(b); // Default => 0x7F }
inline void Set_Display_Offset(unsigned char a, unsigned char b) { Write_Command(0x20); // Specify the Horizontal Start Position of a Window for Written in Memory (MEMORY_ACCESSPOINTER X) Write_Data(a); // Default => 0x00 Write_Command(0x21); // Specify the Vertical Start Position of a Window for Written in Memory (MEMORY_ACCESSPOINTER Y) Write_Data(b); // Default => 0x00 }
inline void Set_Write_RAM() { Write_Command(0x22); // Internal DDRAM Memory Access (DDRAM_DATA_ACCESS_PORT) }
void Fill_RAM(unsigned char a, unsigned char b) { unsigned char i,j;
Set_Display_Offset(0x00,0x00); Set_Column_Address(0x00,0x7F); Set_Row_Address(0x00,0x7F); Set_Write_RAM();
for(i=0;i<128;i++) { for(j=0;j<160;j++) { Write_Data(a); Write_Data(b); } } }
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Show Regular Pattern (Partial or Full Screen) // // a: Column Address of Start // b: Column Address of End // c: Row Address of Start // d: Row Address of End // e: RRRRRGGG // f: GGGBBBBB //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Fill_Block(unsigned char a, unsigned char b, unsigned char c, unsigned char d, unsigned char e, unsigned char f) { unsigned char i,j;
Set_Display_Offset(a,c); Set_Column_Address(a,b); Set_Row_Address(c,d); Set_Write_RAM();
for(i=0;i<(d-c+1);i++) { for(j=0;j<(b-a+1);j++) { Write_Data(e); Write_Data(f); } } }
void Fill_Block64k(unsigned char xLeft, unsigned char yTop, unsigned char xRight, unsigned char yBottom, unsigned short int colFill) { unsigned char i,j,w,h,col1,col2;
col1 = colFill>>8; //Line Color - CCCCCBBB col2 = colFill&0xff; // Line Color - BBBAAAAA w = (yBottom-yTop+1); h = (xRight-xLeft+1); Set_Display_Offset(xLeft,yTop); Set_Column_Address(xLeft,xRight); Set_Row_Address(yTop,yBottom);
Set_Write_RAM();
for(i=0;i<w;i++) {
for(j=0;j<h;j++) {
Write_Data(col1);
Write_Data(col2);
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// First Screen Active Range (Partial or Full Screen)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void First_Screen_Range(unsigned char x1, unsigned char x2, unsigned char y1, unsigned char y2)
{
Write_Command(0x2E); // Set Column Address of Start Point (D1_DDRAM_FAC)
Write_Data(x1); // Default => 0x00
Write_Command(0x2F); // Set Row Address of Start Point (D1_DDRAM_FAR)
Write_Data(y1); // Default => 0x9F
Write_Command(0x33); // Set Column Address of Start (SCR1_FX1)
Write_Data(x1); // Default => 0x00
Write_Command(0x34); // Set Column Address of End (SCR1_FX2)
Write_Data(x2); // Default => 0x9F
Write_Command(0x35); // Set Row Address of Start (SCR1_FY1)
Write_Data(y1); // Default => 0x00
Write_Command(0x36); // Set Row Address of End (SCR1_FY2)
Write_Data(y2); // Default => 0x7F
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Patterns //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Show_64k_Pattern_BigEndian(unsigned char Data_Pointer, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) { unsigned char Src_Pointer; unsigned char i,j;
Src_Pointer=Data_Pointer;
Set_Display_Offset(x1,y1); Set_Column_Address(x1,x2); Set_Row_Address(y1,y2); Set_Write_RAM();
for(i=0;i<(y2-y1+1);i++) { for(j=0;j<(x2-x1+1);j++) { Write_Data(_Src_Pointer); Src_Pointer++; Write_Data(_Src_Pointer); Src_Pointer++; } } }
void Show_64k_Pattern_LittleEndia(unsigned char Data_Pointer, unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) { unsigned char Src_Pointer; unsigned char i,j;
Src_Pointer=Data_Pointer;
Set_Display_Offset(x1,y1); Set_Column_Address(x1,x2); Set_Row_Address(y1,y2); Set_Write_RAM();
for(i=0;i<(y2-y1+1);i++) { for(j=0;j<(x2-x1+1);j++) { WriteData((Src_Pointer+1)); WriteData((Src_Pointer)); Src_Pointer+=2; } } }
void Draw_Point64k_Slow(unsigned char x, unsigned char y, unsigned short int col) { Set_Display_Offset(x,y); Set_Column_Address(x,x); Set_Row_Address(y,y); Set_Write_RAM();
Write_Data(col>>8); // Line Color - CCCCCBBB Write_Data(col&0xff); // Line Color - BBBAAAAA }
/* Draw_line : algorithm by Jack Bresenham */ void Draw_Line64k(int X1, int Y1, int X2, int Y2, uint16_t col) { int dy; int dx; int StepX, StepY; int Fraction;
dy = Y2 - Y1; dx = X2 - X1;
if (dy < 0) { dy = -dy; StepY = -1; } else StepY = 1;
if (dx < 0) { dx = -dx; StepX = -1; } else StepX = 1;
dy <<= 1; // dy is now 2_dy dx <<= 1; // dx is now 2_dx DrawPoint( X1, Y1, col);
if (dx > dy) { Fraction = dy - (dx >> 1); // same as 2_dy - dx while (X1 != X2) { if (Fraction >= 0) { Y1 += StepY; Fraction -= dx; // same as fraction -= 2_dx }
X1 += StepX;
Fraction += dy; // same as fraction -= 2*dy
DrawPoint( X1, Y1, col);
}
} else { Fraction = dx - (dy >> 1); while (Y1 != Y2) { if (Fraction >= 0) { X1 += StepX; Fraction -= dy; } Y1 += StepY; Fraction += dx; DrawPoint( X1, Y1, col); } } }
// å «å¯¹ç§°æ§ inline void _draw_circle_8(int xc, int yc, int x, int y, unsigned short int c) { // åæ° c 为é¢è²å¼ DrawPoint(xc + x, yc + y, c); DrawPoint(xc - x, yc + y, c); DrawPoint(xc + x, yc - y, c); DrawPoint(xc - x, yc - y, c); DrawPoint(xc + y, yc + x, c); DrawPoint(xc - y, yc + x, c); DrawPoint(xc + y, yc - x, c); DrawPoint(xc - y, yc - x, c); }
//Bresenham's circle algorithm void Draw_Circle64k(int xc, int yc, int r, int fill, unsigned short int c) { // (xc, yc) 为åå¿ï¼r 为åå¾ // fill 为æ¯å¦å¡«å // c 为é¢è²å¼
// å¦æåå¨å¾çå¯è§åºåå¤ï¼ç´æ¥éåº
if (xc + r < 0 || xc - r >= Max_Column ||
yc + r < 0 || yc - r >= Max_Row) return;
int x = 0, y = r, yi, d;
d = 3 - 2 * r;
if (fill) {
// å¦æå¡«å
ï¼ç»å®å¿åï¼
while (x <= y) {
for (yi = x; yi <= y; yi ++)
_draw_circle_8(xc, yc, x, yi, c);
if (d < 0) {
d = d + 4 * x + 6;
} else {
d = d + 4 * (x - y) + 10;
y --;
}
x++;
}
} else {
// å¦æä¸å¡«å
ï¼ç»ç©ºå¿åï¼
while (x <= y) {
_draw_circle_8(xc, yc, x, y, c);
if (d < 0) {
d = d + 4 * x + 6;
} else {
d = d + 4 * (x - y) + 10;
y --;
}
x ++;
}
}
} //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Show Checkboard (Full Screen) //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Checkerboard() { unsigned char i,j;
Set_Display_Offset(0x00,0x00); Set_Column_Address(0x00,0x9F); Set_Row_Address(0x00,0x7F); Set_Write_RAM();
for(i=0;i<64;i++) { for(j=0;j<80;j++) { Write_Data(0xFF); Write_Data(0xFF); Write_Data(0x00); Write_Data(0x00); } for(j=0;j<80;j++) { Write_Data(0x00); Write_Data(0x00); Write_Data(0xFF); Write_Data(0xFF); } } }
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Show Color Bar (Full Screen) //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= void Rainbow() { // White => Column 1~20 Fill_Block(0x00,0x10,0x00,Max_Row,0xFF,0xFF);
// Yellow => Column 21~40 Fill_Block(0x10,0x20,0x00,Max_Row,0xFF,0xE0);
// Purple => Column 41~60 Fill_Block(0x20,0x30,0x00,Max_Row,0xF8,0x1F);
// Cyan => Column 61~80 Fill_Block(0x30,0x40,0x00,Max_Row,0x07,0xFF);
// Red => Column 81~100 Fill_Block(0x40,0x50,0x00,Max_Row,0xF8,0x00);
// Green => Column 101~120 Fill_Block(0x50,0x60,0x00,Max_Row,0x07,0xE0);
// Blue => Column 121~140 Fill_Block(0x60,0x70,0x00,Max_Row,0x00,0x1F);
// Black => Column 141~160 Fill_Block(0x70,Max_Column,0x00,Max_Row,0x00,0x00); }
const unsigned char Icon24x24x64k[] ={ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x7b,0xf7,0xd6,0xee,0x73,0xe6,0x52,0xe6,0x51,0xe6,0x93,0xe6,0xd6,0xee,0x7b,0xf7, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x18,0xef,0x30,0xde, 0x0e,0xe6,0x6f,0xee,0x8f,0xee,0xd0,0xf6,0xf0,0xf6,0x90,0xee,0x6f,0xee,0x0e,0xe6, 0x10,0xe6,0xf8,0xee,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbd,0xff,0x52,0xe6,0x0e,0xe6,0xf1,0xf6, 0x50,0xff,0x2e,0xff,0x0c,0xff,0xec,0xfe,0xec,0xfe,0xec,0xfe,0x0d,0xff,0x10,0xff, 0xd0,0xf6,0x0d,0xe6,0x31,0xe6,0xbd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0x9c,0xf7,0xef,0xdd,0x8f,0xee,0x2f,0xff,0xcb,0xfe, 0xa8,0xfe,0xc8,0xfe,0xa8,0xfe,0xa8,0xfe,0xa7,0xfe,0xa7,0xfe,0x87,0xfe,0x87,0xfe, 0x8a,0xfe,0xee,0xfe,0x4d,0xee,0xae,0xdd,0x9d,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xbd,0xff,0xef,0xdd,0x8e,0xf6,0x0c,0xff,0xa8,0xfe,0xa8,0xfe, 0xa9,0xfe,0xc8,0xfe,0xa9,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0x68,0xfe,0x67,0xfe, 0x66,0xfe,0x66,0xfe,0xaa,0xfe,0x2c,0xee,0xce,0xdd,0xbd,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0x93,0xe6,0x6c,0xee,0x0b,0xff,0xa8,0xfe,0xa9,0xfe,0xc9,0xfe, 0xa9,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0xa8,0xfe,0x88,0xfe,0x67,0xfe,0x67,0xfe, 0x67,0xfe,0x47,0xfe,0x06,0xfe,0x68,0xfe,0x0b,0xee,0x73,0xe6,0xff,0xff,0xff,0xff,
0xff,0xff,0x5a,0xf7,0x0b,0xe6,0xca,0xfe,0xa8,0xfe,0xa9,0xfe,0xc9,0xfe,0xc9,0xfe, 0xc8,0xfe,0xc8,0xfe,0xa8,0xfe,0xa8,0xfe,0x88,0xfe,0x67,0xfe,0x87,0xfe,0x87,0xfe, 0x26,0xfe,0x26,0xfe,0x26,0xfe,0x25,0xfe,0x28,0xfe,0xaa,0xe5,0x39,0xef,0xff,0xff,
0xff,0xff,0x52,0xe6,0x89,0xf6,0xe8,0xfe,0xc9,0xfe,0xa9,0xfe,0xa9,0xfe,0x88,0xfe, 0xc6,0xe5,0x27,0xee,0xa8,0xfe,0x67,0xfe,0x67,0xfe,0x67,0xfe,0xe6,0xed,0x65,0xe5, 0x26,0xfe,0x26,0xfe,0x26,0xfe,0xe6,0xfd,0xe5,0xfd,0xa6,0xf5,0x31,0xde,0xff,0xff,
0x9d,0xf7,0xeb,0xe5,0x87,0xfe,0xc7,0xfe,0xc8,0xfe,0xa8,0xfe,0xe8,0xfe,0x45,0xd5, 0xc0,0x8a,0xa2,0xab,0x47,0xf6,0x87,0xfe,0x87,0xfe,0x06,0xf6,0x82,0xa3,0xe1,0x92, 0x24,0xdd,0x26,0xfe,0xe6,0xfd,0xe5,0xf5,0xa4,0xfd,0x44,0xfd,0x49,0xdd,0x9d,0xf7,
0x19,0xef,0x86,0xe5,0x87,0xfe,0x67,0xfe,0x87,0xfe,0x87,0xfe,0xa7,0xfe,0xe3,0xb3, 0x80,0x8a,0xc0,0x92,0xa6,0xe5,0x67,0xfe,0x87,0xfe,0x45,0xe5,0xc0,0x92,0xa0,0x8a, 0x23,0xbc,0x06,0xfe,0xa5,0xf5,0x84,0xf5,0x44,0xf5,0x23,0xfd,0xe4,0xdc,0x39,0xef,
0xd7,0xee,0xc5,0xe5,0x87,0xfe,0x67,0xfe,0x67,0xfe,0x67,0xfe,0x87,0xfe,0x66,0xbc, 0x00,0x72,0xe2,0x8a,0xc8,0xed,0x06,0xfe,0x06,0xfe,0x87,0xed,0xc2,0x8a,0x40,0x72, 0x45,0xc4,0xa5,0xfd,0x64,0xf5,0x64,0xf5,0x24,0xf5,0x03,0xfd,0xc3,0xe4,0xd5,0xee,
0x95,0xe6,0xe5,0xed,0x87,0xfe,0x67,0xfe,0x67,0xfe,0x47,0xfe,0x26,0xfe,0x2b,0xf6, 0xec,0xbc,0x8c,0xd5,0x07,0xfe,0xe5,0xfd,0xc4,0xfd,0xc6,0xfd,0x2b,0xcd,0xab,0xbc, 0x89,0xf5,0x63,0xfd,0x44,0xf5,0x24,0xf5,0x24,0xf5,0x23,0xfd,0xc2,0xe4,0x73,0xe6,
0xb6,0xee,0xa5,0xed,0x67,0xfe,0x67,0xfe,0x27,0xfe,0x26,0xfe,0x26,0xfe,0x26,0xfe, 0x8b,0xfe,0x49,0xfe,0xe5,0xfd,0xc6,0xf5,0xa5,0xfd,0x84,0xf5,0xe7,0xfd,0x09,0xfe, 0x64,0xfd,0x43,0xf5,0x24,0xf5,0x04,0xf5,0x24,0xf5,0x23,0xf5,0xc2,0xe4,0x94,0xe6,
0xf8,0xee,0x85,0xe5,0x46,0xfe,0x27,0xfe,0x26,0xfe,0x25,0xfe,0xe5,0xf5,0xe6,0xf5, 0xe6,0xfd,0xe6,0xfd,0xe7,0xfd,0xc7,0xfd,0xa7,0xfd,0xa6,0xfd,0x65,0xf5,0x44,0xf5, 0x24,0xed,0x23,0xfd,0x24,0xfd,0x24,0xf5,0x04,0xf5,0x03,0xfd,0xa3,0xe4,0xf7,0xee,
0x5b,0xf7,0x87,0xe5,0x26,0xfe,0x26,0xfe,0x26,0xfe,0x45,0xdd,0xe6,0xd4,0xe6,0xfd, 0x07,0xfe,0x29,0xfe,0x2b,0xfe,0x2b,0xfe,0x0b,0xfe,0xe9,0xfd,0xc8,0xfd,0x86,0xfd, 0xe5,0xe4,0x44,0xcc,0x03,0xf5,0x24,0xf5,0x04,0xf5,0xe3,0xfc,0xc5,0xdc,0x5b,0xf7,
0xff,0xff,0xcd,0xdd,0xe5,0xf5,0x26,0xfe,0xe5,0xf5,0x07,0xcd,0x49,0xdd,0xe5,0xd4, 0x05,0xdd,0x87,0xed,0xea,0xf5,0x2c,0xfe,0x0c,0xfe,0xa9,0xf5,0x46,0xed,0x83,0xd4, 0x86,0xcc,0xa8,0xcc,0xa3,0xe4,0x03,0xfd,0x03,0xfd,0xc3,0xf4,0x6b,0xdd,0xde,0xff,
0xff,0xff,0x95,0xe6,0x86,0xe5,0x06,0xfe,0xe6,0xfd,0xa8,0xed,0xe7,0xfd,0xa9,0xe5, 0xe9,0xcc,0x67,0xbc,0x67,0xbc,0x67,0xbc,0x47,0xbc,0x27,0xb4,0x47,0xb4,0xc9,0xc4, 0x48,0xed,0x26,0xf5,0x04,0xf5,0x03,0xfd,0x03,0xfd,0xc4,0xe4,0x95,0xe6,0xff,0xff,
0xff,0xff,0xbe,0xff,0xac,0xdd,0xc6,0xf5,0xe6,0xfd,0xc6,0xfd,0x85,0xfd,0xc5,0xfd, 0xc7,0xfd,0xe9,0xf5,0xca,0xf5,0x8a,0xed,0x6a,0xed,0x8a,0xed,0xa9,0xf5,0x66,0xfd, 0x23,0xfd,0x04,0xf5,0x03,0xf5,0x03,0xfd,0x04,0xf5,0x6a,0xdd,0xbe,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0x19,0xef,0x47,0xdd,0xc6,0xfd,0xa5,0xfd,0x64,0xf5,0x65,0xf5, 0x64,0xf5,0x43,0xfd,0x23,0xfd,0x23,0xfd,0x23,0xfd,0x03,0xfd,0x02,0xfd,0x03,0xf5, 0x03,0xf5,0x03,0xf5,0x23,0xfd,0x25,0xfd,0xe6,0xdc,0x18,0xef,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xb5,0xe6,0x26,0xd5,0xc7,0xf5,0x85,0xfd,0x44,0xf5, 0x24,0xf5,0x44,0xf5,0x23,0xf5,0x24,0xf5,0x23,0xf5,0x23,0xf5,0x03,0xf5,0xe3,0xf4, 0xe3,0xf4,0x45,0xfd,0x66,0xf5,0xe5,0xdc,0x95,0xee,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb6,0xe6,0x49,0xdd,0x87,0xf5,0xa7,0xfd, 0x66,0xfd,0x24,0xf5,0x23,0xf5,0x23,0xf5,0x03,0xf5,0xe3,0xf4,0x04,0xf5,0x46,0xfd, 0x67,0xfd,0x46,0xed,0x07,0xd5,0xb6,0xe6,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5a,0xf7,0xce,0xdd,0x27,0xdd, 0x47,0xed,0x67,0xf5,0x87,0xfd,0x67,0xfd,0x67,0xfd,0x87,0xfd,0x67,0xfd,0x46,0xed, 0x06,0xdd,0xad,0xdd,0x3a,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x19,0xef, 0x10,0xe6,0x6b,0xdd,0x49,0xe5,0x48,0xe5,0x28,0xe5,0x48,0xdd,0x6a,0xdd,0x10,0xe6, 0x18,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x7c,0xf7,0x5a,0xf7,0x5a,0xef,0x7c,0xf7,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0x7c,0xf7,0x5a,0xf7,0x5a,0xef,0x7c,0xf7,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, };
void draw_lines(void) { unsigned char x1,y1,x2,y2; unsigned short int i;
for (i=0; i<1000; i++) { x1=rand()%127; x2=rand()%127; y1=rand()%127; y2=rand()%127; Draw_Line64k(min(x1,x2),min(y1,y2),max(x1,x2),max(y1,y2), MAKECOLOR64k(rand(), rand(),rand())); } }
void draw_circles(void) { unsigned char x,y,r; unsigned short int i;
// draw unfilled circles for (i=0; i<200; i++) { x=rand()%128; y=rand()%128; r=rand()%60; Draw_Circle64k(x, y, r, 0, MAKECOLOR64k(rand(), rand(),rand())); } }
void setup() { long i; // set the digital pin as output: pinMode(RST_PIN, OUTPUT); pinMode(CS_PIN, OUTPUT); pinMode(DC_PIN, OUTPUT); pinMode(DIN_PIN, OUTPUT); pinMode(CLK_PIN, OUTPUT); // pinMode(HVEN_PIN, OUTPUT);
// OLED_HVEN_1; //+12V on OLED_InitIOs(); OLED_Init(); Set_Display_On_Off(1);
Fill_RAM(0x00,0x00);
FillBlock(0, 127, 0, 1, 0, 15); /* write a horizontal blue line at the top / FillBlock(0, 63, 127, 127, 255, 255); / write half white line at bottom / / error: the top blue line gets modified (hardware error???) */
}
// do put code in loop func void loop() { while(1) { } }
128x128 display ebay: www.ebay.com/itm/5V-Ready-SPI-1-5-Full-Color-OLED-Module-for-Arduino-AVR-PIC-STM-ARM-PI-/141641587471
http://oled.jimdo.com/2014/02/21/ug-2828gdeaf02-oled-module-for-arduino/ Display: UG-2828GDEAF02-Univision Arduino-UG282802.rar
Open topics
The color problem edges seems to be a display issue. Writing a color with none zero blue component to the last line, will show something on the first line if this is also blue (probably some bits in the red component are set). Attached a picture to this issue (see below).