Очередная тема про меню на LCD 20x4

Нет ответов
ingener.solovyev
Offline
Зарегистрирован: 12.02.2013

Добрый день!

Написал код

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include "Arduino.h"
#include <DS1307.h>
#define NUM_KEYS 5

int  adc_key_val[NUM_KEYS] = {30, 150, 360, 535, 760};
LiquidCrystal_I2C lcd(0x27,20,4);  //инициализируем экран
int key, t, h;

uint8_t temp_cel[8] = //Символ °
{
B00010,
B00101,
B00010,
B00000,
B00000,
B00000,
B00000
};

int poscursor=0, menu=1;
String hour , minut, clocks;


void setup()
{
  lcd.init();                      
  lcd.backlight();
  lcd.createChar(1, temp_cel);
}

void loop()
{
  delay (1000);
  t=23;  //здесь будет температура с DHT21
  h=35;  //здесь будет влажность с DHT21
  key = get_key(A7); //проверяем состояние кнопок
  Cursor ();
  switch (menu) {
    case 1: menu1 ();
    break;
    case 2: menu2 ();
    break;
    case 3: menu3 ();
    break;
    case 4: menu4 ();
    break;
    case 5: menu5 ();
    break;
  }
}
//Button
byte get_key(int key_pin)
{
  if(analogRead(key_pin) < adc_key_val[NUM_KEYS-1])
  {
    byte k[3];
    for(byte i = 0; i < 3; i++)
    {
      delay(10);
      k[i] = 0;
      for(byte j = 0; j < NUM_KEYS; j++)
      { 
        if(analogRead(key_pin) < adc_key_val[j]) 
        {
          k[i] = j + 1;
          break;
        }
      }
    }
    if((k[0] > 0) && (k[0] == k[1]) && (k[0] == k[2]) && (k[1] == k[2])) return k[0];
  }
  return 0;
} //end button
void clock () {
  int hr=RTC.get(DS1307_HR,true);
  int min=RTC.get(DS1307_MIN,false);
 }
void Cursor () {
  switch (key) {
    case 1: //вверх
      poscursor--;
      if (poscursor < 0)
        {poscursor=0;}
    case 2: //вниз
      poscursor++;
      if (poscursor > 3)
        {poscursor=3;}
  }
}
void menu1 () {
  menu=1;
  int hr=RTC.get(DS1307_HR,true);
  int min=RTC.get(DS1307_MIN,false);
  
  lcd.clear ();
  // первая строка
  lcd.setCursor (8, 0);
  if (hr<10) { lcd.print ("0"); lcd.print (hr);}
  else {lcd.print (hr);}
  lcd.print (":");
  if (min<10) { lcd.print ("0"); lcd.print (min);}
  else {lcd.print (min);}
  //вторая строка
  lcd.setCursor (3, 1); lcd.print ("T: ");
  lcd.setCursor (5, 1); lcd.print (t);
  lcd.setCursor (8, 1); lcd.print ("/1");
  lcd.setCursor (9, 1); lcd.print ("C   H: ");
  lcd.setCursor (16, 1); lcd.print (h);
  lcd.setCursor (18, 1); lcd.print (" %");
  //третья строка
  lcd.setCursor (3, 2); lcd.print ("FM: ");
  lcd.setCursor (7, 2); lcd.print ("103.7");
  lcd.setCursor (15, 2); lcd.print ("OFF");
  //четвертая строка
  lcd.setCursor (3, 3); lcd.print ("Fan: ");
  lcd.setCursor (15, 3); lcd.print ("OFF"); 
  
  // Управление курсором
  lcd.setCursor(0, poscursor); lcd.print("*");
  
  if (key == 5) {
    switch (poscursor) {
      case 0:
        menu2 ();
        poscursor = 0;
      break;
      case 1:
        menu3 ();
        poscursor = 0;
      break;
      case 2:
        menu4 ();
        poscursor = 0;
      break;
      case 3:
        menu5 ();
        poscursor = 0;
      break;
    }
  }
}
void menu2 () {
  menu=2;
  
  lcd.clear ();
  lcd.setCursor (3, 1); lcd.print ("Setting the clock");
  
  if (key == 5) {
    poscursor = 0;
    menu1 ();
  }
}
void menu3 () {
  menu=3;
  
  lcd.clear ();
  lcd.setCursor (7, 1); lcd.print ("DHT21");
  
  if (key == 5) {
    poscursor = 0;
    menu1 ();
  }
}
void menu4 () {
  menu=4;
  
  lcd.clear ();
  lcd.setCursor (4, 1); lcd.print ("Radio state");
  
  if (key == 5) {
    poscursor = 0;
    menu1 ();
  }
}
void menu5 () {
  menu=5;
  
  lcd.clear ();
  lcd.setCursor (8, 1); lcd.print ("Fan");
  
  if (key == 5) {
    poscursor = 0;
    menu1 ();
  }
}

Не совсем корректно работает: мерцает экран, курсор в верх не идет, между пунктами нет корректной работы.

Прошу посмотреть и ткнуть носом.

Спасибо!