W poprzednim wpisie opisałem obliczanie liczb pierwszych i miganie diodą LINK, program ten można w prosty sposób rozszerzyć o wyświetlanie tych danych na LCD zamiast po UART.

Uwaga! LCD musi mieć konwerter sygnału wyświetlacza I2C np. układ PCF8574.

1. Pobiermay obrać bibliotekę do obsługi LCD po I2C
https://github.com/ptrre/kurs-stm32-e16-lcd/blob/master/Core/Src/lcd_i2c.c
https://github.com/ptrre/kurs-stm32-e16-lcd/blob/master/Core/Inc/lcd_i2c.h
Pliki należy pobrać i skopiować do Inc (plik nagłówkowy *.h) oraz Src (plik źródłowy *.c).

2. W STM32CubeIDE wchodzimy w Pinout & Configuration -> Connectivity -> I2C1 -> Mode i zmieniamy I2C na I2C.

3. Podłączamy zasilanie obojętnie z jakich pinów, oraz I2C1_SDA oraz I2C1_SCL zgodnie z pinoutem naszego STM32.

4. Piszemy kod

1
2
3
4
5
/* USER CODE BEGIN Includes */
#include "lcd_i2c.h"
#include <stdbool.h>
#include <stdio.h>
/* USER CODE END Includes */
1
2
3
4
/* USER CODE BEGIN PV */
[...]
struct lcd_disp disp;
/* USER CODE END Variables */
1
2
3
4
5
6
7
8
 /* USER CODE BEGIN 2 */
        disp.addr = (0x27 << 1);
        disp.bl = true;
        lcd_init(&disp);
        sprintf((char *)disp.f_line, "");
        sprintf((char *)disp.s_line, "");
        lcd_display(&disp);
  /* USER CODE END 2 */
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/* USER CODE END Header_StartTask02 */
void StartTask02(void *argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
          for(uint32_t i=0;; i++){
                    int divide = 0;
                    for(uint32_t j=1; j < i+1; j++){
                        if((i % j) == 0) divide++;
                        if(divide > 2) break;
                    }
                    if(divide == 2){
                            printfx("%d\r\n", i);
                            sprintf((char *)disp.f_line, "%i", i); //string ktory bedzie wyslany
                            lcd_display(&disp); //przeslanie danych
                            osDelay(1);
                    }
          }
  }
  /* USER CODE END StartTask02 */
}