查看: 7601|回復: 182
打印 上一主題 下一主題

OLED 128*64自制可達10000000個選項的菜單(已更新)

  [復制鏈接]
  • TA的每日心情
    奮斗
    2019-8-25 00:01
  • 簽到天數: 87 天

    [LV.6]常住居民II

    跳轉到指定樓層
    樓主
    發表于 2019-7-4 20:31 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
    本帖最后由 新手之帆 于 2019-7-29 11:01 編輯

      OLED 128*64自制可達10000000個選項的菜單


    溫馨提示:
      建議占個樓再食用本帖子!!!  庫已經完成,移步到http://www.lfjdqf.icu/thread-90636-1-1.html
    一:前言  大家在使用OLED時,會不會常常因為無法顯示過多內容而煩惱呢?而菜單就可以解決這樣的問題——前面輸出編號,后面輸出該項的名稱,按鍵1按下往下拉,按鍵2按下就進入該項,再按下按鍵2返回。
    我們要實現的就是這個功能,而這個功能也是對我們來說非常重要的。
    有了這個菜單功能,我們才能“干出一番事業”!
    二.硬件準備
       1塊arduino開發板,我這里用的NANO,其它的也可以。IIC的OLED 128*64;  2顆輕觸按鍵。
    連線圖:
      
    其中,按鍵另一端接地。在程序的pinMode將INPUT改為INPUT_PULLUP就可以啦!
    三:思維導入
    游客,如果您要查看本帖隱藏內容請回復

    如果這么詳細還不懂的話,請關掉該帖子,繼續學習!
    四:項目分析
      該項目是菜單的,所以肯定要有屏幕驅動庫的,在此,我采用的是u8g2的庫。如果沒有的話,可以去github搜索一下,然后放入libraries文件夾中。
      然后,按鍵是普通的輕觸按鍵就可以了。
      下面,給出實物圖片:




    看到了嗎,這就是我們的最終成品。
    一個面輸出3個選項,再一個指針圖表“->”減號和大于號組成的
    那么,我們如何將思路連同實際整合起來,完成我們的菜單實品呢?
    且看代碼分析一章。
    五:代碼分析
    游客,如果您要查看本帖隱藏內容請回復


    上面這一段代碼,大家照抄進去就可以了!


    下面是全局的一些定義
    游客,如果您要查看本帖隱藏內容請回復



    大家結合我剛剛說的,理解一下各個變量的意義。


    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行事!!!!!!!!!!!!!!!





    要是版主大大覺得好的話,評個精華再走呦!!!!


    QQ:3320987642(不常在,備注社區用戶)




    放暑假啦!


    覺得好就打賞一下吧!!讓我有動力繼續寫教程
  • TA的每日心情
    奮斗
    2019-8-25 00:01
  • 簽到天數: 87 天

    [LV.6]常住居民II

    沙發
     樓主| 發表于 2019-7-5 11:42 | 只看該作者
    LZ先占沙發!
    覺得好就打賞一下吧!!讓我有動力繼續寫教程
  • TA的每日心情
    難過
    2019-10-4 14:19
  • 簽到天數: 91 天

    [LV.6]常住居民II

    板凳
    發表于 2019-7-5 13:09 | 只看該作者
    不錯不錯,學習學習
  • TA的每日心情
    慵懶
    2019-10-11 18:34
  • 簽到天數: 138 天

    [LV.7]常住居民III

    地板
    發表于 2019-7-5 13:44 | 只看該作者
    非常不錯,剛好正在學這。太謝謝啦!

    該用戶從未簽到

    5#
    發表于 2019-7-5 16:11 | 只看該作者
    多謝,大神資源
  • TA的每日心情
    擦汗
    2019-7-3 21:39
  • 簽到天數: 3 天

    [LV.2]偶爾看看I

    6#
    發表于 2019-7-5 16:21 | 只看該作者
    啦啦啦啦啦啦啦啦綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠綠
  • TA的每日心情
    擦汗
    2019-8-17 09:22
  • 簽到天數: 44 天

    [LV.5]常住居民I

    8#
    發表于 2019-7-5 21:41 | 只看該作者
    樓主好棒,一起學習
  • TA的每日心情
    擦汗
    2019-8-17 09:22
  • 簽到天數: 44 天

    [LV.5]常住居民I

    9#
    發表于 2019-7-5 21:42 | 只看該作者
    樓主666,一起學習
  • TA的每日心情
    奮斗
    2019-10-12 07:40
  • 簽到天數: 388 天

    [LV.9]以壇為家II

    10#
    發表于 2019-7-6 08:03 | 只看該作者
    看看如何實現的
    您需要登錄后才可以回帖 登錄 | 立即注冊  

    本版積分規則

    熱門推薦

    arduino實現L298N控制工業步進電機
    arduino實現L298N控制工業
    求助 L298N是ST公司生產的一種高電壓、大電流電機驅動芯片。該芯片采用15腳封裝。主
    arduino IDE錯誤,有點崩潰了,要搞作業!
    arduino IDE錯誤,有點崩
    無論編譯什么程序文件都是這個錯誤!程序自帶例程,最簡單的點亮led燈也是 這個 問題
    【項目】基于Arduino Nano的多功能桌面感應垃圾桶
    【項目】基于Arduino Nano
    基于Arduino Nano的多功能桌面感應垃圾桶隨著大學生活不斷往前邁進,宿舍桌面上的雜物
    在芯間投資成立的零知實驗室發布國內的STM32開源開發板
    在芯間投資成立的零知實驗
    在芯間電子元器件商城成立于2016年,是集電子元器件采購、SMT貼片、PCB打樣、于一
    【原創】全球最小口袋3D打印機mini one直播教程貼
    【原創】全球最小口袋3D打
    最近閑得蛋疼,沒事搞個掌上3D打印機,先放效果圖吧。 搞了半天,終于能正常打印,
    Copyright   ©2015-2016  Arduino中文社區  Powered by©Discuz!   ( 蜀ICP備14017632號-3 )
    快速回復 返回頂部 返回列表
    美娱娱乐登录网址