Arduino 使用Mega2560和LCD1602做的多级菜单显示功能-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 9676|回复: 7

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

[复制链接]
发表于 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();
  }
}

一级菜单

一级菜单

二级菜单

二级菜单







发表于 2021-1-24 20:29 | 显示全部楼层
zxy2266 发表于 2020-9-27 15:25
搞好了吗,楼主很不负责人

把这一串代码放到setup里就好了
lcd.setCursor(0, 0);
lcd.print("20163907");
lcd.setCursor(0, 1);
lcd.print("Zed'program");
 楼主| 发表于 2020-9-27 18:58 来自手机 | 显示全部楼层
构造函数LiquidCrystal_I2C lcd(0x27, 16, 2); 括号第一项是驱动芯片地址 后面是行列数
 楼主| 发表于 2020-9-27 18:31 来自手机 | 显示全部楼层
毕业了 好久没逛论坛了 抱歉。实物连接有问题的 注意下驱动芯片 我这是pcf8574 iic协议的 看看自己的屏幕是几线的吧。还有要注意构造函数,就是库下面那句 根据自己实际情况写。还有就是你们的库和我不一样 这是arduino的特点 有可能名字一样但作者不同,
发表于 2020-9-27 15:25 | 显示全部楼层
helloword1111 发表于 2020-3-26 21:40
楼主,你的代码在我这编译出现这种错误,是我哪里没弄对?
注释掉
lcd.setCursor(0, 0);

搞好了吗,楼主很不负责人
发表于 2020-3-26 21:40 | 显示全部楼层
楼主,你的代码在我这编译出现这种错误,是我哪里没弄对?
注释掉
lcd.setCursor(0, 0);
lcd.print("20200326");
lcd.setCursor(0, 1);
lcd.print("Zed program");
这几行代码后就能通过编译。
但上传到arduino上显示屏是黑的

微信截图_20200326213612.png
微信截图_20200326213809.png
发表于 2020-3-20 23:51 | 显示全部楼层
在arduino IDE的库管理中找到的好像不对,能给个库的下载地址吗?
发表于 2019-1-15 19:07 | 显示全部楼层
能不能把实物的连接图发一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 09:33 , Processed in 0.090203 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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