From 2ac0af3fead14c0c3819bdfd2ced2889cba24a60 Mon Sep 17 00:00:00 2001 From: dplimin Date: Tue, 26 Sep 2023 16:36:13 +0300 Subject: [PATCH] design first screen --- .settings/language.settings.xml | 4 +- A1210.elf.launch | 25 ++- Core/Inc/main.h | 4 +- Core/Inc/my.h | 4 +- Core/Inc/ssd1306_conf.h | 18 +- Core/Src/main.c | 340 +++++++++++++++++++++++++++++--- Core/Src/spi.c | 8 +- Core/Src/ssd1306.c | 2 +- Core/Src/tim.c | 12 +- 9 files changed, 371 insertions(+), 46 deletions(-) diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 4db43d6..822e527 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -4,7 +4,7 @@ - + @@ -14,7 +14,7 @@ - + diff --git a/A1210.elf.launch b/A1210.elf.launch index 08686e2..4c2d200 100644 --- a/A1210.elf.launch +++ b/A1210.elf.launch @@ -4,28 +4,39 @@ + + + + + - + - - + + - - + + + + + - + + + + @@ -33,8 +44,10 @@ + + diff --git a/Core/Inc/main.h b/Core/Inc/main.h index bb9b62b..9a453cb 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -64,7 +64,7 @@ void Error_Handler(void); #define STD_GPIO_Port GPIOC #define SCK_Pin GPIO_PIN_2 #define SCK_GPIO_Port GPIOC -#define ON_Pin GPIO_PIN_3 +#define ON_Pin GPIO_PIN_4 //Был3 #define ON_GPIO_Port GPIOC #define OFF_Pin GPIO_PIN_2 #define OFF_GPIO_Port GPIOA @@ -106,6 +106,8 @@ void Error_Handler(void); /* USER CODE END Private defines */ + + #ifdef __cplusplus } #endif diff --git a/Core/Inc/my.h b/Core/Inc/my.h index 451274d..efeccb0 100644 --- a/Core/Inc/my.h +++ b/Core/Inc/my.h @@ -22,11 +22,11 @@ #include "string.h" -#define LOGO_TIME_MS (3000u) +#define LOGO_TIME_MS (500u) #define lo(x) ((uint8_t) ((x) & 0xFF)) #define hi(x) ((uint8_t) (((x) >> 8) & 0xFF)) - +#define ABS(x) (((x) < 0)?-(x) :(x)) diff --git a/Core/Inc/ssd1306_conf.h b/Core/Inc/ssd1306_conf.h index b30fa53..747f93d 100644 --- a/Core/Inc/ssd1306_conf.h +++ b/Core/Inc/ssd1306_conf.h @@ -10,12 +10,12 @@ // Choose a microcontroller family //#define STM32F0 //#define STM32F1 -//#define STM32F4 +#define STM32F4 //#define STM32L0 //#define STM32L4 //#define STM32F3 //#define STM32H7 -#define STM32F7 +//#define STM32F7 // Choose a bus //#define SSD1306_USE_I2C @@ -26,14 +26,14 @@ //#define SSD1306_I2C_ADDR (0x3C << 1) // SPI Configuration -#define SSD1306_SPI_PORT hspi2 +#define SSD1306_SPI_PORT hspi1 -#define SSD1306_CS_Port GPIOC -#define SSD1306_CS_Pin GPIO_PIN_7 -#define SSD1306_DC_Port GPIOC -#define SSD1306_DC_Pin GPIO_PIN_2 -#define SSD1306_Reset_Port GPIOC -#define SSD1306_Reset_Pin GPIO_PIN_8 +#define SSD1306_CS_Port GPIOA +#define SSD1306_CS_Pin GPIO_PIN_8 +#define SSD1306_DC_Port GPIOA +#define SSD1306_DC_Pin GPIO_PIN_6 +#define SSD1306_Reset_Port GPIOA +#define SSD1306_Reset_Pin GPIO_PIN_12 // Mirror the screen if needed // #define SSD1306_MIRROR_VERT diff --git a/Core/Src/main.c b/Core/Src/main.c index 9df5cf9..dc66358 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -25,33 +25,25 @@ #include "tim.h" #include "usart.h" #include "gpio.h" +#include "OLED_Fonts.h" +#include "string.h" +#include +#include +#include +#include "my.h" -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ +#include "ssd1306.h" -/* USER CODE END Includes */ -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ +__IO uint16_t repeat = 0; +volatile int needRefresh; /// -/* USER CODE END PTD */ +typedef enum +{ + CURSOR = Black, + TEXT = White +}typeTEXT; -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ - -/* USER CODE BEGIN PV */ - -/* USER CODE END PV */ - -/* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP */ @@ -66,11 +58,266 @@ void SystemClock_Config(void); * @brief The application entry point. * @retval int */ + + + +//0,2; 1; 2; 10 фвч +//0,1; 0,3; 1; 3; 10; 30; 100 фнч + + +typedef struct { + int kPr; + int kExit; + int FVCH; + int FNCH; +} set_type; + + +char pString[16] = {0}; + +char* FloatToASCII(float Val, int32_t RoundTo) +{ +uint8_t idx = 0; +int32_t i; +float value, F, I; +uint32_t rnd = 0; + +uint32_t Tmp32 = 0; +uint32_t Int32 = 0; +uint32_t Frac32 = 0; +uint32_t _I32 = 0; +uint32_t _F32 = 0; +uint32_t d = 0, dd = 0; +char tmparray[32]; +volatile bool minus = false; + + + + memset(tmparray, 0, 32); + memset(pString, 0, 16); + + value = Val; + if(value < 0) + minus = true; + + if((Val >= 10000.00000f)/* || (Val <= 0)*/) + { + if(Val <= 0) + { + pString[0] = '0'; + pString[1] = '~'; + pString[2] = '0'; + pString[3] = '\0'; + } + else + { + pString[0] = '1'; + pString[1] = '0'; + pString[2] = '0'; + pString[3] = '0'; + pString[4] = '0'; + pString[5] = '\0'; + } + + return pString; + } + + value = ABS(Val); + rnd = ABS(RoundTo); + if(RoundTo < 0) + { + F = modff(value, &I); + while(rnd) + { + F *= 10.0f; + rnd--; + d++; + } + F = roundf(F); + + dd = 1; + for(i = 0; i < d; i++) + dd *= 10; + + if((uint32_t) F == dd) + { + F = 0; + I += 1; + } + + } + else + { + I = roundf(value); + F = 0.0f; + } + + Int32 = (uint32_t) I; + Frac32 = (uint32_t) F; + _I32 = Int32; + _F32 = Frac32; + + + idx = 0; + tmparray[idx++] = '\0'; + if((Int32 == 0) && (Frac32 == 0)) + { + if(RoundTo < 0) + { + for(i = 0; i < abs(RoundTo); i++) + tmparray[idx++] = '0'; + tmparray[idx++] = '~'; + } + tmparray[idx++] = '0'; + } + else + { + if(RoundTo < 0) + { + for(i = 0; i < abs(RoundTo); i++) + { + Tmp32 = Frac32; + Frac32 /= 10; + Tmp32 = Tmp32 - Frac32 * 10; + tmparray[idx++] = '0' + Tmp32; + } + tmparray[idx++] = '~'; + } + + if(Int32 != 0) + { + while(Int32) + { + Tmp32 = Int32; + Int32 /= 10; + Tmp32 = Tmp32 - Int32 * 10; + tmparray[idx++] = '0' + Tmp32; + } + } + else + tmparray[idx++] = '0'; + + if(minus) + { + if((_I32 != 0) || (_F32 != 0)) + tmparray[idx++] = '-'; + } + } + + for(i = 0; i < idx; i++) + pString[i] = tmparray[idx - i - 1]; + + return pString; +} + + +uint16_t readkey(void) +{ +uint16_t key = 0; + + if(HAL_GPIO_ReadPin(OK_BTN_GPIO_Port, OK_BTN_Pin) == GPIO_PIN_RESET) + key |= OK_BTN_Pin; + if(HAL_GPIO_ReadPin(UP_BTN_GPIO_Port, UP_BTN_Pin) == GPIO_PIN_RESET) + key |= UP_BTN_Pin; + if(HAL_GPIO_ReadPin(DN_BTN_GPIO_Port, DN_BTN_Pin) == GPIO_PIN_RESET) + key |= DN_BTN_Pin; + if(HAL_GPIO_ReadPin(ON_GPIO_Port, ON_Pin) == GPIO_PIN_RESET) + key |= ON_Pin; + + return key; +} + + +uint16_t kbhit(void) +{ +volatile uint16_t key; +static uint32_t dreb = 0; //дребезг +static uint8_t first = 1; //признак первого момента нажатия кнопки +static uint16_t rep = 50; + + do + { + key = readkey(); + + if(!key) + { + if(dreb) + dreb--; + else first = 1; + } + else + { + if(dreb < 3) + dreb++; + } + } + while((dreb > 0) && (dreb < 3)); + + + + if(!key) //если кнопки отпущены + { + first = 1; //достоверно кнопки отпущены + return 0; //вернуть 0 + } + else //иначе + { + if(first) //определить кнопку + { //только один раз + first = 0; //за нажатие + repeat = rep = 32; + return key; //вернуть в главную функцию состояние клавиатуры + } + else + { + if(repeat) + return 0; //имитация свободной клавиатуры + else + { + if(rep > 0) + rep >>= 1; + else rep = 32; + + repeat = rep; + // if(key == KEY_RESET_Pin) + // return 0; + + + return key; + } + } + } +} + +const float exitVar[] = {0.1, 0,2, 0,5, 1, 2, 5, 10, 20, 50, 100, 200, 500}; +const float fvchVar[] = {0.2, 1, 2, 10}; +const float fnchVar[] = {0.1, 0.3, 1, 3, 10, 30, 100}; + +const char string11[] = "Rgh"; +const char string12[] = "gRk/vc2"; + +const char string21[] = "Ds[jl"; +const char string22[] = "vD/vc2"; + +const char string31[] = "ADX"; +const char string32[] = "Uw"; + +const char string41[] = "AYX"; +const char string42[] = "rUw"; + +const char string51[] = "Gthtuheprf!!!"; + int main(void) { + set_type set; + set.kPr = 22222; + set.kExit =22222; + set.FVCH=22222; + set.FNCH=22222; + + HAL_Init(); SystemClock_Config(); - MX_FLASH_Init(); MX_GPIO_Init(); MX_DMA_Init(); @@ -80,9 +327,56 @@ int main(void) MX_TIM7_Init(); MX_USART1_UART_Init(); + + /////Мой код здесь + + + ssd1306_Init(); + DrawLogo(); + HAL_Delay(100); + ssd1306_Fill(Black); + ssd1306_UpdateScreen(); + ssd1306_SetCursor(0, 7); + while (1) { + FontSet(Segoe_UI_Rus_8); + OLED_DrawStr(string11, 1, 10, TEXT); + OLED_DrawStr(FloatToASCII(2.45f, -3), 40, 10, TEXT); + // OLED_DrawStr(FloatToASCII(2.45f, 0), 40, 10, TEXT); +// OLED_DrawNum(set.kPr, 40, 10, TEXT); + OLED_DrawStr(string12, 80, 10, TEXT); +//////////////////////////// + OLED_DrawStr(string21, 1, 20, TEXT); + OLED_DrawNum(set.kExit, 40, 20, CURSOR); + OLED_DrawStr(string22, 80, 20, TEXT); +//////////////////////////// + OLED_DrawStr(string31, 2, 30, TEXT); + OLED_DrawNum(set.FVCH, 40, 30, TEXT); + OLED_DrawStr(string32, 80, 30, TEXT); +////////////// + OLED_DrawStr(string41, 2, 40, TEXT); + OLED_DrawNum(set.FNCH, 40, 40, TEXT); + OLED_DrawStr(string42, 80, 40, TEXT); +////////////// + OLED_DrawStr(string51, 30, 50, TEXT); + + //OLED_DrawChar("n", 4, 4, TEXT); + + + + //if(readkey()==OK_BTN_Pin) OLED_DrawStr("jr", 255, 8, White); + //if(readkey()==DN_BTN_Pin) OLED_DrawStr("dybp", 255, 20, White); + //if(readkey()==UP_BTN_Pin) OLED_DrawStr("ddth[", 255, 32, White); + //if(readkey()==ON_Pin) OLED_DrawStr("drk", 255, 44, White); + //HAL_Delay(300); + // ssd1306_Fill(Black); + //; // + //OLED_DrawStr("Ds[jl", 255, 20, White); // + //OLED_DrawStr("adx", 255, 32, White); // Modbus + //OLED_DrawStr("ayx", 255, 44, White); + needRefresh=1; } } diff --git a/Core/Src/spi.c b/Core/Src/spi.c index 8024faa..3e1dce7 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -77,13 +77,19 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) PA6 ------> SPI1_MISO PA7 ------> SPI1_MOSI */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Pin = GPIO_PIN_5|/*GPIO_PIN_6|*/GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* USER CODE BEGIN SPI1_MspInit 1 */ /* USER CODE END SPI1_MspInit 1 */ diff --git a/Core/Src/ssd1306.c b/Core/Src/ssd1306.c index fe239da..77dedac 100644 --- a/Core/Src/ssd1306.c +++ b/Core/Src/ssd1306.c @@ -8,7 +8,7 @@ extern __IO bool por; extern __IO bool clbr; -extern const char SERIAL[]; +const char SERIAL[] ={'0','2','3'}; extern __IO UserData_TypeDef pardata, pardata_old; __IO uint8_t DMA_Ready = 0; diff --git a/Core/Src/tim.c b/Core/Src/tim.c index 2078b89..b91011a 100644 --- a/Core/Src/tim.c +++ b/Core/Src/tim.c @@ -22,6 +22,8 @@ /* USER CODE BEGIN 0 */ +extern int needRefresh; + /* USER CODE END 0 */ TIM_HandleTypeDef htim3; @@ -96,7 +98,7 @@ void MX_TIM7_Init(void) Error_Handler(); } /* USER CODE BEGIN TIM7_Init 2 */ - + HAL_TIM_Base_Start_IT(&htim7); /* USER CODE END TIM7_Init 2 */ } @@ -163,6 +165,14 @@ void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) } /* USER CODE BEGIN 1 */ +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ + + if(needRefresh==1) {//ssd1306_Fill(0x00); + ssd1306_UpdateScreen(); + needRefresh=0; + } + } /* USER CODE END 1 */