logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega32][c]Jeszcze raz o menu LCD...walki ciąg dalszy..

margas4542 22 Lis 2010 20:37 2474 15
REKLAMA
  • #1 8776956
    margas4542
    Poziom 16  
    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 **********
    
  • REKLAMA
  • #2 8777066
    tadzik85
    Poziom 38  
    Powielasz ten temat po 100-kroć i po 100-kroć podane zostały ci rozwiązania setki rozwiązań do tego czasu nauczyłbyś się wskaźników tablic itp itd chociaż pod kątem tego zastosowania. Podałem ci jak na tacy szablon menu wielopoziomowego jednak z wyświetlaniem tylko jednej opcji. Więc polecam książka i kursy do C w rękę i poświęć ten czas na lekturę zamiast powielać ten temat bo marnujesz przede wszystkim swój czas.
  • REKLAMA
  • #3 8777107
    rpal
    Poziom 27  
    kol. margas kopiesz się z koniem, jedna struktura albo dwie, może 10-20 linii kodu i masz menu ograniczone jedynie wielkoscią pamięci o ilości poziomów zależnym tylko od tej wielkości. Jak ci sie już znudzi powielanie w koło tego samego napisz na PW to coś ci podeśle.Od tego co załączyłeś juz w mi oczach migocze taki tam bałagan.
  • #4 8778749
    margas4542
    Poziom 16  
    Zdaję sobie sprawę z bałaganu w tym kodzie i nie jestem tym faktem zachwycony...temat powielam bo jest dla mnie kłopotem z którym nie potrafię sobie poradzić pomimo iż szacowne grono kolegów zasugerowało rozwiązanie oparte na wskaźnikach i tablicach których funkcjonowania nie do końca rozumiem i napisany testowy kod nie działał poprawnie...kiedyś zrozumiem i będzie to banalnie proste ale sami wiecie że na to potrzeba czasu którego nie każdy ma sporo pod dostatkiem. W moim menu kłopot sprawiają mi klawisze a właściwie ich podwójne wykorzystanie i nie zachodzenia na siebie w momencie wyboru danego ekranu. Coś takiego mam uruchomione w wersji testowej ale funkcje obsługi klawiszy wielokrotnie powielam w programie co nie jest ani dobrym ani funkcjonalnym rozwiązaniem i tu kłaniają się definicje na wskaźnikach o których była mowa a których jeszcze nie rozumiem...żeby to chodziło tak;

    klawisz 1 - wybór ekranu leci w pętli 5 ekranów

    klawisz 2 - wybór na którymś ekranie 1 z 4 grup ustawień np;4 cyfr
    klawisz 2 - wybieram 1 cyfrę
    klawisz 3 - ustawiam wartość 1 cyfry licznik w pętli
    klawisz 2 - wybieram 2 cyfrę
    klawisz 3 - ustawiam wartość 2 cyfry licznik w pętli
    klawisz 2 - wybieram 3 cyfrę
    klawisz 3 - ustawiam wartość 3 cyfry licznik w pętli
    klawisz 2 - wybieram 4 cyfrę
    klawisz 3 - ustawiam wartość 4 cyfry licznik w pętli
    klawisz 4 - zatwierdzam ustawienia np;zapis do tablicy lub innej pamięci
    klawisz 2 - wybór na tym ekranie 2 z 4 grup ustawień np;4 cyfr
    // itd aż do 4 grupy cyfr
    klawisz 5 - wyjście w dowolnym momencie z danego ekranu ale gdy ekran główny możliwość włączania i wyłączania podświetlenia LCD
  • REKLAMA
  • #5 8778787
    tadzik85
    Poziom 38  
    Menu które ci przedstawiłem w jednym z poprzednich tematów było moim 1. Przeszukałem internet w poszukiwaniu rozwiązań i udało się. I to właśnie praca nad nim pomogła mi bardziej zrozumieć kwestię tablic i wskaźników (wystarczyła wiedza z wikipedii !!).

    Podaliśmy ci wraz z kolegami konkretne rozwiązanie typowe dla realizacji tego problemu. W dodatku podałem ci szablon który uzupełniłbyś własnymi ustawieniami. Poświęć godzinkę lub 2 na lekturę na temat wskaźników, tablic. Na pewno wystarczy by zrozumieć. Dodam, że w tym przypadku warto również zaznajomić się z zagadnieniem automatu, gdyż na jego zasadzie działa menu.

    Spróbuj to zrealizować i ewentualnie szukaj pomocy w tym zakresie tu. Przyda się tez innym zapewne.
  • #6 8778901
    margas4542
    Poziom 16  
    Właśnie na twoim przykładzie próbowałem coś "uskutecznić" ale kłopoty z wyobrażeniem sobie co z czym powiązać gdzie i jak zdefiniować zmienne a potem je wywoływać spowodowały że moja próba i kilka kolejnych zakończyła się fiaskiem.
  • #7 8778924
    tadzik85
    Poziom 38  
    Więc było zadać odpowiednie pytanie.
  • REKLAMA
  • #9 8792906
    margas4542
    Poziom 16  
    Podumałem pokombinowałem i zrobiłem wreszcie to menu ;
    if(!(PIND & _BV(4)))//-----------------------------------------klawisze
    {
    _delay_ms(50);
    {
    ekran++; //przełącza kolejne ekrany w pętli
    PORTB |= _BV(0); //włącza podświetlenie LCD
    }
    LCD_GoTo(0,0); LCD_WriteText(" ");
    LCD_GoTo(0,1); LCD_WriteText(" ");
    level = 0; //wartości początkowe zmiennych
    set_d = 0; //wartości początkowe zmiennych
    set_j = 0; //wartości początkowe zmiennych
    }
    if(!(PIND & _BV(5)))
    {
    if(++level > 4)
    {
    level = 0;
    }
    _delay_ms(100);
    if(level==0)
    {
    LCD_GoTo(39,1); LCD_WriteText(" ");
    LCD_GoTo(19,0); LCD_WriteText(" ");
    }
    if(level==1)
    {
    LCD_GoTo(19,0); LCD_WriteText("<"); //wskazuje modyfikowaną zmienną
    }
    if(level==2)
    {
    LCD_GoTo(19,0); LCD_WriteText(" ");
    LCD_GoTo(19,1); LCD_WriteText("<"); //wskazuje modyfikowaną zmienną
    }
    if(level==3)
    {
    LCD_GoTo(19,1); LCD_WriteText(" ");
    LCD_GoTo(39,0); LCD_WriteText("<"); //wskazuje modyfikowaną zmienną
    }
    if(level==4)
    {
    LCD_GoTo(39,0); LCD_WriteText(" ");
    LCD_GoTo(39,1); LCD_WriteText("<"); //wskazuje modyfikowaną zmienną
    }
    }
    if(!(PIND & _BV(6)))
    {
    if(++set_d > 32) //klawisz zmiany wartości godzin działa w pętli
    {
    set_d = 0;
    }
    _delay_ms(100);
    }
    if(!(PIND & _BV(7)))
    {
    if(++set_j > 60) //klawisz zmiany wartości minut działa w pętli
    {
    set_j = 0;
    }
    _delay_ms(100);
    }
    switch(ekran)
    {
    case 0://-------------------------------------------------------
    level = 9;//blokuje możliwość pojawienia się < na boku ekranu LCD jeżeli nie jest potrzebne do zmiany nastaw
    //okno główne wyświetlanie pomiarów,czasu,daty
    break;
    case x:
    //tak wygląda okno nastaw zegara sterującego
    //K1 to czas zał/wył od poniedziałku do piątku
    //K2 to czas zał/wył w sobotę i niedzielę
    //pierwsze dwie cyfry to odczytany z EEPROMA czas nastawy
    KANAL -1A 00:00 00:00 < //to jest wskaźnik wyboru zmienna level
    KANAL -1B 00:00 00:00 //set_d zmienia godziny
    KANAL -2A 00:00 00:00 //set_j zmienia minuty
    KANAL -2B 00:00 00:00
    //i po ustawieniu czasu danego "level-a" zapis do EEPROM i można ustawiać kolejny wybrany czas
    break;
  • Pomocny post
    #10 8793529
    nsvinc
    Poziom 35  
    Wklejaj kod w znacznikach code!

    O, zrozumiałeś. Działa ci to??...

    Aż się prosi użyć
    Cytat:
    switch(level)

    !!!.

    Oczywiscie zrobiles w to najbardziej łopatologiczny sposób. Innym tematem na menu jest pisanie...
    Cytat:
    void *(*funkcja)(void *);

    na każdy screen. Wtedy screeny konkretnego typu tworzone dynamicznie mają swój handler.

    Jesli zrobisz tabelkę tychże funkcji
    
    #define SCREENY 4
    void *(*funkcja[SCREENY])(void*); //magiczne wskazniczki
    


    to możesz indeksować screeny liczbą. Tworzymy stos...no i to samo co na strukturach, tyle że inne :]
  • #11 8794682
    margas4542
    Poziom 16  
    Znacznik CODE nie zaskoczył...przepraszam. Tak zrobione łopatologicznie na prostych funkcjach ale ten kod jest dla mnie zrozumiały i menu to tylko 6 głównych kolejno przełączanych ekranów //1-ekran główny //2-przełączanie manualne obwodów sieciowych //3-ustawianie czasu zegara //4-ustawianie daty i dnia tygodnia //5-ustawianie 4 czasów wł/wył dla zegara sterującego kanał-1 //6-ustawianie 4 czasów wł/wył dla zegara sterującego kanał-2 [z rozróżnieniem od poniedziałku do piątku i sobota-niedziela]. Na początku nie myślałem o zegarku i zegarze sterującym ale możliwość zastąpienia "siedzącego" w tablicy zegara była nazbyt prowokująca. Program choć nie wyższych lotów robi to co chciałem i mogę wreszcie sprawdzić jak cały układ zachowuje się w praktyce. Zrobiłem kolejny krok ale to nie oznacza że ostatni i na pewno nie jest to wersja ostateczna tego programu bo jak sami zauważyliście parę funkcji można zoptymalizować a parę inaczej zdefiniować. Jeszcze raczkuję ale wkrótce stanę na nogi i zacznę sięgać do wyższych półek.
    Jeżeli można to krótkie wyjaśniające pytanko o PCF-8583 bo albo przeoczyłem albo datashet na ten temat milczy. Jak jest zorganizowana pamięć powyżej adresu 0F...jako 8 bitów czy 2x4bity?.
    Dziękuje za pomoc i wszystkie posty.
  • #12 8795573
    djmdp
    Poziom 16  
    kolega nsvinc ma kompletną rację, funkcje wskaźnikowe załatwiają wszystkie problemy, bez tego właściwie prędzej się zamordujesz niż zrobisz coś więcej i to jeszcze w taki sposób, żeby jednym pstryknięciem dokładać bądź usuwać elementy menu, radzę wziąć się za wskaźniki, najprostsze, później tablice wskaźników, funkcje wskaźnikowe, sam w pracy pracuję na tych rozwiązaniach, gdzie wymaganiem jest dopisywanie elementów menu np w trakcie realizacji projektu, dopisujesz dosłownie jedną wykonywaną funkcję na element i już. Nawet nie chce pomysleć ile czasu i trudu zajęłyby inne rozwiązania. Pozdrawiam.
  • #13 8805359
    margas4542
    Poziom 16  
    Jak to wszystko prosto wygląda ja się wie jak ma wyglądać...zasugerowany postami zacząłem przeróbki z którymi sobie jednak nie poradziłem...więc zacząłem przywracać wszystko do stanu wyjściowego. Efekt jest taki że teraz nie wiem już gdzie co jest, połowa programu nie chodzi łącznie z menu. Ugotowałem się na cacy i chyba trzeba będzie zacząć pisać program od nowa...po raz piąty i zaczynam wątpić czy w tej pięciolatce go napiszę.
  • #14 8805740
    rpal
    Poziom 27  
    margas4542 napisał:
    Jak to wszystko prosto wygląda ja się wie jak ma wyglądać...zasugerowany postami zacząłem przeróbki z którymi sobie jednak nie poradziłem...więc zacząłem przywracać wszystko do stanu wyjściowego. Efekt jest taki że teraz nie wiem już gdzie co jest, połowa programu nie chodzi łącznie z menu. Ugotowałem się na cacy i chyba trzeba będzie zacząć pisać program od nowa...po raz piąty i zaczynam wątpić czy w tej pięciolatce go napiszę.

    Jak kolego wszystko ci nie wychodzi, po prostu wróć do punktu wyjścia czyli zacznij od nowa stosując się do wskazówek dotyczących wskaźników. Nie znam innej lepszej metody.
  • #15 8807692
    margas4542
    Poziom 16  
    Nie mam innego wyjścia jak zacząć od nowa..poprzedni program rozjechał mi się po modyfikacjach menu i próbach zoptymalizowania części dotyczącej zegara sterującego...nastawy z menu i zapis do eeprom chodziły ale schodki się zaczęły przy porównywaniu czasu bieżącego z czasami nastaw [łącznie 8 czasów]...najpierw jednak muszę wymyślić jak ograniczyć ilość if-ów upraszczających strukturę zależności.
    Co do obsługi klawiszy to zastosowałem się do rady (nsvinc) i użyłem switch-a eliminując wielokrotnie powtarzające się procedury obsługi klawiszy. W listingu część procedur umieściłem w jednej linii ale myślę że nie będzie kłopotu z ich odczytaniem;
    
    	if(!(PIND & _BV(4)))//-----------------------------------------klawisze 
    	{	
    		_delay_ms(50);	{	LCD_ekran++;	PORTB |= _BV(0);	}
    		LCD_GoTo(0,0);   LCD_WriteText("                                        ");
    		LCD_GoTo(0,1);   LCD_WriteText("                                        ");
    		LCD_line=0;
    	}
    	if(!(PIND & _BV(5)))	
    	{
     		LCD_line++;	_delay_ms(100);
    	}
    	switch(LCD_line)
    	{
    		case 0:
    		LCD_GoTo(19,0);	LCD_WriteText(" ");		LCD_GoTo(19,1);	LCD_WriteText(" ");
    		LCD_GoTo(39,0);	LCD_WriteText(" ");		LCD_GoTo(39,1);	LCD_WriteText(" ");
    		if(!(PIND & _BV(6)))	{	if(++set_d > 31)	{	set_d = 0;	}	_delay_ms(100);	}
    		if(!(PIND & _BV(7)))	{	if(++set_j > 59)	{	set_j = 0;	}	_delay_ms(100);	}
    		break;
    		case 1:
    		LCD_GoTo(19,0);	LCD_WriteText("<");	LCD_GoTo(39,1);	LCD_WriteText(" ");
    		if(!(PIND & _BV(6)))	{	if(++set_g1 > 24)	{	set_g1 = 0;	}	_delay_ms(100);	}
    		if(!(PIND & _BV(7)))	{	if(++set_m1 > 60)	{	set_m1 = 0;	}	_delay_ms(100);	}
    		break;
    		case 2:
    		LCD_GoTo(19,0);	LCD_WriteText(" ");	LCD_GoTo(19,1);	LCD_WriteText("<");
    		if(!(PIND & _BV(6)))	{	if(++set_g2 > 24)	{	set_g2 = 0;	}	_delay_ms(100);	}
    		if(!(PIND & _BV(7)))	{	if(++set_m2 > 60)	{	set_m2 = 0;	}	_delay_ms(100);	}
    		break;
    		case 3:
    		LCD_GoTo(19,1);	LCD_WriteText(" ");	LCD_GoTo(39,0);	LCD_WriteText("<");
    		if(!(PIND & _BV(6)))	{	if(++set_g3 > 24)	{	set_g3 = 0;	}	_delay_ms(100);	}
    		if(!(PIND & _BV(7)))	{	if(++set_m3 > 60)	{	set_m3 = 0;	}	_delay_ms(100);	}
    		break;
    		case 4:
    		LCD_GoTo(39,0);	LCD_WriteText(" ");	LCD_GoTo(39,1);	LCD_WriteText("<");
    		if(!(PIND & _BV(6)))	{	if(++set_g4 > 24)	{	set_g4 = 0;	}	_delay_ms(100);	}
    		if(!(PIND & _BV(7)))	{	if(++set_m4 > 60)	{	set_m4 = 0;	}	_delay_ms(100);	}
    		break;
    		case 5:
    		LCD_line=0;
    		break;
    	}
    	if(!(PINA & _BV(7)))	{	_delay_ms(30);	enter=1;	}
  • #16 9003471
    djmdp
    Poziom 16  
    Może jeszcze moja wskazówka co do wyświetlania czegokolwiek na lcd, nie jestem zwolennikiem pisania do wyświetlacza dosłownie wszędzie! Ma to wiele wad, nie jesteś w stanie kontrolować w ten sposób sterownika lcd. Dużo lepsze rozwiązanie to zrobienie definiowalnej tablicy dwuwymiarowej (na potrzeby tworzenia ekranów) i tam wpisywanie treści wyświetlacza, a samo przesyłanie danych w przerwaniu co określony czas odświeżania, poza tym w bibliotece HD44780 jest cholerny błąd, który nie jednemu już uprzykrzył życia, a jeżeli jeszcze nie, to uprzykrzy.
    Co do switchy, to ja stosuję metodę na pulling całego portu switchy (tyle ile ich mam) tzn, jeśli mam 3 switche, to wpisuje sobie najpierw ich stany do bajtu, później sprawdzam czy mam kombinację typu 0b11111110, gdzie lsb to naciśnięty switch. W ten sposób nie ma problemów z jednokrotnym obsługiwaniem wielu switchy (w danym czasie może być wciśnięty tylko jeden). Pozdrawiam, MdP!
REKLAMA