#include <U8g2lib.h>
#include <Wire.h>
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);这是比较常用的0.9寸的OLED显示器的驱动
short x, x_trg; //x当前x坐标值,x_trg 目标x坐标值
short y = 10, y_trg = 10; //y坐标,目标y坐标
int state; //状态
typedef struct //定义别名为CAIDAN_LIEBIAO的结构
{
char *str; //指针变量用于指向菜单列表成员的地址
} CD_LIEBIAO;
CD_LIEBIAO LieBiao[] = { //定义结构体数组来存放菜单列表
{"a"}, {"ab"}, {"abc"}
};
/***------------菜单移动(从当前坐标向目标坐标靠近)------***/
int cd_run(short *a, short *a_trg) //两个指针变量分别指向代入坐标的地址
{
if (*a < *a_trg) //取出两个地址中的数据(坐标值)进行比较,如果当前坐标小于目标坐标
{
*a += 1; //加大当前坐标值,向目标坐标靠近
}
else if ( *a > *a_trg)
{
*a -= 1;
}
else
{
return 0; //如果两坐标相等,返回0
}
return 1; //不相等,返回1
}
/***===================================================***/
/***-------------------------菜单显示--------------------------***/
void cd_show(void)
{
u8g2.clearBuffer(); // 清除内部缓冲区
int CD_ChangDu = sizeof(LieBiao) / sizeof(CD_LIEBIAO);//计算菜单列表的成员数量
for (int i = 0; i < CD_ChangDu ; i++) //遍历列表成员
{
u8g2.drawStr(x + 10, y + i * 10, LieBiao[i].str); // 输出列表成员
}
if ((cd_run(&y, &y_trg)) == 0) //如果菜单移动到了目标坐标
{
switch (state) //设置两个坐标值,让菜单在两个坐标之间来回移动
{
case 0: //状态为0
{
y_trg = 44; //将目标坐标赋值为44,可根据菜单调整
state = 1; //状态置为1
break;
}
case 1: //状态为1
{
y_trg = 8; //目标坐标赋值为8
state = 0; //状态置为0
break;
}
}
}
u8g2.sendBuffer(); // 将内存数据传输到显示器
}
/***===================================================***/
void setup(void)
{
u8g2.begin(); //U8G2初始化
u8g2.setFont(u8g2_font_ncenB08_tr); //设置字体
}
void loop(void)
{
cd_show();
}