Шилд DFRobot LCD1602 – это очень популярный ЖК-экран с клавиатурой для плат Arduino или Freeduino. Он включает в себя ЖК-дисплей 2x16 и 6 кнопок мгновенного действия. Контакты 4, 5, 6, 7, 8, 9 и 10 используются для взаимодействия с ЖК-дисплеем. Аналоговый контакт 0 используется для считывания кнопок. Экран ЖК-дисплея поддерживает регулировку контрастности и функции включения/выключения подсветки. Он также позволяет расширить аналоговые контакты для облегчения считывания и отображения аналоговых датчиков.

Здесь мы создадим простой проект с отображением символов на экране. Кнопки пока трогать не будем.
Здесь мы подключаем линию выбора регистра RS к контакту 8 платы Arduino, а Enable – к контакту 9. Контакты дисплея D4, D5, D6 и D7 подключены к соответствующим контактам платы 4, 5, 6 и 7. RW Ready/Wait не подключен и не используется в программном обеспечении.

По умолчанию Arduino поставляется с библиотекой Liquid Crystal для использования этого дисплея. Нам нужно изменить выводы подключения по умолчанию. Примеры из библиотеки будут работать, но нам придется изменить так называемый конструктор.

В объектно-ориентированном программировании (ООП) мы создаем экземпляр объекта данных типа LiquidCrystal с именем lcd. Возвращаемое значение lcd(variables) зависит от битов, передаваемых по различным проводам. Во всех примерах библиотеки LiquidCrystal предполагается наличие 4 выводов данных и двух выводов управления.



В примере CustomCharacter из библиотеки Liquid Crystal найдите строку конструктора и обновите ее, чтобы исправить нюансы подключения. Иными словами, замените две строки, указывающие программное обеспечение, которое ведет к использованию, на эту обновленную строку. DFrobot Shield и копии подключены таким образом. Скомпилируйте скетч для проверки. Именно во время этих правок и допускаются ошибки.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);Включая библиотеку LiquidCrystal, мы добавляем определенные функции для обмена данными с модулем дисплея. Перегрузка – это функция C++, при которой определенные функции готовы к 8-битной или 4-битной операции. Загрузите скетч на плату Arduino, и вы увидите небольшую анимацию.

Просмотрите все примеры библиотеки LiquidCrystal и измените конструктор. Загрузите на плату и наблюдайте результаты. Если хотите поэкспериментировать с кнопками, то для этого можно загрузить скетч с игрой PacMan.
//#include "Wire.h"
//#include <Deuligne.h>
#include <LiquidCrystal.h>
#define VITESSE_PAC 150
#define VITESSE_FANT 2000
#define MAXX 15
#define MAXY 1
#define btnRight 0
#define btnUp 1
#define btnDown 2
#define btnLeft 3
#define btnSelect 4
#define btnNone 5
void(* resetFunc) (void) = 0;
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
byte pacman[8] = {
B00000,
B00000,
B01110,
B11011,
B11100,
B01110,
B00000,
B00000
};
byte fantome[8] = {
B00000,
B00000,
B01110,
B10101,
B11111,
B11111,
B10101,
B00000
};
byte point[8] = {
B00000,
B00000,
B00000,
B01110,
B01110,
B00000,
B00000,
B00000
};
byte points[MAXX+1][MAXY+1];
int xpac=2;
int ypac=1;
int xfant=15;
int yfant=0;
byte light=true;
long keystruck=0;
long poursuite=0;
byte partieEnCours=true;
byte vide=false;
byte level=0;
int score=0;
void bouge(int x,int y)
{
int oldx=xpac;
int oldy=ypac;
if (((xpac+x)>=0)&((xpac+x)<=MAXX)) xpac=xpac+x;
if (((ypac+y)>=0)&((ypac+y)<=MAXY)) ypac=ypac+y;
lcd.setCursor(xpac,ypac);
lcd.write(byte(0));
lcd.setCursor(oldx,oldy);
if ((xpac!=oldx)||(ypac!=oldy)) lcd.print(" ");
if(points[xpac][ypac]){
points[xpac][ypac]=false;
score++;
}
vide=true;
for (int i=0; i<=MAXX; i=i+1)
for (int j=0; j<=MAXY; j=j+1)
if (points[i][j]) vide=false;
if ((vide)&&(partieEnCours)) gagne();
}
void perdu(){
lcd.setCursor(0, 0);
lcd.print("***Game Over****");
lcd.setCursor(0, 1);
lcd.print("***");
lcd.print(score);
lcd.print("***");
delay(2000);
resetFunc();
}
void gagne()
{
level++;
lcd.setCursor(0, 0);
lcd.print("*** Next level ***");
lcd.setCursor(0, 1);
lcd.print("*** ");
lcd.print(level,DEC);
lcd.print(" ***");
delay(2000);
initLevel();
}
void poursuis()
{
int oldx=xfant;
int oldy=yfant;
if (yfant<ypac) yfant=yfant+1;
else if (yfant>ypac) yfant=yfant-1;
else if (xfant<xpac) xfant=xfant+1;
else if (xfant>xpac) xfant=xfant-1;
lcd.setCursor(xfant,yfant);
lcd.write(1);
lcd.setCursor(oldx,oldy);
if ((oldx!=xfant)||(oldy!=yfant))
{
if (points[oldx][oldy]) lcd.write(2);
else lcd.print(" ");
}
}
void initLevel(){
for (int i=0; i<=MAXX; i=i+1)
for (int j=0; j<=MAXY; j=j+1){
points[i][j]=true;
lcd.setCursor(i-1, j-1);
lcd.write(2);
}
lcd.setCursor(xpac,ypac);
lcd.write(byte(0));
lcd.setCursor(xfant,yfant);
lcd.write(1);
poursuite=millis();
vide=false;
}
void setup() {
Serial.begin(9600);
//Wire.begin();
//lcd.init();
lcd.begin(16, 2);
lcd.createChar(0, pacman);
lcd.createChar(1, fantome);
lcd.createChar(2, point);
//lcd.backLight(true);
lcd.setCursor(0, 0);
lcd.print("Pacman!");
delay (5000);
initLevel();
}
void loop() {
int thisChar = Serial.read();
switch (thisChar)
{
case 'r':
lcd.scrollDisplayRight();
break;
case 'l':
lcd.scrollDisplayLeft();
break;
}
if ((thisChar>'a')&(thisChar<'z'))
{
lcd.setCursor(1,1);
lcd.write(thisChar);
}
if (millis()-keystruck>VITESSE_PAC)
{
int joy=getKey();
switch (joy)
{
case btnNone:
break;
case btnLeft:
Serial.print("Pacman bouge à gauche.\n");
Serial.print(keystruck);
bouge(-1,0);
keystruck=millis();
break;
case btnRight:
Serial.print("Pacman bouge à droite\n");
bouge(1,0);
keystruck=millis();
break;
case btnUp:
Serial.print("Pacman bouge en haut\n");
bouge(0,-1);
keystruck=millis();
break;
case btnDown:
Serial.print("Pacman bouge en bas\n");
bouge(0,1);
keystruck=millis();
break;
/*case 4:
Serial.print("centre\n");
light=!light;
lcd.backLight(light);
keystruck=millis();
break;*/
default:
Serial.print(joy);
keystruck=millis();
};
};
if (millis()-poursuite>VITESSE_FANT/(level+1)+10)
{
poursuis();
poursuite=millis();
}
if ((xpac==xfant)&&(ypac==yfant)&&(partieEnCours))
{
perdu();
}
}
int getKey() {
int b = analogRead(A0);
if (b > 1000) return btnNone;
delay(8);
if (b < 50) return btnRight;
if (b < 180) return btnUp;
if (b < 330) return btnDown;
if (b < 520) return btnLeft;
if (b < 700) return btnSelect;
}
© digitrode.ru