Итак, подключаем дисплей WH0802A-YGH-CT к микроконтроллеру
WH0802A – двухстрочный символьный дисплей на 8 знакомест со встроенным управляющим контроллером KS0066.Разбираем назначение выводов дисплея.


Схема подключения дисплея

Начальный код
Цикл записи для 8-ми разрядной шины выглядит следующим образом:
1. Установить RS (0 - команда, 1 – данные)
2. Вывести значение байта данных на шину DB7…DB0
3. Установить E=1
4. Программная задержка 1
5. Установить E=0
6. Программная задержка 2
//подключаем символьный ЖК-дисплей к AVR
#include <ioavr.h>
#include <intrinsics.h>
//порт к которому подключена шина данных ЖКД
#define PORT_DATA PORTD
#define PIN_DATA PIND
#define DDRX_DATA DDRD
//порт к которому подключены управляющие выводы
#define PORT_SIG PORTB
#define PIN_SIG PINB
#define DDRX_SIG DDRB
//номера выводов микроконтроллера
//к которым подключены управляющие выводы ЖКД
#define RS 5
#define RW 6
#define EN 7
//макросы для работы с битами
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))
#define F_CPU 8000000
#define _delay_us(us) __delay_cycles((F_CPU / 1000000) * (us));
#define _delay_ms(ms) __delay_cycles((F_CPU / 1000) * (ms));
void LcdWriteCom(unsigned char data)
{
ClearBit(PORT_SIG, RS); // устанавливаем RS в 0
PORT_DATA = data; // выводим данные на шину
SetBit(PORT_SIG, EN); // устанавливаем Е в 1
_delay_us(2);
ClearBit(PORT_SIG, EN); // устанавливаем Е в 0
_delay_us(40);
{
SetBit(PORT_SIG, RS); //устанавливаем RS в 1
PORT_DATA = data; //выводим данные на шину
SetBit(PORT_SIG, EN); //устанавливаем Е в 1
_delay_us(2);
}
int main( void )
{
while(1);
return 0;
}
Здесь нет сложных мест, все должно быть понятно. Идем дальше.
2. Ждем >40 мс
3. Подаем команду Function set

DL – бит установки разрядности шины
0 – 4 разрядная шина, 1 – 8 разрядная шина
N – бит установки количества строк дисплея
0 – однострочный режим, 1 – двухстрочный режим
F – бит установки шрифта
0 – формат 5*8, 1 – формат 5*11
* - не важно что будет в этих битах
4. Подаем команду Display ON/OFF

D – бит включения/выключения дисплея
0 – дисплей выключен, 1 – дисплей включен
C – бит включения/выключения курсора
0 – курсор выключен, 1 – курсор включен
B – бит включения мерцания
0 – мерцающий курсор включен, 1 – мерцающий курсор выключен
5. Подаем команду Clear Display

6. Ждем > 1,5 ms
7. Подаем команду Entry Mode Set

I/D – порядок увеличения/уменьшения адреса DDRAM(ОЗУ данных дисплея)
0 – курсор движется влево, адрес уменьшается на 1, 1 – курсор движется вправо, адрес увеличивается на 1
SH – порядок сдвига всего дисплея
0 – сдвига нет, 1 – сдвиг происходит согласно сигналу I/D – если он 0 – дисплей сдвигается вправо, 1 – дисплей сдвигается влево
Для нашего примера функция инициализации будет выглядеть так
_delay_ms(40);
LcdWriteCom(0x38); //0b00111000 - 8 разрядная шина, 2 строки
LcdWriteCom(0x0f); //0b00001111 - дисплей, курсор, мерцание включены
LcdWriteCom(0x01); //0b00000001 - очистка дисплея
_delay_ms(2);
LcdWriteCom(0x06); //0b00000110 - курсор движется вправо, сдвига нет
}
Теперь у нас есть необходимый минимум, чтобы начать работу с дисплеем. Выведем на него слово "Test."
//собственно наша программа
int main( void )
{
InitLcd();
LcdWriteData('T');
LcdWriteData('e');
LcdWriteData('s');
LcdWriteData('t');
LcdWriteData('.');
while(1);
return 0;
}
Первые результаты мы получили. Доводить программу до ума будем в следующих статьях.


[code] [/code]