Сбой при формировании своих символов на LCD 1602

denis64
Offline
Зарегистрирован: 07.10.2013

В общем всё работает нормально, но...

Часто (в 50% случаев) при старте или перезагрузке в памяти дисплея оказываются не нужные мне символы букв а их смесь. В данном случае например буква П сверху и буква У снизу. Код такой:


// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>

uint8_t temp_cel_0[8] =
{
  B01010,
  B10101,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001
}; //закодировано в двоичной системе знак Й
uint8_t temp_cel_1[8] =
{
  B10001,
  B10001,
  B10011,
  B10101,
  B11001,
  B10001,
  B10001
}; //закодировано в двоичной системе знак И
uint8_t temp_cel_2[8] =
{
  B11110,
  B00001,
  B00001,
  B01110,
  B00001,
  B00001,
  B11110
}; //закодировано в двоичной системе знак З
uint8_t temp_cel_3[8] =
{
  B10101,
  B10101,
  B01110,
  B00100,
  B01110,
  B10101,
  B10101
}; //закодировано в двоичной системе знак Ж
uint8_t temp_cel_4[8] =
{
  B01111,
  B10001,
  B10001,
  B01111,
  B00101,
  B01001,
  B10001
}; //закодировано в двоичной системе знак Я
uint8_t temp_cel_5[8] =
{
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001
}; //закодировано в двоичной системе знак П 
uint8_t temp_cel_6[8] =
{
  B10001,
  B10001,
  B01010,
  B00110,
  B00100,
  B01000,
  B10000
}; //закодировано в двоичной системе знак У 
uint8_t temp_cel_7[8] =
{
  B11110,
  B00001,
  B00001,
  B01111,
  B00001,
  B00001,
  B11110
}; //закодировано в двоичной системе знак З 
int tok = 0; //сварочный ток, % импульсов сети
int time = 0; //время сварки, основной параметр
int rezhim = 1; //режим однократный или многократный
int pauza = 0;// задержка перед отключением пневмоклапана
int menu = 0; //активный пункт меню
int addres_eeprom_tok=0;
int addres_eeprom_time=2;
int addres_eeprom_rezhim=4;
int addres_eeprom_pauza=6;

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int a=0;
void setup() {
  lcd.createChar(1, temp_cel_0);//Й
  lcd.createChar(2, temp_cel_1);//И
  lcd.createChar(3, temp_cel_2);//З
  lcd.createChar(4, temp_cel_3);//Ж
  lcd.createChar(5, temp_cel_4);//Я
  lcd.createChar(6, temp_cel_5);//П
  lcd.createChar(7, temp_cel_6);//У
  lcd.createChar(8, temp_cel_7);//З
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("   KOHTAKTHA\5");
      lcd.setCursor(5, 1);
  lcd.print("CBAPKA");
  pinMode (A5, INPUT);

}

void loop() {

  a = analogRead (5);
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):

  // print the number of seconds since reset:

  if (a < 896 && a> 894)
  {
    EEPROM.write(addres_eeprom_tok, tok);
    EEPROM.write(addres_eeprom_time, time);
    EEPROM.write(addres_eeprom_rezhim, rezhim);
    EEPROM.write(addres_eeprom_pauza, pauza);
    lcd.clear ();
    
    lcd.print("   COXPAHEHO");
    lcd.setCursor(3, 1);
    lcd.print("B  \6AM\5T\2");
    delay(2000);
    edit();
  }

  if (a> 765 && a < 769 )
  {
  tok = EEPROM.read(addres_eeprom_tok);
  time = EEPROM.read(addres_eeprom_time);
  rezhim = EEPROM.read(addres_eeprom_rezhim);
  pauza = EEPROM.read(addres_eeprom_pauza);
    lcd.clear ();
    lcd.print("   BO\3BPAT");

    lcd.setCursor(3, 1);
lcd.print("HACTPOEK");
delay(2000);
menu=1;
edit();
  }

  if (a> 124 && a < 128 )
  {
    ++menu;
    if (menu==5)
    {
      menu=1;
    }
    delay(200); 
    edit();

  }

  if (a> 637 && a < 641 )
  {
    if (menu==1)
    {
      if (time>0)
      {
      --time;
      }
    }
    if (menu==2)
    {
      if (tok>0)
      {
      --tok;
      }
    }
    if (menu==3)
    {
      if (rezhim>0)
      {
      --rezhim;
      }
    }
    if (menu==4)
    {
      if (pauza>0)
      {
      --pauza;
      }
    }
    delay(200);
    edit();
  }

  if (a> 380 && a < 384 )
    {
    if (menu==1)
    {
      ++time;
    }
    if (menu==2)
    {
      ++tok;
    }
    if (menu==3)
    {
      ++rezhim;
    }
    if (menu==4)
    {
      ++pauza;
    }
    
    delay(200);
    edit();
  }
  if (a> 252 && a < 256 )
  {
    --menu;
    if (menu==0)
    {
      menu=4;
    }
    if (menu<0)
    {
      menu=4;
    }
    delay(200); 
    edit();

  }
  if (a> 506 && a < 514 )
  {
//

  }


}

void edit() {
  if (menu==1)
  {
    lcd.clear ();
    lcd.print("   HACTPO\1K\2");
    lcd.setCursor(0, 1);
    lcd.print("BPEM\5   :");
    lcd.print(time);
    //
  }
  if (menu==2)
  {
    lcd.clear ();
    lcd.print("   HACTPO\1K\2");
    lcd.setCursor(0, 1);
    lcd.print("TOK     :");
    lcd.print(tok);
    //
  }
  if (menu==3)
  {
    lcd.clear ();
    lcd.print("   HACTPO\1K\2");
    lcd.setCursor(0, 1);
    lcd.print("PE\4\2M CBAPK\2 :");
    lcd.print(rezhim);
    //
  }
  if (menu==4)
  {
    lcd.clear ();
    lcd.print("   HACTPO\1K\2");
    lcd.setCursor(0, 1);
    lcd.print("\6A\7\3A");
    lcd.print("   :");
    lcd.print(pauza);
    //
  }
}









 

denis64
Offline
Зарегистрирован: 07.10.2013

Как  избавиться от этой досадной мелочи?

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

Напряжение питания на дисплее измерьте. Какое напряжение?

Iona
Offline
Зарегистрирован: 26.08.2013

Не успевает при инициализации, попробуй по играться с задержками
Мне помогло в такой же ситуации
 

lcd.begin(16, 2);
delay (100);
lcd.createChar(1, temp_cel_0);
lcd.clear();

 

denis64
Offline
Зарегистрирован: 07.10.2013

Iona пишет:

Не успевает при инициализации, попробуй по играться с задержками
Мне помогло в такой же ситуации
 

lcd.begin(16, 2);
delay (100);
lcd.createChar(1, temp_cel_0);
lcd.clear();

 

Большое спасибо всем ответившим за помощь. Введение задержки по совету Iona кажется помогло.

Во всяком случае за 15 перезагрузок, такой проблемы более не обнаружено.