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

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

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

Помогите с инициализацией LCD на wh1602
Работаю с stm32f4 discovery

Вот код:

Код
#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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2012, 15:31
Ответы с готовыми решениями:

STM32F4 + LCD помощник разработчика
Есть отладочная плата SK-STM32F417 и LCD...

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

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

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

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

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

И там функция задержки вызывается вот такая:
Код
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
tomozovr
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
20.05.2012, 18:00 3
Тоесть не тестировался?

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

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

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

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

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

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

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

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

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

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

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

pps сделал так:

Код
/*
*    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
phomtom tord
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 335
20.05.2012, 18:53 6
Да, у меня дискавери и взлетело всё просто на ура. Были проблемы с инициализацией, но когда с ней разобрался дальше всё пошло как по маслу.

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

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

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

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

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

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

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


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

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

вот кстати пару кусочков с рабочего проекта от MSP430 (подправить думаю проблем не будет?):
Код
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), хотя экран в девайсе имел самую последнюю роль...
0
.ykmori
0 / 0 / 0
Регистрация: 17.03.2013
Сообщений: 16
21.03.2013, 22:42 12
слушайте а где взять main.h???

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

И там функция задержки вызывается вот такая:
Код
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
DYZIT
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
20.08.2014, 11:50 13
Вопрос о том где взять main.h заставил задуматься всех надолго... Так никто и не нашел его... )))))))))
0
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
20.08.2014, 12:27 14
Посмотрите тему http://forum.iosyitistromyss.ru/viewtopys.php?f=35&t=19426. Я оставлял исходники для WH1602B + stm32f4.
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
20.08.2014, 12:47 15
Цитата Сообщение от DYZIT
Вопрос о том где взять main.h заставил задуматься всех надолго... Так никто и не нашел его... )))))))))
В большинстве случаев там одни декларации и легко восстанавливаются руками.
Правда, попадаются разные "умники", которые туда какой-то код пихают ...
Попробуйте #include закомментарить и посмотреть, что будет.
0
DYZIT
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
20.08.2014, 16:35 16
Цитата Сообщение от hd44780
Цитата Сообщение от DYZIT
Вопрос о том где взять main.h заставил задуматься всех надолго... Так никто и не нашел его... )))))))))
В большинстве случаев там одни декларации и легко восстанавливаются руками.
Правда, попадаются разные "умники", которые туда какой-то код пихают ...
Попробуйте #include закомментарить и посмотреть, что будет.

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

инициализация "через пень" с одними экранами заработает , а потом отдел закупок приобретет на 5 центов дешевле, и готовьтесь ловить косяки и перешивать всю партию. Это по нашему.
0
KotyoMor
0 / 0 / 0
Регистрация: 07.02.2013
Сообщений: 97
26.08.2014, 02:10 20
Цитата Сообщение от tomozovr
Тоесть не тестировался?
При сажании на землю управления контрастом "горит" 2 строки дисплея. При сажании его через подтяжку ничего не видно
Как бы там потенциал должен быть от 0 до Vdd, переменный резистор поставь вместо подтяжки, и подбери нужный контраст так чтобы ""горит" 2 строки дисплея" были еле видны.
0
26.08.2014, 02:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.08.2014, 02:10

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

STM32F4Discovery + LCD через fsmc для индентификации мк LCD
Нужна помощь, может кто поделиться готовым проектом,чтобы на STM32F4-Dyscovery используя...

Подключение WH1602B
в одном примере на IAR для STM32 есть библиотека. http://eugenemcu.ru/article/STM32/STM32 ......


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

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

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