ADVERTISEMENT

lcd.h

Makra DDR, PORT, PIN w AVR - błędy kompilacji w AVR Studio 6 i WinAVR

Przepisuję ręcznie ta bibliotekę i tam zaraz po definicji tych makr bez funkcji są wykorzystywane. Ma może ktoś program do obsługi LCD od Pana Kardasia? bo nie dostałem płyty niestety z biblioteki do ksiażki i ręcznie przepisuje to może źle coś zrobilem :( załączam moją biblioteczkę napisaną (przepisaną w zasadzie)


Download file - link to post

//----------------------------------------------------------------------
// Definicje (w zaleznosc od podlaczenia i uzytego wyswietlacza
//----------------------------------------------------------------------
// rozdzielczosc wyswietlacza LCD
#define LCD_Y 2 // liczba wierszy wyswietlacza
#define LCD_X 16 // liczba kolumn wyswietlacza

//ustawiamy czy sterujemy pinem RW czy nie
#define USE_RW 0 // RW podlaczone na stale do masy

// definiujemy porty i piny do jakich podlaczone sa linie D7-D4
#define LCD_D7PORT C
#define LCD_D7 5

#define LCD_D6PORT C
#define LCD_D6 4

#define LCD_D5PORT C
#define LCD_D5 3

#define LCD_D4PORT C
#define LCD_D4 2

// definiujemy piny procesora do ktorych podlaczone sa linie RS, RW oraz E
#define LCD_RSPORT B
#define LCD_RS 2

#define LCD_RWPORT B
#define LCD_RW 1

#define LCD_EPORT B
#define LCD_E 0

// definiujemy adresy w DDRAM dla roznych wyswietlaczy
// rozne sa w wyswietlaczach 2wierszonych inne w 4wierszowych
#if ( (LCD_Y == 4) & & (LCD_X == 20) )
#define LCD_LINE1 0x00 // adres 1 znaku 1 wiersza
#define LCD_LINE2 0x28 // adres 1 znaku 2 wiersza
#define LCD_LINE3 0x14 // adres 1 znaku 3 wiersza
#define LCD_LINE4 0x54 // adres 1 znaku 4 wiersza
#else
#define LCD_LINE1 0x00 // adres 1 znaku 1 wiersza
#define LCD_LINE2 0x40 // adres 1 znaku 2 wiersza
#define LCD_LINE3 0x10 // adres 1 znaku 3 wiersza
#define LCD_LINE4 0x50 // adres 1 znaku 4 wiersza
#endif
//----------------------------------------------------------------------

//----------------------------------------------------------------------
// Definicje makr
//----------------------------------------------------------------------
//Makra upraszczaj¹ce dostêp do portów
// *** PORT
#define PORT(x) SPORT(x)
#define SPORT(x) ( PORT##x )
//*** PIN
#define PIN(x) SPIN(x)
#define SPIN(x) ( PIN##x)
//*** DDR
#define DDR(x) SDDR(x)
#define SDDR(x) ( DDR##x )

//----------------------------------------------------------------------
// inicjalizacja pinow i portow wyswietlacza
//----------------------------------------------------------------------
// ustawienie wszystkich jak wyjscia
DDR(LCD_D7PORT) |= (1 & lt; & lt; LCD_D7);
DDR(LCD_D6PORT) |= (1 & lt; & lt; LCD_D6);
DDR(LCD_D5PORT) |= (1 & lt; & lt; LCD_D5);
DDR(LCD_D4PORT) |= (1 & lt; & lt; LCD_D4);
DDR(LCD_RSPORT) |= (1 & lt; & lt; LCD_RS);
DDR(LCD_EPORT) |= (1 & lt; & lt; LCD_E);
#if USE_RW == 1
DDR(LCD_RWPORT) |= (1 & lt; & lt; LCD_RW);
#endif


// wyzerowanie wszystkich linii sterujacych
PORT(LCD_RSPORT) & = ~(1 & lt; & lt; LCD_RS);
PORT(LCD_EPORT) & = ~(1 & lt; & lt; LCD_E);
#if USE_RW == 1
PORT(LCD_RWPORT) & = ~(1 & lt; & lt; LCD_RW);
#endif

//----------------------------------------------------------------------
// Makrodefinicje operacji na sygnalach sterujacych RS, RW oraz E
//----------------------------------------------------------------------
// stan wysoki na linii RS
#define SET_RS PORT(LCD_RSPORT) |= (1 & lt; & lt; LCD_RS)
// stan niski na linii RS
#define CLR_RS PORT(LCD_RSPORT) & = ~(1 & lt; & lt; LCD_RS)

// stan wysoki na linii RW
#define SET_RW PORT(LCD_RWPORT) |= (1 & lt; & lt; LCD_RW)
// stan niski na linii RW
#define CLR_RW PORT(LCD_RWPORT) & = ~(1 & lt; & lt; LCD_RW)

// stan wysoki na linii E
#define SET_E PORT(LCD_EPORT) |= (1 & lt; & lt; LCD_E)
// stan niski na linii E
#define CLR_E PORT(LCD_EPORT) & = ~(1 & lt; & lt; LCD_E)

//----------------------------------------------------------------------
//Fukcja ustawiajaca wszystkie piny D7 - D4 jako wyjscia
//----------------------------------------------------------------------
static inline void data_dir_out( void )
{
DDR(LCD_D7PORT) |= (1 & lt; & lt; LCD_D7);
DDR(LCD_D6PORT) |= (1 & lt; & lt; LCD_D6);
DDR(LCD_D5PORT) |= (1 & lt; & lt; LCD_D5);
DDR(LCD_D4PORT) |= (1 & lt; & lt; LCD_D4);
}

//----------------------------------------------------------------------
//Fukcja ustawiajaca wszystkie piny D7 - D4 jako wejscia
//----------------------------------------------------------------------
static inline void data_dir_in( void )
{
DDR(LCD_D7PORT) & = ~(1 & lt; & lt; LCD_D7);
DDR(LCD_D6PORT) & = ~(1 & lt; & lt; LCD_D6);
DDR(LCD_D5PORT) & = ~(1 & lt; & lt; LCD_D5);
DDR(LCD_D4PORT) & = ~(1 & lt; & lt; LCD_D4);
}

//----------------------------------------------------------------------
// Funkcja sprawdzajaca zajetosc linii? check busy flag
//----------------------------------------------------------------------
#if USE_RW == 1
uint8_t check_BF( void )
{
CLR_RS;
return _lcd_read_byte();
}
#endif

//----------------------------------------------------------------------
// Funckja przesylajaca pol bajtu
//----------------------------------------------------------------------
static inline void lcd_sendHalf( uint8_t data )
{
if ( data & (1 & lt; & lt; 0) ) PORT(LCD_D4PORT) |= (1 & lt; & lt; LCD_D4);
else PORT(LCD_D4PORT) & = ~(1 & lt; & lt; LCD_D4);

if ( data & (1 & lt; & lt; 1) ) PORT(LCD_D5PORT) |= (1 & lt; & lt; LCD_D5);
else PORT(LCD_D5PORT) & = ~(1 & lt; & lt; LCD_D5);

if ( data & (1 & lt; & lt; 2) ) PORT(LCD_D6PORT) |= (1 & lt; & lt; LCD_D6);
else PORT(LCD_D6PORT) & = ~(1 & lt; & lt; LCD_D6);

if ( data & (1 & lt; & lt; 3) ) PORT(LCD_D7PORT) |= (1 & lt; & lt; LCD_D7);
else PORT(LCD_D7PORT) & = ~(1 & lt; & lt; LCD_D7);
}

//----------------------------------------------------------------------
// Funckja przesylajaca caly bajt
//----------------------------------------------------------------------
void _lcd_write_byte( unsigned char _data )
{
// ustawienie pinow portu LCD D4 - D7 jako wyjscia
data_dir_out();

#if USE_RW == 1
CLR_RW;
#endif

SET_E;
lcd_sendHalf(_data & gt; & gt; 4); // wysylanie starszej czesci bajtu danych
CLR_E;

SET_E;
lcd_sendHalf(_data); // wysylanie mlodszej czesci bajtu danych
CLR_E;

#if USE_RW == 1
while( check_BF() & (1 & lt; & lt; 7) );
#else
_delay_us(120);
#endif
}

//----------------------------------------------------------------------
// Funckje pomocnicze - wysylajace dane czy komende
//----------------------------------------------------------------------
void lcd_write_cmd( uint8_t cmd )
{
CLR_RS;
_lcd_write_byte( cmd );
}

void lcd_write_data( uint8_t data )
{
SET_RS;
_lcd_write_byte( data );
}

//----------------------------------------------------------------------
// Funckja odczytu polowki bajtu
//----------------------------------------------------------------------
#if USE_RW == 1
static inline uint8_t lcd_readHalf( void )
{
uint8_t result=0;

if( PIN(LCD_D4PORT) & (1 & lt; & lt; LCD_D4) ) result |= (1 & lt; & lt; 0);
if( PIN(LCD_D5PORT) & (1 & lt; & lt; LCD_D5) ) result |= (1 & lt; & lt; 1);
if( PIN(LCD_D6PORT) & (1 & lt; & lt; LCD_D6) ) result |= (1 & lt; & lt; 2);
if( PIN(LCD_D7PORT) & (1 & lt; & lt; LCD_D7) ) result |= (1 & lt; & lt; 3);

return result;
}
#endif

//----------------------------------------------------------------------
// Funckja odczytu calego bajtu
//----------------------------------------------------------------------
#if USE_RW == 1
uint8_t _lcd_read_byte( void )
{
uint8_t result = 0;
data_dir_in();

SET_RW;

SET_E;
// odczyt starszej czesci bajtu z wyswietlacza
result |= ( lcd_readHalf() & lt; & lt; 4 );
CLR_R;

SET_E;
// odczyt mlodszej czesci bajtu
result |= lcd_readHalf();
CLR_E;

retur result;
}
#endif