Example code for Newhaven OLED graphic display models NHD-2.8-25664UCxx
//--------------------------------------------------------------------------
//send Command to OLED
//--------------------------------------------------------------------------
void oled_Command_25664(unsigned char Data)
{
GPIO_Write(GPIOB, Data);//6800 mode
GPIO_ResetBits(GPIOC, RS);
GPIO_ResetBits(GPIOC, RW);
GPIO_SetBits(GPIOC, E1);
OLED_uDelay(100);
GPIO_ResetBits(GPIOC, CS1);
OLED_uDelay(100);
GPIO_SetBits(GPIOC, CS1);
OLED_uDelay(100);
GPIO_ResetBits(GPIOC, E1);
OLED_uDelay(100);
//unsigned char i; //3-wire serial mode
//GPIO_ResetBits(GPIOC, RS);
//GPIO_ResetBits(GPIOC, RW);
//GPIO_ResetBits(GPIOC, E1);
//GPIO_ResetBits(GPIOC, CS1);
//
//GPIO_ResetBits(GPIOB, GPIO_Pin_1);//D/C = Command
//GPIO_ResetBits(GPIOB, GPIO_Pin_0);
//GPIO_SetBits(GPIOB, GPIO_Pin_0);
// for (i=0; i<8; i++)
// {
// GPIO_ResetBits(GPIOB, GPIO_Pin_0);
// if((Data&0x80)>>7==1){GPIO_SetBits(GPIOB, GPIO_Pin_1);}
// else {GPIO_ResetBits(GPIOB, GPIO_Pin_1);}
// Data = Data << 1;
// GPIO_SetBits(GPIOB, GPIO_Pin_0);
// }
//GPIO_SetBits(GPIOC, CS1); //end 3-wire serial mode
//unsigned char i; //begin 4-wire serial mode
//GPIO_ResetBits(GPIOC, RS);
//GPIO_ResetBits(GPIOC, RW);
//GPIO_ResetBits(GPIOC, E1);
//GPIO_ResetBits(GPIOC, CS1);
//
// for (i=0; i<8; i++)
// {
// GPIO_ResetBits(GPIOB, GPIO_Pin_0);
// if((Data&0x80)>>7==1){GPIO_SetBits(GPIOB, GPIO_Pin_1);}
// else {GPIO_ResetBits(GPIOB, GPIO_Pin_1);}
// Data = Data << 1;
// GPIO_SetBits(GPIOB, GPIO_Pin_0);
// }
//GPIO_SetBits(GPIOC, RS);
//GPIO_SetBits(GPIOC, CS1); //end 4-wire serial mode
}
//--------------------------------------------------------------------------
//send Data to OLED
//--------------------------------------------------------------------------
void oled_Data_25664(unsigned char Data)
{
GPIO_Write(GPIOB, Data);//6800 mode
GPIO_SetBits(GPIOC, RS);
GPIO_ResetBits(GPIOC, RW);
GPIO_SetBits(GPIOC, E1);
OLED_uDelay(100);
GPIO_ResetBits(GPIOC, CS1);
OLED_uDelay(100);
GPIO_SetBits(GPIOC, CS1);
OLED_uDelay(100);
GPIO_ResetBits(GPIOC, E1);
OLED_uDelay(100);
//unsigned char i; //3-wire serial mode
//GPIO_ResetBits(GPIOC, RS);
//GPIO_ResetBits(GPIOC, RW);
//GPIO_ResetBits(GPIOC, E1);
//GPIO_ResetBits(GPIOC, CS1);
//
//GPIO_SetBits(GPIOB, GPIO_Pin_1);//D/C = Data
//GPIO_ResetBits(GPIOB, GPIO_Pin_0);
//GPIO_SetBits(GPIOB, GPIO_Pin_0);
// for (i=0; i<8; i++)
// {
// GPIO_ResetBits(GPIOB, GPIO_Pin_0);
// if((Data&0x80)>>7==1){GPIO_SetBits(GPIOB, GPIO_Pin_1);}
// else {GPIO_ResetBits(GPIOB, GPIO_Pin_1);}
// Data = Data << 1;
// GPIO_SetBits(GPIOB, GPIO_Pin_0);
// }
//GPIO_SetBits(GPIOC, CS1); //end 3-wire serial mode
//unsigned char i; //begin 4-wire serial mode
//GPIO_SetBits(GPIOC, RS);
//GPIO_ResetBits(GPIOC, RW);
//GPIO_ResetBits(GPIOC, E1);
//GPIO_ResetBits(GPIOC, CS1);
//
// for (i=0; i<8; i++)
// {
// GPIO_ResetBits(GPIOB, GPIO_Pin_0);
// if((Data&0x80)>>7==1){GPIO_SetBits(GPIOB, GPIO_Pin_1);}
// else {GPIO_ResetBits(GPIOB, GPIO_Pin_1);}
// Data = Data << 1;
// GPIO_SetBits(GPIOB, GPIO_Pin_0);
// }
//GPIO_SetBits(GPIOC, RS);
//GPIO_SetBits(GPIOC, CS1); //end 4-wire serial mode
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Column_Address_25664(unsigned char a, unsigned char b)
{
oled_Command_25664(0x15); // Set Column Address
oled_Data_25664(a); // Default => 0x00
oled_Data_25664(b); // Default => 0x77
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Row_Address_25664(unsigned char a, unsigned char b)
{
oled_Command_25664(0x75); // Set Row Address
oled_Data_25664(a); // Default => 0x00
oled_Data_25664(b); // Default => 0x7F
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Write_RAM_25664()
{
oled_Command_25664(0x5C); // Enable MCU to Write into RAM
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Remap_Format_25664(unsigned char d)
{
oled_Command_25664(0xA0); // Set Re-Map / Dual COM Line Mode
oled_Data_25664(d); // Default => 0x40
// Horizontal Address Increment
// Column Address 0 Mapped to SEG0
// Disable Nibble Remap
// Scan from COM0 to COM[N-1]
// Disable COM Split Odd Even
oled_Data_25664(0x11); // Default => 0x01 (Disable Dual COM Mode)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Start_Line_25664(unsigned char d)
{
oled_Command_25664(0xA1); // Set Vertical Scroll by RAM
oled_Data_25664(d); // Default => 0x00
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Display_Offset_25664(unsigned char d)
{
oled_Command_25664(0xA2); // Set Vertical Scroll by Row
oled_Data_25664(d); // Default => 0x00
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Display_Mode_25664(unsigned char d)
{
oled_Command_25664(0xA4|d); // Set Display Mode
// Default => 0xA4
// 0xA4 (0x00) => Entire Display Off, All Pixels Turn Off
// 0xA5 (0x01) => Entire Display On, All Pixels Turn On at GS Level 15
// 0xA6 (0x02) => Normal Display
// 0xA7 (0x03) => Inverse Display
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Partial_Display_25664(unsigned char a, unsigned char b, unsigned char c)
{
oled_Command_25664(0xA8|a);
// Default => 0x8F
// Select Internal Booster at Display On
if(a == 0x00)
{
oled_Data_25664(b);
oled_Data_25664(c);
}
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Function_Selection_25664(unsigned char d)
{
oled_Command_25664(0xAB); // Function Selection
oled_Data_25664(d); // Default => 0x01
// Enable Internal VDD Regulator
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Display_On_Off_25664(unsigned char d)
{
oled_Command_25664(0xAE|d); // Set Display On/Off
// Default => 0xAE
// 0xAE (0x00) => Display Off (Sleep Mode On)
// 0xAF (0x01) => Display On (Sleep Mode Off)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Phase_Length_25664(unsigned char d)
{
oled_Command_25664(0xB1); // Phase 1 (Reset) & Phase 2 (Pre-Charge) Period Adjustment
oled_Data_25664(d); // Default => 0x74 (7 Display Clocks [Phase 2] / 9 Display Clocks [Phase 1])
// D[3:0] => Phase 1 Period in 5~31 Display Clocks
// D[7:4] => Phase 2 Period in 3~15 Display Clocks
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Display_Clock_25664(unsigned char d)
{
oled_Command_25664(0xB3); // Set Display Clock Divider / Oscillator Frequency
oled_Data_25664(d); // Default => 0xD0
// A[3:0] => Display Clock Divider
// A[7:4] => Oscillator Frequency
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Display_Enhancement_A_25664(unsigned char a, unsigned char b)
{
oled_Command_25664(0xB4); // Display Enhancement
oled_Data_25664(0xA0|a); // Default => 0xA2
// 0xA0 (0x00) => Enable External VSL
// 0xA2 (0x02) => Enable Internal VSL (Kept VSL Pin N.C.)
oled_Data_25664(0x05|b); // Default => 0xB5
// 0xB5 (0xB0) => Normal
// 0xFD (0xF8) => Enhance Low Gray Scale Display Quality
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_GPIO_25664(unsigned char d)
{
oled_Command_25664(0xB5); // General Purpose IO
oled_Data_25664(d); // Default => 0x0A (GPIO Pins output Low Level.)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Precharge_Period_25664(unsigned char d)
{
oled_Command_25664(0xB6); // Set Second Pre-Charge Period
oled_Data_25664(d); // Default => 0x08 (8 Display Clocks)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Precharge_Voltage_25664(unsigned char d)
{
oled_Command_25664(0xBB); // Set Pre-Charge Voltage Level
oled_Data_25664(d); // Default => 0x17 (0.50*VCC)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_VCOMH_25664(unsigned char d)
{
oled_Command_25664(0xBE); // Set COM Deselect Voltage Level
oled_Data_25664(d); // Default => 0x04 (0.80*VCC)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Contrast_Current_25664(unsigned char d)
{
oled_Command_25664(0xC1); // Set Contrast Current
oled_Data_25664(d); // Default => 0x7F
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Master_Current_25664(unsigned char d)
{
oled_Command_25664(0xC7); // Master Contrast Current Control
oled_Data_25664(d); // Default => 0x0f (Maximum)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Multiplex_Ratio_25664(unsigned char d)
{
oled_Command_25664(0xCA); // Set Multiplex Ratio
oled_Data_25664(d); // Default => 0x7F (1/128 Duty)
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Display_Enhancement_B_25664(unsigned char d)
{
oled_Command_25664(0xD1); // Display Enhancement
oled_Data_25664(0x82|d); // Default => 0xA2
// 0x82 (0x00) => Reserved
// 0xA2 (0x20) => Normal
oled_Data_25664(0x20);
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Command_Lock_25664(unsigned char d)
{
oled_Command_25664(0xFD); // Set Command Lock
oled_Data_25664(0x12|d); // Default => 0x12
// 0x12 => Driver IC interface is unlocked from entering command.
// 0x16 => All Commands are locked except 0xFD.
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Draw_Rectangle_25664(unsigned char Data, unsigned char a, unsigned char b, unsigned char c, unsigned char d, unsigned char e)
{
unsigned char i,j,k,l;
k=a%4;
if(k == 0)
{
l=(a/4)-1;
}
else
{
l=a/4;
}
Set_Column_Address_25664(Shift+b,Shift+c);
Set_Row_Address_25664(d,(d+a-1));
Set_Write_RAM_25664();
for(i=0;i<(c-b+1);i++)
{
for(j=0;j<a;j++)
{
oled_Data_25664(Data);
oled_Data_25664(Data);
}
}
Set_Column_Address_25664(Shift+(c-l),Shift+c);
Set_Row_Address_25664(d+a,e-a);
Set_Write_RAM_25664();
for(i=0;i<(e-d+1);i++)
{
for(j=0;j<(l+1);j++)
{
if(j == 0)
{
switch(k)
{
case 0:
oled_Data_25664(Data);
oled_Data_25664(Data);
break;
case 1:
oled_Data_25664(0x00);
oled_Data_25664(Data&0x0F);
break;
case 2:
oled_Data_25664(0x00);
oled_Data_25664(Data);
break;
case 3:
oled_Data_25664(Data&0x0F);
oled_Data_25664(Data);
break;
}
}
else
{
oled_Data_25664(Data);
oled_Data_25664(Data);
}
}
}
Set_Column_Address_25664(Shift+b,Shift+c);
Set_Row_Address_25664((e-a+1),e);
Set_Write_RAM_25664();
for(i=0;i<(c-b+1);i++)
{
for(j=0;j<a;j++)
{
oled_Data_25664(Data);
oled_Data_25664(Data);
}
}
Set_Column_Address_25664(Shift+b,Shift+(b+l));
Set_Row_Address_25664(d+a,e-a);
Set_Write_RAM_25664();
for(i=0;i<(e-d+1);i++)
{
for(j=0;j<(l+1);j++)
{
if(j == l)
{
switch(k)
{
case 0:
oled_Data_25664(Data);
oled_Data_25664(Data);
break;
case 1:
oled_Data_25664(Data&0xF0);
oled_Data_25664(0x00);
break;
case 2:
oled_Data_25664(Data);
oled_Data_25664(0x00);
break;
case 3:
oled_Data_25664(Data);
oled_Data_25664(Data&0xF0);
break;
}
}
else
{
oled_Data_25664(Data);
oled_Data_25664(Data);
}
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show Regular Pattern (Full Screen)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Fill_RAM_25664(unsigned char Data)
{
unsigned char i,j;
Set_Column_Address_25664(0x00,0x77);
Set_Row_Address_25664(0x00,0x7F);
Set_Write_RAM_25664();
for(i=0;i<128;i++)
{
for(j=0;j<120;j++)
{
oled_Data_25664(Data);
oled_Data_25664(Data);
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show Regular Pattern (Partial or Full Screen)
//
// a: Column Address of Start
// b: Column Address of End (Total Columns Devided by 4)
// c: Row Address of Start
// d: Row Address of End
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Fill_Block_25664(unsigned char Data, unsigned char a, unsigned char b, unsigned char c, unsigned char d)
{
unsigned char i,j;
Set_Column_Address_25664(Shift+a,Shift+b);
Set_Row_Address_25664(c,d);
Set_Write_RAM_25664();
for(i=0;i<(d-c+1);i++)
{
for(j=0;j<(b-a+1);j++)
{
oled_Data_25664(Data);
oled_Data_25664(Data);
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show Checkboard (Full Screen)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Checkerboard_25664()
{
unsigned char i,j;
Set_Column_Address_25664(0x00,0x77);
Set_Row_Address_25664(0x00,0x7F);
Set_Write_RAM_25664();
for(i=0;i<64;i++)
{
for(j=0;j<120;j++)
{
oled_Data_25664(0xF0);
oled_Data_25664(0xF0);
}
for(j=0;j<120;j++)
{
oled_Data_25664(0x0F);
oled_Data_25664(0x0F);
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show Gray Scale Bar (Full Screen)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Grayscale_25664()
{
Max_Column = 0x3F;
Max_Row = 0x3F;
// Level 16 => Column 1~16
Fill_Block_25664(0xFF,0x00,0x03,0x00,Max_Row);
// Level 15 => Column 17~32
Fill_Block_25664(0xEE,0x04,0x07,0x00,Max_Row);
// Level 14 => Column 33~48
Fill_Block_25664(0xDD,0x08,0x0B,0x00,Max_Row);
// Level 13 => Column 49~64
Fill_Block_25664(0xCC,0x0C,0x0F,0x00,Max_Row);
// Level 12 => Column 65~80
Fill_Block_25664(0xBB,0x10,0x13,0x00,Max_Row);
// Level 11 => Column 81~96
Fill_Block_25664(0xAA,0x14,0x17,0x00,Max_Row);
// Level 10 => Column 97~112
Fill_Block_25664(0x99,0x18,0x1B,0x00,Max_Row);
// Level 9 => Column 113~128
Fill_Block_25664(0x88,0x1C,0x1F,0x00,Max_Row);
// Level 8 => Column 129~144
Fill_Block_25664(0x77,0x20,0x23,0x00,Max_Row);
// Level 7 => Column 145~160
Fill_Block_25664(0x66,0x24,0x27,0x00,Max_Row);
// Level 6 => Column 161~176
Fill_Block_25664(0x55,0x28,0x2B,0x00,Max_Row);
// Level 5 => Column 177~192
Fill_Block_25664(0x44,0x2C,0x2F,0x00,Max_Row);
// Level 4 => Column 193~208
Fill_Block_25664(0x33,0x30,0x33,0x00,Max_Row);
// Level 3 => Column 209~224
Fill_Block_25664(0x22,0x34,0x37,0x00,Max_Row);
// Level 2 => Column 225~240
Fill_Block_25664(0x11,0x38,0x3B,0x00,Max_Row);
// Level 1 => Column 241~256
Fill_Block_25664(0x00,0x3C,Max_Column,0x00,Max_Row);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show Character (5x7)
//
// a: Database
// b: Ascii
// c: Start X Address
// d: Start Y Address
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Show_Font57_25664(unsigned char a, unsigned char b, unsigned char c, unsigned char d)
{
unsigned char *Src_Pointer=0;
unsigned char i,Font,MSB_1,LSB_1,MSB_2,LSB_2;
switch(a)
{
case 1:
Src_Pointer=&Ascii_1[(b-1)][0];
break;
case 2:
//Src_Pointer=&Ascii_2[(b-1)][0];
break;
}
Set_Remap_Format_25664(0x15);
for(i=0;i<=1;i++)
{
MSB_1=*Src_Pointer;
Src_Pointer++;
if(i == 1)
{
LSB_1=0x00;
MSB_2=0x00;
LSB_2=0x00;
}
else
{
LSB_1=*Src_Pointer;
Src_Pointer++;
MSB_2=*Src_Pointer;
Src_Pointer++;
LSB_2=*Src_Pointer;
Src_Pointer++;
}
Set_Column_Address_25664(Shift+c,Shift+c);
Set_Row_Address_25664(d,d+7);
Set_Write_RAM_25664();
Font=((MSB_1&0x01)<<4)|(LSB_1&0x01);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_2&0x01)<<4)|(LSB_2&0x01);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_1&0x02)<<3)|((LSB_1&0x02)>>1);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_2&0x02)<<3)|((LSB_2&0x02)>>1);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_1&0x04)<<2)|((LSB_1&0x04)>>2);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_2&0x04)<<2)|((LSB_2&0x04)>>2);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_1&0x08)<<1)|((LSB_1&0x08)>>3);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_2&0x08)<<1)|((LSB_2&0x08)>>3);
Font=Font|(Font<<1)|(Font<<2)|(Font<<3);
oled_Data_25664(Font);
Font=((MSB_1&0x10)<<3)|((LSB_1&0x10)>>1);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=((MSB_2&0x10)<<3)|((LSB_2&0x10)>>1);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=((MSB_1&0x20)<<2)|((LSB_1&0x20)>>2);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=((MSB_2&0x20)<<2)|((LSB_2&0x20)>>2);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=((MSB_1&0x40)<<1)|((LSB_1&0x40)>>3);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=((MSB_2&0x40)<<1)|((LSB_2&0x40)>>3);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=(MSB_1&0x80)|((LSB_1&0x80)>>4);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
Font=(MSB_2&0x80)|((LSB_2&0x80)>>4);
Font=Font|(Font>>1)|(Font>>2)|(Font>>3);
oled_Data_25664(Font);
c++;
}
Set_Remap_Format_25664(0x14);
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show String
//
// a: Database
// b: Start X Address
// c: Start Y Address
// * Must write "0" in the end...
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Show_String_25664(unsigned char a, unsigned char *Data_Pointer, unsigned char b, unsigned char c)
{
unsigned char *Src_Pointer;
Src_Pointer=Data_Pointer;
Show_Font57_25664(1,96,b,c); // No-Break Space
// Must be written first before the string start...
while(1)
{
Show_Font57_25664(a,*Src_Pointer,b,c);
Src_Pointer++;
b+=2;
if(*Src_Pointer == 0) break;
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Show Pattern (Partial or Full Screen)
//
// a: Column Address of Start
// b: Column Address of End (Total Columns Devided by 4)
// c: Row Address of Start
// d: Row Address of End
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Show_Pattern_25664(unsigned char *Data_Pointer, unsigned char a, unsigned char b, unsigned char c, unsigned char d)
{
unsigned char *Src_Pointer;
unsigned char i,j;
Src_Pointer=Data_Pointer;
Set_Column_Address_25664(Shift+a,Shift+b);
Set_Row_Address_25664(c,d);
Set_Write_RAM_25664();
for(i=0;i<(d-c+1);i++)
{
for(j=0;j<(b-a+1);j++)
{
oled_Data_25664(*Src_Pointer);
Src_Pointer++;
oled_Data_25664(*Src_Pointer);
Src_Pointer++;
}
}
}
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Gray Scale Table Setting (Full Screen)
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void Set_Gray_Scale_Table_25664()
{
oled_Command_25664(0xB8); // Set Gray Scale Table
oled_Data_25664(0x0C); // Gray Scale Level 1
oled_Data_25664(0x18); // Gray Scale Level 2
oled_Data_25664(0x24); // Gray Scale Level 3
oled_Data_25664(0x30); // Gray Scale Level 4
oled_Data_25664(0x3C); // Gray Scale Level 5
oled_Data_25664(0x48); // Gray Scale Level 6
oled_Data_25664(0x54); // Gray Scale Level 7
oled_Data_25664(0x60); // Gray Scale Level 8
oled_Data_25664(0x6C); // Gray Scale Level 9
oled_Data_25664(0x78); // Gray Scale Level 10
oled_Data_25664(0x84); // Gray Scale Level 11
oled_Data_25664(0x90); // Gray Scale Level 12
oled_Data_25664(0x9C); // Gray Scale Level 13
oled_Data_25664(0xA8); // Gray Scale Level 14
oled_Data_25664(0xB4); // Gray Scale Level 15
oled_Command_25664(0x00); // Enable Gray Scale Table
}
//--------------------------------------------------------------------------
//--------------------------------------------------------------------------
void Set_Linear_Gray_Scale_Table_25664()
{
oled_Command_25664(0xB9); // Set Default Linear Gray Scale Table
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Initialization
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
void OLED_Init_25664()
{
unsigned char i;
/*GPIO_ResetBits(GPIOC, RES);
for(i=0;i<200;i++)
{
OLED_uDelay(200);
} */
GPIO_SetBits(GPIOC, RES);
OLED_Delay(10000);
Set_Command_Lock_25664(0x12); // Unlock Basic Commands (0x12/0x16)
Set_Display_On_Off_25664(0x00); // Display Off (0x00/0x01)
Set_Column_Address_25664(0x1C,0x5B);
Set_Row_Address_25664(0x00,0x3F);
Set_Display_Clock_25664(0x91); // Set Clock as 80 Frames/Sec
Set_Multiplex_Ratio_25664(0x3F); // 1/64 Duty (0x0F~0x3F)
Set_Display_Offset_25664(0x00); // Shift Mapping RAM Counter (0x00~0x3F)
Set_Start_Line_25664(0x00); // Set Mapping RAM Display Start Line (0x00~0x7F)
Set_Remap_Format_25664(0x14); // Set Horizontal Address Increment
// Column Address 0 Mapped to SEG0
// Disable Nibble Remap
// Scan from COM[N-1] to COM0
// Disable COM Split Odd Even
// Enable Dual COM Line Mode
Set_GPIO_25664(0x00); // Disable GPIO Pins Input
Set_Function_Selection_25664(0x01); // Enable Internal VDD Regulator
Set_Display_Enhancement_A_25664(0xA0,0xFD); // Enable External VSL
Set_Contrast_Current_25664(0x9F); // Set Segment Output Current
Set_Master_Current_25664(0x0F); // Set Scale Factor of Segment Output Current Control
//Set_Gray_Scale_Table(); // Set Pulse Width for Gray Scale Table
Set_Linear_Gray_Scale_Table_25664(); //set default linear gray scale table
Set_Phase_Length_25664(0xE2); // Set Phase 1 as 5 Clocks & Phase 2 as 14 Clocks
Set_Display_Enhancement_B_25664(0x20); // Enhance Driving Scheme Capability (0x00/0x20)
Set_Precharge_Voltage_25664(0x1F); // Set Pre-Charge Voltage Level as 0.60*VCC
Set_Precharge_Period_25664(0x08); // Set Second Pre-Charge Period as 8 Clocks
Set_VCOMH_25664(0x07); // Set Common Pins Deselect Voltage Level as 0.86*VCC
Set_Display_Mode_25664(0x02); // Normal Display Mode (0x00/0x01/0x02/0x03)
Set_Partial_Display_25664(0x01,0x00,0x00); // Disable Partial Display
Set_Display_On_Off_25664(0x01);
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
// Demonstration
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
int oled_25664(void)
{
OLED_Init_25664();
Set_Column_Address_25664(0x1c,0x5b);
Set_Row_Address_25664(0x00,0x3F);
Set_Write_RAM_25664();
counter = 0;
write_data = 0;
for(i=0;i<64;i++){ //these loops expand the bitmap data because the bmp file is monochrome image (only ON or OFF, no grayscale)
for(j=0;j<32;j++){
datum = Buff[counter];
datum = ((datum >> 6) & 0x03);//move over and mask the highest 2 bits
if(datum == 0x03){oled_Data_25664(0xFF);} //if both bits are high, send 0xFF to OLED
else if(datum == 0x02){oled_Data_25664(0xF0);} //if one bit is high, send 0x0F to OLED
else if(datum == 0x01){oled_Data_25664(0x0F);}
else oled_Data_25664(0x00); //if neither bit is high, send 0x00 to OLED
datum = Buff[counter];
datum = ((datum >> 4) & 0x03); //move over and mask the 3&4th bits
if(datum == 0x03){oled_Data_25664(0xFF);}
else if(datum == 0x02){oled_Data_25664(0xF0);}
else if(datum == 0x01){oled_Data_25664(0x0F);}
else oled_Data_25664(0x00);
datum = Buff[counter];
datum = ((datum >> 2) & 0x03); //move over and mask the 5&6th bits
if(datum == 0x03){oled_Data_25664(0xFF);}
else if(datum == 0x02){oled_Data_25664(0xF0);}
else if(datum == 0x01){oled_Data_25664(0x0F);}
else oled_Data_25664(0x00);
datum = Buff[counter];
datum = (datum & 0x03); //mask the lowest 2 bits
if(datum == 0x03){oled_Data_25664(0xFF);}
else if(datum == 0x02){oled_Data_25664(0xF0);}
else if(datum == 0x01){oled_Data_25664(0x0F);}
else oled_Data_25664(0x00);
counter++;
}
}
return 1;
}