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

[ATMEGA8][C] Polskie znaki na wyświetlaczu 2x16 (hd44780)

Faber33 16 Lip 2010 16:33 17810 78
  • #1 8298875
    Faber33
    Poziom 16  
    Witam. Posiadam wyświetlacz WC1602A0 zgodny z hd44780 i chciałbym wiedzieć w jaki sposób można zdefiniować polskie znaki...wiem że jest możliwość dopisania 8 własnych znaków (np. polskich znaków diakrytycznych) w pamięci CG Ram. Chciałbym się dowiedzieć w jaki sposób można dostać się do tej pamięci aby dopisać polskie znaki :)??? Z góry dziękuje za pomoc ;)
  • #2 8298903
    tadzik85
    Poziom 38  
    A czytał Pan żeś dokumantacje?
  • #3 8298917
    Faber33
    Poziom 16  
    patrzyłem do dokumentacji :P tabela znaków jest...ale jak dodać swoje to jakoś się nie doczytałem :/
  • #4 8298921
    tadzik85
    Poziom 38  
    W zastawie instrukcji jest zapis do cgram.

    Znak zapisuje się w postaci kilku bajtów gdzie 5 ostatnich bitów stanowi o pikselu znaku. znaki potem znajdują sie pod adresami od 0 do 7.
  • #5 8298934
    Faber33
    Poziom 16  
    Jest tam taka tabelka gdzie pisze jak mają być ustawione poszczególne wejścia. Można by to tak na łopatologicznie przełożyć jak to mam zrobić np. w avr studio????
  • #7 8299191
    Faber33
    Poziom 16  
    Widziałem już to...i widze które wejścia mają być ustawione ale jak to zrobić w programie i wpisać te znaki które chciałbym wprowadzić????:/
  • #8 8299261
    tadzik85
    Poziom 38  
    Zapisać do CGRAM pod adresem od 0 do 7 w postaci 8 bajtów opisujących znak. Ustawiasz CGRAM SET a potem używasz funkcji typu write instruction
  • #9 8299305
    Faber33
    Poziom 16  
    mógłbyś podać przykład takiego zapisu????
  • #10 8299314
    tadzik85
    Poziom 38  
    Faber33 napisał:
    mógłbyś podać przykład takiego zapisu????

    
    uint8 tab[8] = {3,3,3,3,3,3,3,3}
    write_instruction(CGRAM_SET | adres);
    
    for(i=0;<8;i++)
    {
    write_data(tab[i]);
    
    }
  • #11 8299471
    PO.
    Poziom 20  
    Niew wiem co czytałeś ale jest dokładny opis definiowania znaku zawartości cgram i wysyłania, nawet wystarczyło obrazki pooglądać jeśli po angielsku nie umiesz ;) .

    Żeby Cię nie przemęczać, bo ciężko to widzę (choć to proste) to skorzystaj z gotowej biblioteki, która ma polskie znaki. Mojej Ci nie dam ale masz tu projekt z elektrody, który działa i więcej o polskich znakach też tam masz:
    https://www.elektroda.pl/rtvforum/topic1497584.html
  • #12 8299590
    Faber33
    Poziom 16  
    Do tadzik85

    A w którym miejscu mam wpisać kod tego nowego znaku??? w nawiasie write_data????
  • #13 8299609
    Konto nie istnieje
    Poziom 1  
  • #14 8299614
    Faber33
    Poziom 16  
    to jak mam zrobić żeby np. ł wpisać????
  • #15 8299710
    Konto nie istnieje
    Poziom 1  
  • #16 8299757
    Faber33
    Poziom 16  
    no to gdzie wpisać kształt tej literki???
  • #18 8299827
    Faber33
    Poziom 16  
    no to wiem...tylko mam to wpisać pod tym co napisałeś wcześniej czy gdzie????bo tego nie czaje

    a gdzie to ogólnie wstawić ??? bo mam program napisany w c otworzony w avr studio i mi wyskakują błędy tak to wpisuje:/
  • #19 8299880
    PO.
    Poziom 20  
    Błędy? Niemożliwe... I zaprzeczcie, że na elce można pisać na innym poziomie niż o miganiu ledką...

    Dostałeś wszystko na tacy, to co podał Tadzik to jest mapa bitowa literki ł. Musisz zdefiniować tablicę, albo i nie definiuj dla uproszczenia i wysłać ją pod odpowiednie pole w cgram, linijka po linijce (uprośćmy ze pod zerowe), a potem musisz wyświetlić znak o kodzie pola cgram i już masz literkę.
    W międzyczasie instrukcje sterujące zmiany pamięci z ddram na cgram i spowrotem.
    Jak teraz poprosisz o wklejenie kodu-gotowca to czekam komu cierpliwość strzeli :) .
  • #20 8299919
    Faber33
    Poziom 16  
    ehh...siedem światów z tym mam :/ Kumam co dodał Tadzik...bo już wcześniej to sobie zrobiłem tylko nie wiem jak to mam do tej pamięci wprowadzić:/ Pewnie w złym miejscu to wklejam co tadzik podał bo błędy głównie przy "for" wyskakują
  • #21 8299928
    tadzik85
    Poziom 38  
    Ustawienie statyczne znaków specjalnych najlepiej zrobić zaraz po inicjacji, "raz na zawsze". I po 1 bo nikt tu wrózka nie jest porównaj to co piszę z wlasną biblioteką obsługi LCD,

    wysyłasz komendę (CDRAM SET |(kod_znaku<<3))
    wysyłasz tablice opisującą znak

    wysyłasz kolejną tablice, którą będzie pod kolejnym adresem znaku lub poprzedzasz ponownie instrukcją jw.

    Przestawiasz wyświetlacza na DDRAM.

    Koniec zapisu polskich znaków.

    wpisanie znaku np z adresu 0 do wysłanie do LCD danej '0'.

    To wyłożenie kawy na lawę. Dalej zrób sam bo będziemy ci tylko powtarzać to w kółko

    Dodano po 5 [minuty]:

    kod tej funkcji jest istotny lcd_def_char()
  • #22 8300001
    Faber33
    Poziom 16  
    tu podaje plik inicjacji LCD:

    
    #include <avr/io.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #include "naglowkowy.h"
     
    /************************ #include<LCD_init.h> ***************************************************/
    
    #define LCD  	PORTD
    #define E  		3									
    #define RS  	2 									
    
    #define SET_E   LCD |= 	_BV(E)						
    #define CLR_E   LCD &= ~_BV(E)
    
    #define SET_RS  LCD |= 	_BV(RS)
    #define CLR_RS  LCD &= ~_BV(RS)
    
    #define PORT_AD PORTC				// Port z wejściami analogowymi 
    #define DDR_AD DDRC
    
    char bufor1[10];
    
    //**********************************************************************************************/
    
    void write_to_lcd(char x)
    	{
    	SET_E; 											
    	LCD = ((LCD & 0x0F) | (x & 0xF0)); 				
    	CLR_E; 											
    	SET_E; 											
    	LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); 		
    	CLR_E; 											
    	Waitms(1); 										
    	}
    
    //**********************************************************************************************/
    
    void write_command(char x)
    	{
    	CLR_RS; 										
    	write_to_lcd(x); 								
    	}
    
    //**********************************************************************************************/
    
    void write_char(char x)
    	{
    
    	SET_RS; 										
    	write_to_lcd(x); 								
    	}
    
    //**********************************************************************************************/
    
    void write_text(char *s)
    	{
    	while(*s) 										
      		{
      		//tu by sie cos przydalo atoi np
    	  	write_char(*s); 							
      		s++; 										
      		}
    	}
    
    
    //**********************************************************************************************/
    
    void write_data(int s)
    	{
    	
    		itoa (s , bufor1, 10); 
    		write_text(bufor1);
    	}
    
    
    //**********************************************************************************************/
    
    void pierwsza(void)
    	{
    	write_command(0x80);
    	}
    
    void druga(void)
    	{
    	write_command(0xC0);
    	}
    	
    void trzecia(void)
    	{
    	write_command(0x90);
    	}
    	
    void czwarta(void)
    	{
    	write_command(0xD0);
    	}		
    //**********************************************************************************************/	
    
    void LCD_init (void)
    	{
    	Waitms(15); 			// czekaj 15ms na ustabilizowanie się napięcia zasilającego
    	CLR_E; 					// E = 0
    	CLR_RS; 				// RS = 0
    	char i; 				// zmianna licznikowa
    	for(i = 0; i < 3; i++) 	// trzykrotne powtórzenie bloku instrukcji
      		{
      		SET_E; 				// E = 1
      		LCD &= 0x3F; 		//
      		CLR_E; 				// E = 0
      		Waitms(5); 			// czekaj 5ms
      		}
    	SET_E; 					// E = 1
    	LCD &= 0x2E; 			//
    	CLR_E; 					// E = 0
    	Waitms(1); 				// czekaj 1ms
    
    
    	write_command(0x28); 	// interfejs 4-bity, 2-linie, znak 5x7	
    	write_command(0x08); 	// wyłącz LCD, kursor i miganie
    	write_command(0x01); 	// czyść LCD
    	write_command(0x06); 	// bez przesuwania w prawo
    	write_command(0x0C); 	// włącz LCD, bez kursora i mrugania
    	
    	
    	}
    	
    			
    //**********************************************************************************************/
    void czysc(void)
    {
    	pierwsza();
    	write_text("        ");	
    	druga();
    	write_text("        ");	
    	pierwsza();
    }	
    
    //**********************************************************************************************/
    
    void lcd_def_char(char dane[], char numer)
    {
    	char x;	
    	write_command(0x40);
    	for (x = 0; x < 8; x++)
    	{	
    		write_command(0b01000000 | (numer<<3) | x);;
    		write_char(dane[x]);
    	}
    	write_command(0x80);
    
    	CDRAM SET |(0<<3) 
          int tablica[20]; 
    	   {
    	   00000101
           00000110
           00001100
           00010100
           00000100
           00000100
           00000100
           00000100
    	   }
    
    }
    



    Dodałem to na końcu i czego nie zmienię to zawsze błędy są :/ehh
  • #23 8300030
    tadzik85
    Poziom 38  
    [quote="Faber33"]
    void lcd_def_char(char dane[], char numer)
    {
    char x;
    write_command(0x40);
    for (x = 0; x < 8; x++)
    {
    write_command(0b01000000 | (numer<<3) | x);;
    write_char(dane[x]);
    }
    write_command(0x80);

    CDRAM SET |(0<<3)
    int tablica[20];
    {
    00000101
    00000110
    00001100
    00010100
    00000100
    00000100
    00000100
    00000100
    }

    }
    [/code]

    co to za brednie? write command osuń albo przed forem lub po. jesli przed dodaj adres znaku. I wywal to od CGRAM_SET do konca.
  • #24 8300044
    Faber33
    Poziom 16  
    tak to wyglądało zanim zacząłem to wpisywać:

    
    void lcd_def_char(char dane[], char numer)
    {
    	char x;	
    	write_command(0x40);
    	for (x = 0; x < 8; x++)
    	{	
    		write_command(0b01000000 | (numer<<3) | x);;
    		write_char(dane[x]);
    	}
    	write_command(0x80);
    	
    }


    I teraz co mam wpisać to CG_SET????
  • #25 8300063
    tadzik85
    Poziom 38  
    
    void lcd_def_char(char dane[], char numer)
    {
    	char x;	
    	write_command(0x40); //to jest CGSET ale zbyteczne bo jest nizej
    	for (x = 0; x < 8; x++)
    	{	
    		write_command(0b01000000 | (numer<<3) | x); / o tu
    		write_char(dane[x]);
    	}
    	write_command(0x80);
    	
    }
    
    
  • #26 8300078
    Faber33
    Poziom 16  
    Tutaj:

    write_char(dane[x]);

    wpisuje ten znaku który chce otrzymać????
  • #27 8300099
    tadzik85
    Poziom 38  
    tworzysz tablice

    char znak[8]={};


    a potem wywołujesz funkcje:

    lcd_def_char(znak, adres znaku);


    Dodano po 6 [minuty]:

    void lcd_def_char(char dane[], char numer)
    {
       char x;   
       write_command(0x40 | (numer<<3)); 
       for (x = 0; x < 8; x++)
       {   
          write_char(dane[x]);
       }
       write_command(0x80);
       
    } 


    tak będzie bardziej elegancko
  • #28 8300163
    Faber33
    Poziom 16  
    wpisałem to sobie tak:

    void lcd_def_char(char dane[], char numer)
    {
    
    char znak[8]={00000101, 00000110, 00001100, 00010100, 00000100, 00000100 ,00000100, 00000100};
       
        
    	lcd_def_char(znak, 0);
    
       char x;   
       write_command(0x40 | (numer<<3));
       for (x = 0; x < 8; x++)
       {   
          write_char(dane[x]);
       }
       write_command(0x80);
    
    
    }


    Będzie to dobrze????...bo teraz błędyów niema tylko 3 Waring są bo chyba za długa jest ta definicja znaku
  • #29 8300187
    tadzik85
    Poziom 38  
    jest i będzie maksymalnie źle. zostaw człowieku tą funkcje w spokoju.

    Masz ja jedynie odpowiednio wywołać to wszytko. wyżej napisałem jak
  • #30 8300199
    Faber33
    Poziom 16  
    to jak to mam wpisać do tablicy i potem wywołać tą funkcje (tzn co wpisać w nawiasie)????
REKLAMA