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

[ATtmega16][C/WinAVR] LCD w trybie 8-bit

melersan 21 Mar 2009 14:14 1526 2
REKLAMA
  • #1 6311719
    melersan
    Poziom 11  
    Witam

    Mam taki problem, a mianowicie już nie mam pojęcia co źle robię. W środowisku Proteus chcę zainicjalizować wyświetlacz i wypisać nań jakiś znak. Niestety nic się nie dzieje. Może to przez błędne przeczytanie datasheet, ale wszędzie gdzie nie patrzyłem, jest, że dane są zapisywane na opadającym zboczu E oraz, że instrukcje sa dla RS = 0 a dane do wyświetlenia dla RS = 1;

    Wyświetlacz: HD44780

    Napisałem program ,zbudowałem schemat i co? i nic;/ Więc proszę kolegów o pomoc, gdyż ja już straciłem cierpliwość:(
    8-bitowy tryb pracy - chyba z tym jest ten problem, gdyż wszędzie wszyscy robią na 4 i może przez nieuwagę o czymś zapomniałem... A, że nie lubię zmieniać założeń "bo coś nie działa" to chciałbym rozwiązać ten problem w istniejącej wersji ;).

    plik lcd.h:
    
    #define F_CPU 1000000L
    
    #include <avr/io.h>
    #include <util/delay.h> 
    #include <stdio.h>
    
    void init()
    { 
    /*Ports: */
    #define LCD_Data_ADD DDRC
    #define LCD_CTR_ADD DDRD
    #define LCD_Data_PORT PORTC
    #define LCD_CTR_PORT PORTD
    
    
    /*Adresses: */
    #define CLEAR 0x01;_delay_us(80)
    #define RETURN 0x02;_delay_us(40)
    #define MODE 0x06;_delay_us(40)
    #define DISP_on 0x0C;_delay_us(40)
    #define FUN_8_Bit 0x38;_delay_us(40)
    #define DDRAM 0x00;_delay_us(40)
    #define WRITE_CTR_up 0x03;_de;ay_us(40)
    #define WRITE_CTR_down 0x01;_delay_us(40)
    
    #define RS_SET LCD_CTR_PORT |= _BV(0)
    #define RS_CLR LCD_CTR_PORT &= ~_BV(0)
    #define E_SET LCD_CTR_PORT |= _BV(1)
    #define E_CLR LCD_CTR_PORT &= ~_BV(1)
    
    	_delay_ms(25); //rozruch
    	LCD_Data_ADD = 0xFF; //wszystkie porty na out
    	LCD_CTR_ADD = 0x0F; //pół na in i pół na out
    	
    	//inicjalizacja:
    	RS_CLR;
    	E_SET;
    	LCD_Data_PORT = CLEAR;
    	E_CLR;
    	
    	E_SET;
    	LCD_Data_PORT = RETURN;
    	E_CLR;
    	
    	E_SET;
    	LCD_Data_PORT = MODE;
    	E_CLR;
    	
    	E_SET;
    	LCD_Data_PORT = DISP_on;
    	E_CLR;
    	
    	E_SET;
    	LCD_Data_PORT = FUN_8_Bit;
    	E_CLR;
    	
    	E_SET;
    	LCD_Data_PORT = DDRAM;
    	E_CLR;
    }
    
    void string(const unsigned char zn)
    {
    	RS_SET;
    	E_SET;
    	LCD_Data_PORT = 0x50;
    	E_CLR;
    	_delay_us(100);
    
    }

    main:
    
    #include "lcd.h"
    
    main()
    {
    	unsigned char i;
    	init();
    	string(i);
    }


    na razie w mainie nic nie ma, a i to będzie w przyszłości przesyłany znak. Na razie na sztywno chcę wypisać jakikolwiek znak...

    schemat w proteusie:
    [img]
    http://img5.imageshack.us/my.php?image=proteusjpg.jpg&via=yfrog[/img]


    Z góry dziękuję, za wszystkie odpowiedzi.

    Pozdrawiam
    Damian
  • REKLAMA
  • Pomocny post
    #2 6311775
    rrata
    Poziom 19  
    Pin RW podłącz do masy. W funkcji string nie używasz zn. Przy inicjalizacji ustawienie trybu w 8-bitowy powinno być pierwsze. Zresztą przeczytaj datasheet (Initializing by instruction) tam masz napisane, że trzeba trzykrotnie wysłać 0x3F w dodatku z różnymi odstepami czasowymi, po włączeniu zasilania należy chwile odczekac. Wstaw jeszcze jakieś opóźnienia, bo LCD może nie wyrobić.
  • #3 6312464
    melersan
    Poziom 11  
    Dzięki, w datasheet z Proteusa nie uswiadczyłem tego punktu, na szczeście wczytałem się w inny i znalazłem. Nareszcie śmiga:)
REKLAMA