[an error occurred while processing this directive]
Делал так:
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Леонид Иванович 08 января 2006 г. 17:03
В ответ на: Народ помогиете подключить LCD(44780) к АВРу используя полниу шину данных не как не получается инициализировать его если есть пример кода шлите на мыло ivan_va@mail.ru отправлено <font color=gray>Ivan_Va</font> 07 января 2006 г. 13:41

Несколько сумбурно, так как куски повыдёргивал из разных c- и h-файлов.


#define FCLK 11.0592 //частота кварца, Мгц

//порт A:

#define LCD_DATA PORTA //порт A - шина данных LCD

#define I_DDRA 0xFF
#define I_PORTA 0x00

//порт F:

#define LCD_RS (1 << PF5) //LCD RS line
#define LCD_W (1 << PF6) //LCD W line
#define LCD_E (1 << PF7) //LCD E line

#define I_DDRF (LCD_E | LCD_W | LCD_RS)
#define I_PORTF (LCD_E | LCD_W | LCD_RS | NC_PF4 | NC_PF3 | NC_PF2 | NC_PF1 | NC_PF0)

#define Port_LCD_RS_0 (PORTF &= ~LCD_RS)
#define Port_LCD_RS_1 (PORTF |= LCD_RS)
#define Port_LCD_W_0 (PORTF &= ~LCD_W)
#define Port_LCD_W_1 (PORTF |= LCD_W)
#define Port_LCD_E_0 (PORTF &= ~LCD_E)
#define Port_LCD_E_1 (PORTF |= LCD_E)

//------------------------- Инициализация портов: ----------------------------

void Init_Ports(void)
{
DDRA = I_DDRA;
PORTA = I_PORTA;
DDRF = I_DDRF;
PORTF = I_PORTF;
}

//---------------- Таблица пользовательских символов LCD: --------------------

__flash char UsrChr[]= { 0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00, //° (0x00)
0x04,0x04,0x1F,0x04,0x04,0x00,0x1F,0x00, //± (0x01)
0x10,0x10,0x10,0x1E,0x11,0x11,0x1E,0x00, //Ь (0x02)
0x15,0x11,0x13,0x15,0x19,0x11,0x11,0x00, //Й (0x03)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (0x04)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (0x05)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // (0x06)
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }; // (0x07)

//----------------- Таблица перекодировки русских букв: ----------------------

__flash char CharsR[]= { 0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,
0xA5,0x03,0x4B,0xA7,0x4D,0x48,0x4F,0xA8,
0x50,0x43,0x54,0xA9,0xAA,0x58,0xE1,0xAB,
0xAC,0xE2,0xAD,0xAE,0x02,0xAF,0xB0,0xB1,
0x61,0xB2,0xB3,0xB4,0xE3,0x65,0xB6,0xB7,
0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0x6F,0xBE,
0x70,0x63,0xBF,0x79,0xE4,0x78,0xE5,0xC0,
0xC1,0xE6,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7 };

//-------------------------- Инициализация LCD: ------------------------------

void Init_LCD(void)
{
Delay_m(15);
LCD_WrCmd(0x30);
Delay_m(5); //delay >4.1 mS
LCD_WrCmd(0x30);
Delay_u(100); //delay >100 uS
LCD_WrCmd(0x30);
Delay_m(5); //delay >4.1 mS
LCD_WrCmd(0x38); //FUNCTION SET
Delay_m(15);
LCD_WrCmd(0x0C); //DISPLAY ON
Delay_m(15);
LCD_WrCmd(0x06); //ENTRY MODE SET
Delay_m(15);
LCD_Clear(); //CLEAR
Delay_m(15);
LCD_UsrChr(); //загрузка символов пользователя
}

//------------------------- Загрузка LCD CGRAM: ------------------------------

//UsrChr - таблица символов: 8 байт на символ x 8 символов
//Матрица точек 5x8: BYTE1 D4 D3 D2 D1 D0
// BYTE2 D4 D3 D2 D1 D0
// ...
// BYTE8 D4 D3 D2 D1 D0

void LCD_UsrChr(void)
{
LCD_WrCmd(0x40); //установка нулевого адреса CGRAM
for(char i = 0; i < 64; i++)
LCD_WrData(UsrChr[i]); //загрузка CGRAM
}

//----------------------------- Очистка LCD: ---------------------------------

void LCD_Clear(void)
{
LCD_WrCmd(0x01); //DISPLAY CLEAR
Delay_m(5); //delay >1.64mS
}

//------------------------- Write command to LCD: ----------------------------

void LCD_WrCmd(char d)
{
Port_LCD_RS_0; //RS <- 0
LCD_Wr(d); //write byte to LCD
}

//-------------------------- Write data to LCD: ------------------------------

void LCD_WrData(char d)
{
Port_LCD_RS_1; //RS <- 1
LCD_Wr(d); //write byte to LCD
}

//-------------------------- Write byte to LCD: ------------------------------

void LCD_Wr(char d)
{
LCD_DATA = d;
Port_LCD_W_0;
Port_LCD_E_1; //E <- 1
Delay_u(2); //delay 2 uS
Port_LCD_E_0; //E <- 0
Delay_u(50); //delay 50 uS
}

//------------------------ Установка позиции на LCD: -------------------------

//line = 1..2
//pos = 1..16

void LCD_Pos(int line, int pos)
{
pos = pos - 1;
pos = pos | 0x80;
if(line > 1)
pos = pos | 0x40;
LCD_WrCmd(pos);
}

//----------------------------------------------------------------------------

void LCD_CurOff(void)
{
LCD_WrCmd(0x0C);
}

//----------------------------------------------------------------------------

void LCD_CurOn(void)
{
LCD_WrCmd(0x0E); //0x01 - мигание знакоместа, 0x02 - курсор on
}

//------------------------- Cдвиг курсора влево: -----------------------------

void LCD_CurLeft(void)
{
LCD_WrCmd(0x10);
}

//------------------------- Вывод символа на LCD: ----------------------------

void LCD_Char(char ch)
{
if(ch == 0x10) { LCD_Clear(); return; } //ch = 0x10 - LCD clear
if(ch == '°') {LCD_WrData(0x00); return; } //ch = '°'
else if(ch < 0xC0) LCD_WrData(ch); //ch < 0xC0 - english
else { ch -= 0xC0; LCD_WrData(CharsR[ch]); } //ch >= 0xC0 - russian
}

//------------------ Вывод null-terminated string на LCD: --------------------

void LCD_Str(char __flash *s)
{
char __flash *i;
for(i = s; *i; i++)
LCD_Char(*i);
}

//-------------------- Задержка микросекундного диапазона: -------------------

void Delay_u(int d)
{
d--;
while(d)
{
__delay_cycles(FCLK - 5);
d--;
}
}

//-------------------- Задержка миллисекундного диапазона: -------------------

void Delay_m(int d)
{
while(d)
{
Delay_u(1000); //задержка 1 мС
Rst_Wdt(); //рестарт watchdog-таймера
d--;
}
}


Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru