WiseLord писал(а):Send_Nibble(0x0C); - не совсем понятно это. Почему 0x0C? Нестандартный (не 5x8 символы) дисплей? По идее, 1) там должно быть 0x08, 2) прямо перед этим ещё одно 0x02, уже в 4-х битном режиме, ранее установленном.
1) В любом случае, дело не в этом (пробовал и с 0, и с 1).
2) Потому что этот нибл УЖЕ стоит на шине. Остается лишь дать ему повторный строб.
Добавлено after 1 hour 29 minutes 3 seconds:
ps. Дисплей и схема рабочие: проверено стандартной микропаскалевской библиотекой LCD.
program LCD_test;
uses
ULCD;
var
ULCD_RS : sbit at PORTC4_bit;
ULCD_EN : sbit at PORTC5_bit;
ULCD_D4 : sbit at PORTD4_bit;
ULCD_D5 : sbit at PORTD5_bit;
ULCD_D6 : sbit at PORTD6_bit;
ULCD_D7 : sbit at PORTD7_bit;
ULCD_RS_Direction : sbit at DDC4_bit;
ULCD_EN_Direction : sbit at DDC5_bit;
ULCD_D4_Direction : sbit at DDD4_bit;
ULCD_D5_Direction : sbit at DDD5_bit;
ULCD_D6_Direction : sbit at DDD6_bit;
ULCD_D7_Direction : sbit at DDD7_bit;
begin
ULCD_Init;
end.
Проверка: если ULCD_ заменяем на LCD_ (обращаемся к стандартной библиотеке), то всё работает.
Не могу понять, в чем именно затык. Формально код ULCD_Init корректен. На практике – не работает.
Плохо знаю паскаль, но на все другие языки он все равно похож. Однако, лень разгребать. У вас процедурка описана Send_Nibble, в которой уже указано, что строб надо дергать. Потом в тексте у вас задержка на 5 мсек и опять строб?
Не помню сейчас полной его инициализации, может там лишнее чего?
Плохо знаю паскаль, но на все другие языки он все равно похож. Однако, лень разгребать. У вас процедурка описана Send_Nibble, в которой уже указано, что строб надо дергать. Потом в тексте у вас задержка на 5 мсек и опять строб?
Не помню сейчас полной его инициализации, может там лишнее чего?
Потому, что нужный нибл уже стоит на шине.
Лишнего вроде бы ничего нет. Но может глаз замылился. Поэтому и прошу помощи.
Не знаю.
Я бы все равно, сначала сконфигурировал все порты и сбросил их в ноль.
Потом бы уже дал начальную задержку.
Потом уже выставил в порт 0011 (и убедился, что они стоят именно на DB7-DB4
Затем три строба с задержкой между ними в 10-15 милисек.
Затем команду для переключения на 4 линии 0010
Потом строб и еще такую же задержку.
Затем вторую тетраду этой команды (4 лини и две строки)
// Разрядность 4
Send_Nibble(0x02); Отправляем старший полубайт. Он его проглатывает.
Delay_us(40);
// Разрядность 4 и параметры (2 строки, дисплей включен)
Strobe_EN; Снова старший полубайт
Send_Nibble(0x0C); Здесь я отправляю команду 1000 (0х08)
Delay_us(40);
Для очистки дисплея отправляю команду 00000001 , т.е. по вашему будет 0х00 и 0х01
После них сразу длиииинннааааая задержка, т.к. чистится он долго
Потом установка режима ВЫВОда данных 00000110, т.е. 0х00 и 0х06
После уже включаю дисплей (курсор погашен) 0b00001100, т.е. 0х00 и 0х0С
Gudd-Head писал(а):Кстати, для OLED контроллера WS0010 вообще не нужны задержки
Только после подачи питания и очистки дисплея.
Это справедливо для любых версий? Просто есть несколько штук из первого выпуска, отметившегося своей неполной совместимостью по инициализации. И на них проскакивают горизонтальные полоски при дефолтных таймингах HD44780.
Сходу:
1 Вы как-то очень уж вольно обращаетесь с портом. Похоже, стробом стираете данные.
2 Не увидел включения дисплея в инсталяторе. (0х0С).
3 Зачем манипулируете DDRD в функции Write_Command?
ARV, СКАЗОЧНИК прав, имхо. На полуфабрикатах, шеф поваром не станешь. К тому же чужие коды либо избыточны, в угоду универсальности, либо напротив - слишком узконаправлены. Вытащить из них и применить нужный "сакрал", без некоторого опыта, слабо реально.