LCD - индикатор, проблемы
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
LCD - индикатор, проблемы
Привет! Не спешите меня футболить или стирать мой вопрос, как это сделали на форуме ELECTRONIX.ru .
Я пытаюсь запустить WinStar 1602. Прочитал много исходников, даташитов, наваял свою прогу инициализации. Только индикатор не переходит на 2 строки, остаётся на одной. Может посмотрите мой код, подскажите, где я ошибся. Там 3 файла: lcd.c lcd.h delay.h Пишу на Си
Я пытаюсь запустить WinStar 1602. Прочитал много исходников, даташитов, наваял свою прогу инициализации. Только индикатор не переходит на 2 строки, остаётся на одной. Может посмотрите мой код, подскажите, где я ошибся. Там 3 файла: lcd.c lcd.h delay.h Пишу на Си
- Вложения
-
- LCD_Clock.rar
- (1.61 КБ) 249 скачиваний
Может я в чём-то и не прав, но это моё мнение
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Хм... а у вас вообще что-то на экран выводится?
Мои сомнения на счет вашей инициализации:
Верхняя строчка закоментирована зря, т.к. при посылке команды 0х28 LCD дисплей работает еще на 8-и битной шине, и потому скорее всего посылка младшей тетрады будет проигнорирована.
И еще, не видно команды 0b000011xx , которая включает дисплей.
Мои сомнения на счет вашей инициализации:
Код: Выделить всё
// SendDisplay(0x20,COMMAND);
// Выбор 4-разрядной шины данных, 2 строки на дисплее, шрифт 5х8
WaitEndBusy(); // ждём снятие с-ла "Занято"
SendDisplay(0x28,COMMAND);
WaitEndBusy(); // ждём снятие с-ла "Занято"
SendDisplay(0x08,COMMAND);
WaitEndBusy(); // ждём снятие с-ла "Занято"
SendDisplay(0x01,COMMAND);
WaitEndBusy(); // ждём снятие с-ла "Занято"
SendDisplay(0x06,COMMAND);
WaitEndBusy(); // ждём снятие с-ла "Занято"
SendDisplay(0x14,COMMAND);
WaitEndBusy(); // ждём снятие с-ла "Занято"
SendDisplay(0x31,DATA);
Верхняя строчка закоментирована зря, т.к. при посылке команды 0х28 LCD дисплей работает еще на 8-и битной шине, и потому скорее всего посылка младшей тетрады будет проигнорирована.
И еще, не видно команды 0b000011xx , которая включает дисплей.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
а еще лучше - пользуйтесь готовыми библиотеками. я для WinAVR нашел отличную библиотеку - сам пользуюсь и горя не знаю! элементарно находится поиском (кстати, в комплекте с библиотекой i2c и 1-wire)Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
Вы совершенно правы. я пропустил в подпрограмме инициализации 1 команду. Сейчас я переделал свой код, сделал подключение индикатора короткими проводами и индикатор ожил. Можно выводить сообщения на обе строки. Но программа работает только пошагово, а когда её запускаешь в автоматическом режиме, то виснет на опросе сигнала BF (окончание сигнала ЗАНЯТО). Посмотрите, пожалуйста, код!
- Вложения
-
- LCD_Clock.rar
- (2.69 КБ) 210 скачиваний
Может я в чём-то и не прав, но это моё мнение
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Чушь полная... 3-ы в начале надо выставить 8-и битный режим. что и сделано в программе.
Почему программа работает в пошаговом режиме и не работает в авто... А черт ее знает ) Сам никогда не пользовался считыванием данных с дисплея, длительность выполнения команды считаю таймером.
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
Pooher писал(а):Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Индикатор физически подключён, я применяю JTAG.
Может я в чём-то и не прав, но это моё мнение
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Pooher писал(а):
Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Чушь полная...
Не погорячились??? (см. вложение 2)
Может пред выдачей команды не опрашивать бит BF?
см. вложение 1.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Pooher писал(а):Не погорячились??? (см. вложение 2)
Нет, чушь она и есть чушь.
В ваших вложениях приведена нормальная инициализация, как раз так и сделано у автора данного поста. Где вы нашли на своих вложениях тройную инициализацию 4-х битного режима??? или вы намекаете что производитель врет и команда 0х30 это не включение 8-и битного режима???
К автору поста. В каком месте у вас зависает программа? при инициализации на первом же send_command(LCD_4_BUS_MODE); ? Если да, то проблема может быть связана с тем, что в данный момент индикатор еще находится в 8-и битном режиме.
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
К автору поста. В каком месте у вас зависает программа? при инициализации на первом же send_command(LCD_4_BUS_MODE); ? Если да, то проблема может быть связана с тем, что в данный момент индикатор еще находится в 8-и битном режиме.[/quote]
Да, сначала зависание происходило на первом send_command(LCD_4_BUS_MODE). я её заменил на write_byte(LCD_4_BUS_MODE) и последующую send_command(LCD_4_BUS_MODE | LCD_2_LINE | LCD_5x8CHAR) тоже заменил на write_byte. Зависать стало дальше, там где опрашивается бит BF.
Да, сначала зависание происходило на первом send_command(LCD_4_BUS_MODE). я её заменил на write_byte(LCD_4_BUS_MODE) и последующую send_command(LCD_4_BUS_MODE | LCD_2_LINE | LCD_5x8CHAR) тоже заменил на write_byte. Зависать стало дальше, там где опрашивается бит BF.
Может я в чём-то и не прав, но это моё мнение
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Ваши последние замечания подкинули данных, вообщем проблема зарыта в функциях wait_end_busy и read_byte. Сделайте вот так, и все должно заработать без задержек

Код: Выделить всё
void wait_end_busy(void)
{
unsigned char d;
DEFAULT;
do{
SET_RW; // будем читать
CLR_RS; // команду
d = read_byte();
}while(TESTBIT(d,BF));
}
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
Да, Вы правы!
Я сделал так как Вы указали и убрал задержку из write_byte - всё работает!
Тогда у меня ещё вопрос. Например я хочу выводить в первой строке показания часов. ЧЧ-ММ-СС. Мне нужно каждую секунду выводить всю строку или нарисовать один раз кадр: __ --__--__, а потом выводить раз в секунду значения секунд, раз в минуту значения минут ну и т.д. на указанное место?
Я сделал так как Вы указали и убрал задержку из write_byte - всё работает!
Тогда у меня ещё вопрос. Например я хочу выводить в первой строке показания часов. ЧЧ-ММ-СС. Мне нужно каждую секунду выводить всю строку или нарисовать один раз кадр: __ --__--__, а потом выводить раз в секунду значения секунд, раз в минуту значения минут ну и т.д. на указанное место?
Может я в чём-то и не прав, но это моё мнение
- Pippeytz
- Потрогал лапой паяльник
- Сообщения: 396
- Зарегистрирован: Ср май 28, 2008 19:30:31
- Откуда: Донецк
- Контактная информация:
ARV писал(а):а еще лучше - пользуйтесь готовыми библиотеками. я для WinAVR нашел отличную библиотеку - сам пользуюсь и горя не знаю! элементарно находится поиском (кстати, в комплекте с библиотекой i2c и 1-wire)Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Обматерился, но не нашл ее. Неплохо было бы на нее поглядеть
Полный пипеутз.
