Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
#1

Stm32 HAL OLED WH1602 - ARM, Cortex, STM32 микроконтроллер

16.04.2018, 07:02. Просмотров 438. Ответов 20
Метки нет (Все метки)

Всем Добрый день, не могу подключить lcd делаю все как на примере указана только пины другие ссылка примера,
библиотека lcd.c
Кликните здесь для просмотра всего текста

C
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "lcd.h"
#include "stm32f3xx_hal.h"
//--------------------------------------------------------
void delay(void)
{
    uint16_t i;
    for(i=0;i<1000;i++)
        {
            
    }
}
 
//--------------------------------------------------------
void LCD_WriteData(uint8_t dt)
{
    if(((dt >> 3)&0x01)==1) {d7_set();} else {d7_reset();}
    if(((dt >> 2)&0x01)==1) {d6_set();} else {d6_reset();}
    if(((dt >> 1)&0x01)==1) {d5_set();} else {d5_reset();}
    if((dt&0x01)==1) {d4_set();} else {d4_reset();}
}
 
//--------------------------------------------------------
void LCD_Command(uint8_t dt)
{        
    rs0;
    LCD_WriteData(dt>>4);
    e1;
    delay();
    e0;
    LCD_WriteData(dt);
    e1;
    delay();
    e0;
}
 
//--------------------------------------------------------
void LCD_ini(void)
{
  HAL_Delay(40);
    rs0;
    LCD_WriteData(3);
    e1;
    delay();
    e0;
    HAL_Delay(1);
    LCD_WriteData(3);
    e1;
    delay();
    e0;
    HAL_Delay(1);
    LCD_WriteData(3);
    e1;
    delay();
    e0;
    HAL_Delay(1);
    LCD_Command(0x28);
    HAL_Delay(1);
    LCD_Command(0x28);
    HAL_Delay(1);
    LCD_Command(0x0F);
    HAL_Delay(1);
    LCD_Command(0x01);
    HAL_Delay(2);
    LCD_Command(0x06);
    HAL_Delay(1);
    LCD_Command(0x02);
    HAL_Delay(2);
}
//--------------------------------------------------------
 
void LCD_Data(uint8_t dt)
{
    rs1;
    LCD_WriteData(dt>>4);
    e1;
    delay();
    e0;
    LCD_WriteData(dt);
    e1;
    delay();
    e0;
}
 
void LCD_Clear(void)
{
    //LCD_SendCommand4(0x01);
    HAL_Delay(2);
}
 
void LCD_SendChar(char ch)
 
{
    LCD_Data((uint8_t) ch);
    delay();
}

библиотека lcd.h
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef LCD_H_
#define LCD_H_
#include "stm32f3xx_hal.h"
 
 
#define d4_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET)
#define d5_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET)
#define d6_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET)
#define d7_set() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET)
#define e1    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_SET)
#define rs1   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET)
 
#define d4_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET)
#define d5_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET)
#define d6_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET)
#define d7_reset() HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET)
#define e0    HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET)  
#define rs0   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET) 
 
#endif /* LCD_H_ */

тактирование пинов
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
 
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

http://www.cyberforum.ru/arm/thread2090253.html

0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2018, 07:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Stm32 HAL OLED WH1602 (ARM, Cortex, STM32 микроконтроллер):

OLED дисплей Winstar WEH001602 на stm32
Здравствуйте! У меня есть микроконтроллер stm32f767zi на плате NUCLEO-F767ZI...

STM32, HAL & ADC
Подскажите, в чем проблема в следующем коде инициализации и вывода значений...

STM32 HAL+SPL
Добрый день, подскажите возможно ли код из CubeMX впихать на SPL

UART, HAL, stm32
Здравствуйте, только недавно узнал о существовании библиотеки HAL. Решил...

STM32 HAL Library документация
Скачал STM32Cube. Прекрасная утилита. Но вот одна загвоздка, она генерирует код...

20
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 09:33 #2
Umar Egamberdie, не люблю я все эти Delay на циклах... поиграй с задержками, поставь их побольше. В свое время запарился с этими дисплеями) И задержки сделай на таймере, а не пустыми циклами
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 15:30  [ТС] #3
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Вопрос решен, OLED WH1602 немного отличается от обычного WH1602. Надо было эти команды поменять
HAL_Delay(40); ---> HAL_Delay(500);
LCD_WriteData(3); ---> LCD_WriteData(2);
и в очистке
LCD_SendCommand4(0x01); ---> LCD_WriteData(1);
Добавлено через 5 часов 36 минут
подскажите почему не обновляется время
C
1
2
3
4
5
6
7
8
9
10
LCD_Clear();
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BCD);
sprintf(str, "%.2x:", sTime.Hours);
sprintf(bufstr, "%.2x:", sTime.Minutes);
strcat(str, bufstr);
sprintf(bufstr, "%.2x", sTime.Seconds);
strcat(str, bufstr);
LCD_SetPos(0, 0);
LCD_String(str);
str[0] = 0;
этот код находится в while
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 15:38 #4
Umar Egamberdie, что то вы сложно строку формируете, так не быстрее?
C
1
sprintf(str, "%.2x:%.2x:%.2x", sTime.Hours, sTime.Minutes, sTime.Seconds);
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 15:52  [ТС] #5
_SayHello, не помогло
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 15:53 #6
Umar Egamberdie, а если просто вывести чего-нибудь в позицию 0.0?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 16:09  [ТС] #7
Вывод работает цифры отображаются. Заметил такую особенность в режиме отладки(DEBUG) время на дисплее обновляется
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 16:11 #8
поставь задержки между выводами на дисплей
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 16:14  [ТС] #9
по моему этот строка не обрабатывает
sprintf(str, "%.2x:%.2x:%.2x", sTime.Hours, sTime.Minutes, sTime.Seconds);
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 16:16 #10
Umar Egamberdie, что не обрабатывает?
У меня вот так выводится время и дата на дисплей
C
1
 sprintf(showtime,"%.2d:%.2d:%.2d  %.2d-%.2d-%.2d",RTC_TimeStructure.RTC_Hours, RTC_TimeStructure.RTC_Minutes, RTC_TimeStructure.RTC_Seconds,RTC_DateStructure.RTC_Date,RTC_DateStructure.RTC_Month, 2000 + RTC_DateStructure.RTC_Year);
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 16:17  [ТС] #11
Цитата Сообщение от _SayHello Посмотреть сообщение
поставь задержки между выводами на дисплей
задержками тоже поигрался, никак пробовал и такую
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (inc==10000)
    {
    LCD_Clear();
        LCD_SetPos(1, 0);
        LCD_String(str1);   
    }
     if (inc==20000)
    {
    LCD_Clear();
        LCD_SetPos(1, 0);
        LCD_String(str);    
    }
    if (inc==30000)
    {
    inc=0;  
    }
где str это время а str1 просто текст, дисплей очищается и т п
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 16:22 #12
Umar Egamberdie, в этом примере у тебя должны строки меняться попеременно, а по факту что? мусор, ничего нет или как?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 16:27  [ТС] #13
_SayHello, строки переключаются а время отображается но не обновляется
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
16.04.2018, 16:29 #14
Umar Egamberdie, ну может проблема тогда не в дисплее а в часах?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
16.04.2018, 16:39  [ТС] #15
_SayHello, Если перезагрузить устройство то время показывает новое. RTC работает.

Добавлено через 8 минут
Все заработало добавил HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BCD);
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
19.04.2018, 13:48  [ТС] #16
sprintf(str, "%.2x:%.2x:%.2x", sTime.Hours, sTime.Minutes, sTime.Seconds);
этот функция глючить, в чем может быть проблема?, или есть еще другая функция вроде этого?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
19.04.2018, 13:52  [ТС] #17
Вот скрин дисплея
0
Миниатюры
Stm32 HAL OLED WH1602  
ValeryS
Модератор
7127 / 5395 / 669
Регистрация: 14.02.2011
Сообщений: 18,212
19.04.2018, 21:27 #18
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
этот функция глючить, в чем может быть проблема?
в чем глючность заключается?
0
_SayHello
521 / 284 / 94
Регистрация: 30.07.2015
Сообщений: 1,026
19.04.2018, 23:51 #19
ValeryS, в том что видимо часы показывают 66 и 69))
Umar Egamberdie, Подозреваю что глючность тут не в стандартной функции, она выводит то что вы ей скормили. Тут дела в том чем вы ее кормите.
Во первых, дату и время читайте на в BCD формате, а в формате BIN.
Во вторых форматирование все таки надо делать правильное
C
1
sprintf(str, "%.2d:%.2d:%.2d", sTime.Hours, sTime.Minutes, sTime.Seconds);
1
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 199
21.04.2018, 14:34  [ТС] #20
Цитата Сообщение от _SayHello Посмотреть сообщение
Во первых, дату и время читайте на в BCD формате, а в формате BIN.
C
1
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BCD);
C
1
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BCD);
0
21.04.2018, 14:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2018, 14:34
Привет! Вот еще темы с решениями:

MLX90614 + STM32 i2c hal
Доброго времени суток. Возникла загвоздка в попытке оживить ИК термодатчик...

STM32 CUBE HAL EXTI interrups
Включил прерывания по одной из ног STM32F103 в Сube . HAL функция которая...

stm32 HAL UART - не могу понять
Здравствуйте, в STM32 я начинающий, приходится просить помощи. Суть вот в чём....

Есть ли примеры по HAL для stm32?
Возьмем как пример таймер. Самый простой режим. Считает до значения TIMx_ARR....


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

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

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