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

ZZed 发表于 2019-1-9 13:27

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

本帖最后由 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;
intKEY = 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");

ZZed 发表于 2020-9-27 18:58

构造函数LiquidCrystal_I2C lcd(0x27, 16, 2); 括号第一项是驱动芯片地址 后面是行列数

ZZed 发表于 2020-9-27 18:31

毕业了 好久没逛论坛了 抱歉。实物连接有问题的 注意下驱动芯片 我这是pcf8574 iic协议的 看看自己的屏幕是几线的吧。还有要注意构造函数,就是库下面那句 根据自己实际情况写。还有就是你们的库和我不一样 这是arduino的特点 有可能名字一样但作者不同,

zxy2266 发表于 2020-9-27 15:25

helloword1111 发表于 2020-3-26 21:40
楼主,你的代码在我这编译出现这种错误,是我哪里没弄对?
注释掉
lcd.setCursor(0, 0);


搞好了吗,楼主很不负责人

helloword1111 发表于 2020-3-26 21:40

楼主,你的代码在我这编译出现这种错误,是我哪里没弄对?
注释掉
lcd.setCursor(0, 0);
lcd.print("20200326");
lcd.setCursor(0, 1);
lcd.print("Zed program");
这几行代码后就能通过编译。
但上传到arduino上显示屏是黑的
:(

helloword1111 发表于 2020-3-20 23:51

在arduino IDE的库管理中找到的好像不对,能给个库的下载地址吗?

独孤少侠 发表于 2019-1-15 19:07

能不能把实物的连接图发一下
页: [1]
查看完整版本: Arduino 使用Mega2560和LCD1602做的多级菜单显示功能