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

LCD 4x20 z przesuwanym i migającym kursorem w 4 wierszu

margas4542 24 Sie 2010 17:56 8927 122
  • #1 8433481
    margas4542
    Poziom 16  
    Witam....mam LCD 4x20 pracującego z biblioteką pana Radosław Kwiecień(HD44780) i chciałem uzyskać możliwość wyświetlania tylko w czwartym wierszu mrugającego kursora który mógłbym przesuwać;
    1 w prawo - microswitch na PORTD= 0x01
    2 w lewo - microswitch na PORTD= 0x02
    //albo jeden albo drugi uaktywniają mruganie kursora
    3 enter - microswitch na PORTD= 0x04
    //po naciśnięciu jego kursor ma przestać mrugać.
    Po kilkunastu próbach gdy LCD na dobre oszalał pokazując po chińsku sci-fi postanowiłem poradzić się na forum jak zrealizować mój pomysł...
  • #2 8433595
    tymon_x
    Poziom 30  
    Odwołując się do tego wątku: Znajome skądś(;
    Patrząc znowu na datasheet i na ten kod nasuwa się coś takiego:
    kursor w lewo:
    LCD_WriteCommand(0x10);

    kursor w prawo:
    LCD_WriteCommand(0x14);

    kursor miga:
    LCD_WriteCommand(0x0F);

    kursor nie miga:
    LCD_WriteCommand(0x0E);
  • #3 8433757
    margas4542
    Poziom 16  
    ....zgadzam się tylko kłopot z wykorzystaniem tych adresów....nie mam koncepcji co do szkieletu takiej procedury dlatego tak sobie namieszałem...i gdybym nie miał kopi programu to pisałbym wszystko od nowa...........
  • #5 8433954
    margas4542
    Poziom 16  
    ...drgania zestyków są już wyeliminowane...steruje potem w lewo i prawo...muszę jeszcze zbudować jakąś tablice przechowującą dane o wybranych i podtrzymywanych kanałach no i.... tu właśnie z mocą przerwań to ja na razie jestem na bakier...książka o tym jest następna w kolejce...pozdrawiam
  • #6 8436762
    PO.
    Poziom 20  
    To zrób to bez przerwań. W wiecznej pętli sprawdzasz co się dzieje na kolejnych przyciskach i w zależności od ich stanu wykonujesz polecenie. Ile to linijek programu :) ?
  • #7 8437037
    margas4542
    Poziom 16  
    ...niestety moje możliwości się wyczerpały...pomiar i wyświetlanie wyniku jeszcze chodzi....kursora na LCD nie udało mi się włączyć...sterowanie pierwszymi 4 bitami portu B też wzięło w łeb...klapa na całej linii...
  • #8 8437407
    PO.
    Poziom 20  
    Wyrazy współczucia...
    Może za dużo chcesz naraz zrobić? Po co Ci ten kursor w ogóle? Grę w węża chcesz dorobić ;) ?
    A poza tym wrzuć kod, może ktoś to poprawi.
  • #9 8437852
    margas4542
    Poziom 16  
    ...próbowałem jeszcze coś wymyślić z kursorem na LCD ale przestałem już rozumieć jak nim sterować...z kodu usunąłem problematyczne definicje żeby się komuś włos nie zjeżył na głowie...
    
    //-----------------------------------------------------------
    //################## procesor ATmega 16Mhz ##################
    //-----------------------------------------------------------
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <HD44780.c>
    //------------------------------------------------------------
    // >>>> program głowny 
    //------------------------------------------------------------
    int main(void)
    {
    //------------------------------------------------------------
    // define port
    //------------------------------------------------------------
    #define LCD_PORT PORTC
    DDRA = 0x00;		//port analogowy jako wejścia
    PORTA = 0x00;		//wejścia bez podciągania
    DDRB = 0xFF;        //port B jako wyjście
    DDRD = 0x00;        //port D jako wejście
    PORTD = 0x0F;       //wejścia podciągnięte
    //------------------------------------------------------------
    // define ADC 
    //------------------------------------------------------------
    int pomiar[4];        //tablica wyniku pomiarów
    char buffer_n[8];     //bufor konwersji ADCH na ASCII
    const int Vmin = 11.0;//progowe napięcie minimalne
    const int Vmax = 14.8;//progowe napięcie maksymalne
    
    ADMUX |= _BV(REFS0);// wewnetrznego zródla napiecia odniesienia     
    ADMUX |= _BV(REFS1);// 2.56V
    ADMUX |= _BV(ADLAR);// MSB8 bitów wyniku w rejestrze ADCH)             
    ADCSRA |= _BV(ADPS0);// set f_adc przetwornika podzial (1/128)
    ADCSRA |= _BV(ADPS1);   
    ADCSRA |= _BV(ADPS2);
    ADCSRA |= _BV(ADEN);// zezwolenie na konwersje
    //------------------------------------------------------------
    // define LCD
    //------------------------------------------------------------ 
    int off = (0x0F + 0xF0);//definicja znaku lcd (pełny prostokąt)
    int on = (0x0B + 0xD0);//definicja znaku lcd (ramka)
    //------------------------------------------------------------
    // >>>> odsługa selektora kanałów wł/wył
    //------------------------------------------------------------
    int kanał[16];         // tablica przechowująca dane BCD o stanie kanałów
                               //pętla licznika up/down
    // powiązana z kursorem na LCD
    //------------------------------------------------------------
    // pomiar napięć
    //------------------------------------------------------------
     {
      ADCSRA |= _BV(ADSC);//rozpoczęcie przetwarzania
      while(bit_is_set(ADCSRA,ADSC))//oczekiwanie na zakończenie przetwarzania
      _delay_ms(100);  
      pomiar[1]=ADCH*10;//zapis MSB 8 bit wyniku konwersji ADC0
     }
     { 
      ADMUX |= _BV(MUX0);  
      ADCSRA |= _BV(ADSC);//kanał ADC1 i rozpoczęcie przetwarzania
      while(bit_is_set(ADCSRA,ADSC))//oczekiwanie na koniec przetwarzania
      _delay_ms(100);  
      pomiar[2]=ADCH*10;//zapis MSB 8 bit wyniku konwersji ADC1
      ADMUX &= ~_BV(MUX0);//zerowanie bitu ADC1
     }
     {
      ADMUX |= _BV(MUX1); 
      ADCSRA |= _BV(ADSC); //kanał ADC2 i rozpoczęcie przetwarzania        	 //
      while(bit_is_set(ADCSRA,ADSC))           //oczekiwanie na koniec przetwarzania
      _delay_ms(100);  
      pomiar[3]=ADCH*10;//zapis MSB 8 bit wyniku konwersji ADC2
      ADMUX &= ~_BV(MUX1);//zerowanie bitu kanału ADC2
     }
     {
      ADMUX |= _BV(MUX2);  
      ADCSRA |= _BV(ADSC);//kanał ADC3 i rozpoczęcie przetwarzania       	 
      while(bit_is_set(ADCSRA,ADSC))//oczekiwanie na koniec przetwarzania
      _delay_ms(100);  
      pomiar[4]=ADCH*10;//zapis MSB 8 bit wyniku konwersji ADC3
     }
     {
      ADMUX &= 0xF0;  _delay_ms(500);          //wyzerowanie MUX 
     }
    //-------------------------------------------------------------
    // >>>> obsługa LCD 4 x 20 sterowanie tryb 4 bitowy
    //-------------------------------------------------------------
     {
      LCD_Initalize();
      LCD_Clear(); 
      while (1)
      {
       LCD_GoTo(0,0);   LCD_WriteText("AKU V ");//napięcie akumulatora
       LCD_WriteText(utoa(pomiar[1], buffer_n, 10));             			     
       LCD_GoTo(12,0);  LCD_WriteText("I ");//prąd zasilania
       LCD_WriteText(utoa(pomiar[2], buffer_n, 10));             			     
       LCD_GoTo(19,0);
       LCD_WriteData(on);             
    
       LCD_GoTo(0,1);   LCD_WriteText("SOL V ");             				                       
       LCD_WriteText(utoa(pomiar[3], buffer_n, 10));//napięcie ogniwa solar
       LCD_GoTo(12,1);  LCD_WriteText("I ");
       LCD_WriteText(utoa(pomiar[4], buffer_n, 10));//prąd odbiorników
       LCD_GoTo(19,1);  LCD_WriteData(off);
       
       LCD_GoTo(20,0);              				 
       LCD_WriteText("1 2 3 4 5 6 7 8 9 0");//nr.kanału tu miał chodzić w lewo i prawo
       // kursor dając możliwość wyboru kanału
       // po zatwierdzeniu klawiszem WYKONAJ miała następować zmiana stanu na przeciwny 
       // w liniach poniżej z OFF na ON lub odwrotnie wysyłając BCD na port B
       LCD_GoTo(20,1);  LCD_WriteData(off);          
       LCD_GoTo(22,1);  LCD_WriteData(on);           
       LCD_GoTo(24,1);  LCD_WriteData(on);
       LCD_GoTo(26,1);  LCD_WriteData(on);
       LCD_GoTo(28,1);  LCD_WriteData(on);
       LCD_GoTo(30,1);  LCD_WriteData(on);
       LCD_GoTo(32,1);  LCD_WriteData(on);
       LCD_GoTo(34,1);  LCD_WriteData(on);
       LCD_GoTo(36,1);  LCD_WriteData(on);
       LCD_GoTo(38,1);  LCD_WriteData(off);
      }
      return 0;
     }
    }//main
    // >>>>>>>>>>>>>>>>>>>>>>>>> END <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  • #10 8439233
    PO.
    Poziom 20  
    I chcesz mieć kilka kanałów naraz włączonych?
    A gdzie przechowujesz stany kanałów, że się tak zapytam? Wypisanie znaczka on/off to najmniejszy problem, zdaje się, że trzeba jeszcze gdzieś tego używać :) ?
  • #11 8439602
    margas4542
    Poziom 16  
    Witam ... założenie było takie tablica np;16 na 5 elementów w której przechowuje 4 bity numeru kanału (PORTB 0-1-2-3 binary code na analog multiplexer) oraz jego stan bit 5 czy jest ON czy OFF (PORTB 4 na analog multiplexer ENABLE), Tablica jest przeglądana w pętli pozwalając na podtrzymanie stanu załączonych kanałów. Klawiszami LEFT - RIGHT zmieniam na LCD numer kanału (CURSOR_BLINK jeżeli został naciśnięty RIGHT lub LEFT) po czym na wybranym kanale naciśnięcie klawisza WYKONAJ (wtedy CURSOR_NOBLINK) powoduje zapis do tablicy o wybranym numerze przeciwną wartość 5 bitu (0 lub 1) określającego jego stan WŁ/WYŁ ..... częściowo udało mi się to zrealizować ale klawisze trochę szalały mimo _delay_ms a tablica też chyba nie tak była zdefiniowana, a pętla też szwankowała .... no i zasięg zmiennych ...pozdrawiam
  • #12 8441505
    PO.
    Poziom 20  
    No to w tym programie masz pomiary tylko raz na początku a w pętli sobie tylko wypisujesz nawet bez sprawdzania klawiatury. Chyba za dużo wyciąłeś...
    Czemu masz takie dziwne wartości w lcd_goto? Masz wyświetlacz 2x40 czy jak?
    Nie wiem co jeszcze ma program robić ale pętla musi robić jakiś keycheck i odpowiednio do tego przesuwać kursor na wyświetlaczu oraz ewentualnie zapisywać stan kanału do tablicy; dalej musi coś mierzyć i zapisywać do bufora (albo zrobić to z przerwaniem?) i jeszcze na koniec podać z bufora na lcd. Może coś jeszcze?
    Pisz po kawałku według założeń i się nie wstydź ;) .
  • #13 8442628
    margas4542
    Poziom 16  
    ..LCD to 4x20 typ jm204a na 4 bitowej szynie....morduje się z tym i nic mi nie wychodzi....poza pomiarami ADC i wyświetlaniem...coś zmaściłem w samej strukturze programu bo teraz nawet poprawnie napisany kod czytania klawiszy na porcieD i prosty ring na ledy portuB nie chodzi...chyba będę musiał przepisać wszystko od podstaw...tylko jeszcze nie wymyśliłem jak....
  • #14 8442683
    PO.
    Poziom 20  
    Zacznij od przemyślenia jak przepływa program.
    W międzyczasie przepisz sobie lcd_goto po ludzku, bo wyświetlacz masz normalny tylko biblioteka zrypana. Wtedy będziesz przynajmniej wiedział gdzie stawiasz kursor ;) .
    Zakomnentuj sobie wszystko co nie działa i odpalaj po kawałku, zobaczysz w którym miejscu się sypie.
    Pamiętaj, że kursor na lcd sam z siebie nic nie robi, to nie jest kursor komputerowy. Tyle że sobie stoi i miga. Całą resztę musisz mu obsłużyć ręcznie. Poza tym, nie ma sensu nadpisywać w kółko komentarzy, wyświetl je raz a potem tylko dane w pętli. Tak samo z przełącznikami, zmieniasz bieżący (wiesz jaki przy okazji) a nie komplet.
  • #15 8442737
    margas4542
    Poziom 16  
    ...skoro biblioteka jest zrypana to ja się poddaje bo nie napisze jej od nowa za cienki jestem...cztery godziny ślęczenia nad kodem i dalej wielkie G...pętle argumenty wyrażenia ... mam z mózgu dobrze przyprawioną C sałatkę...
  • #16 8442806
    gaskoin
    Poziom 38  
    nie trzeba być pro koderem, żeby to napisać. Datasheet ze sterownika do wyświetlacza w rękę, patrzysz jak wygląda inicjalizacja i sterowanie i jesteś w stanie to napisać.

    Mój pierwszy program na mikrokontrolery właśnie wymagał napisania sobie biblioteki do LCD
  • #17 8442921
    margas4542
    Poziom 16  
    ..ok...wierze.. na słowa ale taki mocny nie jestem skoro z trzema guzikami sobie nie poradziłem bo zaczynam podejrzewać że cały blok programu jest źle skonstruowany dlatego coś działa a coś nie a zmienne wychodzą bokiem...
  • #18 8444856
    margas4542
    Poziom 16  
    ....zabrałem się do tego jeszcze raz....kilka godzin przy kompie i nadal jestem w kaczej d... nie chodzi i chodzić nie będzie..na LCD-ku ADC pokazuje bzdury..a ja jak babcie kocham nie wiem dlaczego...może w tych datashetach trzeba czytać pomiędzy wierszami....
    
    //---------------------------------------------------------------
    //################## procesor ATmega 16Mhz ######################
    //---------------------------------------------------------------
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <HD44780.c>
    #include <compat/ina90.h>
    #include <avr/io.h>
      
    //>>>>> ZMIENNE GLOGALNE
    
    volatile pomiar[4];				//adc tablica wyniku pomiarów
    char buffer[8];     			//bufor konwersji ADCH na ASCII 
    int mpx_on[16];					//tablica kanałów w trybie włącz
    int mpx_off[16];				//tablica kanałów w trybie wyłącz
    char aku_up = (0x02 + 0xC0);	//lcd znak ładowanie
    char aku_down = (0x00 + 0xD0);	//lcd znak pobór
    
    //>>>>>
    void ADC_Initalize(void)
    {
     DDRA = 0x00;			
     PORTA = 0x00;			//port A wejścia bez podciągania
     ADMUX |= _BV(REFS0);	//wewnetrznego zródla napiecia odniesienia     
     ADMUX |= _BV(REFS1);	//2.56V
     ADMUX |= _BV(ADLAR);	//wynik w rejestrze ADCH              
     ADCSRA |= _BV(ADPS0);	//set f_adc przetwornika podzial (1/128)
     ADCSRA |= _BV(ADPS1);   
     ADCSRA |= _BV(ADPS2);
     ADCSRA |= _BV(ADEN);	//zezwolenie na konwersje
    }
    
    //>>>>> MULTIPLEXER NA PORTB <<<<<
    void MPX_Set(void)
    {
     DDRB = 0xFF;					//port B jako wyjście
     DDRD = 0x00;			
     PORTD = 0x0F;					//port D wejścia podciągnięte
    }//MPX_Set
    //--------------------------------------------------------------
    //>>>>> MAIN
    //--------------------------------------------------------------
    int main(void)
    {
     LCD_Initalize();
     LCD_Clear();
     ADC_Initalize();
    //>>>>> POMIARY_ADC
     {
      ADCSRA |= _BV(ADSC);
      while(bit_is_set(ADCSRA,ADSC))
      _delay_ms(30);
      pomiar[1]=ADCH;
     }
     {
      ADMUX |= _BV(MUX0); 
      ADCSRA |= _BV(ADSC);
      while(bit_is_set(ADCSRA,ADSC))
      _delay_ms(30); 
      pomiar[2]=ADCH;
      ADMUX &= ~_BV(MUX0);
     }
     {
      ADMUX |= _BV(MUX1);
      ADCSRA |= _BV(ADSC);
      while(bit_is_set(ADCSRA,ADSC))
      _delay_ms(30); 
      pomiar[3]=ADCH;
      ADMUX &= ~_BV(MUX1);
     }
     {
      ADMUX |= _BV(MUX2); 
      ADCSRA |= _BV(ADSC);
      while(bit_is_set(ADCSRA,ADSC))
      _delay_ms(30); 
      pomiar[4]=ADCH;
     }
     {
      ADMUX &= 0xF0;  
      _delay_ms(50);
     }
     sei();
     MPX_Set();
    
    //>>>>> LCD <<<<<
     {
      LCD_GoTo(0,0);   
      LCD_WriteText("AKU V ");						//napięcie akumulatora
      LCD_WriteText(utoa(pomiar[1], buffer, 10));                         
      LCD_GoTo(12,0);  
      LCD_WriteText("I ");							//prąd zasilania
      LCD_WriteText(utoa(pomiar[2], buffer, 10));                       
      LCD_GoTo(19,0);
      LCD_WriteData(aku_up);             
    
      LCD_GoTo(0,1);   
      LCD_WriteText("SOL V ");                                                
      LCD_WriteText(utoa(pomiar[3], buffer, 10));	//napięcie ogniwa solar
      LCD_GoTo(12,1);  
      LCD_WriteText("I ");
      LCD_WriteText(utoa(pomiar[4], buffer, 10));	//prąd odbiorników
      LCD_GoTo(19,1);  
      LCD_WriteData(aku_down);
       
      LCD_GoTo(20,0);                          
      LCD_WriteText("1 2 3 4 5 6 7 8 9 0");			//nr.kanału
     }
     return 0;
    }//main
    // >>>>>>>>>>>>>>>>>>>>>>>>> END <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  • #19 8444944
    PO.
    Poziom 20  
    Nie aż tak, żebyś jej sobie nie poprawił i nie używał. Znaj me dobre serce ;) , poniżej moje lcd_goto wyciągnięte z biblioteki, działało kiedyś. Jeśli się coś rozjedzie to dopasuj adresy kolejnych wierszy. Ale to tak naprawdę jako przykład możesz traktować, nic szczególnie wyrafinowanego nie ma tu do wymyślenia. Aha, dopasuj sobie nazwy funkcji:
    
    void _lcd_gmem(uint8_t x, uint8_t y)
    //przestawia kursor na zadaną pozycję-adres
    //goto do pamięci widzialnej i poza wymiarem lcd
    //ważne przy przewijaniu tekstu
    {
     switch(y){
     case 0:
      break;
     case 1:
      x+=0x40;
      break;
     case 2:
      x+=20;
      break;
     case 3:
      x+=0x54;
      break;
     }
     _lcd_rozkaz(0x80|x);
    }
    


    Jeśli chodzi o resztę to nie wniknę teraz w przetworniki, co i jak bo się tym poważnie nie bawiłem.
    Między wierszami nie trzeba, tylko wiersze dokładnie ;) .
  • #21 8445358
    margas4542
    Poziom 16  
    ...dziękuje PO zaraz biorę się do analizy i wstawienia twojego kodu tylko najpierw muszę uporać się ze sterowaniem z klawiatury...tak Vref wewnętrzny na 2.56 napięcie na wejścia poprzez potencjometr włączony pomiędzy +5V i masę zasilania...z tą tablicą to ładnie zaplamiłem chyba kawa nie podziałała....
    kod poprawiłem...wszystkie wyniki pomiarów poza ostatnim są trzycyfrowe ostatni pięciocyfrowy...napisze adc od nowa może zadziała...
  • #23 8445428
    margas4542
    Poziom 16  
    ..ok załapałem teraz wskoczyło na swoje miejsce...mam pytanie czy aby dostać na LCD wynik pomiaru np;12,80 trzeba osobno odczytać ADCH i ADCL i wysłać na LCD jako dwie dane ?..
  • #24 8445466
    tymon_x
    Poziom 30  
    Nie trzeba, wczytaj je do zmiennej 16 bitowej i tak wyślij. Tylko nie zapomnij, że masz przesunięte bity do lewej. Czyli pomnożone x64. Wartość od 0V (0) do 2.56V (1024) *64 dla 10-bitowego przetwornika. Jeśli chcesz uzyskać przecinek, możesz podzielić wartość przez operator / (wartość całkowita), wysłać, dać przecinek, podzielić przez operator % (wartość po przecinku), wysłać. Musisz to Sobie wyskalować.
  • #25 8445840
    margas4542
    Poziom 16  
    ...jak zdefiniowałem w/g wzoru obliczenia dla adc0 to z kolei pokazuje głupoty na reszcie kanałów...
  • #26 8450410
    margas4542
    Poziom 16  
    Witam...już mi wstyd pisać kolejny post ale za hiny nie potrafię sobie poradzić z tymi klawiszami [w lewo] [zatwierdź] [w prawo] sterującymi w bcd portem B nie wspominając o zsynchronizowaniu tego z kursorem na LCD. Nic nie chodzi jak powinno...z funkcją switch się rozlatywało....z tablicą też miałem kłopot bo traciłem bity...na pętlach robiły sie gordyjskie węzły...w końcu powywalałem nawet delaye z adc bo jak zadziałało w przesuwanie w jedną stronę to muliło strasznie...skutek taki że pomiary "pływają" i zgłupiał na 4 pomiarze...a z klawiszami dalej kaszana...
  • #28 8451136
    margas4542
    Poziom 16  
    ......jak go napiszę bo wczoraj trochę mnie poniosło i kod się zdematerializował.....

    Dodano po 3 [godziny] 52 [minuty]:

    ....jeszcze nie wiem czy coś z tego będzie ale nadal próbuje....
    
    //-----------------------------------------------------------
    //################## procesor ATmega 16Mhz ##################
    //-----------------------------------------------------------
    #include <avr/io.h>
    #include <stdlib.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <HD44780.c>
    //------------------------------------------------------------
    // ##### program głowny
    //------------------------------------------------------------
    int main(void)
    {
     LCD_Initalize();
     LCD_Clear();
     while (1)
    //------------------------------------------------------------
    // ##### ustawienia portów i zmiennych globalnych 
    //------------------------------------------------------------
     {
      int key = 0; // numer w wierszy wybrany klawiszami [left] [right]
      #define OUT_1		(0x0B + 0xD0) //znak kanał złączony
      #define OUT_0		(0x0A + 0x20) //znak kanał wyłączony
      #define AKU_ON	(0x0B + 0x20) //znak ładowanie
      #define AKU_OFF	(0x0D + 0x20) //znak brak ładowania
      #define CURSOR(q,y)	LCD_WriteCommand(HD44780_DDRAM_SET | (x + key))	
      #define CUR_BLINK		LCD_WriteCommand(0x0F)	
      #define CUR_NOBLINK	LCD_WriteCommand(0x0E)	
      DDRA = 0x00;		//port analogowy jako wejścia
      PORTA = 0x00;		//wejścia bez podciągania
      DDRB = 0xFF;		//port B jako wyjście
      DDRD = 0x00;		//port D jako wejście
      PORTD = 0x0F;		//wejścia podciągnięte
    //------------------------------------------------------------
    // ##### adc
    //------------------------------------------------------------
      {
    
      }
    //------------------------------------------------------------
    // ##### odsługa selektora kanałów wł/wył
    //------------------------------------------------------------
      {
       #define key_1 PIND = 0x01
       #define key_2 PIND = 0x02
       #define key_3 PIND = 0x04
       int bcd, l;
       {
        while(1)
        {
         if(key_1 = 0) //w pawo
         {
    	  bcd = +1
    	  if(l > 8)
    	  {
          l = 0
    	  }
    	 }
         if(key_2 = 0) //zatwierdż
    	 {
    	 } 
         if(key_1 = 0) //w lewo
         {
    	  bcd = -l
    	  if(l = 0)
    	  {
          l = 0
    	  }
         }
    	 PORTB = l
        }
       }
    //-------------------------------------------------------------
    // ##### LCD 4 x 20 sterowanie tryb 4 bitowy
    //-------------------------------------------------------------
       {
        LCD_GoTo(0,0);		
    	LCD_WriteText("Vaku ");  
    	//tu będzie wynik pomiar z adc1                         
        LCD_GoTo(11,0);		
    	LCD_WriteText("I ");
    	//tu będzie wynik pomiar z adc12	                           
        LCD_GoTo(19,0);		
    	LCD_WriteData(AKU_ON);           
    
        LCD_GoTo(0,1);		
    	LCD_WriteText("Vsol ");
    	//tu będzie wynik pomiar z adc3                                                
        LCD_GoTo(11,1);		
    	LCD_WriteText("I ");
    	//tu będzie wynik pomiar z adc4
        LCD_GoTo(19,1);		
    	LCD_WriteData(AKU_OFF);
       
        LCD_GoTo(20,0);                          
        LCD_WriteText("1 2 3 4 5 6 7 8 9 0");
    	CURSOR(30,1);
      }
     }
    }//main
    // ##### END #####
  • #29 8452636
    PO.
    Poziom 20  
    1. w warunkach na klawisze nie sprawdzadz tylko podstawiasz.
    2. podstawianie pod makro i to jeszcze z PIN nie ma sensu ;) w żadnym przypadku (nie tylko w tym konkretnym)
    3. sprawdzanie klawiatury w wiecznej pętli powoduje, że nic poza sprawdzaniem się nie wydarzy - to powinno być oczywiste ;) . Ta pętla powinna dotyczyć całości: jedno sprawdzenie klawiadury i przelot przez resztę (przesuwanie kursora, odpalenie adc, wyświetlenie wyników itp) i dopiero wtedy powrót na górę. Jak chcesz mieć przejrzysty kod to sobie podziel na funkcje ale boję się że na tym etapie pogubisz się ze wszystkim
    3a. z powyższego wynika że na razie nie ma szans nic działać. Zacznij od zera - prosty programik do odczytywania klawiadury, wyświetlaj sobie stan klawiszy na lcd i jak to ogarniesz to możemy nimi coś zasterować.

    4. na koniec taka mała uwaga: wszystkie stałe napisy wystarczy
    wyświetlić raz na początku a nie w każdym obiegu. Zmieniać tylko to co się zmienia :) , będzie ekonomiczniej, bo obsługa każdej literki na lcd zajmuj czas.
  • #30 8452965
    gaskoin
    Poziom 38  
    i pamiętaj o średnikach !!!
REKLAMA