
Народ долгое время собирал информацию по данному дисплею. На фото изображен модуль на котором разводка сделана 4 битной.
Долго мучился с его инициализацией, и когда вроде бы в протеусе все заработало, на живой железки обнаружилась проблема с повторной инициализацией. После нажатия на кнопку сброса контролера на дисплее был мусор.
В итоге хочу предложить вам код для AVR STUDIO 6.(0-2) 100% рабочий для данного дисплея. Не боящийся повторной инициализации. Соответственно в режиме 4 бита, код совместим с модулем ARDUINO UNO R3 (ATMEGA328)
Не забываем подключить стандартные библиотеки
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
Готовим имена.
Код: Выделить всё
#define RS_ENABLE PORTB |= (1 << 0) // Пин RS
#define RS_DISABLE PORTB &=~ (1 << 0) //
#define E_ENABLE PORTB |= (1 << 1) // Пин E
#define E_DISABLE PORTB &=~ (1 << 1) //
#define LCD_PORT PORTD
Функции для работы с дисплеем.
Код: Выделить всё
void LCD_INIT()
{
RS_DISABLE;
LCD_WRITE_NIBBLE(0b00110000); // 0_0_1_DL_N_F_0_0 (0010 N(0-1на строка, 1-2ве строки)000) 00101000
LCD_WRITE_NIBBLE(0b00110000);
LCD_WRITE_NIBBLE(0b00110000);
LCD_WRITE_NIBBLE(0b00100000);
LCD_WRITE_DATA(0b00000001); // очистка дисплея
LCD_WRITE_DATA(0b00101000);
LCD_WRITE_DATA(0b00001000); // полное выключение дисплея
LCD_WRITE_DATA(0b00000100); // сдвиг курсора отключен
LCD_WRITE_DATA(0b00001100); // включение дисплея
RS_ENABLE;
}
// ЗАПИСЬ ПОЛУБАЙТА
void LCD_WRITE_NIBBLE(unsigned char TEMP_NIBBLE) {
PORTD |= TEMP_NIBBLE; // запись в порт
_delay_ms(2);
E_ENABLE;
_delay_ms(4);
E_DISABLE;
_delay_ms(2);
PORTD &= ~(TEMP_NIBBLE);
_delay_ms(2);
}
// ФУНКЦИЯ ОТПРАВКИ СИМВОЛА
void LCD_WRITE_CHAR(unsigned char TEMP_WRITE_CHAR) {
RS_ENABLE;
LCD_WRITE_DATA(TEMP_WRITE_CHAR);
}
// ФУНКЦИЯ ОТПРАВКИ КОМАНДЫ
void LCD_WRITE_CMD(unsigned char TEMP_WRITE_CMD) {
RS_DISABLE;
LCD_WRITE_DATA(TEMP_WRITE_CMD);
RS_ENABLE;
}
// ЗАПИСЬ В ПОРТ КОММАНДЫ ИЛИ ДАННЫХ (ОПРЕДЕЛЯЕТСЯ RS), используется в LCD_WRITE_CHAR и LCD_WRITE_CMD
void LCD_WRITE_DATA(unsigned char TEMP_WRITE_DATA) {
LCD_WRITE_NIBBLE(TEMP_WRITE_DATA & 0xF0); // старшый полубайт
LCD_WRITE_NIBBLE(TEMP_WRITE_DATA << 4); //младший полубайт
}
void LCD_OFF() {
LCD_WRITE_CMD(0b00001000);
}
void LCD_ON() {
LCD_WRITE_CMD(0b00001100);
}
// Установка курсора, КУРСОР НЕ СДВИГАЕТСЯ!!! так настроено при инициализации. LINE = 0 - первая строка, 1 - вторая строка.
void LCD_SET_CURSOR(unsigned char LINE, unsigned char POS) {
POS |= 0b10000000;
if (LINE == 0x01)
{
POS |= 0x40;
}
LCD_WRITE_CMD(POS);
}
P.S. На данном модуле есть управление подсветкой что для меня было сюрпризом) т.к. на схеме этого не было, установлен транзистор на катоде подсветки.
можно управлять так:
Код: Выделить всё
#define BACKLIGHT_ENABLE PORTB |= (1 << 2) // Пин подсветки
#define BACKLIGHT_DISABLE PORTB &=~ (1 << 2) //
ну там вам решать вкл\выкл или замутить шим для регулировки яркости.