查看: 424|回复: 1

Arduino 使用Mega2560和LCD1602做的多级菜单显示功能

[复制链接]
  • TA的每日心情
    开心
    2019-1-9 13:00
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-1-9 13:27 | 显示全部楼层 |阅读模式
    本帖最后由 ZZed 于 2019-1-9 13:39 编辑

    新手小白一枚,最近在做课程设计。看了社区的一个帖子后自己根据原文作者思路写的,按键函数被我自己改了一些算法,简单一点也方便后续加功能。原文作者用的12864是四行中文显示,1602是两行字符显示。再次感谢原文作者的帖子,这是链接(Arduino 用LCD12864做的多级菜单显示功能 https://www.arduino.cn/forum.php ... 6308&fromuid=170791(出处: Arduino中文社区))
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

    int c, var;
    int  KEY = 9;
    int KEY2 = 10;
    int KEY3 = 11;
    int KEY_NUM1 = 0;
    int KEY_NUM2 = 0;
    int KEY_NUM3 = 0;
    lcd.setCursor(0, 0);
    lcd.print("20163907");
    lcd.setCursor(0, 1);
    lcd.print("Zed'program");


    void setup()
    {
      lcd.begin(16, 2);
      pinMode(KEY, INPUT);
      pinMode(KEY2, INPUT);
      pinMode(KEY3, INPUT);
      var = 2;//初始化界面

      lcd.clear();

    }
    void loop()
    {
      ScanKey();          //按键函数
      ScanKey2();
      ScanKey3();

      switch (var)
      {
        case 0:
          lcd.setCursor(0, c);
          lcd.print(">");
          lcd.setCursor(1, 0);
          lcd.print("gongneng1-1 ");
          lcd.setCursor(1, 1);
          lcd.print("gongneng1-2 ");
          break;
        case 1:
          lcd.setCursor(0, c);
          lcd.print(">");
          lcd.setCursor(1, 0);
          lcd.print("gongneng2-1 ");
          lcd.setCursor(1, 1);
          lcd.print("gongneng2-2 ");
          break;
        case 2:
          lcd.setCursor(0, c);
          lcd.print(">");
          lcd.setCursor(1, 0);
          lcd.print("gongneng1");
          lcd.setCursor(1, 1);
          lcd.print("gongneng2");
          break;
        case 3:
          lcd.setCursor(0, c);
          lcd.print(">");
          lcd.setCursor(1, 0);
          lcd.print("gongneng3-1");
          lcd.setCursor(1, 1);
          lcd.print("gongneng3-2");
          break;
        case 4:
          lcd.setCursor(0, c);
          lcd.print(">");
          lcd.setCursor(1, 0);
          lcd.print("gongneng3");


      }
    }
    void ScanKey() {//菜单选择
      KEY_NUM1 = 0;                       //清空变量
      if (digitalRead(KEY) == HIGH)        //有按键按下
      {
        delay(20);                        //延时去抖动
        if (digitalRead(KEY) == HIGH)      //有按键按下
        {
          KEY_NUM1 = 1;                   //变量设置为1
          while (digitalRead(KEY) == HIGH); //等待按键松手
        }
      }
      if (KEY_NUM1 == 1)             //是否按键按下
      {
        c = c + 1; lcd.clear();
        if (c > 1) {
          lcd.clear();
          switch (var) {
            case 0:
              c = 0; break;
            case 1:
              c = 0; break;
            case 2:
              c = 0; var = 4; break;
            case 3:
              c = 0; break;
            case 4:
              c = 0; var = 2; break;
          }

        }


      }
    }
    void ScanKey2() {//确定按键
      KEY_NUM2 = 0;                       //清空变量
      if (digitalRead(KEY2) == HIGH)        //有按键按下
      {
        delay(20);                        //延时去抖动
        if (digitalRead(KEY2) == HIGH)      //有按键按下
        {

          KEY_NUM2 = 1;                   //变量设置为1
          while (digitalRead(KEY2) == HIGH); //等待按键松手
        }
      }
      if (KEY_NUM2 == 1)             //是否按键按下    算法更改后子菜单确认就不会返回主菜单  也方便后续子菜单功能添加。
      {
        lcd.clear();
        switch (var) {
          case 0:
            break;
          case 1:
            break;
          case 2:
           var = c; c = 0;  break;
          case 3:
            c = 0; break;
          case 4:
            c = 0; var = 3; break;
        }
      }
    }
    void ScanKey3() {//返回按键定义
      KEY_NUM3 = 0;                       //清空变量
      if (digitalRead(KEY3) == HIGH)        //有按键按下
      {
        delay(20);                        //延时去抖动
        if (digitalRead(KEY3) == HIGH)      //有按键按下
        {
          KEY_NUM3 = 1;                   //变量设置为1
          while (digitalRead(KEY3) == HIGH); //等待按键松手
        }
      }
      if (KEY_NUM3 == 1)             //是否按键按下
      {
        var = 2; c = 0; lcd.clear();
      }
    }

    一级菜单

    一级菜单

    二级菜单

    二级菜单







    该用户从未签到

    发表于 2019-1-15 19:07 | 显示全部楼层
    能不能把实物的连接图发一下
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    一文教你选择Arduino开发板,小白进
    一文教你选择Arduino开发
    笔者在2016年接触了Arduino,跳了万条坑,行了千里弯,到今天也算是Arduino的一
    Arduino官方开发板购买
    Arduino官方开发板购买
    以下为Arduino官方开发板国内购买渠道,点击即可前往淘宝购买 seeedStudio淘宝
    ESP8266-01用Arduino烧写应该选择那一项??
    ESP8266-01用Arduino烧写
    ESP8266-01用Arduino烧写应该选择那一项??还有我用的 是usb串口板340
    酒精传感与超声波传感的使用
    酒精传感与超声波传感的使
    打算超声波传感检测到距离大于10之后就开始酒精浓度检测 下面是代码 mixly提示testArd
    基于Rosbot的声控小夜灯
    基于Rosbot的声控小夜灯
    参赛项目:基于Rosbot的声控小夜灯 参赛组员: 我自己。某单位在职员工,参与单位
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表