Работа с ЖКИ на контроллере HD44780 и его аналогах
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Проект делал в авр студии 4.19 + Atmel AVR 8-bit Toolchain 3.4.4
там же и протеус файл
- Реклама
Здравствуйте товарищи коты
При работе с дисплеем WH1602B (hd44780) у меня иногда возникают сбои, приводящие к выводу на дисплей каши и невозможности вывода на дисплей "нормальных" символов.
Решил лечить это переинициализацией дисплея, в случае, если в одной из точек экрана будет "левый" символ.
Заглох на моменте чтения дисплея...
Использую 4х проводной режим. Вот мой код:
на экран вывожу символы "1234567890" и пытаюсь их считать. ожидаю 0x30, 0x31, 0x32... Вижу - 58, 58, 58, 58...42...74....42,42,42,42.
Может не из той области памяти читаю?
При работе с дисплеем WH1602B (hd44780) у меня иногда возникают сбои, приводящие к выводу на дисплей каши и невозможности вывода на дисплей "нормальных" символов.
Решил лечить это переинициализацией дисплея, в случае, если в одной из точек экрана будет "левый" символ.
Заглох на моменте чтения дисплея...
Использую 4х проводной режим. Вот мой код:
Код: Выделить всё
void lcd_read(void) {
lcd_com(0x80);
GPIO_InitTypeDef PORT;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
PORT.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
PORT.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &PORT);
for (uint8_t i = 0x00; i < 255; i++) { // каждое чтение должно происходить из след. адреса
GPIO_SetBits(GPIOC, RS);
LCD_READ(); // RW == 1
uint32_t temp = 0;
delay_us(1);
GPIO_SetBits(GPIOC, E);
delay_us(100);
temp = GPIO_ReadInputData(GPIOD) & 0xF0;
GPIO_ResetBits(GPIOC, E);
delay_us(1);
GPIO_SetBits(GPIOC, E);
delay_us(100);
temp += GPIO_ReadInputData(GPIOD) & 0x0F;
GPIO_ResetBits(GPIOC, E);
LCD_WRITE();
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
PORT.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
PORT.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &PORT);
}Может не из той области памяти читаю?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
--------------------------
Пишу на Си за еду
Каша возникает видимо из-за того что контроллер переключается на другой размер символов, а матрица ведь другая. Поэтому даже в случае траблов ты считаешь то же самое что и в обычном режиме. Просто вместо вывода символов 8x8 контроллер будет думать что к нему подключена матрица 16x11 но физически она ведь разведена совсем по-другому, поэтому и вываливается мусор. Лучеш просто инициализируй дисплей при переключении режимов работы устройства, раз в минуту и т.п.
Здравствуйте подскажите пожалуйста что с дисплеем?
отображает только по 8 символов в каждой строке дальше непонятные потемнения
неужели дисплей умер? заранее спасибо
отображает только по 8 символов в каждой строке дальше непонятные потемнения
неужели дисплей умер? заранее спасибо
- Вложения
-
- Фото0092.jpg
- фото
- (133.37 КБ) 293 скачивания
переинициализировать в процессе работы напряжно, у меня не предусмотрено памяти на сообщение на дисплее, сообщения формируются довольно развратным способом, дисплей рефрешится редко, в основном сообщения частично перетирают старые. исторически так сложилось =) хотя можно и переделать.Alexeyslav писал(а):Каша возникает видимо из-за того что контроллер переключается на другой размер символов, а матрица ведь другая. Поэтому даже в случае траблов ты считаешь то же самое что и в обычном режиме. Просто вместо вывода символов 8x8 контроллер будет думать что к нему подключена матрица 16x11 но физически она ведь разведена совсем по-другому, поэтому и вываливается мусор. Лучеш просто инициализируй дисплей при переключении режимов работы устройства, раз в минуту и т.п.
а нельзя ли вычитывать из дисплея его настройки?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
--------------------------
Пишу на Си за еду
- Реклама
думаю, что умер. ну или где-то непропай в самом дисплее. пожалуй, будет дешевле дисплей поменять, чем искать неисправностьsklw35 писал(а):Здравствуйте подскажите пожалуйста что с дисплеем?
отображает только по 8 символов в каждой строке дальше непонятные потемнения
неужели дисплей умер? заранее спасибо
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
--------------------------
Пишу на Си за еду
Благодарю за ответ, еще хотел бы узнать причина не может быть в МК именно в самом дисплее? у меня два LCD отображают только половину, до этого пару дней назад все ок отображалось.slavokhire5 писал(а):думаю, что умер. ну или где-то непропай в самом дисплее. пожалуй, будет дешевле дисплей поменять, чем искать неисправностьsklw35 писал(а):Здравствуйте подскажите пожалуйста что с дисплеем?
отображает только по 8 символов в каждой строке дальше непонятные потемнения
неужели дисплей умер? заранее спасибо
sklw35 , в МК - маловероятно. Проверьте питалово. Может повышенное напряжение подаете, или в плате какой-то косяк. ну или дисплеи сильно китайские )
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
--------------------------
Пишу на Си за еду
а прошивку вы за последние 2 недели не меняли? сделайте тестовую прошивку, которая просто выведет 16 букв в каждую строку и больше ничего.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Прошивку не менял на тестовой вот чтоARV писал(а):а прошивку вы за последние 2 недели не меняли? сделайте тестовую прошивку, которая просто выведет 16 букв в каждую строку и больше ничего.
- Вложения
-
- Фото0093.jpg
- (195.76 КБ) 526 скачиваний
Всем доброго времени суток! Пытаюсь работать с hd44780 на pic16f876A. Помогите пожалуйста с выводом символа на дисплей. Пишу прогу на асме, использую 4х битный режим вывода данных. Хочу для начала просто вывести один любой символ на дисплей. В даташите на дисплей в последовательности вывода данных есть такие пункты:
вывести значение старшей тетрады байта данных на линии шины DB4...DB7,
затем есть пункт:
вывести значение младшей тетрады байта данных на линии шины DB4...DB7.
Как правильно вывести эти тетрады? Есть ли алгоритм их вывода? В кодах, которые я встречал используются и логические "И" и "ИЛИ" для чего? почему нельзя вывести напрямую полубайт в порт?????
Приведу один из кусоков кода, которые я пытаюсь понять:
вывести значение старшей тетрады байта данных на линии шины DB4...DB7,
затем есть пункт:
вывести значение младшей тетрады байта данных на линии шины DB4...DB7.
Как правильно вывести эти тетрады? Есть ли алгоритм их вывода? В кодах, которые я встречал используются и логические "И" и "ИЛИ" для чего? почему нельзя вывести напрямую полубайт в порт?????
Приведу один из кусоков кода, которые я пытаюсь понять:
Код: Выделить всё
МОДУЛЬ ЗАПИСИ КОДА КОМАНД И ДАННЫХ LCD
;==========
Lcd_A
bcf PORTB,RS ;запись в дисплей кода команды
goto Lcd1
Lcd_D
bsf PORTB,RS ;запись в дисплей кода символа
Lcd1
movwf lcd
movlw b'11110000'
andwf PORTB,f ;очистить RB0...RB3 PORTB
swapf lcd,w
andlw b'00001111' ; ОЧистили в акб старший полубайт
iorwf PORTB,f ;старший полубайт в PORTB
bsf PORTB,E
bcf PORTB,E
movlw b'11110000'
andwf PORTB,f ;очистить RB0...RB3 PORTB
movf lcd,W
andlw b'00001111'
iorwf PORTB,f ;младший полубайт в PORTB
bsf PORTB,E
bcf PORTB,E
clrf PORTB
call Del_2ms
returnА почему нельзя, кто не дает вывести полубайт в порт?
Дело в том, что в моей голове посеяли смуту все те коды, что я видел - там просто так значение в порт не выводится
, а все через логические операции. В выше приведенном коде значение полубайта почем-то выводится посредством логического "ИЛИ" -
" iorwf PORTB,f ;старший полубайт в PORTB"
почему именно так?
" iorwf PORTB,f ;старший полубайт в PORTB"
почему именно так?
А как по вашему надо было? Предложите конструкцию как можно затронуть только 4 бита порта без логических функций? да чтобы без лишних действий, зачем же усложнять работу... можно ведь и тупо биты дёргать напрямую, только конструкция получится ой-йоооо.
Изучите систему команд своего микроконтроллера и подумайте, как можно это сделать.Serhio писал(а):почему нельзя вывести напрямую полубайт в порт?????
Если считаете, что можно будет обойтись без всяких лог. операций - можете предложить тут свой вариант.
Хранить один символ в двух байтахАlex писал(а):Если считаете, что можно будет обойтись без всяких лог. операций - можете предложить тут свой вариант.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аlex писал(а):Изучите систему команд своего микроконтроллера и подумайте, как можно это сделать.Serhio писал(а):почему нельзя вывести напрямую полубайт в порт?????
Если считаете, что можно будет обойтись без всяких лог. операций - можете предложить тут свой вариант.
С командами мк нет проблем - они достаточно подробно описаны в литературе. У меня вызывает затруднения сам алгоритм вывода старшей и младшей тетрад. Например мне непонятно следующие:
movlw b'11110000'
andwf PORTB,f ;очистить RB0...RB3 PORTB
зачем мы надладываем эту маску на порт B? То есть понятно что чтобы сбросить RB0...RB3. А вот зачем мы их сбрасываем я не совсем понимаю?
Ну и попутно тогда вопрос - нельзя ли просто записать в порт В значения с очищеными битами RB0...RB3?
Дык, сбрасывается чтобы не попортить работу остальных 4-х бит порта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
не совсем понял Вас
. Можно пожалуйста поподробнее)))
можно, если мы знаем состояние битов RB4...RB7. а когда не знаем, мы должны гарантировать, что их состояние не изменится.Serhio писал(а):Ну и попутно тогда вопрос - нельзя ли просто записать в порт В значения с очищеными битами RB0...RB3?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


