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 КБ) 252 скачивания
Может я в чём-то и не прав, но это моё мнение
- Реклама
-
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);
И еще, не видно команды 0b000011xx , которая включает дисплей.
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18556
- Зарегистрирован: Чт дек 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 КБ) 211 скачиваний
Может я в чём-то и не прав, но это моё мнение
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
-
BerZerK-ku
- Мучитель микросхем
- Сообщения: 492
- Зарегистрирован: Вт июл 22, 2008 08:10:54
Чушь полная... 3-ы в начале надо выставить 8-и битный режим. что и сделано в программе.Pooher писал(а):Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Почему программа работает в пошаговом режиме и не работает в авто... А черт ее знает ) Сам никогда не пользовался считыванием данных с дисплея, длительность выполнения команды считаю таймером.
- Anjey_N
- Первый раз сказал Мяу!
- Сообщения: 28
- Зарегистрирован: Сб ноя 03, 2007 20:15:42
- Откуда: Энергодар, Украина
Индикатор физически подключён, я применяю JTAG.Pooher писал(а):Если Вы имеете в виду, что программа виснет при эмуляции, то это так и должно быть. Ведь индикатор "физически" не подключен, соответственно на выводе не может установиться нужный логический уровень.
Кстати, говорить что программа "виснет" в этом случае неправильно. Программа зацикливается на ожидании готовности индикатора.
Может я в чём-то и не прав, но это моё мнение
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Не погорячились??? (см. вложение 2)Pooher писал(а):
Команда перехода в 4-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Чушь полная...
см. вложение 1.Может пред выдачей команды не опрашивать бит BF?
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
-
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-х битный режим должна посылаться как минимум три раза. Читайте даташиты.
Полный пипеутз.



