|
@@ -1,45 +1,51 @@
|
|
|
#include "stm32g4xx_hal.h"
|
|
|
#include "oled_common.h"
|
|
|
+#include "oled_config.h"
|
|
|
#include "config.h"
|
|
|
#include "i2c_bridge.h"
|
|
|
#include "spi_bridge.h"
|
|
|
#include "logo_grayscale.h"
|
|
|
#include "fonts.h"
|
|
|
#include "SSD1327.h"
|
|
|
+#include "cmsis_os.h"
|
|
|
+#include <string.h>
|
|
|
|
|
|
extern "C" {
|
|
|
#include "OLED_SSD1327.h"
|
|
|
#include "GFX_SSD1327.h"
|
|
|
}
|
|
|
|
|
|
-#ifdef I2C_BRIDGE
|
|
|
+#if defined(I2C_BRIDGE)
|
|
|
I2C_HandleTypeDef *i2c_bridge;
|
|
|
-#elif SPI_BRIDGE
|
|
|
+#elif defined(SPI_BRIDGE)
|
|
|
SPI_HandleTypeDef *spi_bridge;
|
|
|
-//DMA_HandleTypeDef hdma_spi_bridge;
|
|
|
#endif
|
|
|
|
|
|
+
|
|
|
+uint8_t oled_buf[OLED_BUF_SIZE];
|
|
|
+
|
|
|
|
|
|
//
|
|
|
void init_oled(void)
|
|
|
{
|
|
|
init_gpio_oled();
|
|
|
|
|
|
-#ifdef I2C_BRIDGE
|
|
|
+ oled_reset();
|
|
|
+
|
|
|
+#if defined(I2C_BRIDGE)
|
|
|
i2c_bridge_init();
|
|
|
i2c_bridge = i2c_get_bridge();
|
|
|
SSD1327_I2cInit(i2c_bridge);
|
|
|
|
|
|
-#elif SPI_BRIDGE
|
|
|
+#elif defined(SPI_BRIDGE)
|
|
|
spi_bridge_init();
|
|
|
-
|
|
|
+ spi_bridge = spi_get_bridge();
|
|
|
+ SSD1327_SpiInit(spi_bridge);
|
|
|
#endif
|
|
|
|
|
|
- //return;
|
|
|
+ oled_clear(BLACK);
|
|
|
|
|
|
|
|
|
- SSD1327_Clear(BLACK);
|
|
|
-
|
|
|
#if 0
|
|
|
ssd1327.clearBuffer();
|
|
|
ssd1327.drawString(16, 16, (char*)"Hello", 0xF, 32);
|
|
@@ -48,85 +54,300 @@ void init_oled(void)
|
|
|
#endif
|
|
|
|
|
|
#if 0
|
|
|
- SSD1327_DrawPixel(20, 20, 15);
|
|
|
- SSD1327_DrawPixel(21, 20, 15);
|
|
|
- SSD1327_DrawPixel(22, 20, 15);
|
|
|
+ oled_draw_pixel(20, 20, 15);
|
|
|
+ oled_draw_pixel(21, 20, 15);
|
|
|
+ oled_draw_pixel(22, 20, 15);
|
|
|
|
|
|
- SSD1327_DrawPixel(20, 21, 15);
|
|
|
- SSD1327_DrawPixel(21, 21, 15);
|
|
|
- SSD1327_DrawPixel(22, 21, 15);
|
|
|
+ oled_draw_pixel(20, 21, 15);
|
|
|
+ oled_draw_pixel(21, 21, 15);
|
|
|
+ oled_draw_pixel(22, 21, 15);
|
|
|
|
|
|
- SSD1327_DrawPixel(20, 22, 15);
|
|
|
- SSD1327_DrawPixel(21, 22, 15);
|
|
|
- SSD1327_DrawPixel(22, 22, 15);
|
|
|
+ oled_draw_pixel(20, 22, 15);
|
|
|
+ oled_draw_pixel(21, 22, 15);
|
|
|
+ oled_draw_pixel(22, 22, 15);
|
|
|
|
|
|
- SSD1327_DrawPixel(20, 23, 15);
|
|
|
- SSD1327_DrawPixel(21, 23, 15);
|
|
|
- SSD1327_DrawPixel(22, 23, 15);
|
|
|
+ oled_draw_pixel(20, 23, 15);
|
|
|
+ oled_draw_pixel(21, 23, 15);
|
|
|
+ oled_draw_pixel(22, 23, 15);
|
|
|
#endif
|
|
|
|
|
|
//GFX_Image(15, 0, (uint8_t*)logo_grayscale, 96, 96);
|
|
|
|
|
|
- SSD1327_Display();
|
|
|
-
|
|
|
+ oled_display();
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void init_gpio_oled(void)
|
|
|
+{
|
|
|
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
|
+
|
|
|
+ __HAL_RCC_GPIOA_CLK_ENABLE();
|
|
|
+
|
|
|
+ // GPIOA_5 - reset
|
|
|
+ GPIO_InitStruct.Pin = OLED_RST_PIN;
|
|
|
+ GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
|
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
|
|
|
+ HAL_GPIO_Init(OLED_RST_PORT, &GPIO_InitStruct);
|
|
|
|
|
|
+ // GPIOA_6 - DC
|
|
|
+ GPIO_InitStruct.Pin = OLED_DC_PIN;
|
|
|
+ HAL_GPIO_Init(OLED_DC_PORT, &GPIO_InitStruct);
|
|
|
|
|
|
- //while (1) {}
|
|
|
+ // GPIOA_7 - CS
|
|
|
+ GPIO_InitStruct.Pin = OLED_CS_PIN;
|
|
|
+ HAL_GPIO_Init(OLED_CS_PORT, &GPIO_InitStruct);
|
|
|
+
|
|
|
+ HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_RESET);
|
|
|
+ HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET);
|
|
|
+ HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET);
|
|
|
}
|
|
|
|
|
|
//
|
|
|
-void test_oled(void)
|
|
|
+void oled_reset(void)
|
|
|
{
|
|
|
-#if 0
|
|
|
- for (int i = 0; i < 16; i++) {
|
|
|
- SSD1327_DrawPixel(10, 20 + i, i);
|
|
|
- }
|
|
|
+ OLED_RST_1;
|
|
|
+ oled_delay_ms(100);
|
|
|
+ OLED_RST_0;
|
|
|
+ oled_delay_ms(100);
|
|
|
+ OLED_RST_1;
|
|
|
+ oled_delay_ms(100);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_delay_ms(uint32_t ms)
|
|
|
+{
|
|
|
+ osDelay(ms);
|
|
|
+}
|
|
|
+
|
|
|
+// TODO убрать sizeof
|
|
|
+void oled_command(uint8_t com)
|
|
|
+{
|
|
|
+#ifdef I2C_BRIDGE
|
|
|
+ HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x00, 1, &com, sizeof(com), 100);
|
|
|
+#endif
|
|
|
|
|
|
- SSD1327_DrawPixel(20, 20, 15);
|
|
|
- SSD1327_DrawPixel(30, 20, 15);
|
|
|
- SSD1327_DrawPixel(40, 20, 5);
|
|
|
+#ifdef SPI_BRIDGE
|
|
|
+ OLED_DC_0;
|
|
|
+ OLED_CS_0;
|
|
|
+ HAL_SPI_Transmit(spi_bridge, &com, 1, 10);
|
|
|
+ OLED_CS_1;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+// TODO убрать sizeof
|
|
|
+void oled_data(uint8_t dat)
|
|
|
+{
|
|
|
+#ifdef I2C_BRIDGE
|
|
|
+ HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x40, 1, &dat, sizeof(dat), 100);
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef SPI_BRIDGE
|
|
|
+ OLED_DC_1;
|
|
|
+ OLED_CS_0;
|
|
|
+ HAL_SPI_Transmit(spi_bridge, &dat, 1, 10);
|
|
|
+ OLED_CS_1;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_display(void)
|
|
|
+{
|
|
|
+ oled_command(SSD1327_SETCOLUMNADDRESS);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(0x3F);
|
|
|
+
|
|
|
+ oled_command(SSD1327_SETROWADDRESS);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(0x7F);
|
|
|
+
|
|
|
+#ifdef I2C_BRIDGE
|
|
|
+ HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x40, 1, (uint8_t*)&oled_buf, OLED_BUF_SIZE, 1000);
|
|
|
+#endif
|
|
|
+
|
|
|
+#ifdef SPI_BRIDGE
|
|
|
+ OLED_DC_1;
|
|
|
+ OLED_CS_0;
|
|
|
+ HAL_SPI_Transmit(spi_bridge, (uint8_t*)&oled_buf, OLED_BUF_SIZE, 100);
|
|
|
+ OLED_CS_1;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_bitmap(uint8_t *bitmap)
|
|
|
+{
|
|
|
+ oled_command(0x22);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(0x07);
|
|
|
+
|
|
|
+#ifdef I2C_BRIDGE
|
|
|
+ HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x40, 1, bitmap, (OLED_HEIGHT * OLED_WIDTH / 8), 100);
|
|
|
#endif
|
|
|
- //void GFX_DrawLine(int x_start, int y_start, int x_end, int y_end, uint8_t color);
|
|
|
- // Верхняя
|
|
|
- GFX_DrawLine(0, 0, 127, 0, 15);
|
|
|
|
|
|
- // Левая
|
|
|
- GFX_DrawLine(0, 0, 0, 127, 15);
|
|
|
+#ifdef SPI_BRIDGE
|
|
|
+ OLED_DC_1;
|
|
|
+ OLED_CS_0;
|
|
|
+ HAL_SPI_Transmit(spi_bridge, bitmap, (OLED_HEIGHT * OLED_WIDTH / 8), 100);
|
|
|
+ OLED_CS_1;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_invert_colors(uint8_t invert)
|
|
|
+{
|
|
|
+ oled_command(invert ? SSD1327_INVERTDISPLAY : SSD1327_NORMALDISPLAY);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_rotate_display(uint8_t rotate)
|
|
|
+{
|
|
|
+ if (rotate > 1) rotate = 1;
|
|
|
+
|
|
|
+ oled_command(0xA0 | (0x01 & rotate)); // Set Segment Re-Map Default
|
|
|
+ // 0xA0 (0x00) => column Address 0 mapped to 127
|
|
|
+ // 0xA1 (0x01) => Column Address 127 mapped to 0
|
|
|
+
|
|
|
+ oled_command(0xC0 | (0x08 & (rotate<<3))); // Set COM Output Scan Direction
|
|
|
+ // 0xC0 (0x00) => normal mode (RESET) Scan from COM0 to COM[N-1];Where N is the Multiplex ratio.
|
|
|
+ // 0xC8 (0xC8) => remapped mode. Scan from COM[N-1] to COM0;;Where N is the Multiplex ratio.
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_display_on(uint8_t on)
|
|
|
+{
|
|
|
+ oled_command(on ? SSD1327_DISPLAYON : SSD1327_DISPLAYOFF);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_set_contrast(uint8_t contrast)
|
|
|
+{
|
|
|
+ oled_command(SSD1327_SETCONTRASTCURRENT); // Set Contrast Control
|
|
|
+ oled_command(contrast);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_start_scroll_right(uint8_t start_page, uint8_t end_page, uint8_t speed)
|
|
|
+{
|
|
|
+ oled_command(SSD1327_RIGHT_HORIZONTAL_SCROLL);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(start_page);
|
|
|
+ oled_command(speed);
|
|
|
+ oled_command(end_page);
|
|
|
+ oled_command(SSD1327_ACTIVATE_SCROLL);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_start_scroll_left(uint8_t start_page, uint8_t end_page, uint8_t speed)
|
|
|
+{
|
|
|
+ oled_command(SSD1327_LEFT_HORIZONTAL_SCROLL);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(start_page);
|
|
|
+ oled_command(speed);
|
|
|
+ oled_command(end_page);
|
|
|
+ oled_command(SSD1327_ACTIVATE_SCROLL);
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_stop_scroll(void)
|
|
|
+{
|
|
|
+ oled_command(SSD1327_DEACTIVATE_SCROLL);
|
|
|
+}
|
|
|
+
|
|
|
+void oled_init(void)
|
|
|
+{
|
|
|
+ oled_command(SSD1327_DISPLAYOFF); // Display Off
|
|
|
|
|
|
- // Правая
|
|
|
- GFX_DrawLine(127, 0, 127, 127, 15);
|
|
|
+ oled_command(SSD1327_SETCOLUMNADDRESS);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(0x7F);
|
|
|
+
|
|
|
+ oled_command(SSD1327_SETROWADDRESS);
|
|
|
+ oled_command(0x00);
|
|
|
+ oled_command(0x7F);
|
|
|
|
|
|
- // Нижняя
|
|
|
- GFX_DrawLine(0, 127, 127, 127, 15);
|
|
|
+ oled_set_contrast(0x7F);
|
|
|
|
|
|
- GFX_SetFont(font_8x5);
|
|
|
+ oled_command(SSD1327_SEGREMAP);
|
|
|
+ oled_command(0x51);
|
|
|
|
|
|
- GFX_SetFontSize(1);
|
|
|
- GFX_DrawString(4, 10, (char*)"BbAa12345", 15, 0);
|
|
|
+ oled_command(SSD1327_SETDISPLAYSTARTLINE);
|
|
|
+ oled_command(0x00);
|
|
|
|
|
|
- GFX_SetFontSize(2);
|
|
|
- GFX_DrawString(4, 30, (char*)"BbAa12345", 15, 0);
|
|
|
+ oled_command(SSD1327_SETDISPLAYOFFSET);
|
|
|
+ oled_command(0x0);
|
|
|
|
|
|
- GFX_SetFontSize(3);
|
|
|
- GFX_DrawString(4, 60, (char*)"BbAa12345", 15, 0);
|
|
|
+ oled_command(SSD1327_DISPLAYALLON_RESUME); // Entire Display ON
|
|
|
+ oled_command(SSD1327_SETMULTIPLEX);
|
|
|
+ oled_command(0x7F);
|
|
|
|
|
|
- //GFX_DrawChar(50, 50, 'F', 15, 0);
|
|
|
- //GFX_DrawString(10, 100, "Hello!!!", 15, 0);
|
|
|
+ oled_command(SSD1327_SETPHASELENGTH);
|
|
|
+ oled_command(0xF1); // !
|
|
|
|
|
|
+ oled_command(SSD1327_SETFRONTCLOCKDIVIDER_OSCILLATORFREQUENCY);
|
|
|
+ oled_command(0x00);
|
|
|
|
|
|
-#if 0
|
|
|
- uint8_t GFX_GetFontHeight(void);
|
|
|
- uint8_t GFX_GetFontWidth(void);
|
|
|
- uint8_t GFX_GetFontSize(void);
|
|
|
- void GFX_DrawChar(int x, int y, char chr, uint8_t color, uint8_t background);
|
|
|
- void GFX_DrawString(int x, int y, char* str, uint8_t color, uint8_t background);
|
|
|
-#endif
|
|
|
-
|
|
|
- SSD1327_Display();
|
|
|
+ oled_command(SSD1327_FUNCTIONSELECTIONA); // !
|
|
|
+ oled_command(0x01); // !
|
|
|
+
|
|
|
+ oled_command(SSD1327_SETSECONDPRECHARGEPERTIOD);
|
|
|
+ oled_command(0x0F); // !
|
|
|
+
|
|
|
+ oled_command(SSD1327_SETSETVCOMVOLTAGE);
|
|
|
+ oled_command(0x0F); // !
|
|
|
+
|
|
|
+ oled_command(SSD1327_SETPRECHARGEVOLTAGE);
|
|
|
+ oled_command(0x08); // !
|
|
|
+
|
|
|
+ oled_command(SSD1327_FUNCTIONSELECTIONB);
|
|
|
+ oled_command(0x62);
|
|
|
+
|
|
|
+ oled_command(SSD1327_SETCOMMANDLOCK); // !
|
|
|
+ oled_command(0x12); // !
|
|
|
|
|
|
+ oled_display_on(1);
|
|
|
}
|
|
|
|
|
|
-// oled_draw_rec(3, 5, 123, 22, 15);
|
|
|
+//
|
|
|
+void oled_draw_pixel(int16_t x, int16_t y, uint8_t color)
|
|
|
+{
|
|
|
+ if ((x < 0) || (x >= SSD1327_LCDWIDTH) || (y < 0) || (y >= SSD1327_LCDHEIGHT))
|
|
|
+ return;
|
|
|
+
|
|
|
+ uint8_t SelectedCell = oled_buf[x/2 + y*(SSD1327_LCDWIDTH/2)];
|
|
|
+
|
|
|
+ if(x % 2)
|
|
|
+ {
|
|
|
+ SelectedCell &= ~(0x0F);
|
|
|
+ SelectedCell |= (0x0F & color);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SelectedCell &= ~(0xF0);
|
|
|
+ SelectedCell |= (0xF0 & (color<<4));
|
|
|
+ }
|
|
|
+
|
|
|
+ oled_buf[x/2 + y*(SSD1327_LCDWIDTH/2)] = SelectedCell;
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+void oled_clear(uint8_t color)
|
|
|
+{
|
|
|
+ if(color > WHITE) color = WHITE;
|
|
|
+ memset(oled_buf, (color << 4 | color), OLED_BUF_SIZE);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// ------------------------------------------------------------------------------- //
|
|
|
+
|
|
|
+//
|
|
|
void oled_draw_rec(int x_start, int y_start, int x_end, int y_end, uint8_t color)
|
|
|
{
|
|
|
for (int i = 0; i < y_end; i++) {
|
|
@@ -161,20 +382,41 @@ void oled_draw_string_frame(uint8_t str_num)
|
|
|
GFX_DrawLine(STR_X_S, str_num*STR_H + STR_Y_S, STR_X_S, str_num*STR_H + STR_Y_S - STR_H, 15);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
//
|
|
|
-void init_gpio_oled(void)
|
|
|
+void test_oled(void)
|
|
|
{
|
|
|
- GPIO_InitTypeDef GPIO_InitStruct = {0};
|
|
|
-
|
|
|
- __HAL_RCC_GPIOA_CLK_ENABLE();
|
|
|
+#if 0
|
|
|
+ for (int i = 0; i < 16; i++) {
|
|
|
+ SSD1327_DrawPixel(10, 20 + i, i);
|
|
|
+ }
|
|
|
+
|
|
|
+ SSD1327_DrawPixel(20, 20, 15);
|
|
|
+ SSD1327_DrawPixel(30, 20, 15);
|
|
|
+ SSD1327_DrawPixel(40, 20, 5);
|
|
|
+#endif
|
|
|
+ //void GFX_DrawLine(int x_start, int y_start, int x_end, int y_end, uint8_t color);
|
|
|
+ // Верхняя
|
|
|
+ GFX_DrawLine(0, 0, 127, 0, 15);
|
|
|
|
|
|
- GPIO_InitStruct.Pin = GPIO_PIN_5;
|
|
|
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
|
- GPIO_InitStruct.Pull = GPIO_NOPULL;
|
|
|
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
|
|
|
+ // Левая
|
|
|
+ GFX_DrawLine(0, 0, 0, 127, 15);
|
|
|
|
|
|
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
|
|
|
-}
|
|
|
-
|
|
|
+ // Правая
|
|
|
+ GFX_DrawLine(127, 0, 127, 127, 15);
|
|
|
+
|
|
|
+ // Нижняя
|
|
|
+ GFX_DrawLine(0, 127, 127, 127, 15);
|
|
|
+
|
|
|
+ GFX_SetFont(font_8x5);
|
|
|
+
|
|
|
+ GFX_SetFontSize(1);
|
|
|
+ GFX_DrawString(4, 10, (char*)"BbAa12345", 15, 0);
|
|
|
+
|
|
|
+ GFX_SetFontSize(2);
|
|
|
+ GFX_DrawString(4, 30, (char*)"BbAa12345", 15, 0);
|
|
|
+
|
|
|
+ GFX_SetFontSize(3);
|
|
|
+ GFX_DrawString(4, 60, (char*)"BbAa12345", 15, 0);
|
|
|
|
|
|
+ SSD1327_Display();
|
|
|
+}
|