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.
//**********************************
//TextXY(x,y,text)
//**********************************
//wyczyæ wyw.
//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)
//**********************************
//wylij tekst z RAM na wyw.
//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) //Wylij komendê do LCD
{
CLR_RS;
CLR_RW;
LCDwrite(d);
CheckStatus();
return;
}
//******************************************************************************
void LCDchr(char d) //Wylij 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æ wyw.
void LCDcls(void) {
LCDcmd(CLRDISP);
return;
}
//******************************************************************************
//wylij tekst z RAM na wyw.
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
/*
* 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_ */
/*
* 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_ */
#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;
}
#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); //Wylij komendê do LCD
//******************************************************************************
void LCDchr(char d); //Wylij 1 znak do LCD
//******************************************************************************
void LCDinit(void); //inicjalizacja LCD
//******************************************************************************
void LCDcls(void); //wyczyæ wyw.
//******************************************************************************
//wylij tekst z RAM na wyw.
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
/*
* 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,
};