Witam. Menu LCD...zrobiłem..uruchomiłem..ale nie byłem z niego zadowolony i zacząłem przerabiać na ile pozwala moja wiedza. Od razu mówię że czary mary ze wskaźnikami,tablicami i inny hokus-pokus to za wysoka dla mnie półka i choć próbowałem to efekt był mizerny i na dobre się w tym pogubiłem.Problemem jest architektura tego menu w którym jest sporo ustawień obsługiwanych klawiszami których kod wielokrotnie się powtarza , ilości zmiennych przyprawiających o ból głowy których nie potrafię upchnąć w jakąś tablice lub funkcję. Byłbym wdzięczny gdy ktoś z większym doświadczeniem pomógł mi ogarnąć ten bałagan...
char *power[2]={"<<*>>","Zalacz","Wylacz"};//power[0] blokada sterowania ręcznego jeżeli nie jest w trybie manual
char *tryb[3]={"MANUAL ","KANAL 1","KANAL 2","* *"};
char *dzien[7]={" Poniedzialek ",
" Wtorek ",
" Sroda ",
" Czwartek ",
" Piatek ",
" Sobota ",
" Niedziela "};
if(!(PIND & _BV(4)))//-----------------------------------------klawisze
{
_delay_ms(100); { menu++; PORTB |= _BV(0); }
LCD_GoTo(0,0); LCD_WriteText(" ");
LCD_GoTo(0,1); LCD_WriteText(" ");
LCD_GoTo(20,0); LCD_WriteText(" ");
LCD_GoTo(20,1); LCD_WriteText(" ");
}
if(!(PIND & _BV(5))) { enter++; _delay_ms(50); }//----klawisze
switch(menu)
{//************************************************************WYŚWIETLACZ 4x20 ZNAKÓW
case 0://--------------------------------------------------ekran główny - OK
LCD_GoTo(0,0); LCD_WriteText(dzien[rtc_dzien]);
LCD_GoTo(0,1); LCD_WriteText(itoa(rtc_ddni,buffer_t,10));
LCD_GoTo(1,1); LCD_WriteText(itoa(rtc_jdni,buffer_t,10));
LCD_GoTo(2,1); LCD_WriteText("- -2010");
LCD_GoTo(3,1); LCD_WriteText(itoa(rtc_dmc,buffer_t,10));
LCD_GoTo(4,1); LCD_WriteText(itoa(rtc_jmc,buffer_t,10));
LCD_GoTo(12,1); LCD_WriteText(itoa(rtc_dg,buffer_t,10));
LCD_GoTo(13,1); LCD_WriteText(itoa(rtc_jg,buffer_t,10));
LCD_GoTo(14,1); LCD_WriteText(": :");
LCD_GoTo(15,1); LCD_WriteText(itoa(rtc_dm,buffer_t,10));
LCD_GoTo(16,1); LCD_WriteText(itoa(rtc_jm,buffer_t,10));
LCD_GoTo(18,1); LCD_WriteText(itoa(rtc_ds,buffer_t,10));
LCD_GoTo(19,1); LCD_WriteText(itoa(rtc_js,buffer_t,10));
LCD_GoTo(20,0); LCD_WriteText("Napiecie AKU V");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(aku=aku,4,1,buffer_n));
LCD_GoTo(20,1); LCD_WriteText("Prad z");
LCD_GoTo(27,1); LCD_WriteText(komunikat);
if(!(PINA & _BV(7))) { _delay_ms(50); PORTB ^= _BV(0); enter=0; }
break;
case 1://--------------------------------------------------podgląd statusów zasilania - OK
LCD_GoTo(0,0); LCD_WriteText("Prad z");
LCD_GoTo(7,0); LCD_WriteText(komunikat);
LCD_GoTo(0,1); LCD_WriteText("AKU V SOL V");
LCD_GoTo(4,1); LCD_WriteText(dtostrf(aku=aku,4,1,buffer_n));
LCD_GoTo(14,1); LCD_WriteText(dtostrf(sol=sol,4,1,buffer_n));
LCD_GoTo(20,0); LCD_WriteText("POWER AKUM OBCI");
LCD_GoTo(20,1); LCD_WriteText(dtostrf(lad=lad,4,1,buffer_n));
LCD_GoTo(24,1); LCD_WriteText("A A A");
LCD_GoTo(27,1); LCD_WriteText(dtostrf(inpower=inpower,4,1,buffer_n));
LCD_GoTo(34,1); LCD_WriteText(dtostrf(out=out,4,1,buffer_n));
break;
case 2://--------------------------------------------------sterowanie obwodami !!!!!!!!!!!!!!!!!!
if(!(PIND & _BV(5))) { if(++select > 4) { select = 0; } }
if(select==0) { LCD_GoTo(39,1); LCD_WriteText(" "); LCD_GoTo(19,0); LCD_WriteText(" "); }
if(select==1) { LCD_GoTo(19,0); LCD_WriteText("<"); }
if(select==2) { LCD_GoTo(19,0); LCD_WriteText(" "); LCD_GoTo(19,1); LCD_WriteText("<"); }
if(select==3) { LCD_GoTo(19,1); LCD_WriteText(" "); LCD_GoTo(39,0); LCD_WriteText("<"); }
if(select==4) { LCD_GoTo(39,0); LCD_WriteText(" "); LCD_GoTo(39,1); LCD_WriteText("<"); }
if((tryb_o1==1)||(tryb_o1==2)) { status_o1=0; }
if((tryb_o2==1)||(tryb_o2==2)) { status_o2=0; }
if((tryb_o3==1)||(tryb_o3==2)) { status_o3=0; }
if((tryb_o4==1)||(tryb_o4==2)) { status_o4=0; }
LCD_GoTo(0,0); LCD_WriteText("STATUS OBW 1");
LCD_GoTo(13,0); LCD_WriteText(power[status_o1]);
LCD_GoTo(0,1); LCD_WriteText("STATUS OBW 2");
LCD_GoTo(13,1); LCD_WriteText(power[status_o2]);
LCD_GoTo(20,0); LCD_WriteText("STATUS OBW 3");
LCD_GoTo(33,0); LCD_WriteText(power[status_o3]);
LCD_GoTo(20,1); LCD_WriteText("STATUS OBW 4");
LCD_GoTo(33,1); LCD_WriteText(power[status_o4]);
break;
case 3://--------------------------------------------------tryb pracy obwodu !!!!!!!!!!!!!!!!!
if(!(PIND & _BV(5))) { _delay_ms(50); if(++select > 4) { select = 0; set_tryb=0; } }
if(select==0) { LCD_GoTo(39,1); LCD_WriteText(" "); LCD_GoTo(19,0); LCD_WriteText(" "); }
if(select==1)
{
LCD_GoTo(19,0); LCD_WriteText("<");
if(!(PIND & _BV(6))) { _delay_ms(30); if(++tryb_o1 > 3) { tryb_o1; } }
}
if(select==2)
{
LCD_GoTo(19,0); LCD_WriteText(" "); LCD_GoTo(19,1); LCD_WriteText("<");
if(!(PIND & _BV(6))) { _delay_ms(30); if(++tryb_o2 > 3) { tryb_o2; } }
}
if(select==3)
{
LCD_GoTo(19,1); LCD_WriteText(" "); LCD_GoTo(39,0); LCD_WriteText("<");
if(!(PIND & _BV(6))) { _delay_ms(30); if(++tryb_o3 > 3) { tryb_o3; } }
}
if(select==4)
{
LCD_GoTo(39,0); LCD_WriteText(" "); LCD_GoTo(39,1); LCD_WriteText("<");
if(!(PIND & _BV(6))) { _delay_ms(30); if(++tryb_o4 > 4) { tryb_o4; } }
}
LCD_GoTo(0,0); LCD_WriteText("OBW 1 TRYB");
LCD_GoTo(11,0); LCD_WriteText(tryb[tryb_o1]);
LCD_GoTo(0,1); LCD_WriteText("OBW 2 TRYB");
LCD_GoTo(11,1); LCD_WriteText(tryb[tryb_o2]);
LCD_GoTo(20,0); LCD_WriteText("OBW 3 TRYB");
LCD_GoTo(31,0); LCD_WriteText(tryb[tryb_o3]);
LCD_GoTo(20,1); LCD_WriteText("OBW 4 TRYB");
LCD_GoTo(31,1); LCD_WriteText(tryb[tryb_o4]);
break;
case 4://--------------------------------------------------programowanie zegarek - OK
LCD_GoTo(0,0); LCD_WriteText(" PROGRAMOWANIE CZAS");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT : :");
LCD_GoTo(11,1); LCD_WriteText(dtostrf(rtc_dg,1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_jg,1,0,buffer_t));
LCD_GoTo(14,1); LCD_WriteText(dtostrf(rtc_dm,1,0,buffer_t));
LCD_GoTo(15,1); LCD_WriteText(dtostrf(rtc_jm,1,0,buffer_t));
LCD_GoTo(17,1); LCD_WriteText(dtostrf(rtc_ds,1,0,buffer_t));
LCD_GoTo(18,1); LCD_WriteText(dtostrf(rtc_js,1,0,buffer_t));
if(!(PIND & _BV(6))) { if(++set_d >= 24) { set_d = 0; } }
if(!(PIND & _BV(7))) { if(++set_j >= 60) { set_j = 0; } }
LCD_GoTo(21,0); LCD_WriteText("USTAW ");
LCD_GoTo(31,0); LCD_WriteText(dtostrf(set_d,2,0,buffer_n));
LCD_GoTo(33,0); LCD_WriteText(": :00");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(set_j,2,0,buffer_n));
if(!(PINA & _BV(7)))
{
_delay_ms(30); LCD_GoTo(39,1); LCD_WriteText("*");
TWI_write(zegar,0x04,dec_na_bcd(set_d));
TWI_write(zegar,0x03,dec_na_bcd(set_j));
TWI_write(zegar,0x02,0x00);
_delay_ms(1500); enter=0; set_d=0, set_j=0;
LCD_GoTo(39,1); LCD_WriteText(" ");
}
break;
case 5://--------------------------------------------------programowanie data - OK
LCD_GoTo(0,0); LCD_WriteText(" PROGRAMOWANIE DATA");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT - -2010");
LCD_GoTo(9,1); LCD_WriteText(dtostrf(rtc_ddni,1,0,buffer_t));
LCD_GoTo(10,1); LCD_WriteText(dtostrf(rtc_jdni,1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_dmc,1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(dtostrf(rtc_jmc,1,0,buffer_t));
if(!(PIND & _BV(6))) { if(++set_j >= 13) { set_d = 0; } }
if(!(PIND & _BV(7))) { if(++set_d >= 32) { set_j = 0; } }
LCD_GoTo(21,0); LCD_WriteText("USTAW ");
LCD_GoTo(29,0); LCD_WriteText(dtostrf(set_j,2,0,buffer_n));
LCD_GoTo(31,0); LCD_WriteText("- -2010");
LCD_GoTo(32,0); LCD_WriteText(dtostrf(set_d,2,0,buffer_n));
if(!(PINA & _BV(7)))
{
_delay_ms(30); LCD_GoTo(39,1); LCD_WriteText("*");
TWI_write(zegar,0x06,dec_na_bcd(set_d));
TWI_write(zegar,0x05,dec_na_bcd(set_j));
_delay_ms(1500); enter=0; set_d=0, set_j=0;
LCD_GoTo(39,1); LCD_WriteText(" ");
}
break;
case 6://--------------------------------------------------programowanie zegar sterujący!!!!!!!!!!!!!!!
LCD_GoTo(0,0); LCD_WriteText(" PROGRAMOWANIE ");
LCD_GoTo(0,1); LCD_WriteText(" Z E G A R ");
LCD_GoTo(20,0); LCD_WriteText(" S T E R U J A C Y ");
LCD_GoTo(20,1); LCD_WriteText(" ");
//od poniedziałku do piątku
// kanal 1 załącz
// odczyt nastawy czasu
// ustawianie czasu > godziny > minuty
// zapis do EEPROM
// kanal 2 załącz
// odczyt nastawy czasu
// ustawianie czasu > godziny > minuty
// zapis do EEPROM
// kanal 1 wyłącz
// odczyt nastawy czasu
// ustawianie czasu > godziny > minuty
// zapis do EEPROM
// kanal 2 wyłącz
// odczyt nastawy czasu
// ustawianie czasu > godziny > minuty
// zapis do EEPROM
//analogicznie od soboty do niedzieli
// - // -
break;
case 7:
PORTB &=~ _BV(0); menu=0;
break;
}
}
return;
}
//********** END MAIN **********