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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!