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

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 41075|回复: 54

Arduino 用LCD12864做的多级菜单显示功能

[复制链接]
发表于 2018-4-17 19:29 | 显示全部楼层 |阅读模式
本帖最后由 15706794215 于 2018-4-18 10:25 编辑

在论坛找了一下没找到多级菜单的帖子然后就自己勉强的做了一个,在论坛潜水了这么久了,我也发个程序,用的是LCD12864直接输出中文的,库我会把库放出来的;然后在放几张图片吧。代码比好简单,连线方式论坛上有我就不重复造车轮了,就修改一下引脚定义,程序比较简陋,能实现基本工资的菜单功能,共能模块可以自己加.

  1. #include "LCD12864RSPI.h"
  2. LCD12864RSPI LCDA(4, 5, 6);//引脚定义
  3. int c, var;
  4. #define KEY 22
  5. #define KEY2 29
  6. #define KEY3 25
  7. int KEY_NUM1 = 0;
  8. int KEY_NUM2 = 0;
  9. int KEY_NUM3 = 0;
  10. void setup() {
  11.   pinMode(KEY, INPUT_PULLUP);//按键内部上拉
  12.   pinMode(KEY2, INPUT_PULLUP);
  13.   pinMode(KEY3, INPUT_PULLUP);
  14.   var = 4;//初始化主界面
  15. }

  16. void loop() {
  17.   int dNumber = random(300);//随机数模拟采集值
  18.   ScanKey();//按键函数
  19.   ScanKey2();//按键函数
  20.   ScanKey3();
  21.   switch (var) {//界面循环显示函数
  22.     case 0://界面1
  23.       LCDA.setCursor(0, 2);
  24.       LCDA.print("电机转速");
  25.       LCDA.setCursor(1, 0);
  26.       LCDA.print("电机转速:");
  27.       LCDA.setCursor(1, 5);
  28.       LCDA.print( dNumber);
  29.       break;
  30.     case 1://界面二
  31.       LCDA.setCursor(0, 2);
  32.       LCDA.print("半径显示");
  33.       LCDA.setCursor(1, 0);
  34.       LCDA.print("最大半径:");
  35.       LCDA.setCursor(1, 5);
  36.       LCDA.print( dNumber);
  37.       LCDA.setCursor(2, 0);
  38.       LCDA.print("最小半径:");
  39.       LCDA.setCursor(2, 5);
  40.       LCDA.print( dNumber);
  41.       break;
  42.     case 2://界面三
  43.       LCDA.setCursor(0, 2);
  44.       LCDA.print("正反转");
  45.       LCDA.setCursor(1, 0);
  46.       LCDA.print("正转:");
  47.       LCDA.setCursor(1, 4);
  48.       LCDA.print("正转:");
  49.       break;
  50.     case 3://界面四
  51.       LCDA.setCursor(2, 2);
  52.       LCDA.print("误差:");
  53.       LCDA.setCursor(2, 5);
  54.       LCDA.print( dNumber);
  55.       break;
  56.     case 4:界面五
  57.       LCDA.setCursor(c, 0);
  58.       LCDA.print("→");
  59.       LCDA.setCursor(0, 1);
  60.       LCDA.print("转速显示");
  61.       LCDA.setCursor(1, 1);
  62.       LCDA.print("半径显示");
  63.       LCDA.setCursor(2, 1);
  64.       LCDA.print("正反转判断");
  65.       LCDA.setCursor(3, 1);
  66.       LCDA.print("误差");
  67.       break;
  68.     case 5://界面六
  69.       LCDA.setCursor(c, 0);
  70.       LCDA.print("→");
  71.       LCDA.setCursor(0, 1);
  72.       LCDA.print("电压显示");
  73.       LCDA.setCursor(1, 1);
  74.       LCDA.print("限制");
  75.       LCDA.setCursor(2, 1);
  76.       break;
  77.   }
  78. }
  79. void ScanKey() {//菜单选择
  80.   KEY_NUM1 = 0;                       //清空变量
  81.   if (digitalRead(KEY) == LOW)        //有按键按下
  82.   {
  83.     delay(20);                        //延时去抖动
  84.     if (digitalRead(KEY) == LOW)      //有按键按下
  85.     {
  86.       KEY_NUM1 = 1;                   //变量设置为1
  87.       while (digitalRead(KEY) == LOW); //等待按键松手
  88.     }
  89.   }
  90.   if (KEY_NUM1 == 1)             //是否按键按下
  91.   {
  92.     c = c + 1; LCDA.clear(); if (c > 3) {
  93.       LCDA.clear();  //LED的状态翻转
  94.       var = 5;
  95.       c = 0;
  96.     }
  97.     if (var == 5) {
  98.       if (c == 2) {
  99.         LCDA.clear();
  100.         var = 4;
  101.         c = 0;
  102.       }
  103.     }

  104.   }
  105. }
  106. void ScanKey2() {//确定按键
  107.   KEY_NUM2 = 0;                       //清空变量
  108.   if (digitalRead(KEY2) == LOW)        //有按键按下
  109.   {
  110.     delay(20);                        //延时去抖动
  111.     if (digitalRead(KEY2) == LOW)      //有按键按下
  112.     {

  113.       KEY_NUM2 = 1;                   //变量设置为1
  114.       while (digitalRead(KEY2) == LOW); //等待按键松手
  115.     }
  116.   }
  117.   if (KEY_NUM2 == 1)             //是否按键按下
  118.   {
  119.     var = c; LCDA.clear();
  120.   }
  121. }
  122. void ScanKey3() {//返回按键定义
  123.   KEY_NUM3 = 0;                       //清空变量
  124.   if (digitalRead(KEY3) == LOW)        //有按键按下
  125.   {
  126.     delay(20);                        //延时去抖动
  127.     if (digitalRead(KEY3) == LOW)      //有按键按下
  128.     {
  129.       KEY_NUM3 = 1;                   //变量设置为1
  130.       while (digitalRead(KEY3) == LOW); //等待按键松手
  131.     }
  132.   }
  133.   if (KEY_NUM3 == 1)             //是否按键按下
  134.   {
  135.     var = 4; LCDA.clear();
  136.   }
  137. }
复制代码
在论坛也学了不少东西了这是视频youku地址 http://v.youku.com/v_show/id_XMzU0NTMwMjM0OA==.html?spm=a2h3j.8428770.3416059.1

对应的菜单功能

对应的菜单功能

菜单上下选择

菜单上下选择

菜单上下选择

菜单上下选择

第二页菜单显示

第二页菜单显示
33333185703.jpg

lcd12864.zip

3.7 KB, 下载次数: 1547

发表于 2018-4-17 23:12 | 显示全部楼层
                                   图片?
发表于 2018-4-18 19:23 | 显示全部楼层
谢楼主,代码很有启示作用!
发表于 2018-7-28 22:56 | 显示全部楼层
这库强悍!直接print 中文汉字,不需要转换内码。有种发现新大陆的感觉!只是看了半天没看懂它的内码是怎么转换的。。。在.h文件里有个类,然后怎么调用的.cpp里边的代码,,c++没学过,真心搞不明白,望指点

点评

发表于 2020-10-9 13:11
发表于 2018-8-23 00:13 | 显示全部楼层
请问是12864B   20 脚的这款屏嘛?
太强了,直接干中文
发表于 2018-8-23 00:20 | 显示全部楼层
请问高手接线是不是可以这教程上面的接?
谢谢
发表于 2018-8-23 07:54 | 显示全部楼层
请问是不是按照这里的接?
https://www.arduino.cn/forum.php?mod=viewthread&tid=75455&highlight=12864B

 楼主| 发表于 2018-9-1 15:26 | 显示全部楼层
share366 发表于 2018-8-23 07:54
请问是不是按照这里的接?
https://www.arduino.cn/forum.php?mod=viewthread&tid=75455&highlight=12864B
...

是的就是这图
 楼主| 发表于 2018-9-1 15:27 | 显示全部楼层
share366 发表于 2018-8-23 00:13
请问是12864B   20 脚的这款屏嘛?
太强了,直接干中文

是啊就得大家玩的普通LCD12864屏幕
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-28 01:47 , Processed in 0.091002 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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