Очередная тема про меню на LCD 20x4
- Войдите на сайт для отправки комментариев
Ср, 20/11/2013 - 13:23
Добрый день!
Написал код
#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 ();
}
}
Не совсем корректно работает: мерцает экран, курсор в верх не идет, между пунктами нет корректной работы.
Прошу посмотреть и ткнуть носом.
Спасибо!