Указатель содержит адрес ячейки памяти. Обычно указатель имеет размерность, равную разрядности архитектуры. Но! Если указатель будет размером 1 байт, то он сможет адресовать всего 256 ячеек. А двухбайтный указатель - 64К ячеек. Поэтому указатель в AVR двухбайтный. И это не зависит от типа данных, на которые он указывает. Так, только в данном случае это не ссылка, а адрес. Ссылка - немного другое.
Размерность любого указателя на любой тип данных на платформе AVR - два байта. При этом указатель может ссылаться на свой тип данных, например, byte, и при его разыменовании и инкрементировании будет происходить либо обращение к ячейке памяти размером 1 байт, либо увеличение адреса указателя на 1 байт.
Всем привет, есть необходимость поправить код, а именно перенести структуры из петли в глобальные данные. вот так код работает. Код (C++): #include <gfxfont.h> #include <UTFTGLUE.h> #include <DHT.h> #include <iarduino_RTC.h> #include <Adafruit_GFX.h> #include <FreeDefaultFonts.h> #include <Fonts/FreeMono12pt7b.h> #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);//int CS=A3, RS=A2, WR=A1, RD=A0, RST=A4; iarduino_RTC time(RTC_DS1302, 47, 29, 39); DHT dht(44, DHT22); //Инициация датчика #define BLACK 0x0000 #define NAVY 0x000F #define DARKGREEN 0x03E0 #define DARKCYAN 0x03EF #define MAROON 0x7800 #define PURPLE 0x780F #define OLIVE 0x7BE0 #define LIGHTGREY 0xC618 #define DARKGREY 0x7BEF #define BLUE 0x001F #define GREEN 0x07E0 #define CYAN 0x07FF #define RED 0xF800 #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define ORANGE 0xFD20 #define GREENYELLOW 0xAFE5 #define PINK 0xF81F #define GREY 0x8410 void setup() { Serial.begin (9600);// инициализация монитора порта time.begin(); dht.begin(); uint16_t ID = tft.readID();// получение информации о дисплее tft.begin(ID);// инициализация дисплея pinMode(52, INPUT_PULLUP);//up pinMode(53, INPUT_PULLUP);//dw pinMode(48, INPUT_PULLUP);//mid pinMode(46, INPUT_PULLUP);//rst pinMode(49, INPUT_PULLUP);//set pinMode(50, INPUT_PULLUP);//left tft.setRotation(1); // повернуть экран tft.fillScreen(GREY); // заливка экрана tft.setTextColor(0xFFFF, GREY); // белый цвет шрифта/сераязаливка tft.setTextSize(1); //размер шрифта 1-5 //tft.setFont(&FreeMono12pt7b); } static int levmenu; static unsigned long timer;// переменная для задержки отображения времени struct Menu //структура хранения данных меню { String myname; String paragraph[5]; int index; }; Menu mainmenu; // mainmenu.myname = "MENU"; // mainmenu.paragraph[0] = "Profil"; // mainmenu.paragraph[1] = "Seting"; // mainmenu.paragraph[2] = "Back"; // mainmenu.index = 3; int menu(String myname, String paragraph[], int index, int levmenu)//функция отображения меню { const int poscur[] = {40, 80, 120, 160, 180};//координаты пунктов меню if (levmenu < 0) levmenu = index - 1; if (levmenu > index - 1) levmenu = 0; if (digitalRead(52) != HIGH) levmenu ++; if (digitalRead(53) != HIGH) levmenu --; tft.setTextSize(3); tft.setCursor(0, 0); tft.setTextColor(BLACK,GREY); tft.print(myname); for (int i = 0; i < index; i++) { tft.setCursor (0, poscur[i]); if (i != levmenu) tft.print(paragraph[i]); } tft.setTextColor(WHITE, BLACK); tft.setCursor(0, poscur[levmenu]); tft.print(paragraph[levmenu]); return levmenu; } void temphum(int x, int y)// выводит на экран температуру и влажность { // float h = dht.readHumidity(); //Измеряем влажность // float t = dht.readTemperature(); //Измеряем температуру tft.setCursor(x,y); tft.setTextSize(3); if(dht.readTemperature() > 28) tft.setTextColor(RED,GREY); else if(dht.readTemperature() < 24) tft.setTextColor(BLUE,GREY); else tft.setTextColor(GREEN, GREY); tft.print(dht.readTemperature()); tft.println("C"); tft.setTextColor(WHITE, GREY); tft.print(dht.readHumidity()); tft.print("%"); tft.setCursor(0, 0); } void loop () { static int realmenu;// переменная для навигации по страницам меню Menu mainmenu; mainmenu.myname = "MENU"; mainmenu.paragraph[0] = "Profil"; mainmenu.paragraph[1] = "Seting"; mainmenu.paragraph[2] = "Back"; mainmenu.index = 3; Menu profilmenu; profilmenu.myname = "PROFIL MENU"; profilmenu.paragraph[0] = "Select"; profilmenu.paragraph[1] = "Edit"; profilmenu.paragraph[2] = "Back"; profilmenu.index = 3; Menu setingmenu; setingmenu.myname = "SETING MENU"; setingmenu.paragraph[0] = "Clock"; setingmenu.paragraph[1] = "Calibration sensors"; setingmenu.paragraph[2] = "Back"; setingmenu.index = 3; if (realmenu == 0) // код отображения времени на главном экране { tft.setTextSize(2); tft.setTextColor(0xFFFF, GREY); tft.setCursor(120, 140); if (millis() - timer > 1000) { tft.setTextColor(0xFFFF, GREY); tft.print(time.gettime("H:i:s")); temphum(0, 0); timer = millis(); } if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); tft.setTextColor(WHITE, GREY); realmenu = 1; } } if (realmenu == 1) { levmenu = menu(mainmenu.myname, mainmenu.paragraph, mainmenu.index, levmenu); if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); // обновление экрана заливкой switch (levmenu) { case 0: realmenu = 2; levmenu = 0; break; case 1: realmenu = 3; levmenu = 0; break; case 2: realmenu = 0; levmenu = 0; break; } } } if (realmenu == 2) //2 - меню профиля { levmenu = menu(profilmenu.myname, profilmenu.paragraph, profilmenu.index, levmenu); if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); // обновление экрана заливкой switch (levmenu) { case 0: realmenu = 11; levmenu = 0; break; case 1: realmenu = 12; levmenu = 0; break; case 2: realmenu = 1; levmenu = 0; break; } } } if (realmenu == 3)// 3 - меню настроек системы { levmenu = menu(setingmenu.myname, setingmenu.paragraph, setingmenu.index, levmenu); if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); // обновление экрана заливкой switch (levmenu) { case 0: realmenu = 21; levmenu = 0; break; case 1: realmenu = 22; levmenu = 0; break; case 2: realmenu = 1; levmenu = 0; break; } } } if (realmenu == 21)// настройки часов { static int setclock;//переменная определения типа настраиваемого времени часы, минуты, секунды tft.setCursor(200, 0); tft.print(levmenu); tft.setCursor(0, 0); tft.print("TIME SETUP"); tft.setCursor(60, 150); tft.print(time.gettime("H:i:s")); if (digitalRead(52) != HIGH) levmenu ++; if (digitalRead(53) != HIGH) levmenu --; switch (setclock) { case 0: levmenu = time.Hours; time.blinktime(3); if(digitalRead(52) != HIGH) levmenu ++; if(digitalRead(53) != HIGH) levmenu --; if(levmenu > 60) levmenu = 0; if(levmenu < 0) levmenu = 60; if (digitalRead(48) != HIGH) setclock = 1; time.settime(-1, -1, levmenu); break; case 1: time.blinktime(2); levmenu = time.minutes; if(digitalRead(52) != HIGH) levmenu ++; if(digitalRead(53) != HIGH) levmenu --; if(levmenu > 60) levmenu = 0; if(levmenu < 0) levmenu = 60; if(digitalRead(48) != HIGH) setclock = 2; time.settime(-1, levmenu); break; case 2: time.blinktime(1); levmenu = time.seconds; if(digitalRead(52) != HIGH) levmenu ++; if(digitalRead(53) != HIGH) levmenu --; if(levmenu > 60) levmenu = 0; if(levmenu < 0) levmenu = 60; time.settime(levmenu); if(digitalRead(48) != HIGH) { setclock = 0; realmenu = 1; time.blinktime(0); levmenu = 0; tft.fillScreen(GREY); // обновление экрана заливкой } break; } } }
а так не работает, в чем ошибка Код (C++): #include <gfxfont.h> #include <UTFTGLUE.h> #include <DHT.h> #include <iarduino_RTC.h> #include <Adafruit_GFX.h> #include <FreeDefaultFonts.h> #include <Fonts/FreeMono12pt7b.h> #include <MCUFRIEND_kbv.h> MCUFRIEND_kbv tft(A3, A2, A1, A0, A4);//int CS=A3, RS=A2, WR=A1, RD=A0, RST=A4; iarduino_RTC time(RTC_DS1302, 47, 29, 39); DHT dht(44, DHT22); //Инициация датчика #define BLACK 0x0000 #define NAVY 0x000F #define DARKGREEN 0x03E0 #define DARKCYAN 0x03EF #define MAROON 0x7800 #define PURPLE 0x780F #define OLIVE 0x7BE0 #define LIGHTGREY 0xC618 #define DARKGREY 0x7BEF #define BLUE 0x001F #define GREEN 0x07E0 #define CYAN 0x07FF #define RED 0xF800 #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define ORANGE 0xFD20 #define GREENYELLOW 0xAFE5 #define PINK 0xF81F #define GREY 0x8410 void setup() { Serial.begin (9600);// инициализация монитора порта time.begin(); dht.begin(); uint16_t ID = tft.readID();// получение информации о дисплее tft.begin(ID);// инициализация дисплея pinMode(52, INPUT_PULLUP);//up pinMode(53, INPUT_PULLUP);//dw pinMode(48, INPUT_PULLUP);//mid pinMode(46, INPUT_PULLUP);//rst pinMode(49, INPUT_PULLUP);//set pinMode(50, INPUT_PULLUP);//left tft.setRotation(1); // повернуть экран tft.fillScreen(GREY); // заливка экрана tft.setTextColor(0xFFFF, GREY); // белый цвет шрифта/сераязаливка tft.setTextSize(1); //размер шрифта 1-5 //tft.setFont(&FreeMono12pt7b); } static int levmenu; static unsigned long timer;// переменная для задержки отображения времени struct Menu //структура хранения данных меню { String myname; String paragraph[5]; int index; }; Menu mainmenu; mainmenu.myname = "MENU"; mainmenu.paragraph[0] = "Profil"; mainmenu.paragraph[1] = "Seting"; mainmenu.paragraph[2] = "Back"; mainmenu.index = 3; Menu profilmenu; profilmenu.myname = "PROFIL MENU"; profilmenu.paragraph[0] = "Select"; profilmenu.paragraph[1] = "Edit"; profilmenu.paragraph[2] = "Back"; profilmenu.index = 3; Menu setingmenu; setingmenu.myname = "SETING MENU"; setingmenu.paragraph[0] = "Clock"; setingmenu.paragraph[1] = "Calibration sensors"; setingmenu.paragraph[2] = "Back"; setingmenu.index = 3; int menu(String myname, String paragraph[], int index, int levmenu)//функция отображения меню { const int poscur[] = {40, 80, 120, 160, 180};//координаты пунктов меню if (levmenu < 0) levmenu = index - 1; if (levmenu > index - 1) levmenu = 0; if (digitalRead(52) != HIGH) levmenu ++; if (digitalRead(53) != HIGH) levmenu --; tft.setTextSize(3); tft.setCursor(0, 0); tft.setTextColor(BLACK,GREY); tft.print(myname); for (int i = 0; i < index; i++) { tft.setCursor (0, poscur[i]); if (i != levmenu) tft.print(paragraph[i]); } tft.setTextColor(WHITE, BLACK); tft.setCursor(0, poscur[levmenu]); tft.print(paragraph[levmenu]); return levmenu; } void temphum(int x, int y)// выводит на экран температуру и влажность { // float h = dht.readHumidity(); //Измеряем влажность // float t = dht.readTemperature(); //Измеряем температуру tft.setCursor(x,y); tft.setTextSize(3); if(dht.readTemperature() > 28) tft.setTextColor(RED,GREY); else if(dht.readTemperature() < 24) tft.setTextColor(BLUE,GREY); else tft.setTextColor(GREEN, GREY); tft.print(dht.readTemperature()); tft.println("C"); tft.setTextColor(WHITE, GREY); tft.print(dht.readHumidity()); tft.print("%"); tft.setCursor(0, 0); } void loop () { static int realmenu;// переменная для навигации по страницам меню if (realmenu == 0) // код отображения времени на главном экране { tft.setTextSize(2); tft.setTextColor(0xFFFF, GREY); tft.setCursor(120, 140); if (millis() - timer > 1000) { tft.setTextColor(0xFFFF, GREY); tft.print(time.gettime("H:i:s")); temphum(0, 0); timer = millis(); } if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); tft.setTextColor(WHITE, GREY); realmenu = 1; } } if (realmenu == 1) { levmenu = menu(mainmenu.myname, mainmenu.paragraph, mainmenu.index, levmenu); if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); // обновление экрана заливкой switch (levmenu) { case 0: realmenu = 2; levmenu = 0; break; case 1: realmenu = 3; levmenu = 0; break; case 2: realmenu = 0; levmenu = 0; break; } } } if (realmenu == 2) //2 - меню профиля { levmenu = menu(profilmenu.myname, profilmenu.paragraph, profilmenu.index, levmenu); if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); // обновление экрана заливкой switch (levmenu) { case 0: realmenu = 11; levmenu = 0; break; case 1: realmenu = 12; levmenu = 0; break; case 2: realmenu = 1; levmenu = 0; break; } } } if (realmenu == 3)// 3 - меню настроек системы { levmenu = menu(setingmenu.myname, setingmenu.paragraph, setingmenu.index, levmenu); if (digitalRead(48) != HIGH) { tft.fillScreen(GREY); // обновление экрана заливкой switch (levmenu) { case 0: realmenu = 21; levmenu = 0; break; case 1: realmenu = 22; levmenu = 0; break; case 2: realmenu = 1; levmenu = 0; break; } } } if (realmenu == 21)// настройки часов { static int setclock;//переменная определения типа настраиваемого времени часы, минуты, секунды tft.setCursor(200, 0); tft.print(levmenu); tft.setCursor(0, 0); tft.print("TIME SETUP"); tft.setCursor(60, 150); tft.print(time.gettime("H:i:s")); if (digitalRead(52) != HIGH) levmenu ++; if (digitalRead(53) != HIGH) levmenu --; switch (setclock) { case 0: levmenu = time.Hours; time.blinktime(3); if(digitalRead(52) != HIGH) levmenu ++; if(digitalRead(53) != HIGH) levmenu --; if(levmenu > 60) levmenu = 0; if(levmenu < 0) levmenu = 60; if (digitalRead(48) != HIGH) setclock = 1; time.settime(-1, -1, levmenu); break; case 1: time.blinktime(2); levmenu = time.minutes; if(digitalRead(52) != HIGH) levmenu ++; if(digitalRead(53) != HIGH) levmenu --; if(levmenu > 60) levmenu = 0; if(levmenu < 0) levmenu = 60; if(digitalRead(48) != HIGH) setclock = 2; time.settime(-1, levmenu); break; case 2: time.blinktime(1); levmenu = time.seconds; if(digitalRead(52) != HIGH) levmenu ++; if(digitalRead(53) != HIGH) levmenu --; if(levmenu > 60) levmenu = 0; if(levmenu < 0) levmenu = 60; time.settime(levmenu); if(digitalRead(48) != HIGH) { setclock = 0; realmenu = 1; time.blinktime(0); levmenu = 0; tft.fillScreen(GREY); // обновление экрана заливкой } break; } } }