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

[AVR GCC]roznica miedzy 0<<PIN a ~(1<<PIN ) LCD

Pajczi 04 Cze 2009 17:51 1443 1
REKLAMA
  • #1 6615586
    Pajczi
    Poziom 14  
    Witam,
    Miałem problem z wyświetlaczem, a mianowicie jeden kod działał na HD44780 a na niby kompatybilnym wyświetlaczu Hitech już nie. Po wielu próbach znalazłem miejsce
    LCP&=0<<LCD_E|0<<LCD_RS;

    które należało zamienić na
    LCP&=~(1<<LCD_E)|0<<LCD_RS; // Po usunieciu tego RS też działało na każdym i HD44780 i Hitech

    Oryginalny kod funkcji do wysyłania znaków :

    
    void LCDsendChar(uint8_t ch)	
    {	 
    	//4 MSB bits
    	LDP=((ch>>2)&0b00111100);
    	LCP|=1<<LCD_RS|1<<LCD_E;
    	_delay_ms(1);
    	LCP&=0<<LCD_E|0<<LCD_RS;	//--- bez 0<<LCD_RS tez dziala
    	_delay_ms(1);
        //4 LSB bits
    	LDP=((ch<<2)&0b00111100);
    	LCP|=1<<LCD_RS|1<<LCD_E;
    	_delay_ms(1);
    	LCP&=0<<LCD_E|0<<LCD_RS; //----bez 0<<LCD_RS tez dziala
    	_delay_ms(1);
    }
    

    Moje pytania są następujące czemu się tak działo ? Rozumiem że kod ~(1<<PIN) jest chyba nie dominujący w sensie że nie wpływa na pozostałe piny czyli nie zmienia stanu lini RS a PORT&=0<<PIN owszem zmienia czy tak ? Drugie moje pytanie to czy muszą być te RS ponieważ po ich usunięciu (w miejscach zaznaczonych w kodzie) program funkcjonował bez problemów na jednym i drugim wyświetlaczu.
  • REKLAMA
  • Pomocny post
    #2 6615600
    Freddie Chopin
    Specjalista - Mikrokontrolery
    0<<x = 0. Zawsze, niezależnie od x.

    x & 0 = 0. Zawsze, niezależnie od x.

    ~(1<<x) = 111...0...111 (0 na pozycji x)

    x & 111...0...111 = x z zerem na pozycji zera w "masce".

    4\/3!!
REKLAMA