
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stdlib.h"


void SH1108_comm_out(char data);
void SH1108_data_out(char data);
void SH1108_SPI_Write(char data);
void SH1108_point( char x, char y);
void SH1108_show_8x16(char y, char x, char word) ;
void SH1108_show_variable(char y, char x, char l, int word);



#define SH1108_SCL_SetOutput()        LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_0, LL_GPIO_MODE_OUTPUT);//SDA
#define SH1108_SCL_SetVal()           LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_0);
#define SH1108_SCL_ClrVal()           LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_0);

#define SH1108_SDA_SetOutput()        LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_1, LL_GPIO_MODE_OUTPUT);//SDA
#define SH1108_SDA_SetInput()         LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_1, LL_GPIO_MODE_INPUT);//SDA 
#define SH1108_SDA_SetVal()           LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_1);
#define SH1108_SDA_ClrVal()           LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_1);
 //模组屏
#define SH1108_DC_SetOutput()         LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT);//DC   
#define SH1108_DC_SetVal()            LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_5);
#define SH1108_DC_ClrVal()            LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_5);

#define SH1108_RES_SetOutput()        LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_4, LL_GPIO_MODE_OUTPUT);//RES  
#define SH1108_RES_SetVal()           LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_4);
#define SH1108_RES_ClrVal()           LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_4);

#define SH1108_CS_SetOutput()         LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_2, LL_GPIO_MODE_OUTPUT);//CS
#define SH1108_CS_SetVal()            LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_2);
#define SH1108_CS_ClrVal()            LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_2);

/*
//测试板
#define SH1108_DC_SetOutput()         LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_2, LL_GPIO_MODE_OUTPUT);//DC   
#define SH1108_DC_SetVal()            LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_2);
#define SH1108_DC_ClrVal()            LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_2);

#define SH1108_RES_SetOutput()        LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_3, LL_GPIO_MODE_OUTPUT);//RES  
#define SH1108_RES_SetVal()           LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_3);
#define SH1108_RES_ClrVal()           LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_3);

#define SH1108_CS_SetOutput()         LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_4, LL_GPIO_MODE_OUTPUT);//CS
#define SH1108_CS_SetVal()            LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_4);
#define SH1108_CS_ClrVal()            LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_4);
*/

void SH1108_192_test(void)
{
   int i,j;
  char sentence01[]  = "0123456789;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
      switch( Sub_Menu )
          {
              case 0: //白色 
                SH1108_comm_out(0xa6);
                for(i=0;i<20;i++)
                {
                     SH1108_comm_out(0xb0);//Set Row Address of Display RAM
                     SH1108_comm_out(i);
                     SH1108_comm_out(0x00);//Set Lower Column Address of display RAM
                     SH1108_comm_out(0x10);//Set Higher Column Address of display RAM
                     for(j=0;j<160;j++)
                     {
                        SH1108_data_out(0xFF);
                     }
                }
                      break;
              case 1:    //黑色
                    
                         SH1108_comm_out(0xb0);//Set Row Address of Display RAM
                         SH1108_comm_out(0);
                         SH1108_comm_out(0x01);//Set Lower Column Address of display RAM
                         SH1108_comm_out(0x11);//Set Higher Column Address of display RAM
                         for(j=0;j<126;j++)
                         {
                            SH1108_data_out(0x01);
                         }
                    for(i=1;i<19;i++)
                    {
                         SH1108_comm_out(0xb0);//Set Row Address of Display RAM
                         SH1108_comm_out(i);
                         SH1108_comm_out(0x01);//Set Lower Column Address of display RAM
                         SH1108_comm_out(0x11);//Set Higher Column Address of display RAM
                         for(j=0;j<126;j++)
                         {
                            SH1108_data_out(0x00);
                         }
                          
                    }
                         SH1108_comm_out(0xb0);//Set Row Address of Display RAM
                         SH1108_comm_out(19);
                         SH1108_comm_out(0x01);//Set Lower Column Address of display RAM
                         SH1108_comm_out(0x11);//Set Higher Column Address of display RAM
                         for(j=0;j<126;j++)
                         {
                            SH1108_data_out(0x80);
                         }
                         
                    _Delay_us(80000);
                    
                break;
              case 2:   //50%  
                     for(i=0;i<20;i++)
                     {     
                        SH1108_comm_out(0xb0);//Set Row Address of Display RAM
                         SH1108_comm_out(i);
                         SH1108_comm_out(0x00);//Set Lower Column Address of display RAM
                         SH1108_comm_out(0x10);//Set Higher Column Address of display RAM
                         for(j=0;j<128;j++)       
                         {    SH1108_data_out(0xAA);
                              SH1108_data_out(0x55);
                         }  

                     }
                break;
              case 3:  //LOG 
                   for(i=0;i<64;i++)       {      SH1108_show_8x16(i/16*2, (i%16)*8, sentence01[i]) ;   }
                   for(i=0;i<64;i++)       {      SH1108_show_8x16(i/16*2+8, (i%16)*8, sentence01[i]) ;   }
                   for(i=0;i<64;i++)       {      SH1108_show_8x16(i/16*2+16, (i%16)*8, sentence01[i]) ;   }

                break;
              case 4:  
                  SH1108_comm_out(0xa7);//Set Reverse Display
                  
                   Sub_Menu = 8;
                break;
              case 5:    
                break;
              case 6:     
                break;
              case 7:     
                break;
              case 8:    
                break;
              case 9:    
                break;
           }
    _Delay_us(80000);
    
}

void SH1108_192_initial(void)
{
   int i,j;
   
    LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOC);
    
    SH1108_CS_SetOutput();        SH1108_CS_ClrVal(); 
    SH1108_DC_SetOutput();       
    SH1108_SCL_SetOutput();
    SH1108_SDA_SetOutput();
//    SH1108_Data_SetOutput();
    
    SH1108_RES_SetOutput(); 
    SH1108_RES_SetVal();   _Delay_us(1000);
    SH1108_RES_ClrVal();   _Delay_us(2000);
    SH1108_RES_SetVal();   _Delay_us(3000);
    
    SH1108_comm_out(0xae);//Display OFF(sleep mode)
    SH1108_comm_out(0x81);//Set Contrast Control
      SH1108_comm_out(0xd0);//For VPP 13.5V
      SH1108_comm_out(0xa0);//Set Segment Re-map
      SH1108_comm_out(0xa4);//Set Entire Display OFF/ON
      SH1108_comm_out(0xa6);//Set Normal/Reverse Display
      SH1108_comm_out(0xa9);//Display Resolution Control
      SH1108_comm_out(0x02);
      SH1108_comm_out(0xad);//DC-DC Control Mode Set
      SH1108_comm_out(0x80);
      SH1108_comm_out(0xc0);//Set COM Output Scan Direction
      SH1108_comm_out(0xd5);//Set Display Clock Divide Ratio/Oscillator Frequency
      SH1108_comm_out(0x40);
      SH1108_comm_out(0xd9);//Dis-charge/Pre-charge Period Mode Set
      SH1108_comm_out(0x2f);
      SH1108_comm_out(0xdb);//Set VCOMH Deselect Level
      SH1108_comm_out(0x3f);
      SH1108_comm_out(0x20);//Page addressing mode
      SH1108_comm_out(0xdc);//VSEGM Deselect Level Mode Set
      SH1108_comm_out(0x35);
      SH1108_comm_out(0x30);//Set Discharge VSL Level
      
      SH1108_comm_out(0xaf);//Set Display ON
      
      _Delay_us(600);
    

}



/******************************************************************************
*  y: 列位置，取值范围0-63
*  x: 行位置，取值范围0-127
* 
* 
*******************************************************************************/
void SH1108_show_8x16(char y, char x, char word) 
{ 
    int i,j;    
    
    SH1108_comm_out(0xb0);      //Set  page行地址
    SH1108_comm_out(y);
    SH1108_comm_out(0x00+x%16);   //Set 低列地址
    SH1108_comm_out(0x11+x/16);   //Set 高列地址
    for(i=0;i<8;i++) 
    { 
      j = word<<4 | i<<1;
      SH1108_data_out(Arial_8x16[j]); 
    }
    SH1108_comm_out(0xb0);    //Set  page行地址
    SH1108_comm_out(y+1);
    SH1108_comm_out(0x00+x%16);   //Set 低列地址
    SH1108_comm_out(0x11+x/16);   //Set 高列地址
    for(i=0;i<8;i++) 
    { 
      j= word<<4 | i<<1 | 1;
      SH1108_data_out(Arial_8x16[j] ); 
    }
}
void SH1108_comm_out(char data)
{
//    SH1108_RD_SetVal();
    SH1108_DC_ClrVal();// 0 - comm
//    SH1108_WR_ClrVal();
//    SH1108_Data_SetVal(data);
//    SH1108_WR_SetVal();      _Delay_us(1);
    SH1108_SPI_Write(data);  
}

void SH1108_data_out(char data)
{
 
//    SH1108_RD_SetVal();
    SH1108_DC_SetVal();// 1 - data
//    SH1108_WR_ClrVal();
//    SH1108_Data_SetVal(data);
//    SH1108_WR_SetVal();    _Delay_us(1);
  
    SH1108_SPI_Write(data);
}
void SH1108_SPI_Write(char data)
{
    uint8_t i;

    for(i=0; i<8; i++)
    {
        if(data & 0x80) {                SH1108_SDA_SetVal();        }
        else            {                SH1108_SDA_ClrVal();        }
        data <<= 1;		//_Delay_ns(1);
         SH1108_SCL_ClrVal();	_Delay_ns(1);        
         SH1108_SCL_SetVal();	//_Delay_ns(1);

    }
}
