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

ATmega16 problem z obsługą LCD

zebra_elaktra 04 Mar 2009 21:15 1314 4
REKLAMA
  • #1 6236923
    zebra_elaktra
    Poziom 10  
    Głupio się pytać o taką trywialną sprawę. Przeglądałem rózne fora i google i nic nie moge wymyślić. Napisałem program na atmega16 podłaczonego z wys. na HD44780. RS-PORTA2, E-PORTA3, D4-D7 -PORT4-7. Jestem pewien, że wszystko jest dobrze podłaczone (R/W do GND), ale program do wyświetlacza i tak nie działa. Prosze o jakąs sugestie.
    
    #include <avr/io.h>
    
    #define LCD  PORTB
    #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)
    
    
    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; 
    }
    
    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){
    		write_char(*s); 
    	  	s++; 
    	}
    }
    
    void lcd_init(void){
    	int x;
    	int i; 
    
    	for(i = 0; i < 3; i++){
    		write_command(0x3F) ; 
    		for(x=0;x<5000;x++){}
    	}
    	for(i = 0; i < 2; i++){
    		write_command(0x2E); 
       }
    
    	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
    }
    
    
    int main(void){
    
    	int x;
    
    	for(x=0;x<5000;x++){}
    
    	DDRA = 0xFF;
    
    	PORTA = 0xFF;
    
    	lcd_init();
    
    	write_text("Ala ma kota :D");
    
    	while(1){}
    }


    Proszę używać znaczników [code] - uzupełniłem.
    [zumek]
  • REKLAMA
  • #2 6237092
    Nol
    Poziom 15  
    Nie dziwne, że nie działa, skoro już w samej inicjalizacji nie generujesz przerw wymaganych przez HD44780. Spójrz sobie do datasheeta na timingi i czasy wyczekiwania, zwłaszcza jeśli nie planujesz odczytywać flagi Busy.

    Spójrz np. na to:
    write_command(0x01); // czyść LCD
    W tym miejscu HD44780 wymaga odczekania ok. 2,5ms (jeśli mnie pamięć nie myli).
  • REKLAMA
  • #3 6238632
    zebra_elaktra
    Poziom 10  
    Poprawilem kod dodajac opoznienia, ale nic to nie dalo. Dalej wyswietlacz nie dziala.
    
    #include <avr/io.h>
    #include <avr/delay.h>
    #define LCD  PORTB
    #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)
    
    
    void write_to_lcd(char x){
    	SET_E; 
    	LCD = ((LCD & 0x0F) | (x & 0xF0)); 
    	CLR_E; 
    	_delay_us (10);
    	SET_E; 
    	LCD = ((LCD & 0x0F) | ((x & 0x0F) << 4)); 
    	CLR_E; 
    }
    
    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){
    		write_char(*s); 
    	  	s++; 
    	}
    }
    
    void lcd_init(void){
    	int x;
    	int i; 
    
    	for(i = 0; i < 3; i++){
    		write_command(0x3F) ; 
    		_delay_ms (10);
    	}
    	for(i = 0; i < 2; i++){
    		write_command(0x2E); 
    		_delay_ms (10);
       }
    
    	write_command(0x28); // interfejs 4-bity, 2-linie, znak 5x7
    	_delay_ms (10);
    	write_command(0x08); // wyłącz LCD, kursor i miganie
    	_delay_ms (10);
    	write_command(0x01); // czyść LCD
    	_delay_ms (10);
    	write_command(0x06); // bez przesuwania w prawo
    	_delay_ms (10);
    	write_command(0x0C); // włącz LCD, bez kursora i mrugania
    	_delay_ms (10);
    }
    
    
    int main(void){
    
    	int x;
    
    	_delay_ms (40);
    
    	DDRA = 0xFF;
    
    	PORTA = 0xFF;
    
    	lcd_init();
    
    	write_text("Ala ma kota :D");
    
    	while(1){}
    }

    Proszę używać znaczników [code] - uzupełniłem.
    [zumek]
  • REKLAMA
  • #5 6242999
    mm_pawel
    Poziom 11  
    Czy mógłbyś się zdecydować, gdzie podłączyłeś LCD:
    do portu A
    Cytat:
    podłaczonego z wys. na HD44780. RS-PORTA2, E-PORTA3, D4-D7 -PORT4-7.

    czy do portu B
    Cytat:
    #define LCD PORTB
    #define E 3
    #define RS 2
    #define SET_E LCD |= _BV(E)


    Pozdrawiam
    Paweł
REKLAMA