Изучаю работу с LCD-экранчиками и вот с нуля пишу программку инициализации oled-дисплейчика на кристалле ws0010 в режиме 4bit.
Мучаюсь который день, че-то не получается. С каждой подачей питания на экране то выводятся всякие стрелочки, точечки, то квадратики, бывает вообще ничего нет. Иногда курсор на первой позиции мигающий появляется, бывает так и мигает, а бывает хоп и исчезает. (при инициализации я специально курсор и его блинк вывожу)...
Так вот - подскажите, что я ни так делаю?
Описываю логику инициализации.
В даташите на этот экран в режиме 4bit даются 2 такие схемы.
1 схема2 схемаИз первой схемы узнаем что перед подачей команд нужно подождать 500ms для стабилизации питания.
Из второй схемы, что после паузы в отличие от привычных контроллеров HD44780 этому нужно подать 5 раз сигнал LOW на DB7-DB4.
Итак, что я делаю в инициализации.
Код
1) выставляю пины МК подключенные к DB7-DB4 в output (DDRB = 0b00001111)
2) пины RS, RW, E выставляю в output (DDRD = 0b11100000)
3) на RS, RW, E подаю LOW (PORTD |= 0b00000000)
4) задержка для стабилизации питания _delay_ms(1500);
5) подаю команды как указано в схемах.
А) Подаю на линию данных 0000 (PORTB |= 0b00000000)
команду подаю так:
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0000
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
таких последовательностей подаю 5 раз, как в даташите.
6) делаю небольшую задержку _delay_ms(100);
7) Подаю команды Function Set.
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0010
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0010
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
- DB7-DB4 ставлю в 1000
- E ставлю в 1
_delay_ms(10);
- E ставлю в 0
- функция проверки флага занятости
- RW ставлю в 0
8) Подаю команды Display on
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0000
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
- DB7-DB4 ставлю в 1111
- E ставлю в 1
_delay_ms(10);
- E ставлю в 0
- функция проверки флага занятости
- RW ставлю в 0
9) Подаю команды Entry mode set
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0000
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
- DB7-DB4 ставлю в 0111
- E ставлю в 1
_delay_ms(10);
- E ставлю в 0
- функция проверки флага занятости
- RW ставлю в 0
10) Подаю команды Return home
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0000
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
- DB7-DB4 ставлю в 0010
- E ставлю в 1
_delay_ms(10);
- E ставлю в 0
- функция проверки флага занятости
- RW ставлю в 0
11) Подаю команды Display clear
- RS, RW, E ставлю в 0
- DB7-DB4 ставлю в 0000
- E ставлю в 1
- _delay_ms(10);
- E ставлю в 0
- DB7-DB4 ставлю в 0001
- E ставлю в 1
_delay_ms(10);
- E ставлю в 0
- функция проверки флага занятости
- RW ставлю в 0
конец инициализации
Может я команды неправильно отдаю, флашки не в такой последовательности выставляю?
Насчет функции проверки флага занятости.
Логика такая.
Код
- выставляем порты DB7-DB4 в input
- RS, RW ставлю в 0
- E ставлю в 1
- пауза _nop_(); _delay_ms(5);
- считываю значение порта DB7
int val = ((PIN(PORTB) & _BV(3))==0)?0:1;
#define PIN(x) (*(&x - 2))
- E ставлю в 0
- E ставлю в 1
- _nop_();
- E ставлю в 0
- цикл длится пока while(val!= 0);