Arduino 用LCD12864做的多级菜单显示功能
本帖最后由 15706794215 于 2018-4-18 10:25 编辑在论坛找了一下没找到多级菜单的帖子然后就自己勉强的做了一个,在论坛潜水了这么久了,我也发个程序,用的是LCD12864直接输出中文的,库我会把库放出来的;然后在放几张图片吧。代码比好简单,连线方式论坛上有我就不重复造车轮了,就修改一下引脚定义,程序比较简陋,能实现基本工资的菜单功能,共能模块可以自己加.
#include "LCD12864RSPI.h"
LCD12864RSPI LCDA(4, 5, 6);//引脚定义
int c, var;
#define KEY 22
#define KEY2 29
#define KEY3 25
int KEY_NUM1 = 0;
int KEY_NUM2 = 0;
int KEY_NUM3 = 0;
void setup() {
pinMode(KEY, INPUT_PULLUP);//按键内部上拉
pinMode(KEY2, INPUT_PULLUP);
pinMode(KEY3, INPUT_PULLUP);
var = 4;//初始化主界面
}
void loop() {
int dNumber = random(300);//随机数模拟采集值
ScanKey();//按键函数
ScanKey2();//按键函数
ScanKey3();
switch (var) {//界面循环显示函数
case 0://界面1
LCDA.setCursor(0, 2);
LCDA.print("电机转速");
LCDA.setCursor(1, 0);
LCDA.print("电机转速:");
LCDA.setCursor(1, 5);
LCDA.print( dNumber);
break;
case 1://界面二
LCDA.setCursor(0, 2);
LCDA.print("半径显示");
LCDA.setCursor(1, 0);
LCDA.print("最大半径:");
LCDA.setCursor(1, 5);
LCDA.print( dNumber);
LCDA.setCursor(2, 0);
LCDA.print("最小半径:");
LCDA.setCursor(2, 5);
LCDA.print( dNumber);
break;
case 2://界面三
LCDA.setCursor(0, 2);
LCDA.print("正反转");
LCDA.setCursor(1, 0);
LCDA.print("正转:");
LCDA.setCursor(1, 4);
LCDA.print("正转:");
break;
case 3://界面四
LCDA.setCursor(2, 2);
LCDA.print("误差:");
LCDA.setCursor(2, 5);
LCDA.print( dNumber);
break;
case 4:界面五
LCDA.setCursor(c, 0);
LCDA.print("→");
LCDA.setCursor(0, 1);
LCDA.print("转速显示");
LCDA.setCursor(1, 1);
LCDA.print("半径显示");
LCDA.setCursor(2, 1);
LCDA.print("正反转判断");
LCDA.setCursor(3, 1);
LCDA.print("误差");
break;
case 5://界面六
LCDA.setCursor(c, 0);
LCDA.print("→");
LCDA.setCursor(0, 1);
LCDA.print("电压显示");
LCDA.setCursor(1, 1);
LCDA.print("限制");
LCDA.setCursor(2, 1);
break;
}
}
void ScanKey() {//菜单选择
KEY_NUM1 = 0; //清空变量
if (digitalRead(KEY) == LOW) //有按键按下
{
delay(20); //延时去抖动
if (digitalRead(KEY) == LOW) //有按键按下
{
KEY_NUM1 = 1; //变量设置为1
while (digitalRead(KEY) == LOW); //等待按键松手
}
}
if (KEY_NUM1 == 1) //是否按键按下
{
c = c + 1; LCDA.clear(); if (c > 3) {
LCDA.clear();//LED的状态翻转
var = 5;
c = 0;
}
if (var == 5) {
if (c == 2) {
LCDA.clear();
var = 4;
c = 0;
}
}
}
}
void ScanKey2() {//确定按键
KEY_NUM2 = 0; //清空变量
if (digitalRead(KEY2) == LOW) //有按键按下
{
delay(20); //延时去抖动
if (digitalRead(KEY2) == LOW) //有按键按下
{
KEY_NUM2 = 1; //变量设置为1
while (digitalRead(KEY2) == LOW); //等待按键松手
}
}
if (KEY_NUM2 == 1) //是否按键按下
{
var = c; LCDA.clear();
}
}
void ScanKey3() {//返回按键定义
KEY_NUM3 = 0; //清空变量
if (digitalRead(KEY3) == LOW) //有按键按下
{
delay(20); //延时去抖动
if (digitalRead(KEY3) == LOW) //有按键按下
{
KEY_NUM3 = 1; //变量设置为1
while (digitalRead(KEY3) == LOW); //等待按键松手
}
}
if (KEY_NUM3 == 1) //是否按键按下
{
var = 4; LCDA.clear();
}
}
:D在论坛也学了不少东西了这是视频youku地址 http://v.youku.com/v_show/id_XMzU0NTMwMjM0OA==.html?spm=a2h3j.8428770.3416059.1
图片? 谢楼主,代码很有启示作用!:lol 前来学习 这库强悍!直接print 中文汉字,不需要转换内码。有种发现新大陆的感觉!只是看了半天没看懂它的内码是怎么转换的。。。在.h文件里有个类,然后怎么调用的.cpp里边的代码,,c++没学过,真心搞不明白,望指点 请问是12864B 20 脚的这款屏嘛?
太强了,直接干中文
请问高手接线是不是可以这教程上面的接?
谢谢 请问是不是按照这里的接?
https://www.arduino.cn/forum.php?mod=viewthread&tid=75455&highlight=12864B
https://www.arduino.cn/data/attachment/forum/201802/07/210619oqmucek869umlckz.jpg share366 发表于 2018-8-23 07:54
请问是不是按照这里的接?
https://www.arduino.cn/forum.php?mod=viewthread&tid=75455&highlight=12864B
...
是的就是这图 share366 发表于 2018-8-23 00:13
请问是12864B 20 脚的这款屏嘛?
太强了,直接干中文
是啊就得大家玩的普通LCD12864屏幕