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

Przesuwający się tekst

arikadiusz 23 Lip 2009 23:38 2319 5
REKLAMA
  • #1 6815298
    arikadiusz
    Poziom 12  
    Witam.
    Mógłby ktoś mi powiedzieć dlaczego ten kod:
    
    char tabela[5]="Super";
    int k;
    char i;
    
    for(k=0;k<=16;k++)
    {
    	_delay_ms(200);
    	for(i=4;i>=0;i--)
    	{
    	_delay_ms(150);
    		if(i==4){
    	lcd_gotoxy(k,1);
    	lcd_putc(*(tabela+i));}
    		if(i==3){
    	lcd_gotoxy(k,1);
    	lcd_putc(*(tabela+i));
    	lcd_gotoxy(k+1,1);
    	lcd_putc(*(tabela+i+1));}
    		if(i==2){
    	lcd_gotoxy(k,1);
    	lcd_putc(*(tabela+i));
    	lcd_gotoxy(k+1,1);
    	lcd_putc(*(tabela+i+1));
    	lcd_gotoxy(k+2,1);
    	lcd_putc(*(tabela+i+2));}
    		if(i==1){
    	lcd_gotoxy(k,1);
    	lcd_putc(*(tabela+i));
    	lcd_gotoxy(k+1,1);
    	lcd_putc(*(tabela+i+1));
    	lcd_gotoxy(k+2,1);
    	lcd_putc(*(tabela+i+2));
    	lcd_gotoxy(k+3,1);
    	lcd_putc(*(tabela+i+3));}
    		if(i==0){
    	lcd_gotoxy(k,1);
    	lcd_putc(*(tabela+i));
    	lcd_gotoxy(k+1,1);
    	lcd_putc(*(tabela+i+1));
    	lcd_gotoxy(k+2,1);
    	lcd_putc(*(tabela+i+2));
    	lcd_gotoxy(k+3,1);
    	lcd_putc(*(tabela+i+3));
    	lcd_gotoxy(k+4,1);
    	lcd_putc(*(tabela+i+4));}
    	
    	}
    	lcd_gotoxy(k,1);
    	lcd_puts(" ");
    }
    loop_until_bit_is_set(PINF,0);
    

    mający przesuwać napis na lcd, przesuwa go tylko do pokazania się wyrazu "Super"?
    Kod sam napisałem i pewnie pięknością to on nie grzeszy, ale nie moge znaleźć przyczyny jego "zawieszania się", po wykonaniu 1 okrążenia ze zmienną k...
    Od 2h się na to gapię :/.
    Błagam pomocy !
    Na wyświetlaczu wygląda to tak:
    r
    er
    per
    uper
    Super [stop]
  • REKLAMA
  • Pomocny post
    #2 6815665
    flapo213
    Poziom 21  
    Witaj problem pewnie jest z drugą pętlą for(i=4; i>=0; i--) {};

    Jest tak że masz post inkrementację i gdy i = 1 po wykonaniu zrobi się 0 i sprawdza ponownie czy i >=0 i co i jest prawdziwe kolejny raz i co zrobi następnie zrobi 255 co i znowu warunek jest prawdziwy.

    Wiesz nie wiem jakiego typu jest twój char co jest domyślnie czy jest bezznakowy czy znakowy. Więc spróbuj dodać może signed char, ewentualnie zmień trochę pętlę na np. taką konstrukcję.

    for(i=0; i<5; i++)

    a wszędzie gdzie masz tablica+i to zrób tak tablica -i +4 itd, a chara zrób na unsigned char. Daj znać czy poszło. Pozdrawiam
  • REKLAMA
  • Pomocny post
    #3 6816060
    nenpa8lo
    Poziom 17  
    Tak jak napisał flapo213 problem jest z drugą pętlą.

    Jeżeli chcesz żeby tylko działało, to w drugiej pętli w warunku if (i == 0) dodaj jako ostatnią instrukcję break.
    ...
    ...
    if(i==0)
    {
       lcd_gotoxy(k,1);
       lcd_putc(*(tabela+i));
       lcd_gotoxy(k+1,1);
       lcd_putc(*(tabela+i+1));
       lcd_gotoxy(k+2,1);
       lcd_putc(*(tabela+i+2));
       lcd_gotoxy(k+3,1);
       lcd_putc(*(tabela+i+3));
       lcd_gotoxy(k+4,1);
       lcd_putc(*(tabela+i+4));
    
       break;                                // Cały wyraz wyświetlony więc wyjdź z pętli.
    }
    ...
    ...
    Ogólna uwaga to zmienił bym wszystkie if i == 0 , if i == 1 itd. na switch
  • REKLAMA
  • #4 6816085
    flapo213
    Poziom 21  
    Tak dokładnie możesz również zrobić jak napisał Ci nenpa8lo. Rzeczywiście ładniej by to ze swichami wyglądało i szybciej by się wykonywało bo tak sprawdza każdy warunek za każdym razem - bez potrzeby. Pomyśl nad napisaniem uniwersalnych funkcji skrolujących, jak coś to pomogę 2 funkcje trzeba z czego jedna powinna być wykonywana w przerwaniu. Pozdrawiam
  • REKLAMA
  • Pomocny post
    #5 6816949
    Kolek
    Poziom 25  
    Pewnie to mniej istotne w tym momencie bo nie wpływa na aktualne problemy, ale pętla:
    for(k=0;k<=16;k++) {}

    wykona się 17 razy, chyba że o to Ci chodziło.
  • #6 6817526
    arikadiusz
    Poziom 12  
    dzieki wszystkim serdecznie za pomoc :), rzeczywiscie ta petla krazyla w nieskonczonosc... break; zalatwil sprawe. Z ta uniwersalna instrukcja to nie glupi pomysl ale z tego co pamietam C mial jakies objekcje co do deklarowania zmiennej dlugosci tablicy, dawno temu to mialem na programowaniu juz nie pamietam co to bylo :P w kazdym razie wezmne sie za to i dam znac jak mi idzie. Jeszcze raz dziekuje!
REKLAMA