Вывод на LCD из массива в теле цикла и без цикла.
- Войдите на сайт для отправки комментариев
Ср, 13/11/2013 - 14:10
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
char* main_Menu[] PROGMEM =
{"Chapter 1",
"Chapter 2",
"Chapter 3",
"Chapter 4",
};
void setup()
{
lcd.init();
lcd.backlight();
}
void loop() {
lcd.clear();
for (byte i=0; i<4; i++) {
lcd.setCursor(1, i);
lcd.print (main_Menu[i]);
}
delay (1000);
}
Выводит на экра кракозабру в позиции 0, 0; 0,1; 0, 2; 0, 3;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);
char* main_Menu[] PROGMEM =
{"Chapter 1",
"Chapter 2",
"Chapter 3",
"Chapter 4",
};
void setup()
{
lcd.init();
lcd.backlight();
}
void loop() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print (main_Menu[0]);
lcd.setCursor(1, 1);
lcd.print (main_Menu[1]);
lcd.setCursor(1, 2);
lcd.print (main_Menu[2]);
lcd.setCursor(1, 3);
lcd.print (main_Menu[3]);
delay (1000);
}
Выводит нормальным текстом.
Где подвох?
for (byte i=0; i<4; i++) {заменить на:
for (int i=0; i<4; i++) {for (byte i=0; i<4; i++) {заменить на:
for (int i=0; i<4; i++) {Когда начинаете чем то пользоваться, надо читать как этим пользоваться PROGMEM
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,20,4); char string_1[] PROGMEM = "Chapter 1"; char string_2[] PROGMEM = "Chapter 2"; char string_3[] PROGMEM = "Chapter 3"; char string_4[] PROGMEM = "Chapter 4"; PROGMEM char *main_Menu[] = { string_1, string_2, string_3, string_4, }; void setup() { lcd.init(); lcd.backlight(); } void loop() { lcd.clear(); for (byte i = 0; i < 5; i++) { lcd.setCursor(1, i); char buff[21]; strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i]))); lcd.print(buff); } delay (1000); }Когда начинаете чем то пользоваться, надо читать как этим пользоваться PROGMEM
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,20,4); char string_1[] PROGMEM = "Chapter 1"; char string_2[] PROGMEM = "Chapter 2"; char string_3[] PROGMEM = "Chapter 3"; char string_4[] PROGMEM = "Chapter 4"; PROGMEM char *main_Menu[] = { string_1, string_2, string_3, string_4, }; void setup() { lcd.init(); lcd.backlight(); } void loop() { lcd.clear(); for (byte i = 0; i < 5; i++) { lcd.setCursor(1, i); char buff[21]; strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i]))); lcd.print(buff); } delay (1000); }Максим ворчливый, но всегда помогает.
Спасибо!
Это не ворчание, а совет с какой стороны нудно подходить к проблеме, и там в цикле должно быть 4 ,а не 5, так как у вас 4 строки.
Maksim еще вопрос.
Насколько вообще справедливо и полезно в данном случае использовать флеш память? Возможно менее нагруженно будет char* ?
И там в цикле должно быть 4 ,а не 5, так как у вас 4 строки.
в моем исходнике 4.
В кокретном привере без разницы, а вот когда программа разростается и встает вопрос о нехватке оперативной памяти, тогда это просто необходимо.
В кокретном привере без разницы, а вот когда программа разростается и встает вопрос о нехватке оперативной памяти, тогда это просто необходимо.
тогда в PROGMEM, т.к. после блока меню будем разрастаться.
Добрый день! Пытаюсь адаптировать код Maksima под себя
mega2560, IDE1.5.4
#include <LiquidCrystal.h> LiquidCrystal lcd(52, 50, 48, 46, 44, 42 ); char string_1[] PROGMEM = "Chapter 1"; char string_2[] PROGMEM = "Chapter 2"; char string_3[] PROGMEM = "Chapter 3"; char string_4[] PROGMEM = "Chapter 4"; PROGMEM char *main_Menu[] = { string_1, string_2, string_3, string_4, }; void setup() { lcd.begin(20, 4); } void loop() { lcd.clear(); for (byte i = 0; i < 4; i++) { lcd.setCursor(1, i); char buff[21]; strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i]))); lcd.print(buff); } delay (1000); }Не выводится 4-я строка!
А код ingener.solovyev
#include <LiquidCrystal.h> LiquidCrystal lcd(52, 50, 48, 46, 44, 42 ); char* main_Menu[] PROGMEM = {"Chapter 1", "Chapter 2", "Chapter 3", "Chapter 4", }; void setup() { lcd.begin(20, 4); } void loop() { lcd.clear(); lcd.setCursor(1, 0); lcd.print (main_Menu[0]); lcd.setCursor(1, 1); lcd.print (main_Menu[1]); lcd.setCursor(1, 2); lcd.print (main_Menu[2]); lcd.setCursor(1, 3); lcd.print (main_Menu[3]); delay (1000); }- выводит все строки.
Добрый день! Пытаюсь адаптировать код Maksima под себя
mega2560, IDE1.5.4
#include <LiquidCrystal.h> LiquidCrystal lcd(52, 50, 48, 46, 44, 42 ); char string_1[] PROGMEM = "Chapter 1"; char string_2[] PROGMEM = "Chapter 2"; char string_3[] PROGMEM = "Chapter 3"; char string_4[] PROGMEM = "Chapter 4"; PROGMEM char *main_Menu[] = { string_1, string_2, string_3, string_4, }; void setup() { lcd.begin(20, 4); } void loop() { lcd.clear(); for (byte i = 0; i < 4; i++) { lcd.setCursor(1, i); char buff[21]; strcpy_P(buff, (char*)pgm_read_byte(&(main_Menu[i]))); lcd.print(buff); } delay (1000); }Не выводится 4-я строка!
А код ingener.solovyev
#include <LiquidCrystal.h> LiquidCrystal lcd(52, 50, 48, 46, 44, 42 ); char* main_Menu[] PROGMEM = {"Chapter 1", "Chapter 2", "Chapter 3", "Chapter 4", }; void setup() { lcd.begin(20, 4); } void loop() { lcd.clear(); lcd.setCursor(1, 0); lcd.print (main_Menu[0]); lcd.setCursor(1, 1); lcd.print (main_Menu[1]); lcd.setCursor(1, 2); lcd.print (main_Menu[2]); lcd.setCursor(1, 3); lcd.print (main_Menu[3]); delay (1000); }- выводит все строки.
возможно функция lcd.clear вызванная более 25 раз в секунду не дает нормально отобразиться 4-й строке, и даже мерцание ее происходит с такой частотой, что глаз его не распознает. Попробейте хотя бы, пока delay (1000); в код Максима и по смотрите появится ли 4-ая строка.
Вы имеете ввиду добавить delay после lcd.clear? - поставил 5 секунд - результат тот же