REKLAMA

LCD.rar

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

DDR(D)A zerknij w źródła libsa dla Twojego uC (pliki biblioteczne "iomXX.") i odnajdź zdefiniowany symbol "D"... Chyba chodziło o coś innego,.. :) Jeżeli korzystasz z: #define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) #define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) to jako argument makra powinieneś zdaje się podać w tym przypadku "PORTD". ps. W załączniku masz moją wariację obsługi LCD.


Pobierz plik - link do postu
  • LCD.rar
    • LCDbuf.h
    • lcd.c
    • znaki.h
    • znaki.c
    • LCDbuf.c
    • lcd.h


LCD.rar > lcd.c

//**********************************
//TextXY(x,y,text)
//**********************************
//wyczyœæ wyœw.
//LCDcls(void)
//**********************************
//w³¹cz wyswietlacz
//a=1 w³
//a=0 wy³
//LCD_ON(int a)
//**********************************
//wl¹czanie kurosra
//a=1 w³
//a=0 wy³
//LCD_CURSOR(int a)
//**********************************
//miganie kursora
//a=1 w³
//a=0 wy³
//LCD_BLINK(int a)
//**********************************
//przesuwanie tekstu
//a=1 w prawo
//a=2 w lewo
//a=0 wy³
//void LCD_SHIFT(int a)
//**********************************
//ustaw kursor na pozycji 0,0
//LCDhome(void)
//**********************************
//wyœlij tekst z RAM na wyœw.
//LCDtext(char *txt)
//**********************************
//umieϾ kursor na pozycji x,y
//LCDxy(char x,char y)
//**********************************
#include " lcd.h "

void DB47out(void)
{
D4DDR |= (1 & lt; & lt; D4PIN);
D5DDR |= (1 & lt; & lt; D5PIN);
D6DDR |= (1 & lt; & lt; D6PIN);
D7DDR |= (1 & lt; & lt; D7PIN);
}
void DB47in(void)
{
D4DDR & = ~(1 & lt; & lt; D4PIN);
D5DDR & = ~(1 & lt; & lt; D5PIN);
D6DDR & = ~(1 & lt; & lt; D6PIN);
D7DDR & = ~(1 & lt; & lt; D7PIN);
}
//******************************************************************************
void LCDresetdata(void) //wyzeruj szynê danych LCD
{
CLR_D4;
CLR_D5;
CLR_D6;
CLR_D7;
}
//******************************************************************************
void LCDwrite(char d) //zapis bajtu do LCD
{
LCDresetdata();
SET_E;
if (d & 0x10) {
SET_D4;
}
if (d & 0x20) {
SET_D5;
}
if (d & 0x40) {
SET_D6;
}
if (d & 0x80) {
SET_D7;
}
CLR_E;
LCDresetdata();
SET_E;
if (d & 0x01) {
SET_D4;
}
if (d & 0x02) {
SET_D5;
}
if (d & 0x04) {
SET_D6;
}
if (d & 0x08) {
SET_D7;
}
CLR_E;
}


unsigned char LCD_ReadNibble(void)
{
unsigned char tmp = 0;
SET_E;
if(D4_press)tmp|=(1 & lt; & lt; 0);
if(D5_press)tmp|=(1 & lt; & lt; 1);
if(D6_press)tmp|=(1 & lt; & lt; 2);
if(D7_press)tmp|=(1 & lt; & lt; 3);
CLR_E;
return tmp;
}
//-----------------------------------------------------------------------------
unsigned char LCD_ReadStatus(void)
{
unsigned char status = 0;

DB47in();
SET_RW;
CLR_RS;
status |= (LCD_ReadNibble() & lt; & lt; 4);
status |= LCD_ReadNibble();
DB47out();
return status;
}


void CheckStatus(void)
{
uint32_t StatusTimeout=0;
while((LCD_ReadStatus() & 0x80))
{
StatusTimeout++;
if(StatusTimeout & gt; TimeoutLCD)
break;
}
}
//******************************************************************************
void LCDcmd(char d) //Wyœlij komendê do LCD
{
CLR_RS;
CLR_RW;
LCDwrite(d);
CheckStatus();
return;
}
//******************************************************************************
void LCDchr(char d) //Wyœlij 1 znak do LCD
{
SET_RS;
CLR_RW;
LCDwrite(d);
CheckStatus();
return;
}
//******************************************************************************
void LCDinit(void) //inicjalizacja LCD
{
RSDDR |= (1 & lt; & lt; RSPIN);
RSDDR |= (1 & lt; & lt; RWPIN);
EDDR |= (1 & lt; & lt; EPIN);
DB47out();
CLR_RS;
CLR_RW;
CLR_E;
_delay_ms(20);
CLR_D7;
CLR_D6;
SET_D4;
SET_D5;
unsigned char i;
for (i = 0; i & lt; 3; i++) {
SET_E;
_delay_us(10);
CLR_E;
_delay_ms(5);
}
CLR_D4;
SET_E;
_delay_us(10);
CLR_E;
_delay_ms(5);
LCDcmd(0x28); //function set - interface=4 bit,line=2,font=5x7
LCDcmd(ONDISP); //display ctrl - display on
LCDcmd(0x06); //entry mode set - increment
LCDcmd(0x01); //clear display
return;
}
//******************************************************************************
//wyczyœæ wyœw.
void LCDcls(void) {
LCDcmd(CLRDISP);
return;
}
//******************************************************************************
//wyœlij tekst z RAM na wyœw.
void LCDtext(char *txt) {
while (*txt) {
LCDchr(*txt++);
}
return;
}
//******************************************************************************
//umieϾ kursor na pozycji x,y - brak kontroli dla x i y
void LCDxy(char x, char y) {
unsigned char com = 0x80;
com |= (x | (y & lt; & lt; 6));
LCDcmd(com);
return;
}
//******************************************************************************
#if CGRAMchars==1
void LCD_CGRAMchar(uint8_t nr, const char *FlashLoc)
{
register uint8_t i,c;
LCDcmd( 64+((nr & 0x07)*8) );
for(i=0;i & lt; 8;i++)
{
c = *(FlashLoc++);
LCDchr(c);
}
}
#endif


LCD.rar > znaki.h

/*
* znaki.h
*
* Created on: 20-03-2014
* Author: Thomaz
*/

#ifndef ZNAKI_H_
#define ZNAKI_H_
#include & lt; avr/io.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; stdio.h & gt;
#include & lt; stdlib.h & gt;
extern const char znak1[];
extern const char znak2[];
extern const char znak3[];
extern const char znak4[];
extern const char znak5[];
extern const char znak6[];
extern const char *znakTable[];
#endif /* ZNAKI_H_ */


LCD.rar > LCDbuf.h

/*
* LCDbuf.h
*
* Created on: 10-03-2012
* Author: Thomaz
*/

#ifndef LCDBUF_H_
#define LCDBUF_H_
#include & lt; avr/io.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; stdio.h & gt;
#include & lt; stdlib.h & gt;
#include " lcd.h "
#include " znaki.h "
#include " ../TIMERY/Timer1_systick/Timer1.h "
/***************************************************************************************/
//Definicja rozmiarow wyswietlacza
#define Lines 2
#define Columns 16
#define Refresh 15 //szybkosc odswiezania obrazu (x10ms)
//Definicja znakow specjalnych
#define Space 32
#define Null 0
/***************************************************************************************/
#if Lines & lt; 1
#error Zwieksz liczbe wierszy wyswietlacza!
#endif
#if Lines & gt; 4
#error Zmniejsz liczbe wierszy wyswietlacza!
#endif
#if Columns & lt; 8
#error Zwieksz liczbe kolumn wyswietlacza!
#endif
#if Columns & gt; 40
#error Zmniejsz liczbe kolumn wyswietlacza!
#endif
//Definicja buforów wyswietlania
char LCDbuf[Lines][(Columns + 1)];
//bufor dla funkcji itoa mieszcz¹cy liczby 16bit
extern char result[Columns+1];
enum LCDmode {Freeze,Clear};
//ustawienie kursora
void bLCDxy(uint8_t x, uint8_t y);
//czyszczenie RAM
void bLCDcls(void);
//wyswietlanie tekstow z RAM na LCD
void LCDdisplay(uint8_t mode);
//zapis tekstow do pamieci RAM
void bLCDtext(const char *txt);
void bLCDpgmtext(const char *FlashLoc);
void bLCD_CGRAMchar(uint8_t txt);
#endif /* LCDBUF_H_ */


LCD.rar > LCDbuf.c

#include " LCDbuf.h "
char result[Columns+1];
typedef uint8_t u8;
typedef uint16_t u16;
u8 Px,Py;
void bLCDxy(uint8_t x, uint8_t y)
{
Px=x;
Py=y;
return;
}
//Czyszczenie zawartosci bufora
void bLCDcls(void)
{
for(uint8_t y=0;y & lt; (Lines);y++)
{
for(uint8_t x=0;x & lt; (Columns);x++)
{
LCDbuf[y][x]=Space;
}
}
return;
}
//wyswietlanie tekstow z RAM na LCD
void LCDdisplay(uint8_t mode)
{
if(!T_LCDrefresh)
{
uint8_t y=0;
for(uint8_t x=0;x & lt; (Lines);x++)
{
LCDxy(0,x);
for(y=0;y & lt; (Columns);y++)
{
LCDchr(LCDbuf[x][y]);
}
}
}
if(mode)
bLCDcls();
return;
}
//zapis tekstow do pamieci RAM
void bLCDtext(const char *txt) {
while (*txt & & (Px & lt; Columns))
{
LCDbuf[Py-1][Px++]=*txt++;
}
return;
}

void bLCD_CGRAMchar(uint8_t txt) {
LCDbuf[Py-1][Px++]=txt;
return;
}

void bLCDpgmtext(const char *FlashLoc) {
register char znak;
while ((znak=pgm_read_byte(FlashLoc++)) & & (Px & lt; Columns))
{
LCDbuf[Py-1][Px++]=znak;
}
return;
}


LCD.rar > lcd.h

#ifndef LCD_H
#define LCD_H
#include " ../MACRO_PORT.h "
#include & lt; util/delay.h & gt;
#include & lt; avr/io.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; stdio.h & gt;
#include & lt; stdlib.h & gt;

#define TimeoutLCD 1000 //przy braku komunikacji z lcd program sie dzieki temu nie zawiesi
/*
* Konfiguracja pinów wyswietlacza
*/
#define RSPIN 2
#define RSPORT PORTG

#define RWPIN 1
#define RWPORT PORTG

#define EPIN 0
#define EPORT PORTG

#define D4PIN 7
#define D4PORT PORTD

#define D5PIN 6
#define D5PORT PORTD

#define D6PIN 5
#define D6PORT PORTD

#define D7PIN 4
#define D7PORT PORTD
/*
* Opcja wyswietlania z FLASH
*/
#define ProgTexts 0 //uzywamy tekstów z pamieci FLASH?
#define CGRAMchars 1 //obs³ugujemy w³asne znaki w pamiêci cg ram?
//***************************************************************************
/*
* Makra wyliczaj¹ce adresy rejestrów DDR
*/
#define RSDDR DDR(RSPORT)
#define RWDDR DDR(RWPORT)
#define EDDR DDR(EPORT)
#define D4DDR DDR(D4PORT)
#define D5DDR DDR(D5PORT)
#define D6DDR DDR(D6PORT)
#define D7DDR DDR(D7PORT)
/*
* Makra umo¿liwiaj¹ce ³atwe sterowanie pinami
*/
#define SET_D4 D4PORT|=(1 & lt; & lt; D4PIN);
#define SET_D5 D5PORT|=(1 & lt; & lt; D5PIN);
#define SET_D6 D6PORT|=(1 & lt; & lt; D6PIN);
#define SET_D7 D7PORT|=(1 & lt; & lt; D7PIN);

#define CLR_D4 D4PORT & =~(1 & lt; & lt; D4PIN);
#define CLR_D5 D5PORT & =~(1 & lt; & lt; D5PIN);
#define CLR_D6 D6PORT & =~(1 & lt; & lt; D6PIN);
#define CLR_D7 D7PORT & =~(1 & lt; & lt; D7PIN);

#define SET_E EPORT|=(1 & lt; & lt; EPIN);
#define CLR_E EPORT & =~(1 & lt; & lt; EPIN);

#define SET_RS RSPORT|=(1 & lt; & lt; RSPIN);
#define CLR_RS RSPORT & =~(1 & lt; & lt; RSPIN);

#define SET_RW RWPORT|=(1 & lt; & lt; RWPIN);
#define CLR_RW RWPORT & =~(1 & lt; & lt; RWPIN);


#define D4_PIN PIN(D4PORT)
#define D4_press (D4_PIN & (1 & lt; & lt; D4PIN))

#define D5_PIN PIN(D5PORT)
#define D5_press (D5_PIN & (1 & lt; & lt; D5PIN))

#define D6_PIN PIN(D6PORT)
#define D6_press (D6_PIN & (1 & lt; & lt; D6PIN))

#define D7_PIN PIN(D7PORT)
#define D7_press (D7_PIN & (1 & lt; & lt; D7PIN))
/*
* Predefinicja komend steruj¹cych wywietlaczem
*/
#define CLRDISP 0x01 //czysc wyswietlacz
#define HOMEDISP 0x02 //kursor na pozycje 0,0
#define OFFDISP 0x08 //wylacz ekran
#define ONDISP 0x0c //wlacz ekran
#define SHIFT 0x9f // przesuwanie kursora
//koniec uproszczeñ
//******************************************************************************
void LCDcmd(char d); //Wyœlij komendê do LCD
//******************************************************************************
void LCDchr(char d); //Wyœlij 1 znak do LCD
//******************************************************************************
void LCDinit(void); //inicjalizacja LCD
//******************************************************************************
void LCDcls(void); //wyczyœæ wyœw.
//******************************************************************************
//wyœlij tekst z RAM na wyœw.
void LCDtext(char *txt);
//******************************************************************************
//umieϾ kursor na pozycji x,y - brak kontroli dla x i y
void LCDxy(char x, char y);
#if CGRAMchars==1
void LCD_CGRAMchar(uint8_t nr, const char *FlashLoc);
#endif
#endif


LCD.rar > znaki.c

/*
* znaki.c
*
* Created on: 20-03-2014
* Author: Thomaz
*/

#include " znaki.h "
const char znak1[] =
{
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b10000,
0b11000
};
const char znak2[] =
{
0b00000,
0b00000,
0b00000,
0b00000,
0b10000,
0b11000,
0b11100,
0b11110
};
const char znak3[] =
{
0b00000,
0b00000,
0b10000,
0b11000,
0b11100,
0b11110,
0b11111,
0b11111
};
const char znak4[] =
{
0b10000,
0b10000,
0b11000,
0b11100,
0b11110,
0b11111,
0b11111,
0b11111
};
const char znak5[] =
{

0b11000,
0b11100,
0b11110,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};
const char znak6[] =
{
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111,
0b11111
};


const char *znakTable[] =
{
znak1,
znak2,
znak3,
znak4,
znak5,
znak6,
};