From a407f01559d8be1469a65d480c77d8260801b8e1 Mon Sep 17 00:00:00 2001 From: Wolfgang Hottgenroth Date: Mon, 29 May 2017 11:50:59 +0200 Subject: [PATCH] oled library integrated and adapted to STM32 HAL --- cube/output/ttt2/Inc/mxconstants.h | 6 + cube/output/ttt2/Src/main.c | 14 +- cube/output/ttt2/ttt2.ioc | 23 +- include/mxconstants.h | 6 + my_src/main2.c | 8 + my_src/oled-fonts.h | 226 +++++++++++++ my_src/oled.c | 523 +++++++++++++++++++++++++++++ my_src/oled.h | 36 ++ src/main.c | 14 +- src/main.c-bak | 14 +- 10 files changed, 861 insertions(+), 9 deletions(-) create mode 100644 my_src/oled-fonts.h create mode 100644 my_src/oled.c create mode 100644 my_src/oled.h diff --git a/cube/output/ttt2/Inc/mxconstants.h b/cube/output/ttt2/Inc/mxconstants.h index 0780baa..f7be39c 100644 --- a/cube/output/ttt2/Inc/mxconstants.h +++ b/cube/output/ttt2/Inc/mxconstants.h @@ -45,6 +45,12 @@ #define LED_GPIO_Port GPIOC #define ERROR_Pin GPIO_PIN_14 #define ERROR_GPIO_Port GPIOC +#define OLED_CS_Pin GPIO_PIN_7 +#define OLED_CS_GPIO_Port GPIOB +#define OLED_DC_Pin GPIO_PIN_8 +#define OLED_DC_GPIO_Port GPIOB +#define OLED_RST_Pin GPIO_PIN_9 +#define OLED_RST_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/cube/output/ttt2/Src/main.c b/cube/output/ttt2/Src/main.c index c2efb2b..7dae870 100644 --- a/cube/output/ttt2/Src/main.c +++ b/cube/output/ttt2/Src/main.c @@ -186,8 +186,8 @@ static void MX_SPI1_Init(void) hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; @@ -217,16 +217,26 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, LED_Pin|ERROR_Pin, GPIO_PIN_RESET); + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin, GPIO_PIN_RESET); + /*Configure GPIO pins : LED_Pin ERROR_Pin */ GPIO_InitStruct.Pin = LED_Pin|ERROR_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + /*Configure GPIO pins : OLED_CS_Pin OLED_DC_Pin OLED_RST_Pin */ + GPIO_InitStruct.Pin = OLED_CS_Pin|OLED_DC_Pin|OLED_RST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } /* USER CODE BEGIN 4 */ diff --git a/cube/output/ttt2/ttt2.ioc b/cube/output/ttt2/ttt2.ioc index a5773fe..af1995d 100644 --- a/cube/output/ttt2/ttt2.ioc +++ b/cube/output/ttt2/ttt2.ioc @@ -27,6 +27,9 @@ Mcu.Name=STM32F103C(8-B)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=PB8 +Mcu.Pin11=PB9 +Mcu.Pin12=VP_SYS_VS_Systick Mcu.Pin2=PD0-OSC_IN Mcu.Pin3=PD1-OSC_OUT Mcu.Pin4=PA0-WKUP @@ -34,8 +37,8 @@ Mcu.Pin5=PA5 Mcu.Pin6=PA7 Mcu.Pin7=PA13 Mcu.Pin8=PA14 -Mcu.Pin9=VP_SYS_VS_Systick -Mcu.PinsNb=10 +Mcu.Pin9=PB7 +Mcu.PinsNb=13 Mcu.UserConstants= Mcu.UserName=STM32F103C8Tx MxCube.Version=4.16.1 @@ -59,6 +62,18 @@ PA5.Mode=TX_Only_Simplex_Unidirect_Master PA5.Signal=SPI1_SCK PA7.Mode=TX_Only_Simplex_Unidirect_Master PA7.Signal=SPI1_MOSI +PB7.GPIOParameters=GPIO_Label +PB7.GPIO_Label=OLED_CS +PB7.Locked=true +PB7.Signal=GPIO_Output +PB8.GPIOParameters=GPIO_Label +PB8.GPIO_Label=OLED_DC +PB8.Locked=true +PB8.Signal=GPIO_Output +PB9.GPIOParameters=GPIO_Label +PB9.GPIO_Label=OLED_RST +PB9.Locked=true +PB9.Signal=GPIO_Output PC13-TAMPER-RTC.GPIOParameters=GPIO_Label PC13-TAMPER-RTC.GPIO_Label=LED PC13-TAMPER-RTC.Locked=true @@ -129,8 +144,10 @@ RCC.VCOOutput2Freq_Value=8000000 SH.ADCx_IN0.0=ADC1_IN0,IN0 SH.ADCx_IN0.ConfNb=1 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 +SPI1.CLKPhase=SPI_PHASE_2EDGE +SPI1.CLKPolarity=SPI_POLARITY_HIGH SPI1.CalculateBaudRate=4.5 MBits/s -SPI1.IPParameters=Mode,CalculateBaudRate,BaudRatePrescaler +SPI1.IPParameters=Mode,CalculateBaudRate,BaudRatePrescaler,CLKPolarity,CLKPhase SPI1.Mode=SPI_MODE_MASTER VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick diff --git a/include/mxconstants.h b/include/mxconstants.h index 0780baa..f7be39c 100644 --- a/include/mxconstants.h +++ b/include/mxconstants.h @@ -45,6 +45,12 @@ #define LED_GPIO_Port GPIOC #define ERROR_Pin GPIO_PIN_14 #define ERROR_GPIO_Port GPIOC +#define OLED_CS_Pin GPIO_PIN_7 +#define OLED_CS_GPIO_Port GPIOB +#define OLED_DC_Pin GPIO_PIN_8 +#define OLED_DC_GPIO_Port GPIOB +#define OLED_RST_Pin GPIO_PIN_9 +#define OLED_RST_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/my_src/main2.c b/my_src/main2.c index 3529947..1828892 100644 --- a/my_src/main2.c +++ b/my_src/main2.c @@ -20,10 +20,15 @@ #include #include "stm32f1xx_hal.h" +#include "oled.h" + void blink(void *handle) { + static uint32_t i = 0; HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin); + LED_PrintValueI(0, 1, i); + i++; } void my_setup_1() { @@ -44,6 +49,9 @@ void my_errorHandler() { } void my_setup_2() { + LED_Init(); + LED_P6x8Str(0,0,"welcome to"); + } diff --git a/my_src/oled-fonts.h b/my_src/oled-fonts.h new file mode 100644 index 0000000..b0d935c --- /dev/null +++ b/my_src/oled-fonts.h @@ -0,0 +1,226 @@ +/* + * oled-fonts.h + * + * Created on: May 29, 2017 + * Author: wn + */ + +#ifndef OLED_FONTS_H_ +#define OLED_FONTS_H_ + + +/* + * Code found at http://www.instructables.com/id/How-to-use-OLED-display-arduino-module/ + * Thank you very much! + * Adapted from Arduino to STM32 HAL by wollud1969 + */ + + + +const unsigned char F6x8[][6] = +{ + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp + { 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! + { 0x00, 0x00, 0x07, 0x00, 0x07, 0x00 }, // " + { 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // # + { 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $ + { 0x00, 0x62, 0x64, 0x08, 0x13, 0x23 }, // % + { 0x00, 0x36, 0x49, 0x55, 0x22, 0x50 }, // & + { 0x00, 0x00, 0x05, 0x03, 0x00, 0x00 }, // ' + { 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00 }, // ( + { 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00 }, // ) + { 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14 }, // * + { 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08 }, // + + { 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00 }, // , + { 0x00, 0x08, 0x08, 0x08, 0x08, 0x08 }, // - + { 0x00, 0x00, 0x60, 0x60, 0x00, 0x00 }, // . + { 0x00, 0x20, 0x10, 0x08, 0x04, 0x02 }, // / + { 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E }, // 0 + { 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00 }, // 1 + { 0x00, 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2 + { 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31 }, // 3 + { 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10 }, // 4 + { 0x00, 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5 + { 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30 }, // 6 + { 0x00, 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7 + { 0x00, 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8 + { 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E }, // 9 + { 0x00, 0x00, 0x36, 0x36, 0x00, 0x00 }, // : + { 0x00, 0x00, 0x56, 0x36, 0x00, 0x00 }, // ; + { 0x00, 0x08, 0x14, 0x22, 0x41, 0x00 }, // < + { 0x00, 0x14, 0x14, 0x14, 0x14, 0x14 }, // = + { 0x00, 0x00, 0x41, 0x22, 0x14, 0x08 }, // > + { 0x00, 0x02, 0x01, 0x51, 0x09, 0x06 }, // ? + { 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E }, // @ + { 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C }, // A + { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36 }, // B + { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22 }, // C + { 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C }, // D + { 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41 }, // E + { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01 }, // F + { 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A }, // G + { 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F }, // H + { 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00 }, // I + { 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01 }, // J + { 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41 }, // K + { 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40 }, // L + { 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F }, // M + { 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F }, // N + { 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E }, // O + { 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06 }, // P + { 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E }, // Q + { 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46 }, // R + { 0x00, 0x46, 0x49, 0x49, 0x49, 0x31 }, // S + { 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01 }, // T + { 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F }, // U + { 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F }, // V + { 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F }, // W + { 0x00, 0x63, 0x14, 0x08, 0x14, 0x63 }, // X + { 0x00, 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y + { 0x00, 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z + { 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00 }, // [ 91 + { 0x00, 0x02, 0x04 ,0x08, 0x10, 0x20 }, // \92 + { 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00 }, // ] + { 0x00, 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^ + { 0x00, 0x40, 0x40, 0x40, 0x40, 0x40 }, // _ + { 0x00, 0x00, 0x01, 0x02, 0x04, 0x00 }, // ' + { 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, // a + { 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38 }, // b + { 0x00, 0x38, 0x44, 0x44, 0x44, 0x20 }, // c + { 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F }, // d + { 0x00, 0x38, 0x54, 0x54, 0x54, 0x18 }, // e + { 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02 }, // f + { 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C }, // g + { 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78 }, // h + { 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00 }, // i + { 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00 }, // j + { 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00 }, // k + { 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00 }, // l + { 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78 }, // m + { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78 }, // n + { 0x00, 0x38, 0x44, 0x44, 0x44, 0x38 }, // o + { 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18 }, // p + { 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC }, // q + { 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08 }, // r + { 0x00, 0x48, 0x54, 0x54, 0x54, 0x20 }, // s + { 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20 }, // t + { 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C }, // u + { 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C }, // v + { 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C }, // w + { 0x00, 0x44, 0x28, 0x10, 0x28, 0x44 }, // x + { 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C }, // y + { 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44 }, // z + { 0x14, 0x14, 0x14, 0x14, 0x14, 0x14 } // horiz lines +}; + + + + + + + + +const unsigned char F8X16[]= +{ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0 + 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!1 + 0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"2 + 0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//#3 + 0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$4 + 0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//%5 + 0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//&6 + 0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//'7 + 0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//(8 + 0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//)9 + 0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//*10 + 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+11 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//,12 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//-13 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//.14 + 0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,///15 + 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//016 + 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//117 + 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//218 + 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//319 + 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//420 + 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//521 + 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//622 + 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//723 + 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//824 + 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//925 + 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//:26 + 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//;27 + 0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//<28 + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//=29 + 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//>30 + 0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//?31 + 0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@32 + 0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A33 + 0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B34 + 0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C35 + 0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D36 + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E37 + 0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F38 + 0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G39 + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H40 + 0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I41 + 0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J42 + 0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K43 + 0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L44 + 0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M45 + 0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N46 + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O47 + 0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P48 + 0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q49 + 0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R50 + 0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S51 + 0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T52 + 0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U53 + 0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V54 + 0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W55 + 0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X56 + 0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y57 + 0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z58 + 0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[59 + 0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\60 + 0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//]61 + 0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^62 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_63 + 0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//`64 + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a65 + 0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b66 + 0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c67 + 0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d68 + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e69 + 0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f70 + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g71 + 0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h72 + 0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i73 + 0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j74 + 0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k75 + 0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l76 + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m77 + 0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n78 + 0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o79 + 0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p80 + 0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q81 + 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r82 + 0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s83 + 0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t84 + 0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//unsigned char5 + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v86 + 0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w87 + 0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x88 + 0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y89 + 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z90 + 0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{91 + 0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//|92 + 0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//}93 + 0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~94 + +}; + + + + +#endif /* OLED_FONTS_H_ */ diff --git a/my_src/oled.c b/my_src/oled.c new file mode 100644 index 0000000..cbfeb19 --- /dev/null +++ b/my_src/oled.c @@ -0,0 +1,523 @@ +/* + * Code found at http://www.instructables.com/id/How-to-use-OLED-display-arduino-module/ + * Thank you very much! + * Adapted from Arduino to STM32 HAL by wollud1969 + */ + + +#include "oled.h" +#include "oled-fonts.h" +#include "stm32f1xx_hal.h" + + + +#define HIGH GPIO_PIN_SET +#define LOW GPIO_PIN_RESET + + +// DO: SPI Clk, D1: SPI Data + + +extern SPI_HandleTypeDef hspi1; + + + + + + +static void __LEDPIN_RST(GPIO_PinState v) { + HAL_GPIO_WritePin(OLED_RST_GPIO_Port, OLED_RST_Pin, v); +} + +static void __LEDPIN_DC(GPIO_PinState v) { + HAL_GPIO_WritePin(OLED_DC_GPIO_Port, OLED_DC_Pin, v); +} + +static void __LEDPIN_CS(GPIO_PinState v) { + HAL_GPIO_WritePin(OLED_CS_GPIO_Port, OLED_CS_Pin, v); +} + +void LED_WrDat(unsigned char data) +{ + __LEDPIN_CS(LOW); + __LEDPIN_DC(HIGH); + + HAL_SPI_Transmit(&hspi1, &data, 1, 0); + + __LEDPIN_CS(HIGH); +} +void LED_WrCmd(unsigned char cmd) +{ + __LEDPIN_CS(LOW); + __LEDPIN_DC(LOW); + + HAL_SPI_Transmit(&hspi1, &cmd, 1, 0); + + __LEDPIN_CS(HIGH); +} +void LED_Set_Pos(unsigned char x, unsigned char y) +{ + LED_WrCmd(0xb0+y); + LED_WrCmd(((x&0xf0)>>4)|0x10); + LED_WrCmd((x&0x0f)|0x00); +} + + +void LED_Fill(unsigned char bmp_data) +{ + unsigned char y,x; + + for(y=0;y<8;y++) + { + LED_WrCmd(0xb0+y); + LED_WrCmd(0x00); + LED_WrCmd(0x10); + for(x=0;x<128;x++) + LED_WrDat(bmp_data); + } +} + + + +void LED_CLS(void) +{ + unsigned char y,x; + for(y=0;y<8;y++) + { + LED_WrCmd(0xb0+y); + LED_WrCmd(0x00); + LED_WrCmd(0x10); + for(x=0;x<128;x++) + LED_WrDat(0); + } +} + +void LED_DLY_ms(unsigned int ms) +{ + uint32_t start = HAL_GetTick(); + while (HAL_GetTick() < start + ms); +} + +void SetStartColumn(unsigned char d) +{ + LED_WrCmd(0x00+d%16); // Set Lower Column Start Address for Page Addressing Mode + // Default => 0x00 + LED_WrCmd(0x10+d/16); // Set Higher Column Start Address for Page Addressing Mode + // Default => 0x10 +} + +void SetAddressingMode(unsigned char d) +{ + LED_WrCmd(0x20); // Set Memory Addressing Mode + LED_WrCmd(d); // Default => 0x02 + // 0x00 => Horizontal Addressing Mode + // 0x01 => Vertical Addressing Mode + // 0x02 => Page Addressing Mode +} + +void SetColumnAddress(unsigned char a, unsigned char b) +{ + LED_WrCmd(0x21); // Set Column Address + LED_WrCmd(a); // Default => 0x00 (Column Start Address) + LED_WrCmd(b); // Default => 0x7F (Column End Address) +} + +void SetPageAddress(unsigned char a, unsigned char b) +{ + LED_WrCmd(0x22); // Set Page Address + LED_WrCmd(a); // Default => 0x00 (Page Start Address) + LED_WrCmd(b); // Default => 0x07 (Page End Address) +} + +void SetStartLine(unsigned char d) +{ + LED_WrCmd(0x40|d); // Set Display Start Line + // Default => 0x40 (0x00) +} + +void SetContrastControl(unsigned char d) +{ + LED_WrCmd(0x81); // Set Contrast Control + LED_WrCmd(d); // Default => 0x7F +} + +void Set_Charge_Pump(unsigned char d) +{ + LED_WrCmd(0x8D); // Set Charge Pump + LED_WrCmd(0x10|d); // Default => 0x10 + // 0x10 (0x00) => Disable Charge Pump + // 0x14 (0x04) => Enable Charge Pump +} + +void Set_Segment_Remap(unsigned char d) +{ + LED_WrCmd(0xA0|d); // Set Segment Re-Map + // Default => 0xA0 + // 0xA0 (0x00) => Column Address 0 Mapped to SEG0 + // 0xA1 (0x01) => Column Address 0 Mapped to SEG127 +} + +void Set_Entire_Display(unsigned char d) +{ + LED_WrCmd(0xA4|d); // Set Entire Display On / Off + // Default => 0xA4 + // 0xA4 (0x00) => Normal Display + // 0xA5 (0x01) => Entire Display On +} + +void Set_Inverse_Display(unsigned char d) +{ + LED_WrCmd(0xA6|d); // Set Inverse Display On/Off + // Default => 0xA6 + // 0xA6 (0x00) => Normal Display + // 0xA7 (0x01) => Inverse Display On +} + +void Set_Multiplex_Ratio(unsigned char d) +{ + LED_WrCmd(0xA8); // Set Multiplex Ratio + LED_WrCmd(d); // Default => 0x3F (1/64 Duty) +} + +void Set_Display_On_Off(unsigned char d) +{ + LED_WrCmd(0xAE|d); // Set Display On/Off + // Default => 0xAE + // 0xAE (0x00) => Display Off + // 0xAF (0x01) => Display On +} + +void SetStartPage(unsigned char d) +{ + LED_WrCmd(0xB0|d); // Set Page Start Address for Page Addressing Mode + // Default => 0xB0 (0x00) +} + +void Set_Common_Remap(unsigned char d) +{ + LED_WrCmd(0xC0|d); // Set COM Output Scan Direction + // Default => 0xC0 + // 0xC0 (0x00) => Scan from COM0 to 63 + // 0xC8 (0x08) => Scan from COM63 to 0 +} + +void Set_Display_Offset(unsigned char d) +{ + LED_WrCmd(0xD3); // Set Display Offset + LED_WrCmd(d); // Default => 0x00 +} + +void Set_Display_Clock(unsigned char d) +{ + LED_WrCmd(0xD5); // Set Display Clock Divide Ratio / Oscillator Frequency + LED_WrCmd(d); // Default => 0x80 + // D[3:0] => Display Clock Divider + // D[7:4] => Oscillator Frequency +} + +void Set_Precharge_Period(unsigned char d) +{ + LED_WrCmd(0xD9); // Set Pre-Charge Period + LED_WrCmd(d); // Default => 0x22 (2 Display Clocks [Phase 2] / 2 Display Clocks [Phase 1]) + // D[3:0] => Phase 1 Period in 1~15 Display Clocks + // D[7:4] => Phase 2 Period in 1~15 Display Clocks +} + +void Set_Common_Config(unsigned char d) +{ + LED_WrCmd(0xDA); // Set COM Pins Hardware Configuration + LED_WrCmd(0x02|d); // Default => 0x12 (0x10) + // Alternative COM Pin Configuration + // Disable COM Left/Right Re-Map +} + +void Set_VCOMH(unsigned char d) +{ + LED_WrCmd(0xDB); // Set VCOMH Deselect Level + LED_WrCmd(d); // Default => 0x20 (0.77*VCC) +} + +void Set_NOP(void) +{ + LED_WrCmd(0xE3); // Command for No Operation +} + +void LED_Init(void) +{ + // LEDPIN_Init(); + // LED_PORT=0X0F; + //LED_SCLH;;; + //LED_RSTL;;; + //digitalWrite(SCL_PIN,HIGH);;; + __LEDPIN_RST(LOW); + // for(i=0;i<100;i++)asm("nop"); + LED_DLY_ms(50); + //LED_RSTH;;; + __LEDPIN_RST(HIGH); + + Set_Display_On_Off(0x00); // Display Off (0x00/0x01) + Set_Display_Clock(0x80); // Set Clock as 100 Frames/Sec + Set_Multiplex_Ratio(0x3F); // 1/64 Duty (0x0F~0x3F) + Set_Display_Offset(0x00); // Shift Mapping RAM Counter (0x00~0x3F) + SetStartLine(0x00); // Set Mapping RAM Display Start Line (0x00~0x3F) + Set_Charge_Pump(0x04); // Enable Embedded DC/DC Converter (0x00/0x04) + SetAddressingMode(0x02); // Set Page Addressing Mode (0x00/0x01/0x02) + Set_Segment_Remap(0x01); // Set SEG/Column Mapping + Set_Common_Remap(0x08); // Set COM/Row Scan Direction + Set_Common_Config(0x10); // Set Sequential Configuration (0x00/0x10) + SetContrastControl(0xCF); // Set SEG Output Current + Set_Precharge_Period(0xF1); // Set Pre-Charge as 15 Clocks & Discharge as 1 Clock + Set_VCOMH(0x40); // Set VCOM Deselect Level + Set_Entire_Display(0x00); // Disable Entire Display On (0x00/0x01) + Set_Inverse_Display(0x00); // Disable Inverse Display On (0x00/0x01) + Set_Display_On_Off(0x01); // Display On (0x00/0x01) + LED_Fill(0x00); //clear all + LED_Set_Pos(0,0); +} + + +void LED_P6x8Char(unsigned char x,unsigned char y,unsigned char ch) +{ + unsigned char c=0,i=0; + + c =ch-32; + if(x>122) + { + x=0; + y++; + } + LED_Set_Pos(x,y); + for(i=0;i<6;i++) + { + LED_WrDat(F6x8[c][i]); + } +} + +void LED_P6x8Str(unsigned char x,unsigned char y,char ch[]) +{ + unsigned char c=0,i=0,j=0; + while (ch[j]!='\0') + { + c =ch[j]-32; + if(x>126) + { + x=0; + y++; + } + LED_Set_Pos(x,y); + for(i=0;i<6;i++) + { + LED_WrDat(F6x8[c][i]); + } + x+=6; + j++; + } +} + +void LED_P8x16Str(unsigned char x,unsigned char y,char ch[]) +{ + unsigned char c=0,i=0,j=0; + while (ch[j]!='\0') + { + c =ch[j]-32; + if(x>120) + { + x=0; + y++; + } + LED_Set_Pos(x,y); + for(i=0;i<8;i++) + { + LED_WrDat(F8X16[(c<<4)+i]); + } + LED_Set_Pos(x,y+1); + for(i=0;i<8;i++) + { + LED_WrDat(F8X16[(c<<4)+i+8]); + } + x+=8; + j++; + } +} + + + +void LED_PrintBMP(unsigned char x0,unsigned char y0,unsigned char x1,unsigned char y1,unsigned char bmp[]) +{ + int ii=0; + unsigned char x,y; + for(y=y0;y<=y1;y++) + { + LED_Set_Pos(x0,y); + for(x=x0;x