repo

Dependencies:   mbed BLE_API nRF51822 X_NUCLEO_IDB0XA1

Revision:
80:4fbfa09ac26c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/oled.h	Sat Feb 16 15:01:30 2019 +0000
@@ -0,0 +1,601 @@
+#include "fonts.h"
+#include "mbed.h"
+#include "ble/BLE.h"
+#include <stdbool.h>
+#include <stdint.h>
+
+
+DigitalOut SCLK(P0_8);
+DigitalOut SDIN(P0_10);
+DigitalOut RES(P0_18);
+DigitalOut CS(P0_29);
+DigitalOut DC(P0_28);
+
+#define Max_Column  160
+#define Max_Row     136
+#define Brightness  0xcf
+
+void oledwrite(int num1,int num2,int num3, int analog_read);
+
+int num1;
+int num2;
+int num3;
+
+
+void part_num(int analog_read)
+{
+    for(int q = 0;q<=3;q++)
+    {
+        int num = analog_read;
+        for(int k = 0;k<3;k++)
+        {
+            switch(k)
+            {
+                case 0:
+                    num3 = (num%10);
+                    num = num/10;
+                    break;
+                case 1:
+                    num2 = (num%10);
+                    num = num/10;
+                    break;
+                case 2:
+                    num1 = (num%10);
+                    num = num/10;
+                    break;
+            }
+        }
+    }
+    oledwrite(num1,num2,num3,analog_read);
+}
+
+void Write_Command(unsigned char Data)
+{
+unsigned char i;
+
+    CS=0;
+    DC=0;
+    for (i=0; i<8; i++)
+    {
+        SCLK=0;
+        SDIN=(Data&0x80)>>7;
+        Data = Data << 1;
+        SCLK=1;
+    }
+    DC=1;
+    CS=1;
+}
+
+
+void Write_Data(unsigned char Data)
+{
+unsigned char i;
+
+    CS=0;
+    DC=1;
+    for (i=0; i<8; i++)
+    {
+        SCLK=0;
+        SDIN=(Data&0x80)>>7;
+        Data = Data << 1;
+        SCLK=1;
+    }
+    DC=1;
+    CS=1;
+}
+
+
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+//  Instruction Setting
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void Set_Start_Column(unsigned char d)
+{
+    Write_Command(0x00+d%16);       // Set Lower Column Start Address for Page Addressing Mode
+                                    //   Default => 0x00
+    Write_Command(0x10+d/16);       // Set Higher Column Start Address for Page Addressing Mode
+                                    //   Default => 0x10
+}
+
+
+void Set_Page_Addressing_Mode(void)
+{
+    Write_Command(0x20);            // Set Memory Page Addressing Mode
+}
+
+void Set_Vertical_Addressing_Mode(void)
+{
+    Write_Command(0x21);            // Set Memory Vertical Addressing Mode
+}
+
+void Set_Contrast_Control(unsigned char d)
+{
+    Write_Command(0x81);            // Set Contrast Control
+    Write_Command(d);           //   Default => 0x7F
+}
+
+void Set_Segment_Remap(unsigned char d)
+{
+    Write_Command(d);           // Set Segment Re-Map
+                        //   Default => 0xA0
+                        //     0xA0 => Column Address 0 Mapped to SEG0
+                        //     0xA1 => Column Address 0 Mapped to SEG127
+}
+
+void Set_Entire_Display(unsigned char d)
+{
+    Write_Command(d);           // Set Entire Display On / Off
+                        //   Default => 0xA4
+                        //     0xA4 => Normal Display
+                        //     0xA5 => Entire Display On
+}
+
+void Set_Inverse_Display(unsigned char d)
+{
+    Write_Command(d);           // Set Inverse Display On/Off
+                        //   Default => 0xA6
+                        //     0xA6 => Normal Display
+                        //     0xA7 => Inverse Display On
+}
+
+void Set_DCDC_Control_Mode(unsigned char d)
+{
+    Write_Command(0xad);            //Set DC-DC Control Mode
+    Write_Command(d);               //DC-DC Setting Mode Set
+}
+
+void Set_Display_On_Off(unsigned char d)    
+{
+    Write_Command(d);           // Set Display On/Off
+                        //   Default => 0xAE
+                        //     0xAE => Display Off
+                        //     0xAF => Display On
+}
+
+void Set_Page_Address(unsigned char d)
+{
+    Write_Command(0xb0);            // Set Page Address
+    Write_Command(d);               // Page Address
+}
+
+void Set_Common_Remap(unsigned char d)
+{
+    Write_Command(d);   // Set COM Output Scan Direction
+                        //   Default => 0xC0
+                        //     0xC0 => Scan from COM0 to COM[N-1]
+                        //     0xC8 => Scan from COM[N-1] to COM0
+}
+
+void Set_Display_Resolution(unsigned char d)
+{
+    Write_Command(0xa9);            //Set Display Resolution Command
+    Write_Command(d);               //00= 64 COM⊙ 160 SEG
+                                    //01= 96 COM⊙ 160 SEG
+                                    //02=128 COM⊙ 160 SEG
+                                    //03=160 COM⊙ 160 SEG
+}
+
+void Set_Display_Clock(unsigned char d)
+{
+    Write_Command(0xD5);            // Set Display Clock Divide Ratio / Oscillator Frequency
+    Write_Command(d);               // Default => 0x50
+                                    // D[3:0] => Display Clock Divider
+                                    // D[7:4] => Oscillator Frequency
+}
+
+void Set_Precharge_Period(unsigned char d)
+{
+    Write_Command(0xD9);            // Set Pre-Charge Period
+    Write_Command(d);               // Default => 0x22 (2 Display Clocks [Phase 2] / 2 Display Clocks [Phase 1])
+                                    // D[3:0] => Phase 1 Period in 1~15 Display Clocks
+                                    // D[7:4] => Phase 2 Period in 1~15 Display Clocks
+}
+
+void Set_VCOMH(unsigned char d)
+{
+    Write_Command(0xDB);            // Set VCOMH Deselect Level
+    Write_Command(d);           //   Default => 0x35 (VCOMH = 1 x VREF )
+}
+
+void Set_VSEGH(unsigned char d)
+{
+    Write_Command(0xDC);            // Set VSEGH Deselect Level
+    Write_Command(d);           //   Default => 0x35 (VSEGH = 1 x VREF )
+}
+
+void Set_VSL(unsigned char d)
+{
+    Write_Command(d);           // Set VSL
+                                // Default => 0x30 
+}
+
+void Read_Modify_Write_Start(void)
+{
+    Write_Command(0xe0);            //Read-Modify-Write Start
+}
+
+void Read_Modify_Write_End(void)
+{
+    Write_Command(0xee);            //Read-Modify-Write End
+}
+
+void Set_NOP()
+{
+    Write_Command(0xE3);            // Command for No Operation
+}
+
+
+
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+//  Show Character (5x7)
+//
+//    a: Database
+//    b: Ascii
+//    c: Start Page
+//    d: Start Column
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void Show_Font_big(unsigned char a, unsigned char b, unsigned char c, unsigned char d)
+{
+unsigned char i;
+
+    Set_Page_Address(c);
+    Set_Start_Column(d);
+
+    for(i=0;i<11;i++)
+    {
+        Write_Data(Shefi[b-1][i]);
+    }
+    Write_Data(0x00);
+}
+
+void Show_Font_num(unsigned char a, unsigned char b, unsigned char c, unsigned char d)
+{
+unsigned int i;
+
+    Set_Page_Address(c);
+    Set_Start_Column(d);
+
+    for(i=0;i<22;i++)
+    {
+        Write_Data(Shefinum[b-1][i]);
+    }
+    Write_Data(0x00);
+}
+
+
+void Show_Font57(unsigned char a, unsigned char b, unsigned char c, unsigned char d)
+{
+unsigned char i;
+
+    Set_Page_Address(c);
+    Set_Start_Column(d);
+
+    for(i=0;i<5;i++)
+    {
+        Write_Data(Ascii_1[b-1][i]);
+    }
+    Write_Data(0x00);
+}
+
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+//  Show String
+//
+//    a: Database
+//    b: Start Page
+//    c: Start Column
+//    * Must write "0" in the end...
+//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void Show_String_big(unsigned char a, unsigned char *Data_Pointer, unsigned char b, unsigned char c)
+{
+unsigned char *Src_Pointer;
+
+    Src_Pointer=Data_Pointer;
+    Show_Font57(1,96,b,c);          // No-Break Space
+                        //   Must be written first before the string start...
+
+    while(1)
+    {
+        Show_Font_big(a,*Src_Pointer,b,c);
+        Src_Pointer++;
+        c+=13;
+        if(*Src_Pointer == 0) break;
+    }
+}
+
+void Show_String_num(unsigned char a, unsigned char *Data_Pointer, unsigned char b, unsigned char c)
+{
+unsigned char *Src_Pointer;
+
+    Src_Pointer=Data_Pointer;
+    Show_Font57(1,96,b,c);          // No-Break Space
+                        //   Must be written first before the string start...
+
+    while(1)
+    {
+        Show_Font_num(a,*Src_Pointer,b,c);
+        Src_Pointer++;
+        c+=26;
+        if(*Src_Pointer == 0) break;
+    }
+}
+
+void Show_String(unsigned char a, unsigned char *Data_Pointer, unsigned char b, unsigned char c)
+{
+unsigned char *Src_Pointer;
+
+    Src_Pointer=Data_Pointer;
+    Show_Font57(1,96,b,c);          // No-Break Space
+                        //   Must be written first before the string start...
+
+    while(1)
+    {
+        Show_Font57(a,*Src_Pointer,b,c);
+        Src_Pointer++;
+        c+=6;
+        if(*Src_Pointer == 0) break;
+    }
+}
+
+
+
+void OLED_initial(void)                     //SH1108
+{
+    unsigned char i,j;
+    
+    RES = 1;
+    
+    Set_Display_On_Off(0xAE);               //Display off
+
+    Set_Contrast_Control(Brightness);       //set contrast
+
+    Set_Page_Addressing_Mode();             //Set Memory Page addressing mode
+
+    Set_Segment_Remap(0xA0);                //set segment re-map     0xA0 => Column Address 0 Mapped to SEG0
+
+    Set_Entire_Display(0xA4);               //set entire display off
+
+    Set_Inverse_Display(0xA6);              //set normal display 
+
+    Set_DCDC_Control_Mode(0x80);            //set DC-DC off
+       
+    Set_Common_Remap(0xC0);                 //set commom output scan direction  0xC0 => Scan from COM0 to COM[N-1]
+ 
+    Set_Display_Clock(0x60);                //set display clock divide ratio/osc frequency
+
+    Set_Precharge_Period(0x47);             //set dis-charge/pre-charge period
+
+    Set_VCOMH(0x35);                        //set VCOM deselect level
+
+    Set_VSEGH(0x35);                        //set VSEGM deselect level
+
+    Set_VSL(0x30);                          // SET VSL
+
+    Set_Display_Resolution(0x03);           // Set display resolution   03=160 COM⊙ 160 SEG
+
+    for(i=0;i<=16;i++)
+    {
+        Set_Start_Column(0x00);  //set column address
+        Set_Page_Address(i);     //Set Page Address
+        
+        for(j=0;j<Max_Column;j++)
+        {
+            Write_Data(0x00);
+        }
+    }
+    
+    
+    Set_Display_On_Off(0xAF);      //display on
+}
+
+void Frame_pattern()//Frame Pattern
+{       
+  unsigned char i,j;
+
+    for(i=0;i<=16;i++)
+    {
+        Set_Start_Column(0x00);  //set column address
+        Set_Page_Address(i);     //Set Page Address
+            
+        for(j=0;j<Max_Column;j++)
+        {
+            Write_Data(FramePic[i*Max_Column+j]);
+        }
+    }
+}
+
+
+void clear_screen()
+{
+    unsigned char clearodd[2] = {41,0};
+    unsigned char cleareven[2] = {42,0};
+    unsigned char clearodd1[2] = {43,0};
+    unsigned char cleareven1[2] = {44,0};
+    unsigned char clearodd2[2] = {41,0};
+    unsigned char cleareven2[2] = {42,0};
+    unsigned char clearodd3[2] = {43,0};
+    unsigned char cleareven3[2] = {44,0};
+    unsigned char clearodd4[2] = {41,0};
+    unsigned char cleareven4[2] = {42,0};
+    unsigned char clearodd5[2] = {43,0};
+    unsigned char cleareven5[2] = {44,0};
+    Show_String_num(2,clearodd,8,45);
+    Show_String_num(2,cleareven,9,45);
+    Show_String_num(2,clearodd1,10,45);
+    Show_String_num(2,cleareven1,11,45);
+    Show_String_num(2,clearodd2,8,71);
+    Show_String_num(2,cleareven2,9,71);
+    Show_String_num(2,clearodd3,10,71);
+    Show_String_num(2,cleareven3,11,71);
+    Show_String_num(2,clearodd4,8,97);
+    Show_String_num(2,cleareven4,9,97);
+    Show_String_num(2,clearodd5,10,97);
+    Show_String_num(2,cleareven5,11,97);
+    Show_String_num(2,clearodd4,8,58);
+    Show_String_num(2,cleareven4,9,58);
+    Show_String_num(2,clearodd5,10,58);
+    Show_String_num(2,cleareven5,11,58);
+    Show_String_num(2,clearodd4,8,84);
+    Show_String_num(2,cleareven4,9,84);
+    Show_String_num(2,clearodd5,10,84);
+    Show_String_num(2,cleareven5,11,84);
+}
+
+void oledwrite(int num1,int num2,int num3,int analog_read)
+{
+    unsigned char sh[8] = {1,3,5,7,9,11,13,0};
+    unsigned char sh1[8] = {2,4,6,8,10,12,14,0};
+    unsigned char Name[4]={54,33,44,0};
+//    unsigned char Name[10]={52,69,77,80,82,65,84,85,82,0};
+    unsigned char dot[2]={14,0};
+    unsigned char a,b,c;
+    Show_String_big(2,sh,4,35);
+    Show_String_big(2,sh1,5,35);
+    Show_String(1,Name,14,75);
+//    Show_String(1,dot,11,95);
+    clear_screen();
+    switch(num1)
+            {
+                case 0:
+                    a = 1;
+                    break;
+                case 1:
+                    a = 5;
+                    break;
+                case 2:
+                    a = 9;
+                    break;
+                case 3:
+                    a = 13;
+                    break;
+                case 4:
+                    a = 17;
+                    break;
+                case 5:
+                    a = 21;
+                    break;
+                case 6:
+                    a = 25;
+                    break;
+                case 7:
+                    a = 29;
+                    break;
+                case 8:
+                    a = 33;
+                    break;
+                case 9:
+                    a = 37;
+                    break;
+            }
+            switch(num2)
+            {
+                case 0:
+                    b = 1;
+                    break;
+                case 1:
+                    b = 5;
+                    break;
+                case 2:
+                    b = 9;
+                    break;
+                case 3:
+                    b = 13;
+                    break;
+                case 4:
+                    b = 17;
+                    break;
+                case 5:
+                    b = 21;
+                    break;
+                case 6:
+                    b = 25;
+                    break;
+                case 7:
+                    b = 29;
+                    break;
+                case 8:
+                    b = 33;
+                    break;
+                case 9:
+                    b = 37;
+                    break;
+            }
+            switch(num3)
+            {
+                case 0:
+                    c = 1;
+                    break;
+                case 1:
+                    c = 5;
+                    break;
+                case 2:
+                    c = 9;
+                    break;
+                case 3:
+                    c = 13;
+                    break;
+                case 4:
+                    c = 17;
+                    break;
+                case 5:
+                    c = 21;
+                    break;
+                case 6:
+                    c = 25;
+                    break;
+                case 7:
+                    c = 29;
+                    break;
+                case 8:
+                    c = 33;
+                    break;
+                case 9:
+                    c = 37;
+                    break;
+            }
+        unsigned char numodd[2] = {a,0};
+        unsigned char numeven[2] = {(a+1),0};
+        unsigned char numodd1[2] = {(a+2),0};
+        unsigned char numeven1[2] = {(a+3),0};
+        unsigned char numodd2[2] = {b,0};
+        unsigned char numeven2[2] = {(b+1),0};
+        unsigned char numodd3[2] = {(b+2),0};
+        unsigned char numeven3[2] = {(b+3),0};
+        unsigned char numodd4[2] = {c,0};
+        unsigned char numeven4[2] = {(c+1),0};
+        unsigned char numodd5[2] = {(c+2),0};
+        unsigned char numeven5[2] = {(c+3),0};
+        if(analog_read >=100)
+        {
+            Show_String_num(2,numodd,8,45);
+            Show_String_num(2,numeven,9,45);
+            Show_String_num(2,numodd1,10,45);
+            Show_String_num(2,numeven1,11,45);
+            Show_String_num(2,numodd2,8,71);
+            Show_String_num(2,numeven2,9,71);
+            Show_String_num(2,numodd3,10,71);
+            Show_String_num(2,numeven3,11,71);
+            Show_String_num(2,numodd4,8,97);
+            Show_String_num(2,numeven4,9,97);
+            Show_String_num(2,numodd5,10,97);
+            Show_String_num(2,numeven5,11,97);
+        }
+        else if(analog_read < 10)
+        {
+            Show_String_num(2,numodd4,8,71);
+            Show_String_num(2,numeven4,9,71);
+            Show_String_num(2,numodd5,10,71);
+            Show_String_num(2,numeven5,11,71);
+        }
+        else
+        {
+            Show_String_num(2,numodd2,8,58);
+            Show_String_num(2,numeven2,9,58);
+            Show_String_num(2,numodd3,10,58);
+            Show_String_num(2,numeven3,11,58);
+            Show_String_num(2,numodd4,8,84);
+            Show_String_num(2,numeven4,9,84);
+            Show_String_num(2,numodd5,10,84);
+            Show_String_num(2,numeven5,11,84);
+        }
+        
+        
+}