Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/134: Рейтинг темы: голосов - 134, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71

Инициализация LCD WH1602B [stm32f4]

20.05.2012, 15:31. Показов 27657. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите с инициализацией LCD на wh1602
Работаю с stm32f4 discovery

Вот код:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stm32f4xx.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
 
void gpio_init() {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
 
GPIO_InitTypeDef init;
GPIO_StructInit(&init);
 
init.GPIO_OType = GPIO_OType_PP;
init.GPIO_Mode = GPIO_Mode_OUT;
 
GPIO_Init(GPIOD,&init);
 
GPIO_Init(GPIOC,&init);
}
 
void delay_ms(uint16_t time)
{
volatile uint32_t i;
 
while (time-- > 0)
{
i = 1000;
while (i-- > 0)
{
}
}
}
 
void lcd_write(u16 cmd) {
GPIO_SetByts(GPIOC,cmd | GPIO_Pin_10);
delay_ms(1000);
GPIO_RisetByts(GPIOC,GPIO_Pin_10);
delay_ms(1000);
}
 
void lcd_init() {
delay_ms(1000);
GPIO_RisetByts(GPIOC,GPIO_Pin_12);
 
lcd_write(0b00110000);
 
lcd_write(0b00110000);
 
lcd_write(0b00001000);
 
lcd_write(0b00000001);
 
lcd_write(0b00000110);
 
GPIO_SetByts(GPIOC,GPIO_Pin_12);
}
 
int main(void)
{
gpio_init();
 
GPIO_SetByts(GPIOD,GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);
 
lcd_init();
 
delay_ms(10000);
lcd_write(GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);
 
delay_ms(10000);
lcd_write(0b00101000);
 
delay_ms(10000);
lcd_write(0b11111111);
while (1)
{
GPIO_Write(GPIOD,~GPIO_ReadInputData(GPIOD));
delay_ms(10000);
}
 
return 0;
}
Подключено всё верно. (данные: C0-C7, E-C10,RS-C12,RW на земле)
После "инициализации" ложу V0 на землю, горит две строки закрашеных квадратов. т.е. дисплей инициализирован.
Но при попытке занесения данные ничего не происходит. Даже курсор не моргает.

дисплей целый. 100%

Что я делаю не правильно?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2012, 15:31
Ответы с готовыми решениями:

STM32F4 + LCD помощник разработчика
Есть отладочная плата SK-STM32F417 и LCD http://www.storterkit.ru/html/index.php?name=shop&amp;op=view&amp;id=68 &lt;Изображение удалено&gt; ...

STM32F4 + Nokia 6300 lcd
Уважаемые форумчане, помогите понять одну вещь. Подключил к STM32F4Dyscovery дисплей от Nokyo 6300. Только вот не понимаю почему скорость...

stm32f4 cmsis задержка для LCD
как организовать задержку на cmsis правильно для LCD.Спецы подскажите аматору?

21
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
20.05.2012, 17:29
Вот держи рабочий код, в твоем ковыряться лень ))))
100% работает в 4-битном режиме. В 8-битном тоже должен, но в железе не тестировался.

И там функция задержки вызывается вот такая:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void delay_ns(uint32_t ns)
{
uint32_t delayLoops = ((SystemCoreClock/3000000) * ns) / 1000;
 
__asm__ __volatile__
(
"1: \n"
" CBZ %[delayLoops], 2f \n"
" SUB %[delayLoops], %[delayLoops], #1 \n"
" B 1b \n"
"2: \n"
: [delayLoops] "+r"(delayLoops)
);
}
[993 байт]

[5.8 Кб]
0
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
20.05.2012, 18:00
Тоесть не тестировался?

Чтото пока и он не заработал:

Использую же правильно?

Code
1
2
3
   wh_init();
wh_set_cursor(0,0);
wh_write_str("Hello!");
ато таже история. При сажании на землю управления контрастом "горит" 2 строки дисплея. При сажании его через подтяжку ничего не видно
0
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
20.05.2012, 18:17
То есть я только в 4-битном режиме подключал. Не исключаю, что в коде для 8-битного режима могут быть баги.

Если у тебя этот код идет прямо в начале функции main, то поставь вначале задержку эдак миллисекунд на 5 перед wh_init().

А пины правильные подключаешь? У меня там в wh1602.h дефайны прописаны.

И кстааати, ты пишешь, что контраст на землю кладешь. Ну так ты ничего и не увидишь кроме черных квадратов. Подай на контраст около 0.5-0.7 вольт. Если нет переменника, то сооруди делитель на обычных резисторах.
0
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
20.05.2012, 18:44
Цитата Сообщение от phomtom tord
То есть я только в 4-битном режиме подключал. Не исключаю, что в коде для 8-битного режима могут быть баги.

Если у тебя этот код идет прямо в начале функции main, то поставь вначале задержку эдак миллисекунд на 5 перед wh_init().

А пины правильные подключаешь? У меня там в wh1602.h дефайны прописаны.

И кстааати, ты пишешь, что контраст на землю кладешь. Ну так ты ничего и не увидишь кроме черных квадратов. Подай на контраст около 0.5-0.7 вольт. Если нет переменника, то сооруди делитель на обычных резисторах.
резисторы тоже в дефиците)))
соорудил добавку из диода. перепутаными пинами день назад крякозяблы повыводил.. такчто это сработало.
А вот теперь ничего. Инициализация вроде как проходит, т.е. когда кладу контраст на землю горит 2 полосы, а не одна. А вот символа ни единого! Даже курсора нет.

У вас тоже дискавери?

зы в распиновке вашей ничего не менял.
Сунул старшие биты из шины в указанные пины порта С.

pps сделал так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
*    File:   main.c
*    Date:   2011-01-02
*/
 
#include <stm32f4xx.h>
#include <stm32f4xx_gpio.h>
#include <stm32f4xx_rcc.h>
 
#include "wh1602.h"
 
void delay_ns(uint32_t ns){
uint32_t delayLoops = ((SystemCoreClock/3000000) * ns) / 1000;
 
__asm__ __volatile__
(
"1: \n"
" CBZ %[delayLoops], 2f \n"
" SUB %[delayLoops], %[delayLoops], #1 \n"
" B 1b \n"
"2: \n"
: [delayLoops] "+r"(delayLoops)
);
}
 
int main(void){
delay_ns(9999);
wh_init();
wh_set_cursor(0,0);
wh_write_str("Hello!");
while (1){
 
}
 
return 0;
}
0
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
20.05.2012, 18:53
Да, у меня дискавери и взлетело всё просто на ура. Были проблемы с инициализацией, но когда с ней разобрался дальше всё пошло как по маслу.

Вот это и удивительнее всего, что у тебя после инициализации проблемы начинаются. Обычно при освоении любой новой детальки, главный головняк - это как раз инициализация.

Собственно, у меня вариантов больше нет. Пробуй плясать с бубном (менять частоту проца, пересаживать дисплей на другие пины, еще что в голову придет)
0
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
20.05.2012, 18:56
Можно тогда проект?
Или давай я кину свой.. чтоб уже точно быть уверенным в коде.

Уже просто с ума схожу. Никогда не думал, что дисплей может столько хлопот доставить
0
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
20.05.2012, 19:01
Ааааа, еще вспомнил одну хрень. После инициализации первая отправка данных нормально проходит не раньше чем через 1мс. Так что поставь еще задержку после wh_init(). И не 9999, а пару миллионов вкати, у меня же там в наносекундах измеряется.

Голого проекта под дисплей у меня нет. Если мне нужен дисплей, просто копирую в проект эти файлы и всё работает.
0
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
20.05.2012, 19:29
осталось верить только что мой диод в роли вольтодобавки некоректно себя ведёт после инициализации и я просто не вижу символов на дисплее..
Какой переменник вы используете?

Если я запитаю Vo от ЦАПа тоже ведь может проканать? только нужно выставить 1В

зы вот наваянное https://www.dropbox.com/s/jlwj5jipctx0u9r/lcd.zip если есть возможность проверте работоспособность
спасибо за помощь
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
06.12.2012, 14:57
а то что питание у WH1602B 5В? он будет от 3В работать? если осцилограф есть, можно на ввыводах индикатора или микросхемы импульсы посмотреть. WH1602L 3х вольтовые.
0
hosh
06.12.2012, 18:30
Явно с таймингами что-то не так.... рекомендую открыть даташит, и посмотреть на них :)

GPIO_SetByts(GPIOC,cmd | GPIO_Pin_10); например здесь вы тайминги совсем похерили... :)


<Изображение удалено>

а ещё не зря есть ножка R/W , как минимум , что-бы BUSY флаг вычитать ( но смотрите аккуратно, я когда начинал - не 1 MSP430 попалил, когда забывал вовремя ноги шины данных на вход перевести :))))

вот кстати пару кусочков с рабочего проекта от MSP430 (подправить думаю проблем не будет?):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
void lcd_init(void)//lcd init
{
delay_x(2000);
P1OUT&=~lcd_rs_rw;
P1OUT|=lcd_en;
P2OUT=BIT4|BIT5;
P1OUT&=~lcd_en;
 
P1OUT|=lcd_en;
P2OUT=BIT4|BIT5;
P1OUT&=~lcd_en;
delay_x(1000);
 
P1OUT|=lcd_en;
P2OUT=BIT4|BIT5;
P1OUT&=~lcd_en;
delay_x(lcd_delay);
 
P1OUT|=lcd_en;
P2OUT=BIT4|BIT5|BIT3;//function set
P1OUT&=~lcd_en;
delay_x(lcd_delay);
 
P1OUT|=lcd_en;
P2OUT=BIT3|BIT2|BIT1|BIT0;// set dysplay cursor blinking
P1OUT&=~lcd_en;
delay_x(lcd_delay);
 
P1OUT|=lcd_en;    //clear
P2OUT=BIT0;
P1OUT&=~lcd_en;
delay_x(lcd_delay);
 
P1OUT|=lcd_en;//entry mode set
P2OUT=BIT2|BIT1|BIT0;
P1OUT&=~lcd_en;
delay_x(lcd_delay);
while_bf();
}
 
void while_bf(void)//check lcd busy flag
{
P2DIR=0;
P1OUT|=lcd_rw;
P1OUT&=~lcd_rs;
wbf1:P1OUT|=lcd_en;
if(P2IN&BIT7)
{ P1OUT&=~lcd_en;
goto wbf1;
}
P1OUT&=~lcd_en;
P2OUT=0;
P2DIR=0xff;
}
 
void lcd_clr(void)//clear lcd dysplay
{
P1OUT&=~lcd_rs_rw;
P1OUT|=lcd_en;
P2OUT=BIT0;
P1OUT&=~lcd_en;
while_bf();
}
 
//put charster c to current cursor position on lcd
void lcd_put (char c)
{
P1OUT&=~lcd_rw;
P1OUT|=lcd_rs;
P1OUT|=lcd_en;
P2OUT=c;
P1OUT&=~lcd_en;
while_bf();
}
И только через опрос флага можно добиться максимальной скорости работы дисплея!!! А так-же избавиться от ситуации когда вроде всё работает, а потом херяк, и хня всякая на экране :)))

ах....да... вспомнил, в функцию while_bf() добавь выход из цикла по таймауту ожидания BUSY. А то было у меня... сгорел индикатор, а в итоге весь девайс перестал работать(ждал BUSY), хотя экран в девайсе имел самую последнюю роль...
.ykmori
21.03.2013, 22:42
слушайте а где взять main.h???

Code
1
2
3
4
5
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "wh1602.h"
#include "main.h"
Цитата Сообщение от phomtom tord
Вот держи рабочий код, в твоем ковыряться лень ))))
100% работает в 4-битном режиме. В 8-битном тоже должен, но в железе не тестировался.

И там функция задержки вызывается вот такая:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void delay_ns(uint32_t ns)
{
uint32_t delayLoops = ((SystemCoreClock/3000000) * ns) / 1000;
 
__asm__ __volatile__
(
"1: \n"
" CBZ %[delayLoops], 2f \n"
" SUB %[delayLoops], %[delayLoops], #1 \n"
" B 1b \n"
"2: \n"
: [delayLoops] "+r"(delayLoops)
);
}
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
20.08.2014, 11:50
Вопрос о том где взять main.h заставил задуматься всех надолго... Так никто и не нашел его... )))))))))
0
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
20.08.2014, 12:27
Посмотрите тему http://forum.iosyitistromyss.r... 35&t=19426. Я оставлял исходники для WH1602B + stm32f4.
0
3 / 3 / 0
Регистрация: 06.12.2016
Сообщений: 1,605
20.08.2014, 12:47
Цитата Сообщение от DYZIT
Вопрос о том где взять main.h заставил задуматься всех надолго... Так никто и не нашел его... )))))))))
В большинстве случаев там одни декларации и легко восстанавливаются руками.
Правда, попадаются разные "умники", которые туда какой-то код пихают ...
Попробуйте #include закомментарить и посмотреть, что будет.
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
20.08.2014, 16:35
Цитата Сообщение от hd44780
Цитата Сообщение от DYZIT
Вопрос о том где взять main.h заставил задуматься всех надолго... Так никто и не нашел его... )))))))))
В большинстве случаев там одни декларации и легко восстанавливаются руками.
Правда, попадаются разные "умники", которые туда какой-то код пихают ...
Попробуйте #include закомментарить и посмотреть, что будет.

Спасибо! Но я его не искал :)))))) Это .ykmori спрашивал и тема затихла.
0
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 118
24.08.2014, 03:07
Даташит не читали, небось? :) Во всех алгоритм инициализации прописан по слогам.
lcd_write(0b0011хххх); надо три раза подряд, например, а не два , и далее фразы можно подправить.
0
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
24.08.2014, 21:49
Кто его знает читал он или не читал, у меня работает отлично. Даташит есть на русском языке и примеров много. :)
0
0 / 0 / 0
Регистрация: 15.06.2014
Сообщений: 118
25.08.2014, 01:06
я про исходник в топике, а не комментах.
что до готовых драйверов, перебрав штук 5, сел и написал свой, ибо готовые то задержки лажали, то инициализация.

инициализация "через пень" с одними экранами заработает , а потом отдел закупок приобретет на 5 центов дешевле, и готовьтесь ловить косяки и перешивать всю партию. Это по нашему.
0
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 92
26.08.2014, 02:10
Цитата Сообщение от tomozovr
Тоесть не тестировался?
При сажании на землю управления контрастом "горит" 2 строки дисплея. При сажании его через подтяжку ничего не видно
Как бы там потенциал должен быть от 0 до Vdd, переменный резистор поставь вместо подтяжки, и подбери нужный контраст так чтобы ""горит" 2 строки дисплея" были еле видны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.08.2014, 02:10
Помогаю со студенческими работами здесь

подключение LCD (HD47780) к плате STM32F4- Discovery
Здравствуйте всем ! Подключил дисплей к плате написал простой код для проверки в mykroC использую их библиотеку. Всё работает, но как-то...

uart stm32f4 инициализация
Всем здравствуйте. Суть дела в следующем: при настройке uart1 в stm32f407 через куб все работает как на прием, так и на передачу. При...

Подключение LCD 1602 через I2C к STM32F4 без библиотеки Hal
Здравствуйте! Пытаюсь запустить дисплей LCD 1602(по I2C) при помощи STM32F411VET6U. На форуме целое множество примеров по поводу запуска...

STM32F4. Инициализация камеры OV9655
Всем привет! Пытаюсь произвести инициализацию камеры OV9655 с помощью STM32F4Dyscovery через интерфейс I2C. Тактирую камеру с...

Инициализация SDHC по SPI STM32F4
Появилась проблема с инициализацией SDHC по SPI. Карта почему-то не отвечает на команду GO_IDLE_STATE. Вообще никак. Ответ только 0xFF. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru