Очередная тема про меню на 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 (); } }
Не совсем корректно работает: мерцает экран, курсор в верх не идет, между пунктами нет корректной работы.
Прошу посмотреть и ткнуть носом.
Спасибо!