Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/56: Рейтинг темы: голосов - 56, средняя оценка - 4.91
Sosho85ru
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
1

Подключение WH1602B

15.10.2011, 03:15. Просмотров 10060. Ответов 7
Метки нет (Все метки)

в одном примере на IAR для STM32 есть библиотека. http://eugenemcu.ru/article/STM32/STM32 ... cu_iar.rar Мой компилятор с CooCox.
В этой библиотки есть функция
Код
u8 LCD_DAT (u8 DAT) // Запись данных в LCD.
{
spin_m (LCD_D_PORT,((DAT>>4)<<LCD_D_SHIFT)); // Установить единичные биты старшей тетрады.
spin_m (LCD_C_PORT,1<<LCD_EN|1<<LCD_CD); // LCD_EN=1, LCD_CD=1.
Delay_ms(39);
cpin_m (LCD_C_PORT,1<<LCD_EN); // LCD_EN=0.
cpin_m (LCD_D_PORT,LCD_D_MASK); // Сбросить биты шины данных.
spin_m (LCD_D_PORT,((DAT&0x0F)<<LCD_D_SHIFT)); // Установить единичные биты младшей тетрады.
Delay_ms(39);
spin_m (LCD_C_PORT,1<<LCD_EN|1<<LCD_CD); // LCD_EN=1, LCD_CD=1.
Delay_ms(39);
cpin_m (LCD_C_PORT,1<<LCD_EN|1<<LCD_RW|1<<LCD_CD); // Сбросить биты управления.
cpin_m (LCD_D_PORT,LCD_D_MASK); // Сбросить биты шины данных.
while (((1<<7)&(LCD_READ()))){} // Ожидание готовности LCD.
return DAT;
}
Код
#define  SYSCLK_FREQ        8000000
#define  NUM_OF_LINE        2   // Число строк LCD.
#define  CHAR_IN_LINE       16  // Число символов в строке строк LCD.
#define  LCD_C_PORT         PORTC // Порт управляющих сигналов CD, RW, EN.
#define  LCD_CD             10 // Сигнал CD команда/данные.
#define  LCD_RW             11 // Сигнал RW чтение/запись.
#define  LCD_EN             12  // Сигнал EN разрешения данных на шине.
#define  LCD_D_PORT         PORTA // Порт шины данных
#define  LCD_D_SHIFT        0 // Смещение от начала порта до шины данных.
#define  LCD_D_MASK         0x0FUL<<LCD_D_SHIFT // Маска шины данных.
#define  ON                 1 // Значение константы "Включено".
#define  OFF                0 // Значение константы "Выключено".
в этой функции мне не понятна конструкция вида
Код
((CMD&0x0F)<<LCD_D_SHIFT)); // Установить единичные биты младшей тетрады.
Эту библиотеку я переделываю, так как с моим лсд она глючит, вот пытаюсь разобратся с этими функциями.

Ни как не хочет убиратся курсор.
Вот моя инициализация.
Код
Delay_ms(39);
LCD_CMD (0b0010);//function set
LCD_CMD (0b0010);
LCD_CMD (0b1100);

Delay_ms(39);
LCD_CMD(0b0000);// Dysplay ON/OFF control
LCD_CMD(0x1111);

Delay_ms(39);
LCD_CMD (0b0000); // Очистить дисплей.
LCD_CMD (0b0001);

Delay_ms(2);
LCD_CMD(0b0000);//entry mode set
LCD_CMD(0b0101);
А вот сама LCD_CMD();
Код
void LCD_CMD (u32 CMD) // Передача команды LCD.
{

Delay_ms(39);
spin_m (LCD_C_PORT,1<<LCD_EN); // LCD_EN=1.
Delay_ms(39);
cpin_m (LCD_C_PORT,1<<LCD_EN); // LCD_EN=0.
cpin_m (LCD_D_PORT,LCD_D_MASK); // Сбросить биты шины данных.
spin_m (LCD_D_PORT,((CMD&0x0F)<<LCD_D_SHIFT)); // Установить единичные биты младшей тетрады.
Delay_ms(39);
spin_m (LCD_C_PORT,1<<LCD_EN); // LCD_EN=1.
Delay_ms(39);
cpin_m (LCD_C_PORT,1<<LCD_EN|1<<LCD_RW|1<<LCD_CD); // Сбросить биты управления.
cpin_m (LCD_D_PORT,LCD_D_MASK); // Сбросить биты шины данных.
spin_m (LCD_D_PORT,((CMD>>4)<<LCD_D_SHIFT)); // Установить единичные биты старшей тетрады.
//while (((1<<7)&(LCD_READ()))){} // Ожидание готовности LCD.
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2011, 03:15
Ответы с готовыми решениями:

Инициализация LCD WH1602B [stm32f4]
Помогите с инициализацией LCD на wh1602 Работаю с stm32f4 discovery Вот код: #include...

Подключение LCD WH1602B-YYH-CTK к Atmega16
Здравствуйте. Никак не могу связать LCD c микроконтроллером. Перелопатил кучу форумов, разобрался в...

LCD WH1602B
Здравствуйте! Помогите пожалуйста найти ошибку в коде. Только начал изучать программирование МК,...

Проблема с дисплеем WH1602B-REI-CTV#
Хочу задействовать очень красивый дисплейчик (он светит красными цифрами а-ля олдскульный...

Hello World на символьном ЖКИ WH1602B (ATMega32)
Добрый день, программатор AVRISP-MKII, AT90usb162, AVRStudio 5(beta) ATMega32 LCD - wh1602B ...

7
soumt_imobti
0 / 0 / 0
Регистрация: 21.08.2011
Сообщений: 1,057
15.10.2011, 17:28 2
А в чем, собственно, вопрос?
Пример написан с применением библиотеки СОХ. Благо это или зло-решать тебе. Я использую, если есть готовый код. Переписывается на SPL за час.
Конструкция "((CMD&0x0F)<<LCD_D_SHIFT));" - это установка через битовую маску, где LCD_D_SHIFT- смещение битов данных.
0
Sosho85ru
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
22.10.2011, 04:59 3
Почему первый вызов функции с выводит на экран 3 вертикальные полосы? последующие вызовы, допустим 0x77, выводят "w". Кстати, ещё кодировка символов не совпадает ни с одни даташитом, всё перепроверил... может ещё где косяк.
Код
void Lcd_write_data(uint8_t data)
{
Init_pin_out();
rs_1;
rw_0;
e_1;
Delay_ms(3);
GPIO_Write(port,((data>>4)<<lcd_shift)); // старшая тетрада //[b]После этой строчки происходит отправка кракозябры[/b]
e_0;
Delay_ms(3);
e_1;
Delay_ms(3);
GPIO_Write(port,((data&0x0F)<<lcd_shift));// младшая тетрада
e_0;
и на всякий случай инициализация. ks0066
Код
void Init_lcd()
{
Init_pin_out();

Delay_ms(30);
Lcd_write_cmd(0b0010);
Lcd_write_cmd(0b0010);
Lcd_write_cmd(Function_set);
Delay_ms(39);

Lcd_write_cmd(0b0000);
Lcd_write_cmd(Dysplay_on_off_control);
Delay_ms(39);

Lcd_write_cmd(0b0000);
Lcd_write_cmd(Dysplay_clear);
Delay_ms(2);

Lcd_write_cmd(0b0000);
Lcd_write_cmd(Entry_mode_set);

}
а ещё какой глюк, после резета дислпей инициализируется через раз или через 10 раз, но после сброса питания с первого раза.

GPIO_Write(port,((data>>4)<<lcd_shift)); // старшая тетрада //После этой строчки происходит отправка кракозябры

толи в 4 битный режим не переходит, толи отправка по 4 бита какая-то выгнутая
0
tixomit
0 / 0 / 0
Регистрация: 27.03.2011
Сообщений: 127
22.10.2011, 19:29 4
Тайминги не верные, нужно с ними играться. У меня код от LCD1602 не подходит на LCD2004 без переделок задержек, хотя, контроллер на LCD один и тот же.
0
22.10.2011, 19:29
Sosho85ru
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
24.10.2011, 07:39 5
Вот я долбень, посмотрел чужой исходник, там выставления старшей тетрады происходит до дрыгания e_o и e_1. А у меня вместо старашей отправлялась младшая тетрада, а старшая была 0x0, потом в старшею тетраду следующего символа заносилась младшая тетрада предыдущего символа, отсюда не совпадение кодировке.

E=1
Пауза
Выставили в порт старшую тетраду
E=0
Пауза
Е=1
Пауза
Выставили в порт младшую тетраду
Е=0
http://iosyitistromyss.ru/avr-uchebnyj- ... 44780.html
Получается что эта конструкция с урока DY HOTTa не подходит к моему дисплею.

http://eugenemcu.ru/article/STM32/STM32 ... cu_iar.rar - подсмотренный исходник тут

Люди спят а и не ложился ещё... днём мне поковырять хобби не дадут...

А можно забить на ожидание готовности? Вместо этого задержку вставить?
Теперь надо сделать перекодировку символов.
0
DymomVYP
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 163
24.10.2011, 11:16 6
Цитата Сообщение от Sosho85ru
А можно забить на ожидание готовности? Вместо этого задержку вставить?
Теперь надо сделать перекодировку символов.
Можно и забить, но использование задержек не самый лучший вариант.
Про какую перекодировку идет речь? Если на русский, потерпи до вечера - скину.
0
Sosho85ru
0 / 0 / 0
Регистрация: 24.07.2010
Сообщений: 286
27.10.2011, 21:23 7
Обновите Repository CooCox, залил туда пример работы с WH1602B, правда кривой(но работает). И пара функции используются в ней не мои. (Lcd_goto и вывод русских символов)
0
risiorsh
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 118
23.07.2014, 17:39 8
Лучше бы не постили ничего в репозиторий. Ища библиотечку для индикатора, напоролся на этот "шедевр".

не быть голословным:

Код
void Lcd_write_data(uint8_t data)
{
Init_pin_out(); было в инициализации дисплея
GPIO_Write(port,((data>>4)<<lcd_shift));
e_1;rs_1;
del=10; while (del--){}  можно было точку с запятой вместо скобок
e_0;   можно было бы не ставить, ибо строчки ниже все равно отправит бит в ноль
GPIO_Write(port,(0x00)<<lcd_shift);  это вообще не понятно что.
GPIO_Write(port,((data&0x0F)<<lcd_shift));
del=10; while (del--){}
e_1;rs_1;    тактирование спадом можно было бы и фукнкцией сделать.
del=10; while (del--){}
e_0;rs_0;rw_0;
GPIO_Write(port,(0x00)<<lcd_shift);
}
итого, 3 инициализации порта ввода-вывода, вместо одной. Проверка контроллера LCD на саечку нулем (откуда берутся кракозяблы? :), задержки, субъективно, в 4 раза меньше рекомендованных даташитами на 1602. Так понимаю, попытки заглянуть в даташиты даже не было.
0
23.07.2014, 17:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.07.2014, 17:39

ATMega8A + LM75AD + WH1602B = что-то_страшное.asm
Здравствуйте!В электронике я недавно,прочел статьи DY HOTTа про AVR,попробывал сделать термометр и...

Определение осуществлено ли подключение к заданной WI-FI сети и подключение к ней, если не подключена
Добрый день. Суть задачи - в винде хочу что бы программа определяла - подключена ли она (винда)...

Ошибка Selenium: Подключение не установлено, т.к. конечный компьютер отверг запрос на подключение
IWebDriver driver; FirefoxDriverService serv =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru