//B站@小蛋显璐--OLED丝滑菜单教程(四)(完结) : https://www.bilibili.com/video/BV1iP4y1y7zZ/?spm_id_from=333.999.0.0&vd_source=b344881caf56010b57ef7c87acf3ec92
#include <U8g2lib.h>
#include <Wire.h>
#include <math.h>

const u8 sanlian[] U8X8_PROGMEM  = 
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0xE0,
0x07,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,
0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0xFC,
0x7F,0x00,0x00,0x00,0x00,0xF0,0x01,0x00,
0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0xFF,
0xFF,0x01,0x00,0x00,0x00,0xF8,0x01,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0xC0,0xFF,
0xFF,0x03,0x00,0x00,0x00,0xF8,0x03,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0xE0,0xFF,
0xFF,0x07,0x00,0x00,0x00,0xFC,0x03,0x00,
0x00,0x00,0x7F,0x00,0x00,0x00,0xF0,0xFF,
0xFF,0x1F,0x00,0x00,0x00,0xFC,0x03,0x00,
0x00,0x80,0x7F,0x00,0x00,0x00,0xF8,0x01,
0x00,0x1F,0x00,0x00,0x00,0xFC,0x07,0x00,
0x00,0x80,0x7F,0x00,0x00,0x00,0xFC,0x00,
0x00,0x3F,0x00,0x00,0x00,0xFE,0x0F,0x00,
0x00,0xC0,0x7F,0x00,0x00,0x00,0xFC,0x00,
0x00,0x7F,0x00,0x00,0x00,0xFF,0x1F,0x00,
0x00,0xE0,0x7F,0x00,0x00,0x00,0xFE,0x7F,
0xFC,0x7F,0x00,0x00,0xC0,0xFF,0x3F,0x00,
0x00,0xF8,0x7F,0x00,0x00,0x00,0xFE,0x7F,
0xFC,0xFF,0x00,0x00,0xFE,0xFF,0xFF,0x0F,
0xF0,0xF8,0xFF,0xFF,0x01,0x00,0xFE,0x1F,
0xF0,0xFF,0x00,0xC0,0xFF,0xFF,0xFF,0x7F,
0xFC,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x07,
0xC0,0xFF,0x00,0xE0,0xFF,0xFF,0xFF,0x7F,
0xFC,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x01,
0x80,0xFF,0x01,0xC0,0xFF,0xFF,0xFF,0x7F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x41,
0x00,0xFF,0x01,0xC0,0xFF,0xFF,0xFF,0x3F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0xFF,0x70,
0x0C,0xFE,0x01,0x80,0xFF,0xFF,0xFF,0x1F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0x7F,0x78,
0x3C,0xFE,0x01,0x00,0xFF,0xFF,0xFF,0x0F,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0x7F,0x7C,
0x3C,0xFC,0x01,0x00,0xFE,0xFF,0xFF,0x07,
0xFE,0xF8,0xFF,0xFF,0x07,0x00,0x7F,0x7C,
0x3C,0xFC,0x01,0x00,0xFC,0xFF,0xFF,0x03,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7F,0x7C,
0x7C,0xFC,0x01,0x00,0xF8,0xFF,0xFF,0x03,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7F,0x7C,
0x7C,0xFC,0x01,0x00,0xF0,0xFF,0xFF,0x01,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7F,0x7C,
0x7C,0xFC,0x00,0x00,0xF0,0xFF,0xFF,0x01,
0xFE,0xF8,0xFF,0xFF,0x03,0x00,0x7E,0x7C,
0x7C,0xFC,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFE,0x7F,
0xFC,0xFF,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFE,0x7F,
0xFC,0x7F,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFC,0x7F,
0xFC,0x7F,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x01,0x00,0xFC,0x7F,
0xFC,0x3F,0x00,0x00,0xF0,0xFF,0xFF,0x00,
0xFE,0xF8,0xFF,0xFF,0x00,0x00,0xF8,0x7F,
0xFC,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x01,
0xFE,0xF8,0xFF,0xFF,0x00,0x00,0xF0,0xFF,
0xFF,0x1F,0x00,0x00,0xF0,0xFF,0xFF,0x01,
0xFC,0xF8,0xFF,0x7F,0x00,0x00,0xE0,0xFF,
0xFF,0x0F,0x00,0x00,0xF8,0x0F,0xFF,0x01,
0xFC,0xF8,0xFF,0x3F,0x00,0x00,0xC0,0xFF,
0xFF,0x03,0x00,0x00,0xF8,0x03,0xFC,0x01,
0xF8,0xF8,0xFF,0x1F,0x00,0x00,0x00,0xFF,
0xFF,0x01,0x00,0x00,0xF8,0x01,0xF0,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,
0x7F,0x00,0x00,0x00,0x70,0x00,0xC0,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,
0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"C:\Users\ROG\Desktop\无标题.bmp",0*/
/* (128 X 36 )*/
};


// U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);//该驱动是1.3寸的OLED屏幕。
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

void setup(void) 
{
 	// pinMode(2, INPUT_PULLUP);
  // pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
  u8g2.begin();
  u8g2.setFont(u8g2_font_t0_22_mf ); //设置字体
}





u8 ui_disapper(void)
{
  static short disapper_temp = 0; // 0 ~8  消失时右移的位数

  int len = 8 * u8g2.getBufferTileHeight() * u8g2.getBufferTileWidth(); // len = 1024 , 8 * 8 * 16
  u8 *p = u8g2.getBufferPtr(); // 1bye = 8bit  即 1111 1111
  u8 return_flag = 0;
  // Serial.println("len:" + String(len));
  // delay(2000);

  for( int i = 0;i< len ;i++)
  {
    // p[i] = p[i] & (rand()%0xff) >> disapper_temp;   // 随机与清除掉一些像素,呈现像素的颗粒感 假如p[1024]=8bit=1111 1111  0xff=8bit=1111 1111  
    p[i] = p[i]  >> disapper_temp;  // p[i] = 1111 1111 >> 2 ,即0011 1111 1是点亮像素 0是熄灭像素
    // Serial.println("P"+String(i)+"="+ String(p[i])); // p[0]~p[1024] 整个屏幕每一个像素点都要右移 0位 2位 4位 6位 8位 共右移5次屏幕才完全消失
    // delay(30);
  }
  disapper_temp +=2;

  if(disapper_temp > 8)
  {
      return_flag = 1;
      disapper_temp = 0;
      // Serial.println("右移消失完毕");
  }
  return return_flag ? 0 : 1;
}

u8 ui_come(void)
{
    static short come_temp = 8;     // 8 ~ 0 显示时左移的位数

    int len = 8 * u8g2.getBufferTileHeight() * u8g2.getBufferTileWidth();
    u8 *p = u8g2.getBufferPtr();
    u8 return_flag = 0;
    for( int i = 0;i< len ;i++)
    {
        // p[i] = p[i] & (rand()%0xff) >> come_temp;
        p[i] = p[i]  >> come_temp;    // 右移8位 6 位 4 位 2位 0位

    }
    come_temp -=2;
    if(come_temp < 0)
    {
        return_flag = 1;
        come_temp = 8;
        // Serial.println("右移显示完毕");
    }
    return return_flag ? 0 : 1;
}



void loop(void) 
{
  Serial.println("进入第一个while");
  while(1)
  {

  static u8 flag = 0;
// u8 stop_flag = 0;
  u8g2.clearBuffer();                  // 清除内部缓冲区
  u8g2.drawXBMP(0,20,128,36,sanlian);  // 第一段输出位置   
  if(flag==1)
  {
    if(ui_disapper() == 0)
    { 
      // Serial.println("消失完毕");
      flag = 0;
      u8g2.sendBuffer();          // transfer internal memory to the displa
      // while(1){}
      break;
    }
  }
  else// flag = 0 先显示 后消失
  {
    if(ui_come() == 0)
    {        
      // Serial.println("显示完毕"); 
      flag = 1;
      u8g2.sendBuffer();          // transfer internal memory to the displa
      // stop_flag = 1;   //暂停1秒
      delay(1000); // 显示完毕时暂停一秒

    }
  }
  u8g2.sendBuffer();          // transfer internal memory to the displa
  // if(stop_flag == 1)
  // {
  //   stop_flag = 0;
  //   delay(1000); // 暂停一秒
  // }

  }


  while(1){Serial.println("第二个while");}

}