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

[atMega128][c] problem ze zmiana bibliteki hd44780.c

Gural 11 Sty 2011 13:03 1200 2
REKLAMA
  • #1 8990183
    Gural
    Poziom 11  
    Witam serdecznie,
    Pisząc program nie zastanowiłem się nad potrzebą użycia polskich znaków teraz jednak ich potrzebuje bibiloteka dołączana do prgramu wygląda tak :
    #include<avr/io.h>
    #include<util/delay.h>
    #include "hd44780.h"
    
    /*--------------------------------------------------------*/
    /* Zapis danej lub instrukcji */
    
    void WriteToLCD (unsigned char v,unsigned char  rs)
    {
        unsigned char bf;
    
        SET_OUT_LCD_D4;
        SET_OUT_LCD_D5;
        SET_OUT_LCD_D6;
        SET_OUT_LCD_D7;
    
        if(v&0x10) SET_LCD_D4; else CLR_LCD_D4;
        if(v&0x20) SET_LCD_D5; else CLR_LCD_D5;
        if(v&0x40) SET_LCD_D6; else CLR_LCD_D6;
        if(v&0x80) SET_LCD_D7; else CLR_LCD_D7;
     
        CLR_LCD_E;
        if(rs) SET_LCD_RS;else CLR_LCD_RS;
        CLR_LCD_RW;
    
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP; 
        CLR_LCD_E;
        LCD_NOP;
     
        if(v&0x01) SET_LCD_D4; else CLR_LCD_D4;
        if(v&0x02) SET_LCD_D5; else CLR_LCD_D5;
        if(v&0x04) SET_LCD_D6; else CLR_LCD_D6;
        if(v&0x08) SET_LCD_D7; else CLR_LCD_D7;
     
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP; 
        CLR_LCD_E;
        LCD_NOP;
     
        SET_IN_LCD_D4;
        SET_IN_LCD_D5;
        SET_IN_LCD_D6;
        SET_IN_LCD_D7;
    
        CLR_LCD_RS;
        SET_LCD_RW;
        SET_LCD_D7;
    
    
    /* Przydałby się pełny odczyt */
        do
        {
            LCD_NOP;
            SET_LCD_E;
            LCD_NOP;
            bf = IS_SET_LCD_D7;
            CLR_LCD_E;
            LCD_NOP;
            SET_LCD_E;
            LCD_NOP;
            LCD_NOP;
            CLR_LCD_E;
            
        }while( bf );
    }
    
    
    /*--------------------------------------------------------*/
    /* Funkcja odczytuje adres i flage zajetosci */
    
    unsigned char ReadAddressLCD ( void)
    {
        unsigned char g = 0 ;
    
        CLR_LCD_RS;
        SET_LCD_RW; 
    
        SET_IN_LCD_D4;
        SET_IN_LCD_D5;
        SET_IN_LCD_D6;
        SET_IN_LCD_D7;
    
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP;
    
        if(IS_SET_LCD_D4) g+=16;
        if(IS_SET_LCD_D4) g+=32;
        if(IS_SET_LCD_D4) g+=64;
        if(IS_SET_LCD_D4) g+=128;
     
        CLR_LCD_E;
        LCD_NOP;
        SET_LCD_E;  
        LCD_NOP;
      
        if(IS_SET_LCD_D4) g+=8;
        if(IS_SET_LCD_D4) g+=4;
        if(IS_SET_LCD_D4) g+=2;
        if(IS_SET_LCD_D4) g+=1;
      
        CLR_LCD_E; 
    
        return  g ;
    }
    
    
    /*---------------------------------------------------------*/
    /* Inicjalizacja wyświetlacza */
    
    void lcd_init(void)
    {
        _delay_ms(31);    
       
        SET_OUT_LCD_RS;
        SET_OUT_LCD_RW;
        SET_OUT_LCD_E;
        SET_OUT_LCD_D4;
        SET_OUT_LCD_D5;
        SET_OUT_LCD_D6;
        SET_OUT_LCD_D7;
    
        CLR_LCD_E;
        CLR_LCD_RS;
        CLR_LCD_RW;
        SET_LCD_D4;
        SET_LCD_D5;
        CLR_LCD_D6;
        CLR_LCD_D7;        
      
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP; 
        CLR_LCD_E;
        LCD_NOP;
        _delay_ms(10);
    
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP; 
        CLR_LCD_E;
        LCD_NOP;
        _delay_ms(2);
    
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP; 
        CLR_LCD_E;
        LCD_NOP;
        _delay_ms(2);
    
        CLR_LCD_D4;
        LCD_NOP;
        SET_LCD_E;
        LCD_NOP; 
        CLR_LCD_E;
        LCD_NOP;
        _delay_us(80);
    
        WriteToLCD (0x28 , LCDCOMMAND) ;
        LCD_DISPLAY(0) ;
        LCD_CLEAR ;
        LCD_ENTRY_MODE(LCDINCREMENT) ;
    }
    
    
    /*--------------------------------------------------------*/
    /* Wyswietla tekst na aktualnej pozycji kursora */
    
    void lcd_puts(char *str)
    {
        unsigned char i =0;
    
        while( str[i])
            LCD_WRITE_DATA(str[i++]) ;
    }
    

    teraz potrzebna jest funkcja która umożliwi dostęp do zapisania polskich znaków w pamięci, w internecie dostępne są biblioteki z obsługą pz jednak zbyt dużo czasu zajeło by mi przekształcanie kodu programu. proszę o pomoc
    pozdrawiam.
  • REKLAMA
  • #2 8990432
    tmf
    VIP Zasłużony dla elektroda
    Jeśli PZ masz zdefiniowane to jedyne co musisz zrobić to do funkcji WriteToLCD dodać sekcję konwertującą kody, np. w postaci switch case kod polskiego znaku->kod w pamięci kontrolera. Ew. Od razu pozamieniać PZ w tekstach na odpowiednie kody generatora. Sprawa się tylko komplikuje (i to znacznie) jeśli chcesz korzystać ze wszystkich PZ (małe i wielkie litery) bo wtedy trzeba dynamicznie zmieniać definicje.
  • #3 8990708
    Gural
    Poziom 11  
    potrzebuje tylko wykorzystać ś ć ó ż i ł wszystko z małych liter wiec dynamicznie nie potrzeba.
    Cytat:
    Jeśli PZ masz zdefiniowane to jedyne co musisz zrobić to do funkcji WriteToLCD dodać sekcję konwertującą kody, np. w postaci switch case kod polskiego znaku->kod w pamięci kontrolera. Ew. Od razu pozamieniać PZ w tekstach na odpowiednie kody generatora.

    mógł byś przybliżyć mi ten temat bo wiem miej wiecej jak to ma działać jednak nie mogę odpowiednio skonfigurowac do mojej biblioteki, rozumiem ze to jest kwestia napisania funkcji, nastepnie zapisania w programie znaku graficznie w tablicy,
    np dla ż
    znak[] = {4,0,31,2,4,8,31,0};

    i wywołanie w dowolnym miejscu tą
    tablice tylko pytanie jak to wszystko zrobic :)
REKLAMA