/** * This Library was originally written by Olivier Van den Eede (4ilo) in 2016. * Some refactoring was done and SPI support was added by Aleksander Alekseev (afiskon) in 2018. * * https://github.com/afiskon/stm32-ssd1306 */ #ifndef __SSD1306_H__ #define __SSD1306_H__ #include //#include <_ansi.h> //_BEGIN_STD_C #include "ssd1306_conf.h" #include "stm32wlxx_hal.h" #include "stm32wlxx_hal_gpio.h" #include "stm32wlxx_hal_i2c_ex.h" #include "stm32wlxx_hal_i2c.h" #include "stm32wlxx_hal_spi.h" #include "ssd1306_fonts.h" /* vvv I2C config vvv */ #ifndef SSD1306_I2C_PORT #define SSD1306_I2C_PORT hi2c2 #endif #ifndef SSD1306_I2C_ADDR #define SSD1306_I2C_ADDR (0x3C << 1) //#define SSD1306_I2C_ADDR (0x3D << 1) #endif /* ^^^ I2C config ^^^ */ /* vvv SPI config vvv */ #ifndef SSD1306_SPI_PORT #define SSD1306_SPI_PORT hspi2 #endif #ifndef SSD1306_CS_Port #define SSD1306_CS_Port GPIOB #endif #ifndef SSD1306_CS_Pin #define SSD1306_CS_Pin GPIO_PIN_12 #endif #ifndef SSD1306_DC_Port #define SSD1306_DC_Port GPIOB #endif #ifndef SSD1306_DC_Pin #define SSD1306_DC_Pin GPIO_PIN_14 #endif #ifndef SSD1306_Reset_Port #define SSD1306_Reset_Port GPIOA #endif #ifndef SSD1306_Reset_Pin #define SSD1306_Reset_Pin GPIO_PIN_8 #endif /* ^^^ SPI config ^^^ */ #if defined(SSD1306_USE_I2C) extern I2C_HandleTypeDef SSD1306_I2C_PORT; #elif defined(SSD1306_USE_SPI) extern SPI_HandleTypeDef SSD1306_SPI_PORT; #else #error "You should define SSD1306_USE_SPI or SSD1306_USE_I2C macro!" #endif // SSD1306 OLED height in pixels #ifndef SSD1306_HEIGHT #define SSD1306_HEIGHT 64 #endif // SSD1306 width in pixels #ifndef SSD1306_WIDTH #define SSD1306_WIDTH 128 #endif #ifndef SSD1306_BUFFER_SIZE #define SSD1306_BUFFER_SIZE SSD1306_WIDTH * SSD1306_HEIGHT / 8 #endif // Enumeration for screen colors typedef enum { Black = 0x00, // Black color, no pixel White = 0x01 // Pixel is set. Color depends on OLED } SSD1306_COLOR; typedef enum { SSD1306_OK = 0x00, SSD1306_ERR = 0x01 // Generic error. } SSD1306_Error_t; // Struct to store transformations typedef struct { uint16_t CurrentX; uint16_t CurrentY; uint8_t Initialized; uint8_t DisplayOn; } SSD1306_t; typedef struct { uint8_t x; uint8_t y; } SSD1306_VERTEX; // Procedure definitions void ssd1306_Init(void); void ssd1306_Fill(SSD1306_COLOR color); void ssd1306_UpdateScreen(void); void ssd1306_DrawPixel(uint8_t x, uint8_t y, SSD1306_COLOR color); char ssd1306_WriteChar(char ch, FontDef Font, SSD1306_COLOR color); char ssd1306_WriteString(char* str, FontDef Font, SSD1306_COLOR color); void ssd1306_SetCursor(uint8_t x, uint8_t y); void ssd1306_Line(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, SSD1306_COLOR color); void ssd1306_DrawArc(uint8_t x, uint8_t y, uint8_t radius, uint16_t start_angle, uint16_t sweep, SSD1306_COLOR color); void ssd1306_DrawCircle(uint8_t par_x, uint8_t par_y, uint8_t par_r, SSD1306_COLOR color); void ssd1306_Polyline(const SSD1306_VERTEX *par_vertex, uint16_t par_size, SSD1306_COLOR color); void ssd1306_DrawRectangle(uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, SSD1306_COLOR color); void ssd1306_DrawBitmap(uint8_t x, uint8_t y, const unsigned char* bitmap, uint8_t w, uint8_t h, SSD1306_COLOR color); /** * @brief Sets the contrast of the display. * @param[in] value contrast to set. * @note Contrast increases as the value increases. * @note RESET = 7Fh. */ void ssd1306_SetContrast(const uint8_t value); /** * @brief Set Display ON/OFF. * @param[in] on 0 for OFF, any for ON. */ void ssd1306_SetDisplayOn(const uint8_t on); /** * @brief Reads DisplayOn state. * @return 0: OFF. * 1: ON. */ uint8_t ssd1306_GetDisplayOn(); // Low-level procedures void ssd1306_Reset(void); void ssd1306_WriteCommand(uint8_t byte); void ssd1306_WriteData(uint8_t* buffer, size_t buff_size); SSD1306_Error_t ssd1306_FillBuffer(uint8_t* buf, uint32_t len); //_END_STD_C #endif // __SSD1306_H__