//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");}
}