Arduino与Proteus仿真-Nokia5110 LCD界面菜单仿真

Nokia5110 LCD界面菜单仿真

文章目录

图形用户界面或简称 GUI 是一种使用显示屏幕与硬件交互的方式。 当我们从硬件获得视觉反馈时,GUI 使与硬件的交互变得更加容易。

本文将介绍如何在Nokia5110图形LCD上实现一个菜单选择界面。示例将在诺基亚 5110 LCD 上显示一个简单的菜单,并使用三个按钮在菜单项中导航。

1、菜单介绍

在前面的文章中,对Nokia系列LCD的仿真做了详细的介绍,请参考:

由于诺基亚 5110 LCD 是一个图形 LCD 模块,我们可以在其中控制其各个像素,因此我们可以做的不仅仅是显示一些文本。 我们可以做的一件事是以位图的形式显示图像。

如果真的想充分利用诺基亚 5110 LCD 的 84×48 分辨率,那么设计一个图形用户界面来与 Arduino(或任何其他微控制器)交互是一个不错的选择。下面将设计一个简单的诺基亚 5110 菜单系统,我们可以使用 3 个按钮控制它,并以更直观的方式与 Arduino 交互。

我们将在诺基亚 5110 LCD 上显示一个菜单,并使用按钮在其中导航。 使用此设置,我们可以通过诺基亚 5110 菜单与 Arduino 交互并控制不同的参数(如 LCD 的背光和显示屏的对比度)。

诺基亚 5110 菜单系统的设计非常简单。 最初,LCD 显示一个主菜单页面(让我们称此页面为 1),顶部有一个标题,后跟三个菜单项。

在这里插入图片描述

我们将标题命名为“Nokia Menu”,三个菜单项分别是“Set Contrast”、“Backlight”和“Default”。 菜单项的编号分别为 1、2 和 3(在代码内部)。 默认情况下,第一个菜单项将在系统重置(或启动)时突出显示。

1)导航菜单

我们可以使用三个按钮在菜单中导航,这些按钮被恰当地命名为向上、向下和选择。 因此,如果我们在第 1 页并且当前突出显示了菜单项 1,那么我们可以通过按向上或向下按钮突出显示(或导航到)其他菜单项。

显然,如果你按下“向上”按钮,下一个项目将被突出显示,如果你按下“向下”按钮,前一个项目将被突出显示。

如果您到达极端,即菜单项 1 或 3 并按向上或向下键,则菜单项将被圈(或循环)回来。 例如,如果菜单项 1 当前突出显示并且如果您按向上按钮,则菜单项 3 将突出显示。

类似地,如果菜单项 3 当前突出显示并且如果您按下向下按钮,则菜单项 1 将突出显示。

2)Contrast Adjust界面

现在,让我们看看如何设置不同的值。 假设您当前位于第 1 页并且菜单项 1(设置对比度)突出显示。 如果您按下“选择”按钮,那么第 2 页将被激活。 此页面专门用于调整显示器的对比度。

在这个页,您可以分别按向上或向下按钮来增加或减少对比度。 对比度将即时调整,即当您按下向上或向下按钮时。 在任何时候,如果您按下“选择”按钮,您将返回到第 1 页,并且菜单项 1 将突出显示。

3)Control the Backlight

您可以使用菜单项 2(背光)打开或关闭诺基亚 5110 LCD 的背光。 默认情况下,背光打开。 在页面 1 中,通过按向上或向下按钮突出显示菜单项 2。

注意,在仿真中没有效果,可以观察文本提示

突出显示菜单项 2 后,您可以按“选择”按钮切换背光。 背光的当前状态,即打开或关闭打印在菜单项 2 旁边。

4)Default

第三个菜单项称为“Default”。 此选项将恢复默认值,即显示对比度设置为“60”并且背光打开。

2、仿真电路原理图

在这里插入图片描述

Nokia5110与Arduino的接线说明如下:

Nokia 5110 LCD Arduino UNO
RST Digital IO 8
CE Digital IO 10
DC Digital IO 9
DIN Digital IO 11
CLK Digital IO 13
VCC 3.3V
BL Digital IO 7
GND GND

另外,三个按钮来实现“向上”、“向下”和“选择”功能。 按钮的一端连接到 GND,而其他端子分别连接到数字 IO 引脚 4、2 和 3。

3、仿真代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
#include <SPI.h>
#include <Adafruit\_GFX.h>
#include <Adafruit\_PCD8544.h>

#define BUTTON\_PIN\_UP 4
#define BUTTON\_PIN\_SELECT 3
#define BUTTON\_PIN\_DOWN 2
#define BACKLIGHT\_PIN 7

// Declare LCD object for SPI
// Adafruit\_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit\_PCD8544(13, 11, 9, 10, 8);

boolean backLight = true;
int contrastValue = 60; // Default Contrast Value

int displayItem = 1;
int displayPage = 1;

volatile boolean buttonStatusUp = false;
volatile boolean buttonStatusDown = false;
volatile boolean buttonStatusSelect = false;

int readButtonDown = 0;
int readButtonUp = 0;
int readButtonSelect = 0;
int lastButtonStateDown = 0;
int lastButtonStateUp = 0;
int lastButtonStateSelect = 0;

void setup()
{
pinMode(BUTTON_PIN_DOWN, INPUT);
pinMode(BUTTON_PIN_UP, INPUT);
pinMode(BUTTON_PIN_SELECT, INPUT);
pinMode(BACKLIGHT_PIN, OUTPUT);

digitalWrite(BACKLIGHT_PIN, HIGH);

display.begin();
display.setContrast(contrastValue);
display.clearDisplay();
display.display();
}

void loop()
{
displayMenu();

readButtonDown = digitalRead(BUTTON_PIN_DOWN);
readButtonUp = digitalRead(BUTTON_PIN_UP);
readButtonSelect = digitalRead(BUTTON_PIN_SELECT);

checkButtonPressDown();
checkButtonPressUp();
checkButtonPressSelect();

if (displayPage == 1 && buttonStatusUp)
{
buttonStatusUp = false;
displayItem--;
if (displayItem == 0)
{
displayItem = 3;
}
}
else if (displayPage == 2 && buttonStatusUp)
{
buttonStatusUp = false;
contrastValue++;
setContrast();
}

if (displayPage == 1 && buttonStatusDown)
{
buttonStatusDown = false;
displayItem++;
if (displayItem == 4)
{
displayItem = 1;
}
}
else if (displayPage == 2 && buttonStatusDown)
{
buttonStatusDown = false;
contrastValue--;
setContrast();
}


if (buttonStatusSelect)
{
buttonStatusSelect = false;

if (displayPage == 1 && displayItem == 2)
{
if (backLight)
{
backLight = false;
turnBacklightOff();
}
else
{
backLight = true;
turnBacklightOn();
}
}

if(displayPage == 1 && displayItem == 3)
{
DefaultValues();
}
else if (displayPage == 1 && displayItem == 1)
{
displayPage=2;
}
else if (displayPage == 2)
{
displayPage=1;
}
}

}

void checkButtonPressDown(){
if(readButtonDown != lastButtonStateDown){
if (readButtonDown == 0){
buttonStatusDown=true;
}
delay(50);
}
lastButtonStateDown = readButtonDown;
}

void checkButtonPressUp(){
if (readButtonUp != lastButtonStateUp){
if (readButtonUp == 0){
buttonStatusUp=true;
}
delay(50);
}
lastButtonStateUp = readButtonUp;
}

void checkButtonPressSelect(){
if(readButtonSelect != lastButtonStateSelect){
if(readButtonSelect == 0){
buttonStatusSelect=true;
}
delay(50);
}
lastButtonStateSelect = readButtonSelect;
}


void displayMenu(){
if (displayPage == 1){
display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(13, 0);
display.print("Nokia Menu");
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(0, 15);

if(displayItem == 1){
display.setTextColor(WHITE, BLACK);
}else{
display.setTextColor(BLACK, WHITE);
}

display.print(">Set Contrast");
display.setCursor(0, 25);

if (displayItem == 2){
display.setTextColor(WHITE, BLACK);
}else{
display.setTextColor(BLACK, WHITE);
}
display.print(">Backlight:");

if(backLight){
display.print("ON");
}else{
display.print("OFF");
}

if(displayItem == 3){
display.setTextColor(WHITE, BLACK);
}else{
display.setTextColor(BLACK, WHITE);
}

display.setCursor(0, 35);
display.print(">Default");
display.display();
}else if (displayPage == 2){

display.setTextSize(1);
display.clearDisplay();
display.setTextColor(BLACK, WHITE);
display.setCursor(8, 0);
display.print("SET CONTRAST");
display.drawFastHLine(0,10,83,BLACK);
display.setCursor(5, 15);
display.print("Value");
display.setTextSize(2);
display.setCursor(5, 25);
display.print(contrastValue);
display.display();
}
}

void DefaultValues(){
contrastValue = 60;
setContrast();
backLight = true;
turnBacklightOn();
}

void setContrast(){
display.setContrast(contrastValue);
display.display();
}

void turnBacklightOn(){
digitalWrite(BACKLIGHT_PIN, HIGH);
}

void turnBacklightOff(){
digitalWrite(BACKLIGHT_PIN, LOW);
}

4、仿真结果

在这里插入图片描述

文章来源: https://iotsmart.blog.csdn.net/article/details/132917205