Ребят объясните код

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 24 июл 2014.

  1. Максим B

    Максим B Гуру

    Нашел на просторах интернета код по созданию больших символов на ЖКИ 16x2. Но с логикой работы кода есть трудности - где можно почитать мануал по тому, как реализаются большие символы в данном коде. Спасибо
    Код (Text):
    Code:

    /*
    A set of custom made large numbers for a 16x2 LCD using the
    LiquidCrystal librabry. Works with displays compatible with the
    Hitachi HD44780 driver.
    The Cuicuit:
    LCD RS pin to D12
    LCD Enable pin to D11
    LCD D4 pin to D5
    LCD D5 pin to D4
    LCD D6 pin to D3
    LCD D7 pin to D2
    LCD Vee tied to a pot to control brightness
    LCD Vss and R/W tied to ground
    LCD Vcc to +5V
    LCD pin 15 tied to pushbutton for control of backlight
    Made by Michael Pilcher
    2/9/2010
    */

    // include the library
    #include <LiquidCrystal.h>

    // initialize the interface pins
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
    int x = 0;
    // the 8 arrays that form each segment of the custom numbers
    byte LT[8] =
    {
      B00111,
      B01111,
      B11111,
      B11111,
      B11111,
      B11111,
      B11111,
      B11111
    };
    byte UB[8] =
    {
      B11111,
      B11111,
      B11111,
      B00000,
      B00000,
      B00000,
      B00000,
      B00000
    };
    byte RT[8] =
    {
      B11100,
      B11110,
      B11111,
      B11111,
      B11111,
      B11111,
      B11111,
      B11111
    };
    byte LL[8] =
    {
      B11111,
      B11111,
      B11111,
      B11111,
      B11111,
      B11111,
      B01111,
      B00111
    };
    byte LB[8] =
    {
      B00000,
      B00000,
      B00000,
      B00000,
      B00000,
      B11111,
      B11111,
      B11111
    };
    byte LR[8] =
    {
      B11111,
      B11111,
      B11111,
      B11111,
      B11111,
      B11111,
      B11110,
      B11100
    };
    byte UMB[8] =
    {
      B11111,
      B11111,
      B11111,
      B00000,
      B00000,
      B00000,
      B11111,
      B11111
    };
    byte LMB[8] =
    {
      B11111,
      B00000,
      B00000,
      B00000,
      B00000,
      B11111,
      B11111,
      B11111
    };



    void setup()
    {
      // assignes each segment a write number
      lcd.createChar(0,LT);
      lcd.createChar(1,UB);
      lcd.createChar(2,RT);
      lcd.createChar(3,LL);
      lcd.createChar(4,LB);
      lcd.createChar(5,LR);
      lcd.createChar(6,UMB);
      lcd.createChar(7,LMB);

      // sets the LCD's rows and colums:
      lcd.begin(16, 2);

    }

    void custom0O()
    { // uses segments to build the number 0
      lcd.setCursor(x, 0);
      lcd.write(0);
      lcd.write(1);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(5);
    }

    void custom1()
    {
      lcd.setCursor(x,0);
      lcd.write(1);
      lcd.write(2);
      lcd.setCursor(x+1,1);
      lcd.write(5);
    }

    void custom2()
    {
      lcd.setCursor(x,0);
      lcd.write(6);
      lcd.write(6);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(7);
      lcd.write(7);
    }

    void custom3()
    {
      lcd.setCursor(x,0);
      lcd.write(6);
      lcd.write(6);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(7);
      lcd.write(7);
      lcd.write(5);
    }

    void custom4()
    {
      lcd.setCursor(x,0);
      lcd.write(3);
      lcd.write(4);
      lcd.write(2);
      lcd.setCursor(x+2, 1);
      lcd.write(5);
    }

    void custom5S()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(6);
      lcd.setCursor(x, 1);
      lcd.write(7);
      lcd.write(7);
      lcd.write(5);
    }

    void custom6()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(6);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(7);
      lcd.write(5);
    }

    void custom7()
    {
      lcd.setCursor(x,0);
      lcd.write(1);
      lcd.write(1);
      lcd.write(2);
      lcd.setCursor(x+1, 1);
      lcd.write(0);
    }

    void custom8()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(7);
      lcd.write(5);
    }

    void custom9()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(2);
      lcd.setCursor(x+2, 1);
      lcd.write(5);
    }

    void customA()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.print(" ");
      lcd.write(5);
    }

    void customB()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(5);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(7);
      lcd.write(2);
    }

    void customC()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(1);
      lcd.write(1);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(4);
    }

    void customD()
    {
      lcd.setCursor(x, 0);
      lcd.write(2);
      lcd.write(1);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(5);
      lcd.write(4);
      lcd.write(5);
    }

    void customE()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(6);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(7);
      lcd.write(7);
    }

    void customF()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(6);
      lcd.setCursor(x, 1);
      lcd.write(3);
    }

    void customG()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(1);
      lcd.write(1);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(2);
    }

    void customH()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(4);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.print(" ");
      lcd.write(5);
    }

    void customI()
    {
      lcd.setCursor(x,0);
      lcd.write(1);
      lcd.write(2);
      lcd.write(1);
      lcd.setCursor(x,1);
      lcd.write(4);
      lcd.write(5);
      lcd.write(4);
    }

    void customJ()
    {
      lcd.setCursor(x+2,0);
      lcd.write(2);
      lcd.setCursor(x,1);
      lcd.write(4);
      lcd.write(4);
      lcd.write(5);
    }

    void customK()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(4);
      lcd.write(5);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.print(" ");
      lcd.write(2);
    }

    void customL()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(4);
    }

    void customM()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(1);
      lcd.write(3);
      lcd.write(1);
      lcd.write(2);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.print("  ");
      lcd.write(5);
    }

    void customN()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(3);
      lcd.print(" ");
      lcd.write(2);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.print(" ");
      lcd.write(2);
      lcd.write(5);
    }

    void customP()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
    }

    void customQ()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(1);
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(3);
      lcd.write(4);
    }

    void customR()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.write(6);
      lcd.write(5);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.print(" ");
      lcd.write(2);
    }

    void customT()
    {
      lcd.setCursor(x,0);
      lcd.write(1);
      lcd.write(2);
      lcd.write(1);
      lcd.setCursor(x,1);
      lcd.print(" ");
      lcd.write(5);
    }

    void customU()
    {
      lcd.setCursor(x, 0);
      lcd.write(0);
      lcd.print(" ");
      lcd.write(2);
      lcd.setCursor(x, 1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(5);
    }

    void customV()
    {
      lcd.setCursor(x, 0);
      lcd.write(3);
      lcd.print("  ");
      lcd.write(5);
      lcd.setCursor(x+1, 1);
      lcd.write(3);
      lcd.write(5);
    }

    void customW()
    {
      lcd.setCursor(x,0);
      lcd.write(0);
      lcd.print("  ");
      lcd.write(2);
      lcd.setCursor(x,1);
      lcd.write(3);
      lcd.write(4);
      lcd.write(0);
      lcd.write(4);
      lcd.write(5);
    }

    void customX()
    {
      lcd.setCursor(x,0);
      lcd.write(3);
      lcd.write(4);
      lcd.write(5);
      lcd.setCursor(x,1);
      lcd.write(0);
      lcd.print(" ");
      lcd.write(2);
    }

    void customY()
    {
      lcd.setCursor(x,0);
      lcd.write(3);
      lcd.write(4);
      lcd.write(5);
      lcd.setCursor(x+1,1);
      lcd.write(5);
    }

    void customZ()
    {
      lcd.setCursor(x,0);
      lcd.write(1);
      lcd.write(6);
      lcd.write(5);
      lcd.setCursor(x, 1);
      lcd.write(0);
      lcd.write(7);
      lcd.write(4);
    }


    void loop()
    {
      customA();
      x = x + 4;
      customB();
      x = x + 4;
      customC();
      x = x + 4;
      customD();
      delay(4000);  // delay 4 seconds
      lcd.clear();  // clears the display
      x = 0;  // resets x to 0
      customE();
      x = x + 4;
      customF();
      x = x + 4;
      customG();
      x = x + 4;
      customH();
      delay(4000);  // delay 4 seconds
      lcd.clear();  // clears the display
      x = 0;  // resets x to 0
      customI();
      x = x + 4;
      customJ();
      x = x + 4;
      customK();
      x = x + 4;
      customL();
      delay(4000);
      lcd.clear();
      x = 0;
      customM();
      x = x + 6;
      customN();
      x = x + 5;
      custom0O();
      delay(4000);
      lcd.clear();
      x = 0;
      customP();
      x = x + 4;
      customQ();
      x = x + 5;
      customR();
      x = x + 4;
      custom5S();
      delay(4000);
      lcd.clear();
      x = 0;
      customT();
      x = x + 4;
      customU();
      x = x + 4;
      customV();
      delay(4000);
      lcd.clear();
      x = 0;
      customW();
      x = x + 6;
      customX();
      delay(4000);
      lcd.clear();
      x = 0;
      customY();
      x = x + 4;
      customZ();
      delay(4000);
      lcd.clear();
      x = 0;
      custom0O();    // displays custom 0 on the LCD
      x = x + 4;    // sifts cursor over 4 columns
      custom1();
      x = x + 4;
      custom2();
      x = x + 4;
      custom3();
      delay(4000);
      lcd.clear();
      x = 0;
      custom4();
      x = x + 4;
      custom5S();
      x = x + 4;
      custom6();
      x = x + 4;
      custom7();
      delay(4000);
      lcd.clear();
      x = 0;
      custom8();
      x = x + 4;
      custom9();
      delay(4000);
      lcd.clear();
      x = 0;
    }
     
  2. Максим B

    Максим B Гуру

  3. NR55RU

    NR55RU Гик

    Берете даташит по вашему LCD и начинаете его читать, в процессе чтения вдруг выясняете что каждый символ на вашем LCD состоит из поля светящихся точек, например размера 5х8 точек а помимо забитых в память LCD символов он готов принять некоторое количество пользовательских символов. :)

    Начав в этом разбираться и смотреть примеры в дадашите узнаете что собственный символ создается на базе битовой матрицы (собственно в таком же матрице и забитые символы там хранятся), поразбивашись с вопросом битовых матриц вдруг понимаете что 1 это закрашенный квадратик на том самом поле 5х8 а 0 это не закрашенный квадратик и тут вас осиняет что вы можете на поле 5х8 квадратиков "рисовать" все что вашей душе угодно и создав собственные "символы" и расставив их в ячейки для символов на LCD в нужных позициях в целом будите видеть один большой символ :)

    В целом мораль сей басни простая, нет в этом коде ничего такого что надо объяснять если хоть чуть чуть потратить время и попытаться понять как же работает LCD :)

    Вот кстати темка, как то я разбирался с вопросом как управлять LCD без библиотек вообще :)
     
    Последнее редактирование: 24 июл 2014
    Swift и Megakoteyka нравится это.
  4. lerik2703

    lerik2703 Гик