OLED 128*64自制可达10000000个选项的菜单(已更新)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 152622|回复: 830

OLED 128*64自制可达10000000个选项的菜单(已更新)

  [复制链接]
发表于 2019-7-4 20:31 | 显示全部楼层 |阅读模式
本帖最后由 新手之帆 于 2020-1-14 10:57 编辑

  OLED 128*64自制可达10000000个选项的菜单


温馨提示:
  建议占个楼再食用本帖子!!!  库已经完成,移步到https://www.arduino.cn/thread-90636-1-1.html
一:前言  大家在使用OLED时,会不会常常因为无法显示过多内容而烦恼呢?而菜单就可以解决这样的问题——前面输出编号,后面输出该项的名称,按键1按下往下拉,按键2按下就进入该项,再按下按键2返回。
我们要实现的就是这个功能,而这个功能也是对我们来说非常重要的。
u=3789069399,1600775213&fm=27&gp=0.jpg 有了这个菜单功能,我们才能“干出一番事业”!
二.硬件准备
   1块arduino开发板,我这里用的NANO,其它的也可以。IIC的OLED 128*64;  2颗轻触按键。
连线图: J{E}$D]Y$FJG[T(ZVHDAKTF.png
  
其中,按键另一端接地。在程序的pinMode将INPUT改为INPUT_PULLUP就可以啦!
三:思维导入
游客,如果您要查看本帖隐藏内容请回复

如果这么详细还不懂的话,请关掉该帖子,继续学习!
四:项目分析
  该项目是菜单的,所以肯定要有屏幕驱动库的,在此,我采用的是u8g2的库。如果没有的话,可以去github搜索一下,然后放入libraries文件夹中。
  然后,按键是普通的轻触按键就可以了。
  下面,给出实物图片:
DCE6396CA15B274B4B10EE851A7493ED.jpg
FF8A908289095F5327B0134A92FBB5F1.jpg


看到了吗,这就是我们的最终成品。
一个面输出3个选项,再一个指针图表“->”减号和大于号组成的
那么,我们如何将思路连同实际整合起来,完成我们的菜单实品呢?
且看代码分析一章。 ~${UAON~W)9KS8JK}NBA0[7.png
五:代码分析
游客,如果您要查看本帖隐藏内容请回复


上面这一段代码,大家照抄进去就可以了!


下面是全局的一些定义
游客,如果您要查看本帖隐藏内容请回复



大家结合我刚刚说的,理解一下各个变量的意义。


flag说得很透彻啦,就是一个标志,标志着,现在是默认界面,还是在某一个选项中。
i就不用说啦,目前的下标。
j是什么呢?
我在这里先留一个疑问,等大家看了全部的代码,再过来,相信你一定会恍然大悟的!


接下来是setup:


游客,如果您要查看本帖隐藏内容请回复


这几个函数,相信大家都非常熟悉。如果连这几个函数都不懂,我也无能为力。建议去买奈何大佬的书补补基础。


接下来,就是最激动人心的loop函数啦!


我偏偏不一下子都放出来


首先,是几个按键的判断。
  if(digitalRead(6)==0){
    delay(13);                                       //消抖,我手废
    if(digitalRead(6)==0) i++;
  }
  if(digitalRead(7)==0){
    delay(13);
    if(digitalRead(7)==0) flag=!flag;  //flag取反
  }
  if(i==9){
    i=0;
  }

要是i到了边界,自然要为0啊,难不成,要输出乱码吗?
其中的delay我觉得最好加,因为我手太废了!
当然,各位如果有信心,也可以去掉。


  if(flag==0){
    j=0;//j是判断是否刚刚flag=1的,如果是就要刷新
    u8g2.firstPage();
    do{
      u8g2.setFont(u8g2_font_ncenB14_tr);
      int uu=0;
      int ii=i;      //这是第一个
      while(uu<3){  //循环3次
        u8g2.setCursor(18,(uu+1)*18);
        u8g2.print(ii);
        u8g2.print("  ");
        u8g2.print(str[ii]);
        u8g2.setCursor(0,15);
        u8g2.print("->");
        uu++;
        ii++;
        if(ii==9)  ii=0;//有点类似于以前写的数字递增,到了10就变0,就这意思
       }
     }while(u8g2.nextPage());//i与ii的区别:i是第一位的指向数,而ii不同,如果ii到了10,必须为0,i也如此,ii在循环中最多是i+3,2者不同。假如i=8,则ii的数值将会为8,0,1
  }   

这里面,我已经说得非常透彻了——自我认为啊!
其中的      u8g2.setCursor(18,(uu+1)*18);
就是一个界面中有3个项,uu就是目前输出项的位置,它的取值范围是0-2,所以用它+1然后乘一个常量,就可以确定y的位置了!其中的常量自己确定,慢慢调,这里的18是我调出来的,感觉较美观的。


上面的是flag==0的情况,也就是默认界面的输出,那么,flag==1要怎么办呢?


  else if(flag==1){
    j++;
    if(j==1)u8g2.clear();
   /* switch(i){关于i的判断
      
    }*/
  }

是不是恍然大悟了啊!
原来,flag==0的时候,j就是0
要是flag刚刚等于1的时候,j就递增,要是j等于1,就说明,现在刚刚进入该项里面,所以执行清屏。


关于switch,我把他注释了,这就是该项的输出内容,我简单写一下:
  switch(i){
    case 1:
       first();
     break;
    case 2:
       second();
    break;
}
大家就这样写下去就可以了!


如果目前帖子看到这里,你还是有些疑问的话,可以留言,或者再看一遍。


视频在2楼上传!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



六:拓展实例
  有空做了后发上来,这个不怎么要紧。


最后,我再说一次程序的运行过程:
  首先flag=0,所以会运行默认函数,要是再按下按键2,flag就是1,会根据当前的i进行该选项的内容的显示。再按下按键2,flag取反,等于0,所以又返回了!
  每次按下按键1,i递增,i==9,i就是0,也就是到了末尾了。其他的我已经在思路中讲得非常透彻了!!




如果看到这里的话,你就会发现:

  在程序中,标志才是重要的。要根据flag行事!!!!!!!!!!!!!!!





要是版主大大觉得好的话,评个精华再走呦!!!!





放暑假啦!


 楼主| 发表于 2019-7-5 11:42 | 显示全部楼层
LZ先占沙发!
发表于 2019-7-5 13:09 | 显示全部楼层
不错不错,学习学习
发表于 2019-7-5 13:44 | 显示全部楼层
非常不错,刚好正在学这。太谢谢啦!
发表于 2019-7-5 16:11 | 显示全部楼层
多谢,大神资源
发表于 2019-7-5 16:21 | 显示全部楼层
啦啦啦啦啦啦啦啦绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿
发表于 2019-7-5 21:41 | 显示全部楼层
楼主好棒,一起学习
发表于 2019-7-5 21:42 | 显示全部楼层
楼主666,一起学习
发表于 2019-7-6 08:03 | 显示全部楼层
看看如何实现的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 01:36 , Processed in 0.181015 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表