Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Вот мой пример инициализации:

Отправлено Леонид Иванович 28 февраля 2009 г. 13:20
В ответ на: hd44780 отправлено пользователем alex_engine 27 февраля 2009 г. 23:48


//Модуль поддержки LCD 2x16, 8-bit mode

//Control signals: LCD_DATA, LCD_E, LCD_RS

#define FCLK 11.0592 //clock frequency, MHz
#define Delay_us(x) __delay_cycles(x * F_CLK + 0.5)

//--------------------------- Переменные: ------------------------------------

char buffer[10]; //массив для хранения BCD-числа

//-------------------------- Прототипы функций: ------------------------------

void LCD_Wr(char d); //write byte to LCD
void LCD_WrCmd(char d); //write command to LCD
void LCD_WrData(char d); //write data to LCD
void Delay_ms(int d); //задержка, мс
void LCD_UsrChr(void); //загрузка символов пользователя
void Int2BCD(int x, char *buff); //преобразование Int2BCD

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

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

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

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_ms(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 port: ---------------------------

void LCD_Port(char d)
{
LCD_DATA = d;
}

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

void LCD_Wr(char d)
{
Port_LCD_W_0; //W <- 0
LCD_Port(d); //LCD port <- data
Port_LCD_E_1; //E <- 1
Delay_us(2); //delay 2 uS
Port_LCD_E_0; //E <- 0
Delay_us(50); //delay 50 uS
}

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

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

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

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

void LCD_Pos(char line, char 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 == 0x0D) { LCD_Pos(2, 1); return; } //ch = 0x0D - перевод строки
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);
}

//----------------------- Вывод текста меню на LCD: --------------------------

void LCD_Menu(char __flash *s)
{
char __flash *i;
LCD_Clear(); //очистка дисплея
LCD_Pos(1, 1); //установка позиции
for(i = s; *i; i++)
{
if(i == s + 16)
LCD_Pos(2, 1);
LCD_Char(*i); //вывод 16-ти символов
}
}

//------------------ Вывод упакованного 2/10-числа на LCD: -------------------

void LCD_2_10(char n)
{
LCD_Char((n >> 4) + 0x30);
LCD_Char((n & 0x0F) + 0x30);
}

//----------------------- Преобразование Int2BCD: ----------------------------

//Преобразование двоичного числа в двоично-десятичное:
//x - входное двоичное число (16 бит, со знаком)
//buff - выходной массив (5 цифр)

void Int2BCD(int x, char *buff)
{
for(char i = 0; i < 5; i++)
buff[i] = 0; //очистка выходного буфера
if(x < 0) x = -x;
for(char i = 0; i < 16; i++) //цикл по количеству входных бит
{
char c = (x >> 15) & 1; //сохранение переноса
x = x << 1; //сдвиг входного числа
for(char p = 0; p < 5; p++) //цикл по количеству цифр
{
char s = buff[p]; //чтение цифры
s = (s << 1) | c; c = 0; //сдвиг с учетом переноса
if(s > 9) { s += 0x06; c = 1; } //коррекция цифры
s &= 0x0F; //выделение ниббла
buff[p] = s; //сохранение цифры
}
}
}

//---------------------- Вывод параметра без знака: --------------------------

//v - значение параметра (0..9999)
//n - количество выводимых цифр (1..4)
//z - признак подавления нулей

void LCD_Param(int v, char d, bool z)
{
Int2BCD(v, buffer); //преобразование числа в формат BCD
char n = d; //максимальное количество пробелов
if(d > 3 && (!z || buffer[3]))
{ LCD_Char(buffer[3] + 0x30); n--; } //вывод разряда 1
if(d > 2 && (!z || buffer[2] || n < d))
{ LCD_Char(buffer[2] + 0x30); n--; } //вывод разряда 2
if(d > 1 && (!z || buffer[1] || n < d))
{ LCD_Char(buffer[1] + 0x30); n--; } //вывод разряда 3
LCD_Char(buffer[0] + 0x30); n--; //вывод разряда 4
for(char i = 0; i < n; i++) LCD_Char(' '); //вывод пробелов
}

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

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

//UsrChr - таблица символов: 8 байт на символ x 8 символов
//Матрица точек 5x8: BYTE1 D4 D3 D2 D1 D0
// BYTE2 D4 D3 D2 D1 D0
// ...
// BYTE8 D4 D3 D2 D1 D0
__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 };



Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 76:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru