涂鸦arduino中文社区活动
查看: 6159|回复: 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 | 显示全部楼层
能不能把实物的连接图发一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

字符串是否对比该使用哪个函数?
字符串是否对比该使用哪个
现有问题是, 串口接收到的数据是正常的,(通过print函数打印串口收
用电阻式压力传感器(SEN0294)做一个简单的杯垫
用电阻式压力传感器(SEN0
“多喝开水”这句话在目前似乎已经成了一种戏谑的玩笑话,可是多喝水还是很有好处
刚刚买的arduino,希望大神帮我,让我可以对照一下逻辑
刚刚买的arduino,希望大
用什么屏幕无所谓,按键接什么位置无所谓
1602显示时间,如何显示01-09
1602显示时间,如何显示01
请问,如何让1602显示屏,显示00-00-00,我写完程序后,它不显示01-09.显示的是1-9
stm32f103刷arduino 掉坑里了,出不来了
stm32f103刷arduino 掉坑
买了一个stm32f103c8t6的小板子,照教程刷了generic_boot20_pc13.bin,一切正常,用us
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表