查看: 56763|回复: 638

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 | 显示全部楼层
多谢,大神资源

签到天数: 3 天

[LV.2]偶尔看看I

发表于 2019-7-5 16:21 | 显示全部楼层
啦啦啦啦啦啦啦啦绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿

该用户从未签到

发表于 2019-7-5 21:41 | 显示全部楼层
楼主好棒,一起学习

该用户从未签到

发表于 2019-7-5 21:42 | 显示全部楼层
楼主666,一起学习

签到天数: 64 天

[LV.6]常住居民II

发表于 2019-7-6 08:03 | 显示全部楼层
看看如何实现的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

【Arduino】108种传感器模块系列实验(52)---Micro SD卡读写模块
【Arduino】108种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
DIY炫彩灯带,竟如此简单,更有硬件开发工具免费领!
DIY炫彩灯带,竟如此简单
什么是涂鸦Arduino SDK? Arduino 是全球最流行的开源硬件平台,涂鸦官方推出的 Ardui
步进电机播放音乐
步进电机播放音乐
硬件:使用arduino uno板子与步进电机驱动器TB6600实物图 因为我这里用的是方波,才
esp32控制ws2812灯条会有闪烁
esp32控制ws2812灯条会有
把亮度调为0后第一个灯会一直亮其余一些会闪烁,把亮度调高以后就不会闪烁。之前用esp
想在原有的项目上加上一个呼吸灯怎么做才不影响原程序
想在原有的项目上加上一个
如题,想在原来的程序上加上一个呼吸灯,但是程序中的delay会影响到程序的其他部分,
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表