цифровая электроника
вычислительная техника
встраиваемые системы

 



Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

Автор: Mike(admin) от 21-01-2024, 23:55

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


Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

Здесь мы создадим простой проект с отображением символов на экране. Кнопки пока трогать не будем.


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


Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

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


Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

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


Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

Работаем с шилдом дисплея DFRobot LCD1602 для Arduino

В примере CustomCharacter из библиотеки Liquid Crystal найдите строку конструктора и обновите ее, чтобы исправить нюансы подключения. Иными словами, замените две строки, указывающие программное обеспечение, которое ведет к использованию, на эту обновленную строку. DFrobot Shield и копии подключены таким образом. Скомпилируйте скетч для проверки. Именно во время этих правок и допускаются ошибки.


LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

Включая библиотеку LiquidCrystal, мы добавляем определенные функции для обмена данными с модулем дисплея. Перегрузка – это функция C++, при которой определенные функции готовы к 8-битной или 4-битной операции. Загрузите скетч на плату Arduino, и вы увидите небольшую анимацию.


Работаем с шилдом дисплея DFRobot LCD1602 для 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 &#224; gauche.\n");
      Serial.print(keystruck);
      bouge(-1,0);
      keystruck=millis();
      break;
    case btnRight:
      Serial.print("Pacman bouge &#224; 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


Теги: Arduino, дисплеи




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий