LCD ST7920

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

Добрый день.

Пытался написать в тему LCD12864 (ST7920) на типа arduino, но там сообщение уходит в пустоту и не создается.

В краце.  Купил LCD ST7920, подключил по последовательному интерфейсу согласно примера:

PIN1 = GND
PIN2 = 5V
RS(CS) = 8;
RW(SID)= 9;
EN(CLK) = 3;
PIN15 PSB = GND;

Пример находился вместе с библиотекой, взято из 13 поста темы LCD12864 (ST7920) на типа arduino

/*
LCD  Arduino
PIN1 = GND
PIN2 = 5V
RS(CS) = 8; 
RW(SID)= 9; 
EN(CLK) = 3;
PIN15 PSB = GND;
*/

#include "LCD12864RSPI.h"
#include "DFrobot_bmp.h"
#include "DFrobot_char.h"

#define AR_SIZE( a ) sizeof( a ) / sizeof( a[0] )

unsigned char wangzhi[]=" www.DFRobot.cn ";//

unsigned char en_char1[]="ST7920 LCD12864 ";// 

unsigned char en_char2[]="Test, Copyright ";// 

unsigned char en_char3[]="by DFRobot ---> ";// 

void setup()
{
  LCDA.Initialise(); // INIT SCREEN
  delay(100);
  LCDA.DrawFullScreen(logo);//LOGO
  delay(5000);
}

void loop()
{
LCDA.CLEAR();
delay(100);
LCDA.DisplayString(0,0,en_char1,16);//
delay(10);
LCDA.DisplayString(1,0,en_char2,16);//
delay(10);
LCDA.DisplayString(2,0,en_char3,16);//
delay(10);
LCDA.DisplayString(3,0,wangzhi,16);//
delay(5000);
LCDA.CLEAR();
delay(100);
LCDA.DisplayString(0,0,show1,16);//
delay(10);
LCDA.DisplayString(1,0,show2,16);//
delay(10);
LCDA.DisplayString(2,0,show3,16);//
delay(10);
LCDA.DisplayString(3,0,wangzhi,16);//LOGO
delay(5000);
}

При компилировании выдает много ошибок:

C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp: In member function 'void LCD12864RSPI::delayns()':
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:28: error: 'delayMicroseconds' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp: In member function 'void LCD12864RSPI::WriteByte(int)':
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:34: error: 'HIGH' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:34: error: 'digitalWrite' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:36: error: 'MSBFIRST' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:36: error: 'shiftOut' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:37: error: 'LOW' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp: In member function 'void LCD12864RSPI::Initialise()':
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:72: error: 'OUTPUT' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:72: error: 'pinMode' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:75: error: 'LOW' was not declared in this scope
C:\main\Arduino\arduino-1.0.1\libraries\LCD12864RSPI\LCD12864RSPI.cpp:75: error: 'digitalWrite' was not declared in this scope

Подскажите в чем проблема???

maksim
Offline
Зарегистрирован: 12.02.2012

Скорее всего дело в несовместимости библиотеки и IDE, попробуйте скомпилировать в Arduino-1.0 или даже в Arduino-0023.

buka
buka аватар
Offline
Зарегистрирован: 07.06.2012

Для ST7920 есть неплохая библиотека http://code.google.com/p/u8glib/

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

maksim пишет:

Скорее всего дело в несовместимости библиотеки и IDE, попробуйте скомпилировать в Arduino-1.0 или даже в Arduino-0023.

Вы правы, взял этот пример и скомпилировал в Arduino-0023 и все заработало. Меня конечно, это не устраивает, поэтому начал дальше копать и наткнулся на интересную статью . Там как раз описывается библиотека u8glib, которую посоветовал buka. Жаль, что форум, я прочитал позже, чем нашел эту библиотеку.

В итоге с библиотекой u8glib все заработало и на Arduino-0101. Статья хорошая, очень хорошо поможет начинающим.

Вот простенький пример:

#include "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE);   // SPI E = 3, RW = 9, RS = 8

void setup(void) {
  u8g.setFont(u8g_font_6x10); // шрифт
  u8g.setRot180(); //Перевернул экран
  }

void loop(void) {
  // picture loop
  u8g.firstPage();  
  do {
    u8g.setColorIndex(1);    // белые чернила, черный фон
    u8g.setPrintPos(1, 12);  // позиция
    u8g.print("Hello!!!");   // вывод текста
    u8g.drawBox(0,22,128,9); // Закрашиваем прямоугольник белым
    u8g.setColorIndex(0);    // белые чернила, черный фон
    u8g.setPrintPos(1, 30);  // позиция
    u8g.print("Word...");    // вывод текста

    u8g.setColorIndex(1);    // белые чернила, черный фон
    u8g.setPrintPos(1, 50);  // позиция
    u8g.print("After start =");    // вывод текста
    u8g.setPrintPos(85, 50);  // позиция
    u8g.print(millis() / 1000);    // вывод число секунд после старта
    
  } while( u8g.nextPage() );
  
  // rebuild the picture after some delay
  delay(200);
}

Я вот только одного не пойму. В статье указано, что если выводить через u8g.drawStr(xpos, ypos, “Text”),

то (дословно):

Вариант команды u8g.drawStrP позволяет разместить выводимый текст не в оперативной памяти микроконтроллера, а в области Flash-памяти. Это может быть полезно для экономии пространства в ОЗУ.

Когда компилирую программу с u8g.drawStrP, то она занимает в памяти места больше, чем с командами:

    u8g.setPrintPos(xpos, ypos);
    u8g.print(“Text”);

Хотя по описанию, должно быть на оборот....
 

step962
Offline
Зарегистрирован: 23.05.2011

Bim_Sony пишет:

Вариант команды u8g.drawStrP позволяет разместить выводимый текст не в оперативной памяти микроконтроллера, а в области Flash-памяти. Это может быть полезно для экономии пространства в ОЗУ.

Когда компилирую программу с u8g.drawStrP, то она занимает в памяти места больше, чем с командами:

    u8g.setPrintPos(xpos, ypos);
    u8g.print(“Text”);

Хотя по описанию, должно быть на оборот....

А вы почитайте об отличиях RAM. EEPROM и Flash-памяти (ну хотя бы здесь) - и все сразу встанет на свои места.

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

step962, спасибо за ссылку. Теперь все стало на свои места.

Кстати, а можно как нибудь посмотреть, сколько памяти ОЗУ израсходовано?

step962
Offline
Зарегистрирован: 23.05.2011

Ну, как-то так...

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

Попробовал этот код.

На экране показывает 1753

Хотя по ссылке выше, указано, что у нас всего 1024 байта ОЗУ...

пробовал вставлять код:

char t[]="1234567890";

Показания не меняются, но стоит использовать переменную t в программе (выводить ее на экран), как сразу память уменьшается на 10 байт и становится 1743.

Так сколько же памяти у Arduino nano ATmega328???

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

УПС... по ссылке ATmega168... у 328 или 1кб или 2кб.

step962
Offline
Зарегистрирован: 23.05.2011

Bim_Sony пишет:

пробовал вставлять код:

char t[]="1234567890";

Показания не меняются, но стоит использовать переменную t в программе (выводить ее на экран), как сразу память уменьшается на 10 байт и становится 1743.


Ну вот вы и познакомились с работой оптимизатора - место под не используемые в программе переменные не выделяется
Цитата:

Так сколько же памяти у Arduino nano ATmega328???

ATMega328 - вне зависимости от постфикса - имеет 2 КБ RAM.

kosty
Offline
Зарегистрирован: 11.03.2018

подскажите пожалуйста как вывести на экран 12864В показания потенциометра,где можно найти пример

 

 

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Это два независимых действия:

1. Считать значение потенциометра и сохранить в переменную (ссылки давал ТУТ)

2. Вывести значение переменной на экран (смотрите примеры, которые идут с библиотекой на экран)