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

Stm32 HAL OLED WH1602

16.04.2018, 07:02. Просмотров 1188. Ответов 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);
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2018, 07:02
Ответы с готовыми решениями:

STM32 and SSD1306 oled
hi all! А может кто прикручивал данный дисплей...

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

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

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

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

20
_SayHello
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
16.04.2018, 09:33 2
Umar Egamberdie, не люблю я все эти Delay на циклах... поиграй с задержками, поставь их побольше. В свое время запарился с этими дисплеями) И задержки сделай на таймере, а не пустыми циклами
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 247
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
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
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
Сообщений: 247
16.04.2018, 15:52  [ТС] 5
_SayHello, не помогло
0
_SayHello
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
16.04.2018, 15:53 6
Umar Egamberdie, а если просто вывести чего-нибудь в позицию 0.0?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 247
16.04.2018, 16:09  [ТС] 7
Вывод работает цифры отображаются. Заметил такую особенность в режиме отладки(DEBUG) время на дисплее обновляется
0
_SayHello
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
16.04.2018, 16:11 8
поставь задержки между выводами на дисплей
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 247
16.04.2018, 16:14  [ТС] 9
по моему этот строка не обрабатывает
sprintf(str, "%.2x:%.2x:%.2x", sTime.Hours, sTime.Minutes, sTime.Seconds);
0
_SayHello
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
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
Сообщений: 247
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
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
16.04.2018, 16:22 12
Umar Egamberdie, в этом примере у тебя должны строки меняться попеременно, а по факту что? мусор, ничего нет или как?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 247
16.04.2018, 16:27  [ТС] 13
_SayHello, строки переключаются а время отображается но не обновляется
0
_SayHello
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
16.04.2018, 16:29 14
Umar Egamberdie, ну может проблема тогда не в дисплее а в часах?
0
Umar Egamberdie
0 / 0 / 2
Регистрация: 20.12.2015
Сообщений: 247
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
Сообщений: 247
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
Сообщений: 247
19.04.2018, 13:52  [ТС] 17
Вот скрин дисплея
0
Миниатюры
Stm32 HAL OLED WH1602  
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,942
19.04.2018, 21:27 18
Цитата Сообщение от Umar Egamberdie Посмотреть сообщение
этот функция глючить, в чем может быть проблема?
в чем глючность заключается?
0
_SayHello
575 / 329 / 108
Регистрация: 30.07.2015
Сообщений: 1,202
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
Сообщений: 247
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

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

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

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


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

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

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