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

Znak stopnia [c], wyświetlanie na LCD, Jak to zrobić?

Piotr Kania 12 Gru 2008 17:51 9345 15
  • #1 5850498
    Piotr Kania
    Poziom 15  
    Witam mam taki problem potrzebuje zrobić znak stopnia w C (małe kółeczko :) ) napisałem program na ds18B20 w C

    Dodano po 50 [sekundy]:

    Dodaje że znaczek ten ma się wyświetlać na LCD
  • #3 5850548
    Piotr Kania
    Poziom 15  
    już sprawdzam :)

    Dodano po 9 [minuty]:

    no spoko działa ale to jest mały kwadracik a nie kółeczko :D może ma ktoś inny pomysł
  • #4 5850605
    skynet_2
    Poziom 26  
    trudno na segmencie 5*8 wyświetlić kółko chyba ze chcesz aby było duże ?

    albo powiedz które piksele chcesz zapalone ?
  • #5 5850724
    Piotr Kania
    Poziom 15  
    wiec tak w bascomie jest to zrobione tak

    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 ' definicja znaki stopnia

    Dodano po 11 [minuty]:

    o takie kółeczko
    <img src="https://obrazki.elektroda.pl/7_1229103916.gif">

    Tradycyjny link:
    https://obrazki.elektroda.pl/7_1229103916.gif
  • #6 5851013
    skynet_2
    Poziom 26  
    ponieważ w obsłudze HD44780 pana radzia nia ma tej funkcji, musiałem ją dopisać
    void LCD_DefineCharacter(uint8_t nr, uint8_t *znak)
    {
    	LCD_WriteCommand((nr*8)|HD44780_CGRAM_SET);
    
    	for (uint8_t i=0;i<8;i++)
    		LCD_WriteData(*znak++);
    
    	LCD_WriteCommand(HD44780_DDRAM_SET);
    }

    a odwołujesz się
    uint8_t def_1[] = {
    			0,14,10,14,0,0,0,0};//tworzysz znak *C
    
    LCD_DefineCharacter(0, def_1);//definiujesz w wyświetlaczu
    
    LCD_WriteData(0);//wyświetlasz


    pozdrawiam
  • #7 5851359
    Piotr Kania
    Poziom 15  
    dobra a jak nie używam pakietu pana radzia :) ?
  • #9 5851592
    Piotr Kania
    Poziom 15  
    sam pisze swoje biblioteki :)
  • #10 5851617
    skynet_2
    Poziom 26  
    to spróbuj tak
    void LCD_DefineCharacter(uint8_t nr, uint8_t *znak) 
    { 
       LCD_WriteCommand((nr*8)|0x40); 
    
       for (uint8_t i=0;i<8;i++) 
          LCD_WriteData(*znak++); 
    
       LCD_WriteCommand(0x80); 
    }


    też sam pisze sobie biblioteki ale głównie modyfikuje gotowe,
    oczywiście używam ich tylko wtedy jeżeli wiem jak działają i wiem jak działa np. urządzenie to którego będą użyte.

    pozdrawiam
  • #11 5852310
    Piotr Kania
    Poziom 15  
    no spoko ale jakie go mam użyć argumentu żeby wyświetlić to kółeczko, ja zaczynam swoją przygodę z C, dodam :)
  • #12 5852369
    skynet_2
    Poziom 26  
    to jest funkcja którą dodajesz do swojej biblioteki, pozwala ona zdefiniować ci tymczasowo 8 znaków w pamięci wyświetlacza HD44780.

    na początku twojego programu tworzysz tablicę w której zawarte są infornację o pikselach którę będą zapalone w stworzonym przez ciebie znaku.
    uint8_t znak1[] = {0,14,10,14,0,0,0,0};

    później używając funkcji którą podałem w poprzednim poście definiujesz swój znak w pamięci wyświetlacza
    LCD_DefineCharacter(0, znak1);//tutaj 0 określa numer znaku

    a gdy chcesz go wyświetlić używasz
    LCD_WriteData(0);//tutaj 0 określa numer znaku


    przykład użycia

    int main()
    {
     uint8_t znak1[] = {0,14,10,14,0,0,0,0};
    
     LCD_Initalize();
    
     LCD_DefineCharacter(0, znak1);
     LCD_Goto(0,0);
    
     LCD_WriteText("temperatura w ");
     LCD_WriteData(0);
     LCD_WriteData('C');
    
     while(1);
     return 0;
    }

    wynikiem tego będzie tekst "temperatura w *C" gdzie * jest twoim kółeczkiem.

    pozdrawiam
  • #13 5853206
    Piotr Kania
    Poziom 15  
    no teraz działa jak trza :D dziękuje, jedno małe kółeczko a tyle zachodu. Mam jeszcze parę pytań co do DS18B20 tzn o zapis do niego temperatur progowych i odczytu alarmu. Tak odczytuje
    
    ow_reset();
          ow_write_byte(0xCC);
          ow_write_byte(0x44);
          for (uint8_t a = 0; a < 25; a++) _delay_ms(40); // (30) =750ms (40) =1000ms
          ow_reset();
          ow_write_byte(0xCC);
          ow_write_byte(0xBE);
          lsb = ow_read_byte();
          msb = ow_read_byte();
    	  th = ow_read_byte();
    	  tl = ow_read_byte();
    


    jak np zapisać Tl=0 a Th=80 i jak sprawdzić czy jest flaga alarmu ?
  • Pomocny post
    #14 5855289
    skynet_2
    Poziom 26  
    Piotr Kania napisał:
          for (uint8_t a = 0; a < 25; a++) _delay_ms(40); // (30) =750ms (40) =1000ms

    prościej
    _delay_ms(750);


    co do funkcji szukania alarmu i zapisu alarmu to jeszcze jej nie napisałem,
    w poszukiwaniu alarmu używa się funkcji podobnej do search_rom[która do najprostrzych nie należy]
    do zapisu alarmu używa się funkcji WRITE SCRATCHPAD [4Eh] i opcjonalnie COPY SCRATCHPAD [48h] jeżeli chcesz żeby dane zapisały się na stałe w eepromie czujnika.

    na stronie Link możesz pobrać datasheeta
    a tutaj Link kilka funkcji do obsługi 1w, których użyłem również w mojej bibliotece.

    alarmem nigdy się nie bawiłem, wiem to tylko teoretycznie jak to powinno działać wiec jak gdzieś napisałem bzdurę to przepraszam :D
  • #15 5855811
    Piotr Kania
    Poziom 15  
    no rzeczywiście ten _delay w pętli to przesada. Co do ds18B20 znalazłem jego polski opis może się przydać :) mogę wysłać emilem. Ok czaje write scratchpad [4Eh] ale jak podać mu dane żeby popłyneły do niego tzn te 80 stopni
  • #16 5855948
    zumek
    Poziom 39  
    Piotr Kania napisał:
    ...ale jak podać mu dane żeby popłynęły do niego tzn te 80 stopni

    A co to ma wspólnego, ze znakiem stopnia [c] :?:
    Na pytanie z cytatu, jest już odpowiedź:
    a)Przeszukaj forum.
    b) Zajrzyj do dokumentacji, bo jest to opisane i narysowane.

    Temat zamykam.
REKLAMA