всё работает

+экранчик
This commit is contained in:
2025-12-30 09:35:49 +03:00
parent 260a6416ad
commit 5d013ad4c4
75 changed files with 10048 additions and 2865 deletions

52
Core/Inc/i2c.h Normal file
View File

@@ -0,0 +1,52 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file i2c.h
* @brief This file contains all the function prototypes for
* the i2c.c file
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __I2C_H__
#define __I2C_H__
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
extern I2C_HandleTypeDef hi2c1;
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
void MX_I2C1_Init(void);
/* USER CODE BEGIN Prototypes */
/* USER CODE END Prototypes */
#ifdef __cplusplus
}
#endif
#endif /* __I2C_H__ */

View File

@@ -47,7 +47,7 @@
/*#define HAL_HRTIM_MODULE_ENABLED */
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_I2C_MODULE_ENABLED */
#define HAL_I2C_MODULE_ENABLED
/*#define HAL_I2S_MODULE_ENABLED */
/*#define HAL_LPTIM_MODULE_ENABLED */
/*#define HAL_NAND_MODULE_ENABLED */

View File

@@ -0,0 +1,135 @@
// Название шрифта Tahoma 12
// Автор шрифта Anonymous
// Дата и время генерации 24.12.2025 13:17:15
// Сгенерировано matrixFont v2.1.2.84
// Кодовая страница ANSI (ASCII 7-битная)
// Riva Lab :: riva-lab.gitlab.io
#ifndef FONT_TAHOMA_15_H
#define FONT_TAHOMA_15_H
#ifndef FONT_TYPE_MONOSPACED
#define FONT_TYPE_MONOSPACED 0
#endif
#ifndef FONT_TYPE_PROPORTIONAL
#define FONT_TYPE_PROPORTIONAL 1
#endif
#define FONT_TAHOMA_15_LENGTH 96
#define FONT_TAHOMA_15_START_CHAR 32
#define FONT_TAHOMA_15_CHAR_WIDTH 14
#define FONT_TAHOMA_15_CHAR_HEIGHT 16
#define FONT_TAHOMA_15_FONT_TYPE (FONT_TYPE_PROPORTIONAL)
#define FONT_TAHOMA_15_ARRAY_LENGTH (FONT_TAHOMA_15_LENGTH * (1 + FONT_TAHOMA_15_CHAR_WIDTH * 2))
const unsigned char font_tahoma_15[FONT_TAHOMA_15_ARRAY_LENGTH] =
{
6, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 32 < >
1, /*N*/ 0xFE, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 33 <!>
4, /*N*/ 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 34 <">
11, /*N*/ 0x00, 0x02, 0x10, 0x1A, 0x90, 0x07, 0x78, 0x02, 0x16, 0x02, 0x10, 0x02, 0x10, 0x1A, 0x90, 0x07, 0x78, 0x02, 0x16, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 35 <#>
7, /*N*/ 0x70, 0x08, 0x88, 0x10, 0x88, 0x10, 0xFE, 0xFF, 0x08, 0x11, 0x08, 0x11, 0x10, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 36 <$>
14, /*N*/ 0x7C, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x10, 0x82, 0x0C, 0x7C, 0x02, 0x80, 0x01, 0x60, 0x00, 0x90, 0x0F, 0x4C, 0x10, 0x42, 0x10, 0x40, 0x10, 0x40, 0x10, 0x80, 0x0F, // Символ 37 <%>
10, /*N*/ 0x00, 0x07, 0x9C, 0x08, 0x62, 0x10, 0x42, 0x10, 0xC2, 0x10, 0x22, 0x11, 0x1C, 0x0A, 0x00, 0x06, 0xC0, 0x09, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 38 <&>
1, /*N*/ 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 39 <'>
4, /*N*/ 0xF0, 0x0F, 0x0C, 0x30, 0x02, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 40 <(>
4, /*N*/ 0x01, 0x80, 0x02, 0x40, 0x0C, 0x30, 0xF0, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 41 <)>
7, /*N*/ 0x22, 0x00, 0x14, 0x00, 0x08, 0x00, 0x7F, 0x00, 0x08, 0x00, 0x14, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 42 <*>
9, /*N*/ 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 43 <+>
2, /*N*/ 0x00, 0xC0, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 44 <,>
5, /*N*/ 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 45 <->
1, /*N*/ 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 46 <.>
6, /*N*/ 0x00, 0xC0, 0x00, 0x38, 0x00, 0x07, 0xE0, 0x00, 0x1C, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 47 </>
// Digits / Цифры
8, /*N*/ 0xF8, 0x07, 0x04, 0x08, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x04, 0x08, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 48 <0>
5, /*N*/ 0x08, 0x10, 0x08, 0x10, 0xFE, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 49 <1>
7, /*N*/ 0x04, 0x18, 0x02, 0x14, 0x02, 0x12, 0x02, 0x11, 0x82, 0x10, 0x44, 0x10, 0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 50 <2>
7, /*N*/ 0x04, 0x08, 0x02, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0xA4, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 51 <3>
8, /*N*/ 0x80, 0x01, 0x40, 0x01, 0x20, 0x01, 0x10, 0x01, 0x08, 0x01, 0x04, 0x01, 0xFE, 0x1F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 52 <4>
7, /*N*/ 0x3E, 0x08, 0x22, 0x10, 0x22, 0x10, 0x22, 0x10, 0x22, 0x10, 0x42, 0x08, 0x82, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 53 <5>
8, /*N*/ 0xF0, 0x07, 0x48, 0x08, 0x24, 0x10, 0x22, 0x10, 0x22, 0x10, 0x22, 0x10, 0x42, 0x08, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 54 <6>
7, /*N*/ 0x02, 0x00, 0x02, 0x18, 0x02, 0x06, 0x82, 0x01, 0x62, 0x00, 0x1A, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 55 <7>
8, /*N*/ 0x18, 0x07, 0xA4, 0x08, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0xA4, 0x08, 0x18, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 56 <8>
8, /*N*/ 0x78, 0x00, 0x84, 0x10, 0x02, 0x11, 0x02, 0x11, 0x02, 0x11, 0x02, 0x09, 0x84, 0x04, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 57 <9>
1, /*N*/ 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 58 <:>
2, /*N*/ 0x00, 0xC0, 0x30, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 59 <;>
8, /*N*/ 0x80, 0x00, 0x40, 0x01, 0x40, 0x01, 0x20, 0x02, 0x20, 0x02, 0x10, 0x04, 0x10, 0x04, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 60 <<>
9, /*N*/ 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 61 <=>
8, /*N*/ 0x08, 0x08, 0x10, 0x04, 0x10, 0x04, 0x20, 0x02, 0x20, 0x02, 0x40, 0x01, 0x40, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 62 <>>
6, /*N*/ 0x04, 0x00, 0x02, 0x00, 0x02, 0x1B, 0x82, 0x00, 0x44, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 63 <?>
13, /*N*/ 0xE0, 0x07, 0x18, 0x18, 0x04, 0x20, 0xC4, 0x23, 0x22, 0x44, 0x12, 0x48, 0x12, 0x48, 0x12, 0x48, 0x12, 0x44, 0xF4, 0x0F, 0x04, 0x08, 0x18, 0x08, 0xE0, 0x07, 0x00, 0x00, // Символ 64 <@>
// Roman Capitals / Латиница, прописные
10, /*N*/ 0x00, 0x18, 0x00, 0x07, 0xE0, 0x01, 0x1C, 0x01, 0x02, 0x01, 0x02, 0x01, 0x1C, 0x01, 0xE0, 0x01, 0x00, 0x07, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 65 <A>
8, /*N*/ 0xFE, 0x1F, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x62, 0x10, 0x9C, 0x08, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 66 <B>
9, /*N*/ 0xF0, 0x03, 0x0C, 0x0C, 0x04, 0x08, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 67 <C>
10, /*N*/ 0xFE, 0x1F, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x04, 0x08, 0x04, 0x08, 0x18, 0x06, 0xE0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 68 <D>
8, /*N*/ 0xFE, 0x1F, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x42, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 69 <E>
7, /*N*/ 0xFE, 0x1F, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 70 <F>
10, /*N*/ 0xF0, 0x03, 0x0C, 0x0C, 0x04, 0x08, 0x02, 0x10, 0x02, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x10, 0x84, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 71 <G>
10, /*N*/ 0xFE, 0x1F, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 72 <H>
3, /*N*/ 0x02, 0x10, 0xFE, 0x1F, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 73 <I>
6, /*N*/ 0x00, 0x10, 0x00, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 74 <J>
8, /*N*/ 0xFE, 0x1F, 0x80, 0x00, 0xC0, 0x00, 0x20, 0x01, 0x10, 0x02, 0x08, 0x04, 0x04, 0x08, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 75 <K>
7, /*N*/ 0xFE, 0x1F, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 76 <L>
11, /*N*/ 0xFE, 0x1F, 0x06, 0x00, 0x18, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x02, 0x80, 0x01, 0x60, 0x00, 0x18, 0x00, 0x06, 0x00, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 77 <M>
10, /*N*/ 0xFE, 0x1F, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x08, 0xFE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 78 <N>
11, /*N*/ 0xF0, 0x03, 0x0C, 0x0C, 0x04, 0x08, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x04, 0x08, 0x0C, 0x0C, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 79 <O>
8, /*N*/ 0xFE, 0x1F, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x01, 0x84, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 80 <P>
11, /*N*/ 0xF0, 0x03, 0x0C, 0x0C, 0x04, 0x08, 0x02, 0x10, 0x02, 0x10, 0x02, 0x10, 0x02, 0x70, 0x02, 0x90, 0x04, 0x88, 0x0C, 0x8C, 0xF0, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 81 <Q>
9, /*N*/ 0xFE, 0x1F, 0x82, 0x00, 0x82, 0x00, 0x82, 0x00, 0x82, 0x01, 0x42, 0x02, 0x3C, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 82 <R>
8, /*N*/ 0x38, 0x08, 0x44, 0x10, 0x42, 0x10, 0x42, 0x10, 0x82, 0x10, 0x82, 0x10, 0x82, 0x08, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 83 <S>
9, /*N*/ 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xFE, 0x1F, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 84 <T>
10, /*N*/ 0xFE, 0x07, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0xFE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 85 <U>
9, /*N*/ 0x06, 0x00, 0x38, 0x00, 0xC0, 0x01, 0x00, 0x0E, 0x00, 0x10, 0x00, 0x0E, 0xC0, 0x01, 0x38, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 86 <V>
13, /*N*/ 0x06, 0x00, 0xF8, 0x00, 0x00, 0x0F, 0x00, 0x18, 0x80, 0x07, 0x7C, 0x00, 0x02, 0x00, 0x7C, 0x00, 0x80, 0x07, 0x00, 0x18, 0x00, 0x0F, 0xF8, 0x00, 0x06, 0x00, 0x00, 0x00, // Символ 87 <W>
8, /*N*/ 0x02, 0x10, 0x0C, 0x0C, 0x10, 0x02, 0xE0, 0x01, 0xE0, 0x01, 0x10, 0x02, 0x0C, 0x0C, 0x02, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 88 <X>
9, /*N*/ 0x02, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x60, 0x00, 0x80, 0x1F, 0x60, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 89 <Y>
8, /*N*/ 0x02, 0x18, 0x02, 0x14, 0x02, 0x13, 0x82, 0x10, 0x42, 0x10, 0x32, 0x10, 0x0A, 0x10, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 90 <Z>
4, /*N*/ 0xFF, 0xFF, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 91 <[>
6, /*N*/ 0x03, 0x00, 0x1C, 0x00, 0xE0, 0x00, 0x00, 0x07, 0x00, 0x38, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 92 <\>
4, /*N*/ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 93 <]>
10, /*N*/ 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 94 <^>
9, /*N*/ 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 95 <_>
2, /*N*/ 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 96 <`>
// Roman Smalls / Латиница, строчные
7, /*N*/ 0x00, 0x0E, 0x20, 0x11, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0x90, 0x08, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 97 <a>
8, /*N*/ 0xFF, 0x1F, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 98 <b>
6, /*N*/ 0xC0, 0x07, 0x20, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 99 <c>
8, /*N*/ 0xC0, 0x07, 0x20, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 100 <d>
7, /*N*/ 0xC0, 0x07, 0x20, 0x09, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x20, 0x11, 0xC0, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 101 <e>
5, /*N*/ 0x10, 0x00, 0xFE, 0x1F, 0x11, 0x00, 0x11, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 102 <f>
8, /*N*/ 0xC0, 0x07, 0x20, 0x48, 0x10, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0x90, 0x10, 0x48, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 103 <g>
8, /*N*/ 0xFF, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 104 <h>
1, /*N*/ 0xF6, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 105 <i>
4, /*N*/ 0x00, 0x80, 0x10, 0x80, 0x10, 0x80, 0xF6, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 106 <j>
7, /*N*/ 0xFF, 0x1F, 0x00, 0x01, 0x80, 0x01, 0x40, 0x02, 0x20, 0x04, 0x10, 0x08, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 107 <k>
1, /*N*/ 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 108 <l>
11, /*N*/ 0xF0, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xE0, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 109 <m>
8, /*N*/ 0xF0, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x00, 0xC0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 110 <n>
8, /*N*/ 0xC0, 0x07, 0x20, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 111 <o>
8, /*N*/ 0xF0, 0xFF, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x08, 0xC0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 112 <p>
8, /*N*/ 0xC0, 0x07, 0x20, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0xF0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 113 <q>
5, /*N*/ 0xF0, 0x1F, 0x20, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 114 <r>
6, /*N*/ 0xE0, 0x08, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x20, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 115 <s>
5, /*N*/ 0x10, 0x00, 0xFE, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 116 <t>
8, /*N*/ 0xF0, 0x07, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x08, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 117 <u>
7, /*N*/ 0x30, 0x00, 0xC0, 0x01, 0x00, 0x06, 0x00, 0x18, 0x00, 0x06, 0xC0, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 118 <v>
11, /*N*/ 0x30, 0x00, 0xC0, 0x03, 0x00, 0x1C, 0x00, 0x06, 0xC0, 0x01, 0x30, 0x00, 0xC0, 0x01, 0x00, 0x06, 0x00, 0x1C, 0xC0, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 119 <w>
7, /*N*/ 0x10, 0x10, 0x20, 0x08, 0xC0, 0x06, 0x00, 0x01, 0xC0, 0x06, 0x20, 0x08, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 120 <x>
7, /*N*/ 0x30, 0x00, 0xC0, 0x01, 0x00, 0xE6, 0x00, 0x18, 0x00, 0x06, 0xC0, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 121 <y>
6, /*N*/ 0x10, 0x18, 0x10, 0x14, 0x10, 0x13, 0x90, 0x10, 0x50, 0x10, 0x30, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 122 <z>
7, /*N*/ 0x80, 0x00, 0x80, 0x00, 0x40, 0x01, 0x3E, 0x7E, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 123 <{>
1, /*N*/ 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 124 <|>
7, /*N*/ 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x3E, 0x7E, 0x40, 0x01, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 125 <}>
10, /*N*/ 0x00, 0x03, 0x80, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 126 <~>
4, /*N*/ 0xFE, 0x0F, 0x02, 0x08, 0x02, 0x08, 0xFE, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // Символ 127 <DELETE>
};
#endif // FONT_TAHOMA_15_H

View File

@@ -0,0 +1,267 @@
// Название шрифта Tahoma 8
// Автор шрифта ITS-PC / User
// Дата и время генерации Пт 29.09.23 3:23:12
// Сгенерировано matrixFont v1.2.0.55
// Кодовая страница 1251 (ANSI - кириллица)
// https://gitlab.com/riva-lab/matrixFont
#ifndef FONT_TAHOMA_8_H
#define FONT_TAHOMA_8_H
#ifndef FONT_TYPE_MONOSPACED
#define FONT_TYPE_MONOSPACED 0
#endif
#ifndef FONT_TYPE_PROPORTIONAL
#define FONT_TYPE_PROPORTIONAL 1
#endif
#define FONT_TAHOMA_8_LENGTH 224
#define FONT_TAHOMA_8_START_CHAR 32
#define FONT_TAHOMA_8_CHAR_WIDTH 8
#define FONT_TAHOMA_8_CHAR_HEIGHT 10
#define FONT_TAHOMA_8_FONT_TYPE (FONT_TYPE_PROPORTIONAL)
#define FONT_TAHOMA_8_ARRAY_LENGTH (FONT_TAHOMA_8_LENGTH * (1 + FONT_TAHOMA_8_CHAR_HEIGHT))
const unsigned char font_tahoma_8[FONT_TAHOMA_8_ARRAY_LENGTH] =
{
4, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 32 < >
2, /*N*/ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, // Символ 33 <!>
4, /*N*/ 0x50, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 34 <">
8, /*N*/ 0x00, 0x0A, 0x0A, 0x3F, 0x14, 0x14, 0x7E, 0x28, 0x28, 0x00, // Символ 35 <#>
6, /*N*/ 0x10, 0x10, 0x3C, 0x50, 0x50, 0x38, 0x14, 0x14, 0x78, 0x10, // Символ 36 <$>
8, /*N*/ 0x00, 0x30, 0x49, 0x4A, 0x34, 0x08, 0x16, 0x29, 0x49, 0x06, // Символ 37 <%>
8, /*N*/ 0x00, 0x30, 0x48, 0x48, 0x32, 0x4A, 0x44, 0x46, 0x39, 0x00, // Символ 38 <&>
2, /*N*/ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 39 <'>
4, /*N*/ 0x00, 0x10, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x10, // Символ 40 <(>
4, /*N*/ 0x00, 0x40, 0x20, 0x10, 0x10, 0x10, 0x10, 0x10, 0x20, 0x40, // Символ 41 <)>
6, /*N*/ 0x10, 0x54, 0x38, 0x54, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 42 <*>
8, /*N*/ 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, // Символ 43 <+>
3, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, // Символ 44 <,>
4, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, // Символ 45 <->
2, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, // Символ 46 <.>
4, /*N*/ 0x00, 0x00, 0x10, 0x10, 0x20, 0x20, 0x20, 0x40, 0x40, 0x00, // Символ 47 </>
// Digits / Цифры
6, /*N*/ 0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, // Символ 48 <0>
4, /*N*/ 0x00, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, // Символ 49 <1>
6, /*N*/ 0x00, 0x38, 0x44, 0x04, 0x08, 0x10, 0x20, 0x40, 0x7C, 0x00, // Символ 50 <2>
6, /*N*/ 0x00, 0x38, 0x44, 0x04, 0x18, 0x04, 0x04, 0x44, 0x38, 0x00, // Символ 51 <3>
6, /*N*/ 0x00, 0x08, 0x18, 0x28, 0x48, 0x7C, 0x08, 0x08, 0x08, 0x00, // Символ 52 <4>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x78, 0x04, 0x04, 0x44, 0x38, 0x00, // Символ 53 <5>
6, /*N*/ 0x00, 0x18, 0x20, 0x40, 0x78, 0x44, 0x44, 0x44, 0x38, 0x00, // Символ 54 <6>
6, /*N*/ 0x00, 0x7C, 0x04, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x00, // Символ 55 <7>
6, /*N*/ 0x00, 0x38, 0x44, 0x44, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00, // Символ 56 <8>
6, /*N*/ 0x00, 0x38, 0x44, 0x44, 0x44, 0x3C, 0x04, 0x08, 0x30, 0x00, // Символ 57 <9>
2, /*N*/ 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x00, // Символ 58 <:>
3, /*N*/ 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x20, 0x20, 0x20, // Символ 59 <;>
7, /*N*/ 0x00, 0x00, 0x02, 0x0C, 0x30, 0x40, 0x30, 0x0C, 0x02, 0x00, // Символ 60 <<>
8, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, // Символ 61 <=>
7, /*N*/ 0x00, 0x00, 0x40, 0x30, 0x0C, 0x02, 0x0C, 0x30, 0x40, 0x00, // Символ 62 <>>
5, /*N*/ 0x00, 0x70, 0x08, 0x08, 0x10, 0x20, 0x20, 0x00, 0x20, 0x00, // Символ 63 <?>
8, /*N*/ 0x3E, 0x41, 0x9D, 0xA5, 0xA5, 0xA5, 0x9F, 0x40, 0x3C, 0x00, // Символ 64 <@>
// Roman Capitals / Латиница, прописные
7, /*N*/ 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42, 0x00, // Символ 65 <A>
6, /*N*/ 0x00, 0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00, // Символ 66 <B>
7, /*N*/ 0x00, 0x1E, 0x20, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1E, 0x00, // Символ 67 <C>
7, /*N*/ 0x00, 0x78, 0x44, 0x42, 0x42, 0x42, 0x42, 0x44, 0x78, 0x00, // Символ 68 <D>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7C, 0x00, // Символ 69 <E>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 70 <F>
7, /*N*/ 0x00, 0x1E, 0x20, 0x40, 0x40, 0x4E, 0x42, 0x22, 0x1E, 0x00, // Символ 71 <G>
7, /*N*/ 0x00, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, // Символ 72 <H>
4, /*N*/ 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, // Символ 73 <I>
5, /*N*/ 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, // Символ 74 <J>
6, /*N*/ 0x00, 0x44, 0x48, 0x50, 0x60, 0x60, 0x50, 0x48, 0x44, 0x00, // Символ 75 <K>
5, /*N*/ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x78, 0x00, // Символ 76 <L>
8, /*N*/ 0x00, 0x63, 0x63, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41, 0x00, // Символ 77 <M>
7, /*N*/ 0x00, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x46, 0x46, 0x00, // Символ 78 <N>
8, /*N*/ 0x00, 0x1C, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1C, 0x00, // Символ 79 <O>
6, /*N*/ 0x00, 0x78, 0x44, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00, // Символ 80 <P>
8, /*N*/ 0x00, 0x1C, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1C, 0x04, // Символ 81 <Q>
7, /*N*/ 0x00, 0x78, 0x44, 0x44, 0x44, 0x78, 0x48, 0x44, 0x42, 0x00, // Символ 82 <R>
6, /*N*/ 0x00, 0x3C, 0x40, 0x40, 0x38, 0x04, 0x04, 0x04, 0x78, 0x00, // Символ 83 <S>
6, /*N*/ 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // Символ 84 <T>
7, /*N*/ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, // Символ 85 <U>
6, /*N*/ 0x00, 0x44, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10, 0x10, 0x00, // Символ 86 <V>
8, /*N*/ 0x00, 0x49, 0x49, 0x49, 0x36, 0x36, 0x36, 0x12, 0x12, 0x00, // Символ 87 <W>
6, /*N*/ 0x00, 0x44, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, 0x00, // Символ 88 <X>
6, /*N*/ 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x00, // Символ 89 <Y>
6, /*N*/ 0x00, 0x7C, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, 0x7C, 0x00, // Символ 90 <Z>
4, /*N*/ 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, 0x00, // Символ 91 <[>
4, /*N*/ 0x00, 0x40, 0x40, 0x20, 0x20, 0x20, 0x20, 0x10, 0x10, 0x00, // Символ 92 <\>
4, /*N*/ 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00, // Символ 93 <]>
8, /*N*/ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 94 <^>
7, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, // Символ 95 <_>
3, /*N*/ 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 96 <`>
// Roman Smalls / Латиница, строчные
6, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x04, 0x3C, 0x44, 0x44, 0x3C, 0x00, // Символ 97 <a>
6, /*N*/ 0x40, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x44, 0x78, 0x00, // Символ 98 <b>
5, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x40, 0x40, 0x40, 0x40, 0x38, 0x00, // Символ 99 <c>
6, /*N*/ 0x04, 0x04, 0x04, 0x3C, 0x44, 0x44, 0x44, 0x44, 0x3C, 0x00, // Символ 100 <d>
6, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x44, 0x7C, 0x40, 0x44, 0x38, 0x00, // Символ 101 <e>
4, /*N*/ 0x30, 0x40, 0x40, 0x70, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 102 <f>
6, /*N*/ 0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x44, 0x44, 0x3C, 0x04, // Символ 103 <g>
6, /*N*/ 0x40, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, // Символ 104 <h>
2, /*N*/ 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 105 <i>
3, /*N*/ 0x00, 0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // Символ 106 <j>
6, /*N*/ 0x40, 0x40, 0x40, 0x48, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, // Символ 107 <k>
2, /*N*/ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 108 <l>
8, /*N*/ 0x00, 0x00, 0x00, 0x76, 0x49, 0x49, 0x49, 0x49, 0x49, 0x00, // Символ 109 <m>
6, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, // Символ 110 <n>
6, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, // Символ 111 <o>
6, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x44, 0x44, 0x44, 0x44, 0x78, 0x40, // Символ 112 <p>
6, /*N*/ 0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x44, 0x44, 0x3C, 0x04, // Символ 113 <q>
4, /*N*/ 0x00, 0x00, 0x00, 0x50, 0x60, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 114 <r>
5, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x40, 0x60, 0x18, 0x08, 0x70, 0x00, // Символ 115 <s>
4, /*N*/ 0x00, 0x40, 0x40, 0x70, 0x40, 0x40, 0x40, 0x40, 0x30, 0x00, // Символ 116 <t>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x44, 0x44, 0x3C, 0x00, // Символ 117 <u>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x00, // Символ 118 <v>
8, /*N*/ 0x00, 0x00, 0x00, 0x49, 0x49, 0x55, 0x55, 0x22, 0x22, 0x00, // Символ 119 <w>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x00, // Символ 120 <x>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x20, // Символ 121 <y>
5, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x08, 0x10, 0x20, 0x40, 0x78, 0x00, // Символ 122 <z>
4, /*N*/ 0x10, 0x20, 0x20, 0x20, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, // Символ 123 <{>
2, /*N*/ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, // Символ 124 <|>
4, /*N*/ 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x20, 0x20, 0x20, 0x40, // Символ 125 <}>
8, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x31, 0x49, 0x46, 0x00, 0x00, 0x00, // Символ 126 <~>
4, /*N*/ 0x00, 0x70, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x70, 0x00, // Символ 127 <DELETE>
8, /*N*/ 0x00, 0x7E, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x11, 0x12, 0x00, // Символ 128 <Ђ>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 129 <Ѓ>
3, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x40, // Символ 130 <>
5, /*N*/ 0x08, 0x10, 0x00, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 131 <ѓ>
5, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x50, // Символ 132 <„>
8, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, // Символ 133 <…>
6, /*N*/ 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, // Символ 134 <†>
6, /*N*/ 0x10, 0x10, 0x7C, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x00, // Символ 135 <‡>
7, /*N*/ 0x00, 0x1C, 0x22, 0x78, 0x20, 0x78, 0x20, 0x12, 0x0C, 0x00, // Символ 136 <€>
7, /*N*/ 0x60, 0x90, 0x90, 0x62, 0x1C, 0xE0, 0x62, 0x94, 0x94, 0x62, // Символ 137 <‰>
8, /*N*/ 0x00, 0x38, 0x28, 0x28, 0x28, 0x2E, 0x29, 0x29, 0x4E, 0x00, // Символ 138 <Љ>
4, /*N*/ 0x00, 0x00, 0x00, 0x10, 0x20, 0x40, 0x20, 0x10, 0x00, 0x00, // Символ 139 <>
8, /*N*/ 0x00, 0x48, 0x48, 0x48, 0x7E, 0x49, 0x49, 0x49, 0x4E, 0x00, // Символ 140 <Њ>
7, /*N*/ 0x00, 0x46, 0x48, 0x48, 0x70, 0x50, 0x48, 0x44, 0x42, 0x00, // Символ 141 <Ќ>
8, /*N*/ 0x00, 0x7E, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x11, 0x11, 0x00, // Символ 142 <Ћ>
7, /*N*/ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x08, 0x08, 0x00, // Символ 143 <Џ>
7, /*N*/ 0x20, 0x78, 0x20, 0x3C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x04, // Символ 144 <ђ>
3, /*N*/ 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 145 <>
3, /*N*/ 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 146 <>
5, /*N*/ 0x50, 0x50, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 147 <“>
5, /*N*/ 0x28, 0x28, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 148 <”>
5, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x78, 0x30, 0x00, 0x00, // Символ 149 <•>
7, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, // Символ 150 <>
8, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, // Символ 151 <—>
5, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 152 <˜>
7, /*N*/ 0x00, 0xEA, 0x4E, 0x4A, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 153 <™>
8, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x48, 0x4E, 0x49, 0x49, 0x8E, 0x00, // Символ 154 <љ>
4, /*N*/ 0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x20, 0x40, 0x00, 0x00, // Символ 155 <>
8, /*N*/ 0x00, 0x00, 0x00, 0x48, 0x48, 0x7E, 0x49, 0x49, 0x4E, 0x00, // Символ 156 <њ>
6, /*N*/ 0x08, 0x10, 0x00, 0x4C, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, // Символ 157 <ќ>
7, /*N*/ 0x20, 0x78, 0x20, 0x3C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, // Символ 158 <ћ>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x7C, 0x10, 0x10, 0x00, // Символ 159 <џ>
5, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 160 < >
5, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 161 <Ў>
5, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 162 <ў>
5, /*N*/ 0x00, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x70, 0x00, // Символ 163 <Ј>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x38, 0x28, 0x38, 0x44, 0x00, 0x00, // Символ 164 <¤>
6, /*N*/ 0x04, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 165 <Ґ>
2, /*N*/ 0x00, 0x40, 0x40, 0x40, 0x00, 0x00, 0x40, 0x40, 0x40, 0x00, // Символ 166 <¦>
6, /*N*/ 0x3C, 0x40, 0x40, 0x38, 0x44, 0x44, 0x38, 0x04, 0x04, 0x78, // Символ 167 <§>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7C, 0x00, // Символ 168 <Ё>
8, /*N*/ 0x00, 0x3C, 0x42, 0x99, 0xA1, 0xA1, 0xA1, 0x99, 0x42, 0x3C, // Символ 169 <©>
6, /*N*/ 0x00, 0x1C, 0x20, 0x40, 0x78, 0x40, 0x40, 0x20, 0x1C, 0x00, // Символ 170 <Є>
6, /*N*/ 0x00, 0x00, 0x00, 0x14, 0x28, 0x50, 0x28, 0x14, 0x00, 0x00, // Символ 171 <«>
7, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x02, 0x02, 0x02, 0x00, // Символ 172 <¬>
4, /*N*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, // Символ 173 <­>
8, /*N*/ 0x00, 0x3C, 0x42, 0x99, 0x95, 0x99, 0x95, 0x95, 0x42, 0x3C, // Символ 174 <®>
4, /*N*/ 0x50, 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, // Символ 175 <Ї>
5, /*N*/ 0x00, 0x30, 0x48, 0x48, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 176 <°>
6, /*N*/ 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x00, 0x7C, 0x00, // Символ 177 <±>
4, /*N*/ 0x00, 0x70, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x00, // Символ 178 <І>
2, /*N*/ 0x00, 0x40, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 179 <і>
5, /*N*/ 0x00, 0x08, 0x08, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 180 <ґ>
6, /*N*/ 0x00, 0x44, 0x44, 0x44, 0x44, 0x4C, 0x74, 0x40, 0x40, 0x00, // Символ 181 <µ>
6, /*N*/ 0x00, 0x3C, 0x74, 0x74, 0x74, 0x34, 0x14, 0x14, 0x14, 0x00, // Символ 182 <¶>
2, /*N*/ 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, // Символ 183 <·>
6, /*N*/ 0x00, 0x28, 0x00, 0x38, 0x44, 0x7C, 0x40, 0x44, 0x38, 0x00, // Символ 184 <ё>
8, /*N*/ 0x00, 0x8A, 0xCD, 0xCA, 0xA8, 0xAF, 0x98, 0x98, 0x88, 0x00, // Символ 185 <№>
5, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x40, 0x70, 0x40, 0x40, 0x38, 0x00, // Символ 186 <є>
6, /*N*/ 0x00, 0x00, 0x00, 0x50, 0x28, 0x14, 0x28, 0x50, 0x00, 0x00, // Символ 187 <»>
3, /*N*/ 0x20, 0x00, 0x60, 0x20, 0x20, 0x20, 0x20, 0x40, 0x00, 0x00, // Символ 188 <ј>
6, /*N*/ 0x00, 0x3C, 0x40, 0x40, 0x38, 0x04, 0x04, 0x04, 0x78, 0x00, // Символ 189 <Ѕ>
5, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x40, 0x60, 0x18, 0x08, 0x70, 0x00, // Символ 190 <ѕ>
4, /*N*/ 0x00, 0x50, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, // Символ 191 <ї>
// Cyrillic Capitals / Кириллица, прописные
7, /*N*/ 0x00, 0x18, 0x18, 0x24, 0x24, 0x24, 0x7E, 0x42, 0x42, 0x00, // Символ 192 <А>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00, // Символ 193 <Б>
6, /*N*/ 0x00, 0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00, // Символ 194 <В>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 195 <Г>
8, /*N*/ 0x00, 0x0E, 0x0A, 0x12, 0x12, 0x12, 0x7F, 0x41, 0x41, 0x00, // Символ 196 <Д>
6, /*N*/ 0x00, 0x7C, 0x40, 0x40, 0x78, 0x40, 0x40, 0x40, 0x7C, 0x00, // Символ 197 <Е>
8, /*N*/ 0x00, 0x49, 0x49, 0x2A, 0x2A, 0x1C, 0x2A, 0x49, 0x08, 0x00, // Символ 198 <Ж>
6, /*N*/ 0x00, 0x78, 0x04, 0x04, 0x38, 0x04, 0x04, 0x04, 0x78, 0x00, // Символ 199 <З>
7, /*N*/ 0x00, 0x42, 0x46, 0x4A, 0x4A, 0x52, 0x52, 0x62, 0x42, 0x00, // Символ 200 <И>
7, /*N*/ 0x24, 0x18, 0x42, 0x46, 0x4A, 0x4A, 0x52, 0x62, 0x42, 0x00, // Символ 201 <Й>
7, /*N*/ 0x00, 0x46, 0x48, 0x48, 0x70, 0x50, 0x48, 0x44, 0x42, 0x00, // Символ 202 <К>
7, /*N*/ 0x00, 0x3E, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x42, 0x00, // Символ 203 <Л>
8, /*N*/ 0x00, 0x63, 0x63, 0x55, 0x55, 0x49, 0x49, 0x41, 0x41, 0x00, // Символ 204 <М>
7, /*N*/ 0x00, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x00, // Символ 205 <Н>
8, /*N*/ 0x00, 0x1C, 0x22, 0x41, 0x41, 0x41, 0x41, 0x22, 0x1C, 0x00, // Символ 206 <О>
7, /*N*/ 0x00, 0x7E, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x00, // Символ 207 <П>
6, /*N*/ 0x00, 0x78, 0x44, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40, 0x00, // Символ 208 <Р>
7, /*N*/ 0x00, 0x1E, 0x20, 0x40, 0x40, 0x40, 0x40, 0x20, 0x1E, 0x00, // Символ 209 <С>
6, /*N*/ 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // Символ 210 <Т>
7, /*N*/ 0x00, 0x42, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x60, 0x00, // Символ 211 <У>
8, /*N*/ 0x00, 0x08, 0x3E, 0x49, 0x49, 0x49, 0x49, 0x3E, 0x08, 0x00, // Символ 212 <Ф>
6, /*N*/ 0x00, 0x44, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x44, 0x00, // Символ 213 <Х>
8, /*N*/ 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x7F, 0x01, 0x01, 0x00, // Символ 214 <Ц>
7, /*N*/ 0x00, 0x42, 0x42, 0x42, 0x42, 0x3E, 0x02, 0x02, 0x02, 0x00, // Символ 215 <Ч>
8, /*N*/ 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x7F, 0x00, // Символ 216 <Ш>
8, /*N*/ 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xFF, 0x80, // Символ 217 <Щ>
8, /*N*/ 0x00, 0x70, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x11, 0x1E, 0x00, // Символ 218 <Ъ>
8, /*N*/ 0x00, 0x41, 0x41, 0x41, 0x79, 0x45, 0x45, 0x45, 0x79, 0x00, // Символ 219 <Ы>
6, /*N*/ 0x00, 0x40, 0x40, 0x40, 0x78, 0x44, 0x44, 0x44, 0x78, 0x00, // Символ 220 <Ь>
7, /*N*/ 0x00, 0x78, 0x04, 0x02, 0x3E, 0x02, 0x02, 0x04, 0x78, 0x00, // Символ 221 <Э>
8, /*N*/ 0x00, 0x4E, 0x51, 0x51, 0x71, 0x51, 0x51, 0x51, 0x4E, 0x00, // Символ 222 <Ю>
7, /*N*/ 0x00, 0x1E, 0x22, 0x22, 0x22, 0x1E, 0x12, 0x22, 0x42, 0x00, // Символ 223 <Я>
// Cyrillic Smalls / Кириллица, строчные
6, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x04, 0x3C, 0x44, 0x44, 0x3C, 0x00, // Символ 224 <а>
6, /*N*/ 0x1C, 0x20, 0x40, 0x78, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, // Символ 225 <б>
6, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x44, 0x78, 0x44, 0x44, 0x78, 0x00, // Символ 226 <в>
5, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, // Символ 227 <г>
7, /*N*/ 0x00, 0x00, 0x1C, 0x14, 0x14, 0x24, 0x24, 0x7E, 0x42, 0x00, // Символ 228 <д>
6, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x44, 0x7C, 0x40, 0x44, 0x38, 0x00, // Символ 229 <е>
8, /*N*/ 0x00, 0x00, 0x00, 0x49, 0x2A, 0x2A, 0x1C, 0x2A, 0x49, 0x00, // Символ 230 <ж>
5, /*N*/ 0x00, 0x00, 0x00, 0x70, 0x08, 0x30, 0x08, 0x08, 0x70, 0x00, // Символ 231 <з>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x4C, 0x54, 0x64, 0x44, 0x44, 0x00, // Символ 232 <и>
6, /*N*/ 0x24, 0x18, 0x00, 0x44, 0x4C, 0x54, 0x64, 0x44, 0x44, 0x00, // Символ 233 <й>
6, /*N*/ 0x00, 0x00, 0x00, 0x4C, 0x50, 0x60, 0x50, 0x48, 0x44, 0x00, // Символ 234 <к>
6, /*N*/ 0x00, 0x00, 0x00, 0x3C, 0x24, 0x24, 0x24, 0x24, 0x44, 0x00, // Символ 235 <л>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x6C, 0x54, 0x54, 0x44, 0x44, 0x00, // Символ 236 <м>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x7C, 0x44, 0x44, 0x44, 0x00, // Символ 237 <н>
6, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x44, 0x38, 0x00, // Символ 238 <о>
6, /*N*/ 0x00, 0x00, 0x00, 0x7C, 0x44, 0x44, 0x44, 0x44, 0x44, 0x00, // Символ 239 <п>
6, /*N*/ 0x00, 0x00, 0x00, 0x78, 0x44, 0x44, 0x78, 0x40, 0x40, 0x00, // Символ 240 <р>
5, /*N*/ 0x00, 0x00, 0x00, 0x38, 0x40, 0x40, 0x40, 0x40, 0x38, 0x00, // Символ 241 <с>
6, /*N*/ 0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // Символ 242 <т>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x20, // Символ 243 <у>
8, /*N*/ 0x08, 0x08, 0x08, 0x3E, 0x49, 0x49, 0x49, 0x49, 0x3E, 0x08, // Символ 244 <ф>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44, 0x00, // Символ 245 <х>
6, /*N*/ 0x00, 0x00, 0x00, 0x48, 0x48, 0x48, 0x48, 0x48, 0x7C, 0x04, // Символ 246 <ц>
6, /*N*/ 0x00, 0x00, 0x00, 0x44, 0x44, 0x44, 0x3C, 0x04, 0x04, 0x00, // Символ 247 <ч>
8, /*N*/ 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0x7F, 0x00, // Символ 248 <ш>
8, /*N*/ 0x00, 0x00, 0x00, 0x49, 0x49, 0x49, 0x49, 0x49, 0xFF, 0x80, // Символ 249 <щ>
7, /*N*/ 0x00, 0x00, 0x00, 0x70, 0x10, 0x1C, 0x12, 0x12, 0x1C, 0x00, // Символ 250 <ъ>
8, /*N*/ 0x00, 0x00, 0x00, 0x41, 0x41, 0x79, 0x45, 0x45, 0x79, 0x00, // Символ 251 <ы>
6, /*N*/ 0x00, 0x00, 0x00, 0x40, 0x40, 0x78, 0x44, 0x44, 0x78, 0x00, // Символ 252 <ь>
5, /*N*/ 0x00, 0x00, 0x00, 0x70, 0x08, 0x38, 0x08, 0x08, 0x70, 0x00, // Символ 253 <э>
8, /*N*/ 0x00, 0x00, 0x00, 0x8E, 0x91, 0xF1, 0x91, 0x91, 0x8E, 0x00, // Символ 254 <ю>
6, /*N*/ 0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x3C, 0x24, 0x44, 0x00 // Символ 255 <я>
};
#endif // FONT_TAHOMA_8_H

View File

@@ -0,0 +1,42 @@
// Название шрифта Terminus (TTF) for Windows 15
// Автор шрифта ITS-PC / User
// Дата и время генерации Ср 27.09.23 15:02:48
// Сгенерировано matrixFont v1.2.0.55
// Кодовая страница ANSI (ASCII 7-битная)
// https://gitlab.com/riva-lab/matrixFont
#ifndef FONT_TERMINUS_10X15__H
#define FONT_TERMINUS_10X15__H
#ifndef FONT_TYPE_MONOSPACED
#define FONT_TYPE_MONOSPACED 0
#endif
#ifndef FONT_TYPE_PROPORTIONAL
#define FONT_TYPE_PROPORTIONAL 1
#endif
#define FONT_TERMINUS_10X15__LENGTH 10
#define FONT_TERMINUS_10X15__START_CHAR 48
#define FONT_TERMINUS_10X15__CHAR_WIDTH 10
#define FONT_TERMINUS_10X15__CHAR_HEIGHT 15
#define FONT_TERMINUS_10X15__FONT_TYPE (FONT_TYPE_MONOSPACED)
#define FONT_TERMINUS_10X15__ARRAY_LENGTH (FONT_TERMINUS_10X15__LENGTH * FONT_TERMINUS_10X15__CHAR_HEIGHT * 2)
const unsigned char font_terminus_10x15_[FONT_TERMINUS_10X15__ARRAY_LENGTH] =
{
// Digits / Цифры
0x00, 0x00, 0xFC, 0x00, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x8E, 0x01, 0x9E, 0x01, 0xB6, 0x01, 0xE6, 0x01, 0xC6, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x00, 0x00, // Символ 48 <0>
0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0xFC, 0x00, 0x00, 0x00, // Символ 49 <1>
0x00, 0x00, 0xFC, 0x00, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0x80, 0x01, 0xFE, 0x01, 0x00, 0x00, // Символ 50 <2>
0x00, 0x00, 0xFC, 0x00, 0x86, 0x01, 0x86, 0x01, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x7C, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x86, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x00, 0x00, // Символ 51 <3>
0x00, 0x00, 0x06, 0x00, 0x0E, 0x00, 0x1E, 0x00, 0x36, 0x00, 0x66, 0x00, 0xC6, 0x00, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0xFE, 0x01, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, // Символ 52 <4>
0x00, 0x00, 0xFE, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xFC, 0x01, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x86, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x00, 0x00, // Символ 53 <5>
0x00, 0x00, 0x7C, 0x00, 0xC0, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xFC, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x00, 0x00, // Символ 54 <6>
0x00, 0x00, 0xFE, 0x01, 0x86, 0x01, 0x86, 0x01, 0x06, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, // Символ 55 <7>
0x00, 0x00, 0xFC, 0x00, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0xFC, 0x00, 0x00, 0x00, // Символ 56 <8>
0x00, 0x00, 0xFC, 0x00, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0x86, 0x01, 0xFE, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x0C, 0x00, 0xF8, 0x00, 0x00, 0x00 // Символ 57 <9>
};
#endif // FONT_TERMINUS_10X15__H

1036
Core/OLED_Driver/gfx_lib.c Normal file
View File

@@ -0,0 +1,1036 @@
/*
* gfx_lib.c
*
* Библиотека для заполнения буфера дисплея
*
* Для разработки библиотеки иcпользовались материалы:
* https://www.youtube.com/watch?v=ajEqZN5s5xc
* https://narodstream.ru/stm-urok-37-displej-tft-240x320-8bit-chast-1/
* https://hubstub.ru/display/126-vyvod-simvolov-i-strok-na-tft-displey-na-primere-ili9341.html
*/
#include "gfx_lib.h"
#include "font_tahoma_8_prop.h"
#include "font_tahoma_15_prop.h"
#include "font_terminus_15_digi.h"
#include "math.h"
#ifndef PI
#define PI 3.1415926535
#endif
/* переменные */
uint8_t chSpacing = 0; //межсимвольный интервал в px
/* функция очистки буфера кадра */
void GFX_Clean_Buffer_Frame(uint8_t *Buffer_Frame)
{
if(Buffer_Frame == NULL)
return;
memset(Buffer_Frame, 0x00, GFX_BufferHeight*GFX_BufferWidth/8);
}
/* Функция очистки прямоугольной области */
void GFX_Clean_Area(uint8_t *Buffer_Frame, uint16_t xPos_Start, uint16_t yPos_Start, uint16_t width, uint16_t height)
{
if(Buffer_Frame == NULL)
return;
if ((xPos_Start+width > GFX_BufferWidth)||(xPos_Start < 0)||(yPos_Start+ height> GFX_BufferHeight)||(yPos_Start < 0))
{
//если значения по x и y больше пределов то выходим из функции
return;
}
for (uint16_t xPos = xPos_Start; xPos < xPos_Start + width; xPos++)
{
for(uint16_t yPos = yPos_Start; yPos < yPos_Start + height; yPos++)
{
uint16_t arrayPos = xPos + ((yPos/8)*GFX_BufferWidth);
Buffer_Frame[arrayPos] &= ~(1 << (yPos % 8)); // Очищаем бит, отвечающий за пиксель
}
}
}
/* функция прорисовки пикселя */
void GFX_Draw_Pixel(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t pxColor)
{
if(Buffer_Frame == NULL)
return;
if ((xPos >= GFX_BufferWidth)||(xPos < 0)||(yPos >= GFX_BufferHeight)||(yPos < 0))
{
//если значения по x и y больше пределов то выходим из функции
return;
}
else
{
uint16_t arrayPos = xPos + ((yPos/8)*GFX_BufferWidth);
//заполняем буфер кадра
if (pxColor)
{
Buffer_Frame[arrayPos] |= 1 << (yPos % 8);
}
else
{
Buffer_Frame[arrayPos] &= 0xFF ^ 1 << (yPos % 8);
}
}
}
/* функция инверсии любой области в буфере кадра */
void GFX_Invertion_Area(uint8_t *Buffer_Frame, uint16_t xPos_Start, uint16_t yPos_Start, uint16_t width, uint16_t height)
{
if(Buffer_Frame == NULL)
return;
if ((xPos_Start+width > GFX_BufferWidth)||(xPos_Start < 0)||(yPos_Start+ height> GFX_BufferHeight)||(yPos_Start < 0))
{
//если значения по x и y больше пределов то выходим из функции
return;
}
for (uint16_t xPos = xPos_Start; xPos < xPos_Start + width; xPos++)
{
for(uint16_t yPos = yPos_Start; yPos < yPos_Start + height; yPos++)
{
uint16_t arrayPos = xPos + ((yPos/8)*GFX_BufferWidth);
Buffer_Frame[arrayPos] ^= (1 << (yPos % 8)); // Инвертируем бит, отвечающий за пиксель
}
}
}
/* работа со шрифтами */
/* функция прорисовки однобайтового символа шрифта */
void GFX_Draw_Char_Tahoma8_Byte(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, char Symbol, uint8_t Inversion)
{
/*
* выгрузка кода шрифта в "h" файл из программы matrixFont
* https://habr.com/ru/articles/575332/
* параметры выгрузки:
* сначала строки, справа на лево, сверху вниз, пропорциональный, HEX, нули, 8(uint8_t, unsigned char), С99
* ниже циклы для однобайтового символа шрифта, т.е. ширина символа не более 8 пикселей
*/
if(Buffer_Frame == NULL)
return;
/* если ASCII номер символа в диапазоне 32...255, то рисуем символы шрифта */
if ((Symbol >= 32) && (Symbol <= 255))
{
uint8_t pxChView;
uint8_t pxBkView;
//включение/выключении инверсии символа
if (!(Inversion & GFX_ChInvers))
{
pxChView = GFX_pxView_On;
pxBkView = GFX_pxView_Off;
}
else
{
pxChView = GFX_pxView_Off;
pxBkView = GFX_pxView_On;
}
//извлекаем ширину символа + 1px для минимального межсимвольного интервала
uint8_t chWidth = font_tahoma_8[(Symbol - 0x20) * (1 + FONT_TAHOMA_8_CHAR_HEIGHT)] + 1;
//запоминаем ширину данного символа
chSpacing = chWidth;
//рисуем заданный символ шрифта
for (uint8_t y = 1; y <= FONT_TAHOMA_8_CHAR_HEIGHT; y++) //высота холста шрифта в пикселях
{
for (uint8_t x = 0; x < chWidth; x++) //ширина холста символа шрифта
{
/*
* извлекаем из массива шрифта байт строки пикселей символа
* и с помощью операции побитового И определяем где 1 и где 0
* 0x20 на 32
*/
if (font_tahoma_8[((Symbol - 0x20) * (1 + FONT_TAHOMA_8_CHAR_HEIGHT)) + y] >> (7 - x) & 0x01)
{
GFX_Draw_Pixel(Buffer_Frame, xPos + x, yPos + y, pxChView);
}
else
{
GFX_Draw_Pixel(Buffer_Frame, xPos + x, yPos + y, pxBkView);
}
}
/*
* заполняем фоном справа от символа если ширина символа меньше ширины холста шрифта
* с учетом заданного минимального межсимвольного интервала в 1px
*/
if (chWidth < FONT_TAHOMA_8_CHAR_WIDTH)
{
for (uint8_t n = chWidth; n < (FONT_TAHOMA_8_CHAR_WIDTH + 1); n++)
{
if (!(Inversion & GFX_ChInvers))
{
GFX_Draw_Pixel(Buffer_Frame, xPos + n, yPos + y, pxBkView);
}
else
{
GFX_Draw_Pixel(Buffer_Frame, xPos + n, yPos + y, pxChView);
}
}
}
}
}
}
/* функция прорисовки символа шрифта Tahoma 15 */
/* функция прорисовки символа шрифта Tahoma 15 */
void GFX_Draw_Char_Tahoma15_Byte(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, char Symbol, uint8_t Inversion)
{
if (!Buffer_Frame)
return;
if (Symbol < FONT_TAHOMA_15_START_CHAR ||
Symbol >= FONT_TAHOMA_15_START_CHAR + FONT_TAHOMA_15_LENGTH)
return;
uint8_t pxChView, pxBkView;
if (!(Inversion & GFX_ChInvers))
{
pxChView = GFX_pxView_On;
pxBkView = GFX_pxView_Off;
}
else
{
pxChView = GFX_pxView_Off;
pxBkView = GFX_pxView_On;
}
uint16_t index =
(Symbol - FONT_TAHOMA_15_START_CHAR) *
(1 + FONT_TAHOMA_15_CHAR_WIDTH * 2);
uint8_t chWidth = font_tahoma_15[index] + 1;
chSpacing = chWidth;
index++; // переходим к данным столбцов
/* идем по столбцам */
for (uint8_t x = 0; x < chWidth; x++)
{
uint16_t column =
font_tahoma_15[index] |
(font_tahoma_15[index + 1] << 8);
index += 2;
/* идем по высоте */
for (uint8_t y = 0; y < FONT_TAHOMA_15_CHAR_HEIGHT; y++)
{
if (column & (1 << y))
{
GFX_Draw_Pixel(Buffer_Frame,
xPos + x,
yPos + y,
pxChView);
}
else
{
GFX_Draw_Pixel(Buffer_Frame,
xPos + x,
yPos + y,
pxBkView);
}
}
}
/* межсимвольный интервал */
for (uint8_t y = 0; y < FONT_TAHOMA_15_CHAR_HEIGHT; y++)
{
GFX_Draw_Pixel(Buffer_Frame,
xPos + chWidth,
yPos + y,
pxBkView);
}
}
/* функция прорисовки двухбайтового символа шрифта */
void GFX_Draw_Char_Terminus15Dig_Byte(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t Symbol, uint8_t Inversion)
{
// /*
// * выгрузка кода шрифта в "h" файл из программы matrixFont
// * https://habr.com/ru/articles/575332/
// * параметры выгрузки:
// * сначала строки, справа на лево, сверху вниз, моноширный, HEX, нули, 8(uint8_t, unsigned char), С99
// * ниже циклы для двухбайтового символа шрифта, т.е. ширина символа более 8 пикселей
// */
// /* если ASCII номер символа в диапазоне 48...57, то рисуем символы цифр шрифта */
if ((Symbol >= 48) && (Symbol <= 57))
{
Symbol = (Symbol - 48) * 15;
uint8_t pxChView;
uint8_t pxBkView;
//включение/выключении инверсии символа
if (!(Inversion & GFX_ChInvers))
{
pxChView = GFX_pxView_On;
pxBkView = GFX_pxView_Off;
}
else
{
pxChView = GFX_pxView_Off;
pxBkView = GFX_pxView_On;
}
//рисуем заданный символ шрифта
for (uint8_t y = 0; y < FONT_TERMINUS_10X15__CHAR_HEIGHT; y++) //высота холста шрифта в пикселях
{
for (uint8_t x = 0; x < 8; x++) //8 - один байт
{
/*
* извлекаем из массива шрифта правый байт строки пикселей символа
* и с помощью операции побитового И определяем где 1 а где 0
*/
if (font_terminus_10x15_[(Symbol + y) * 2 + 1] >> (7 - x) & 0x01)
{
/*
* рисуем только нужную нам часть из правого байта
* пикселя символа, -6 смещаем картинку на заданную позицию
*/
if (x > 5)
{
GFX_Draw_Pixel(Buffer_Frame, xPos + x - 6, yPos + y, pxChView);
}
}
else
{
/*
* рисуем только нужную нам часть из правого байта
* пикселя фона символа, -6 смещаем картинку на заданную позицию
*/
if (x > 5)
{
GFX_Draw_Pixel(Buffer_Frame, xPos + x - 6, yPos + y, pxBkView);
}
}
/*
* извлекаем из массива шрифта левый байт строки пикселей символа
* и с помощью операции побитового И определяем где 1 а где 0
*/
if (font_terminus_10x15_[(Symbol + y) * 2] >> (7 - x) & 0x01)
{
/*
* смещаем картинку на 8 пикселей вправо
* т.е. "склеиваем" картинку символа и рисуем пиксель символа,
* -6 смещаем картинку на заданную позицию
*/
GFX_Draw_Pixel(Buffer_Frame, xPos + x + 8 - 6, yPos + y, pxChView);
}
else
{
/*
* смещаем картинку на 8 пикселей вправо
* т.е. "склеиваем" картинку символа и рисуем пиксель фона символа,
* -6 смещаем картинку на заданную позицию
*/
GFX_Draw_Pixel(Buffer_Frame, xPos + x + 8 - 6, yPos + y, pxBkView);
}
}
}
}
}
/* функция вывода строки на дисплей */
void GFX_Output_String(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, char *String, GFX_Font_t font, uint8_t setChSpacing, uint8_t Inversion)
{
/*
* вывод строки шрифтом font_tahoma_8
* параметры функции:
* xPos - позиция по X
* yPos - позиция по Y
* *String - строка для вывода
* setChSpacing - межсимвольный интервал в px
* Inversion - включение/выключени инверсии
*/
//uint8_t xPos_Start = xPos; //px начала вывода строки по X
if((Buffer_Frame == NULL) || (String == NULL))
return;
//посимвольный вывод строки
while(*String)
{
//проверяем не вылезем ли мы за пределы экрана при отрисовке следующего символа,
// если да, то переходим на следующую строчку
/*if((xPos + 8) > GFX_BufferWidth)
{
xPos = xPos_Start;
yPos = yPos + 10;
}*/
//вывод текущего символа строки
switch(font)
{
case GFX_FONT_TAHOMA_8: GFX_Draw_Char_Tahoma8_Byte(Buffer_Frame, xPos, yPos, *String, Inversion); break;
case GFX_FONT_TAHOMA_15: GFX_Draw_Char_Tahoma15_Byte(Buffer_Frame, xPos, yPos, *String, Inversion); break;
case GFX_FONT_DIG_TERMINUS_15: GFX_Draw_Char_Terminus15Dig_Byte(Buffer_Frame, xPos, yPos, *String, Inversion); break;
}
//изменяем координату для отрисовки следующего символа
xPos += chSpacing - 1 + setChSpacing;
//инкремент указателя на следующий символ в строке
String++;
}
}
/* геометрические примитивы */
/* функция рисования линии */
void GFX_Draw_Line(uint8_t *Buffer_Frame, GFX_LineHandleTypeDef *hLine)
{
if((Buffer_Frame == NULL) || (hLine == NULL))
return;
uint8_t xPos_Start = hLine->xPos_Start;
uint8_t yPos_Start = hLine->yPos_Start;
uint8_t xPos_End = hLine->xPos_End;
uint8_t yPos_End = hLine->yPos_End;
uint8_t pxColor = hLine->pxColor;
int dx = (xPos_End >= xPos_Start) ? xPos_End - xPos_Start : xPos_Start - xPos_End;
int dy = (yPos_End >= yPos_Start) ? yPos_End - yPos_Start : yPos_Start - yPos_End;
int sx = (xPos_Start < xPos_End) ? 1 : -1;
int sy = (yPos_Start < yPos_End) ? 1 : -1;
int err = dx - dy;
for (;;)
{
GFX_Draw_Pixel(Buffer_Frame, xPos_Start, yPos_Start, pxColor);
if (xPos_Start == xPos_End && yPos_Start == yPos_End)
break;
int e2 = err + err;
if (e2 > -dy)
{
err -= dy;
xPos_Start += sx;
}
if (e2 < dx)
{
err += dx;
yPos_Start += sy;
}
}
}
/* функция рисования пустотелого прямоугольника */
void GFX_Draw_Rectangle(uint8_t *Buffer_Frame, GFX_RectangleHandleTypeDef *hRectangle)
{
if((Buffer_Frame == NULL) || (hRectangle == NULL))
return;
uint8_t xPos_Start = hRectangle->xPos_Start;
uint8_t yPos_Start = hRectangle->yPos_Start;
uint8_t rectangle_Width = hRectangle->rectangle_Width;
uint8_t rectangle_Height = hRectangle->rectangle_Height;
uint8_t pxColor = hRectangle->pxColor;
if(hRectangle->Filled)
__GFX_Draw_Rectangle_Filled(Buffer_Frame, xPos_Start, yPos_Start, rectangle_Width, rectangle_Height, pxColor);
else
__GFX_Draw_Rectangle(Buffer_Frame, xPos_Start, yPos_Start, rectangle_Width, rectangle_Height, pxColor);
}
/* функция рисования пустотелой окружности */
void GFX_Draw_Circle(uint8_t *Buffer_Frame, GFX_CircleHandleTypeDef *hCircle)
{
if((Buffer_Frame == NULL) || (hCircle == NULL))
return;
uint8_t xPos = hCircle->xPos;
uint8_t yPos = hCircle->yPos;
uint8_t circle_Radius = hCircle->circle_Radius;
uint8_t pxColor = hCircle->pxColor;
if(hCircle->Filled)
__GFX_Draw_Circle_Filled(Buffer_Frame, xPos, yPos, circle_Radius, pxColor);
else
__GFX_Draw_Circle(Buffer_Frame, xPos, yPos, circle_Radius, pxColor);
}
/* функция рисования треугольника */
void GFX_Draw_Triangle(uint8_t *Buffer_Frame, GFX_TriangleHandleTypeDef *hTriangle)
{
uint8_t xPos1 = hTriangle->xPos1;
uint8_t xPos2 = hTriangle->xPos2;
uint8_t xPos3 = hTriangle->xPos3;
uint8_t yPos1 = hTriangle->yPos1;
uint8_t yPos2 = hTriangle->yPos2;
uint8_t yPos3 = hTriangle->yPos3;
uint8_t pxColor = hTriangle->pxColor;
if((Buffer_Frame == NULL) || (hTriangle == NULL))
return;
__GFX_Draw_Line(Buffer_Frame, xPos1, yPos1, xPos2, yPos2, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos2, yPos2, xPos3, yPos3, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos3, yPos3, xPos1, yPos1, pxColor);
}
/* функция рисования стрелки */
void GFX_Draw_Arrow(uint8_t *Buffer_Frame, GFX_ArrowHandleTypeDef *hArrow)
{
uint8_t xPos = hArrow->xPos;
uint8_t yPos = hArrow->yPos;
uint8_t size = hArrow->size;
uint16_t angle = hArrow->angle % 360;
uint8_t pxColor = hArrow->pxColor;
if((angle == 0) || (angle == 90) || (angle == 180) || (angle == 270))
__GFX_Draw_Arrow_Ortho(Buffer_Frame, xPos, yPos, size, angle, pxColor);
else
__GFX_Draw_Arrow(Buffer_Frame, xPos, yPos, size, angle, pxColor);
}
/* Функция рисования дуги (четверти окружности) */
void GFX_Draw_Arc(uint8_t *Buffer_Frame, GFX_ArcHandleTypeDef *hArc)
{
if((Buffer_Frame == NULL) || (hArc == NULL))
return;
uint8_t xPos = hArc->xPos;
uint8_t yPos = hArc->yPos;
uint8_t radius = hArc->radius;
uint8_t startAngle = hArc->startAngle;
uint8_t endAngle = hArc->endAngle;
uint8_t pxColor = hArc->pxColor;
int xPos_tmp = 0;
int yPos_tmp = 0;
for (int angle = startAngle; angle <= endAngle; angle++)
{
xPos_tmp = roundf(xPos + (radius * cosf(angle * 3.14159 / 180)));
yPos_tmp = roundf(yPos + (radius * sinf(angle * 3.14159 / 180)));
GFX_Draw_Pixel(Buffer_Frame, xPos_tmp, yPos_tmp, pxColor);
}
}
/* Функция для отрисовки графика uint8_t массива */
void GFX_Plotter_uint8_t(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, uint8_t *data, uint32_t data_size, float data_step, uint8_t data_max)
{
if((Buffer_Frame == NULL) || (hPlot == NULL))
return;
if((hPlot->plotHeight == NULL) || (hPlot->plotWidth == NULL))
return;
if((hPlot->yPos + hPlot->plotHeight == NULL) || (hPlot->xPos + hPlot->plotWidth == NULL))
return;
if(data == NULL)
return;
/* Расчет позиции пикселя */
uint8_t pix_y_uint8t;
if(data_size == 0)
pix_y_uint8t = *data;
else
pix_y_uint8t = data[(int)hPlot->dataInd];
// масштабирование под размеры графика
hPlot->dataY = (pix_y_uint8t*hPlot->plotHeight)/data_max;
hPlot->f.dataSigned = 0;
/* Вывод пикселя */
__GFX_Draw_Plotter_Value(Buffer_Frame, hPlot);
/* Смещение графика далее */
hPlot->dataX++;
hPlot->dataPrevY = hPlot->dataY;
// Если используется массив плота
if(data == NULL)
{
hPlot->dataInd += data_step;
if(hPlot->dataInd >= data_size)
hPlot->dataInd -= data_size;
if(hPlot->dataInd < 0)
hPlot->dataInd += data_size;
}
}
/* Функция для отрисовки графика uint16_t массива */
void GFX_Plotter_uint16_t(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, uint16_t *data, uint32_t data_size, float data_step, uint16_t data_max)
{
if((Buffer_Frame == NULL) || (hPlot == NULL))
return;
if((hPlot->plotHeight == NULL) || (hPlot->plotWidth == NULL))
return;
if((hPlot->yPos + hPlot->plotHeight == NULL) || (hPlot->xPos + hPlot->plotWidth == NULL))
return;
if(data == NULL)
return;
/* Расчет позиции пикселя */
uint16_t pix_y_uint16t;
if(data_size == 0)
pix_y_uint16t = *data;
else
pix_y_uint16t = data[(int)hPlot->dataInd];
// масштабирование под размеры графика
hPlot->dataY = (pix_y_uint16t*hPlot->plotHeight)/data_max;
hPlot->f.dataSigned = 0;
/* Вывод пикселя */
__GFX_Draw_Plotter_Value(Buffer_Frame, hPlot);
/* Смещение графика далее */
hPlot->dataX++;
hPlot->dataPrevY = hPlot->dataY;
// Если используется массив плота
if(data == NULL)
{
hPlot->dataInd += data_step;
if(hPlot->dataInd >= data_size)
hPlot->dataInd -= data_size;
if(hPlot->dataInd < 0)
hPlot->dataInd += data_size;
}
}
/* Функция для отрисовки графика int массива */
void GFX_Plotter_int(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, int *data, uint32_t data_size, float data_step, int data_max)
{
if((Buffer_Frame == NULL) || (hPlot == NULL))
return;
if((hPlot->plotHeight == NULL) || (hPlot->plotWidth == NULL))
return;
if((hPlot->yPos + hPlot->plotHeight == NULL) || (hPlot->xPos + hPlot->plotWidth == NULL))
return;
if(data == NULL)
return;
/* Расчет позиции пикселя */
uint8_t pix_y_int;
if(data_size == 0)
pix_y_int = *data;
else
pix_y_int = data[(int)hPlot->dataInd];
// масштабирование под размеры графика
hPlot->dataY = (pix_y_int*hPlot->plotHeight)/data_max;
hPlot->f.dataSigned = 1;
/* Вывод пикселя */
__GFX_Draw_Plotter_Value(Buffer_Frame, hPlot);
/* Смещение графика далее */
hPlot->dataX++;
hPlot->dataPrevY = hPlot->dataY;
// Если используется массив плота
if(data == NULL)
{
hPlot->dataInd += data_step;
if(hPlot->dataInd >= data_size)
hPlot->dataInd -= data_size;
if(hPlot->dataInd < 0)
hPlot->dataInd += data_size;
}
}
/* Функция для отрисовки графика float массива */
void GFX_Plotter_float(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, float *data, uint32_t data_size, float data_step, float data_max)
{
if((Buffer_Frame == NULL) || (hPlot == NULL))
return;
if((hPlot->plotHeight == NULL) || (hPlot->plotWidth == NULL))
return;
if((hPlot->yPos + hPlot->plotHeight == NULL) || (hPlot->xPos + hPlot->plotWidth == NULL))
return;
if((data == NULL) || (data_size == 0))
return;
/* Расчет позиции пикселя */
float pix_y_float;
if(data_size == 0)
pix_y_float = *data;
else
pix_y_float = data[(int)hPlot->dataInd];
hPlot->f.dataSigned = 1;
// масштабирование под размеры графика
hPlot->dataY = (pix_y_float/data_max)*(hPlot->plotHeight);
/* Вывод пикселя */
__GFX_Draw_Plotter_Value(Buffer_Frame, hPlot);
/* Смещение графика далее */
hPlot->dataX++;
hPlot->dataPrevY = hPlot->dataY;
// Если используется массив плота
if(data_size != 0)
{
hPlot->dataInd += data_step;
if(hPlot->dataInd >= data_size)
hPlot->dataInd -= data_size;
if(hPlot->dataInd < 0)
hPlot->dataInd += data_size;
}
}
/* Функция инвертирования прямоугольной области */
void GFX_Invertion_Display(uint8_t *Buffer_Frame)
{
if(Buffer_Frame == NULL)
return;
GFX_Invertion_Area(Buffer_Frame, 0, 0, GFX_BufferWidth-1, GFX_BufferHeight-1);
}
/* Низкоуровневая функция рисования линии */
void __GFX_Draw_Line(uint8_t *Buffer_Frame, uint8_t xPos_Start, uint8_t yPos_Start, uint8_t xPos_End, uint8_t yPos_End, uint8_t pxColor)
{
int dx = (xPos_End >= xPos_Start) ? xPos_End - xPos_Start : xPos_Start - xPos_End;
int dy = (yPos_End >= yPos_Start) ? yPos_End - yPos_Start : yPos_Start - yPos_End;
int sx = (xPos_Start < xPos_End) ? 1 : -1;
int sy = (yPos_Start < yPos_End) ? 1 : -1;
int err = dx - dy;
for (;;)
{
GFX_Draw_Pixel(Buffer_Frame, xPos_Start, yPos_Start, pxColor);
if (xPos_Start == xPos_End && yPos_Start == yPos_End)
break;
int e2 = err + err;
if (e2 > -dy)
{
err -= dy;
xPos_Start += sx;
}
if (e2 < dx)
{
err += dx;
yPos_Start += sy;
}
}
}
/* функция рисования пустотелого прямоугольника */
void __GFX_Draw_Rectangle(uint8_t *Buffer_Frame, uint8_t xPos_Start, uint8_t yPos_Start, uint8_t rectangle_Width, uint8_t rectangle_Height, uint8_t pxColor)
{
/* рисуем стороны прямоугольника */
//левая сторона прямоугольника
__GFX_Draw_Line(Buffer_Frame, xPos_Start, yPos_Start, xPos_Start, yPos_Start + rectangle_Height, pxColor);
//верх прямоугольника
__GFX_Draw_Line(Buffer_Frame, xPos_Start, yPos_Start, xPos_Start + rectangle_Width, yPos_Start, pxColor);
//правая сторона прямоугольника
__GFX_Draw_Line(Buffer_Frame, xPos_Start + rectangle_Width, yPos_Start, xPos_Start + rectangle_Width, yPos_Start + rectangle_Height, pxColor);
//низ прямоугольника
__GFX_Draw_Line(Buffer_Frame, xPos_Start, yPos_Start + rectangle_Height, xPos_Start + rectangle_Width, yPos_Start + rectangle_Height, pxColor);
}
/* функция рисования закрашенного прямоугольника */
void __GFX_Draw_Rectangle_Filled(uint8_t *Buffer_Frame, uint8_t xPos_Start, uint8_t yPos_Start, uint8_t rectangle_Width, uint8_t rectangle_Height, uint8_t pxColor)
{
for (uint8_t i = 0; i <= rectangle_Height; i++)
{
__GFX_Draw_Line(Buffer_Frame, xPos_Start, yPos_Start + i, xPos_Start + rectangle_Width, yPos_Start + i, pxColor);
}
}
/* функция рисования пустотелой окружности */
void __GFX_Draw_Circle(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t circle_Radius, uint8_t pxColor)
{
int f = 1 - (int)circle_Radius;
int ddF_x = 1;
int ddF_y = -2 * (int)circle_Radius;
int x_0 = 0;
GFX_Draw_Pixel(Buffer_Frame, xPos, yPos + circle_Radius, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos, yPos - circle_Radius, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos + circle_Radius, yPos, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos - circle_Radius, yPos, pxColor);
int y_0 = circle_Radius;
while (x_0 < y_0)
{
if (f >= 0)
{
y_0--;
ddF_y += 2;
f += ddF_y;
}
x_0++;
ddF_x += 2;
f += ddF_x;
GFX_Draw_Pixel(Buffer_Frame, xPos + x_0, yPos + y_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos - x_0, yPos + y_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos + x_0, yPos - y_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos - x_0, yPos - y_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos + y_0, yPos + x_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos - y_0, yPos + x_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos + y_0, yPos - x_0, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos - y_0, yPos - x_0, pxColor);
}
}
/* функция рисования закрашенной окружности */
void __GFX_Draw_Circle_Filled(uint8_t *Buffer_Frame, int8_t xPos, int8_t yPos, int8_t circle_Radius, uint8_t pxColor)
{
int16_t f = 1 - circle_Radius;
int16_t ddF_x = 1;
int16_t ddF_y = -2 * circle_Radius;
int16_t x_0 = 0;
int16_t y_0 = circle_Radius;
GFX_Draw_Pixel(Buffer_Frame, xPos, yPos + circle_Radius, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos, yPos - circle_Radius, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos + circle_Radius, yPos, pxColor);
GFX_Draw_Pixel(Buffer_Frame, xPos - circle_Radius, yPos, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos - circle_Radius, yPos, xPos + circle_Radius, yPos, pxColor);
while (x_0 < y_0)
{
if (f >= 0)
{
y_0--;
ddF_y += 2;
f += ddF_y;
}
x_0++;
ddF_x += 2;
f += ddF_x;
__GFX_Draw_Line(Buffer_Frame, xPos - x_0, yPos + y_0, xPos + x_0, yPos + y_0, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos + x_0, yPos - y_0, xPos - x_0, yPos - y_0, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos + y_0, yPos + x_0, xPos - y_0, yPos + x_0, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos + y_0, yPos - x_0, xPos - y_0, yPos - x_0, pxColor);
}
}
/* функция рисования треугольника */
void __GFX_Draw_Triangle(uint8_t *Buffer_Frame, uint8_t xPos1, uint8_t yPos1, uint8_t xPos2, uint8_t yPos2, uint8_t xPos3, uint8_t yPos3, uint8_t pxColor)
{
__GFX_Draw_Line(Buffer_Frame, xPos1, yPos1, xPos2, yPos2, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos2, yPos2, xPos3, yPos3, pxColor);
__GFX_Draw_Line(Buffer_Frame, xPos3, yPos3, xPos1, yPos1, pxColor);
}
float roundUp(float num) {
if (num > 0) {
return ceilf(num); // Для положительных чисел используем ceil
} else {
return floorf(num); // Для отрицательных чисел используем floor
}
}
void __GFX_Draw_Arrow(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t size, uint16_t angle, uint8_t pxColor)
{
float rad = (angle-90) * PI / 180.0; // Переводим угол в радианы
// Кончик стрелки (самая острая точка)
int16_t x1 = xPos;
int16_t y1 = yPos;
// Два боковых конца (формируют треугольник стрелки)
int16_t x2 = xPos + roundUp(size * sinf(rad + PI / 4));
int16_t y2 = yPos + roundUp(size * cosf(rad + PI / 4));
int16_t x3 = xPos + roundUp(size * sinf(rad - PI / 4));
int16_t y3 = yPos + roundUp(size * cosf(rad - PI / 4));
// Ограничение от выхода за границы (если нужно)
if (x2 < 0) x2 = 0;
if (x3 < 0) x3 = 0;
if (y2 < 0) y2 = 0;
if (y3 < 0) y3 = 0;
// Рисуем стрелку как две линии
__GFX_Draw_Line(Buffer_Frame, x1, y1, x2, y2, pxColor);
__GFX_Draw_Line(Buffer_Frame, x1, y1, x3, y3, pxColor);
}
/* функция рисования стрелки под прямым углом */
void __GFX_Draw_Arrow_Ortho(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t size, uint16_t angle, uint8_t pxColor)
{
int16_t x1, y1, x2, y2, x3, y3;
if(angle == 0) // >
{
x1 = xPos;
y1 = yPos;
x2 = xPos - size;
y2 = yPos - size;
x3 = xPos - size;
y3 = yPos + size;
}
else if(angle == 180) // <
{
x1 = xPos;
y1 = yPos;
x2 = xPos + size;
y2 = yPos - size;
x3 = xPos + size;
y3 = yPos + size;
}
else if(angle == 270) // ^
{
x1 = xPos;
y1 = yPos;
x2 = xPos - size;
y2 = yPos - size;
x3 = xPos + size;
y3 = yPos - size;
}
else if(angle == 90) // v
{
x1 = xPos;
y1 = yPos;
x2 = xPos - size;
y2 = yPos + size;
x3 = xPos + size;
y3 = yPos + size;
}
else
return;
if(x1 < 0)
x1 = 0;
if(x2 < 0)
x2 = 0;
if(x3 < 0)
x3 = 0;
if(y1 < 0)
y1 = 0;
if(y2 < 0)
y2 = 0;
if(y3 < 0)
y3 = 0;
__GFX_Draw_Line(Buffer_Frame, x1, y1, x2, y2, pxColor);
__GFX_Draw_Line(Buffer_Frame, x1, y1, x3, y3, pxColor);
}
/* Функция рисования дуги (четверти окружности) */
void __GFX_Draw_Arc(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t radius, uint16_t startAngle, uint16_t endAngle, uint8_t pxColor)
{
int xPos_tmp = 0;
int yPos_tmp = 0;
for (int angle = startAngle; angle <= endAngle; angle++)
{
xPos_tmp = roundf(xPos + (radius * cosf(angle * 3.14159 / 180)));
yPos_tmp = roundf(yPos + (radius * sinf(angle * 3.14159 / 180)));
GFX_Draw_Pixel(Buffer_Frame, xPos_tmp, yPos_tmp, pxColor);
}
}
/* Функция для отрисовки осей и рамки графика */
HAL_StatusTypeDef __GFX_StartPlot(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot)
{
if((hPlot->dataX < hPlot->xPos) || (hPlot->dataX >= hPlot->plotWidth))
{
hPlot->dataX = hPlot->xPos;
GFX_Clean_Area(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->plotWidth, hPlot->plotHeight);
if(hPlot->f.plotXAxis)
{
uint8_t xaxis_x_start = hPlot->xPos;
uint8_t xaxis_x_end = hPlot->xPos+hPlot->plotWidth-1;
uint8_t xaxis_y = hPlot->yPos-hPlot->plotXShift;
if(hPlot->f.dataSigned)
xaxis_y += hPlot->plotHeight/2;
else
xaxis_y += hPlot->plotHeight-1;
__GFX_Draw_Line(Buffer_Frame, xaxis_x_start, xaxis_y, xaxis_x_end, xaxis_y, 1);
__GFX_Draw_Arrow_Ortho(Buffer_Frame, xaxis_x_end, xaxis_y, 2, 0, 1);
}
if(hPlot->f.plotYAxis)
{
uint8_t yaxis_y_start = hPlot->yPos;
uint8_t yaxis_y_end = hPlot->yPos+hPlot->plotHeight-1;
uint8_t yaxis_x = hPlot->xPos+hPlot->plotYShift;
__GFX_Draw_Line(Buffer_Frame, yaxis_x, yaxis_y_start, yaxis_x, yaxis_y_end, 1);
__GFX_Draw_Arrow_Ortho(Buffer_Frame, yaxis_x, yaxis_y_start, 2, 90, 1);
}
if(hPlot->f.plotFrame)
{
__GFX_Draw_Rectangle(Buffer_Frame, hPlot->xPos, hPlot->yPos, hPlot->plotWidth-1, hPlot->plotHeight-1, 1);
}
return HAL_OK;
}
else
{
return HAL_ERROR;
}
}
/* Функция для отрисовки выбранной точки графика*/
void __GFX_Draw_Plotter_Value(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot)
{
/* Первичная инициализация плоттера */
if(hPlot->f.initialized == 0)
{
hPlot->f.initialized = 1;
GFX_Clean_Buffer_Frame(Buffer_Frame);
hPlot->dataX = -1;
if(__GFX_StartPlot(Buffer_Frame, hPlot) != HAL_OK)
return;
}
/* Очищение графика после полного заполнения */
if((hPlot->dataX < hPlot->xPos) || (hPlot->dataX >= hPlot->plotWidth))
{
__GFX_StartPlot(Buffer_Frame, hPlot);
}
/* Расчет позиции на графике */
// если график должен быть знаковым, то уменьшаем машстаб еще в два раза
if(hPlot->f.dataSigned)
hPlot->dataY = (hPlot->dataY + hPlot->plotHeight)/2;
// инвертирование y потому что он считается сверху вниз
uint8_t plot_y_down = hPlot->yPos + hPlot->plotHeight-1;
hPlot->dataY = plot_y_down - hPlot->dataY;
// Сдвиг графика
hPlot->dataY += hPlot->plotXShift;
/* Вывод пикселя позиции пикселя */
// Передний фронт
if(hPlot->dataY - hPlot->dataPrevY > 0)
{
/* Цикл для заполнения пикселей по вертикали, когда фронт очень резкий */
for(int y = hPlot->dataPrevY+1; y <= hPlot->dataY; y++)
{
if((y<hPlot->yPos+hPlot->plotHeight) && (y>=hPlot->yPos))
GFX_Draw_Pixel(Buffer_Frame, hPlot->dataX, y, 1);
}
}// Задний фронт
else if (hPlot->dataY - hPlot->dataPrevY < 0)
{
/* Цикл для заполнения пикселей по вертикали, когда фронт очень резкий */
for(int y = hPlot->dataPrevY-1; y >= hPlot->dataY; y--)
{
if((y<hPlot->yPos+hPlot->plotHeight) && (y>=hPlot->yPos))
GFX_Draw_Pixel(Buffer_Frame, hPlot->dataX, y, 1);
}
}// Плато
else
{
if((hPlot->dataY<hPlot->yPos+hPlot->plotHeight) && (hPlot->dataY>=hPlot->yPos))
GFX_Draw_Pixel(Buffer_Frame, hPlot->dataX, hPlot->dataY, 1);
}
}

158
Core/OLED_Driver/gfx_lib.h Normal file
View File

@@ -0,0 +1,158 @@
/*
* PixelGraphics.h
*
*/
#ifndef INC_PIXEL_GRAPHICS_H_
#define INC_PIXEL_GRAPHICS_H_
/* инклюды */
#include "main.h"
#include "string.h"
#include "stdio.h"
#define GFX_BufferWidth 128 //ширина дисплея в пикселях
#define GFX_BufferHeight 64 //высота дисплея в пикселях
#define GFX_pxView_On 1 //закраска пикселя On
#define GFX_pxView_Off 0 //закраска пикселя Off
#define GFX_ChInvers 1 //инверсия символа шрифта On
#define GFX_ChUnInvers 0 //инверсия символа шрифта Off
typedef enum
{
GFX_FONT_TAHOMA_8,
GFX_FONT_TAHOMA_15,
GFX_FONT_DIG_TERMINUS_15,
}GFX_Font_t;
typedef struct
{
uint8_t xPos_Start;
uint8_t yPos_Start;
uint8_t xPos_End;
uint8_t yPos_End;
uint8_t pxColor;
}GFX_LineHandleTypeDef;
typedef struct
{
uint8_t xPos_Start;
uint8_t yPos_Start;
uint8_t rectangle_Width;
uint8_t rectangle_Height;
uint8_t pxColor;
uint8_t Filled;
}GFX_RectangleHandleTypeDef;
typedef struct
{
uint8_t xPos;
uint8_t yPos;
uint8_t circle_Radius;
uint8_t pxColor;
uint8_t Filled;
}GFX_CircleHandleTypeDef;
typedef struct
{
uint8_t xPos1;
uint8_t yPos1;
uint8_t xPos2;
uint8_t yPos2;
uint8_t xPos3;
uint8_t yPos3;
uint8_t pxColor;
uint8_t Filled;
}GFX_TriangleHandleTypeDef;
typedef struct
{
uint8_t xPos;
uint8_t yPos;
uint8_t size;
uint16_t angle;
uint8_t pxColor;
uint8_t Filled;
}GFX_ArrowHandleTypeDef;
typedef struct
{
uint8_t xPos;
uint8_t yPos;
uint8_t radius;
uint16_t startAngle;
uint16_t endAngle;
uint8_t pxColor;
uint8_t Filled;
}GFX_ArcHandleTypeDef;
typedef struct
{
uint8_t xPos;
uint8_t yPos;
uint8_t plotHeight;
uint8_t plotWidth;
int16_t dataX;
int32_t dataY;
float dataInd;
int32_t dataPrevY;
int16_t plotXShift;
int16_t plotYShift;
struct
{
unsigned dataSigned:1;
unsigned plotFrame:1;
unsigned plotXAxis:1;
unsigned plotYAxis:1;
unsigned initialized:1;
}f;
}GFX_PlotterHandleTypeDef;
/* прототипы функций */
void GFX_Clean_Buffer_Frame(uint8_t *Buffer_Frame);
void GFX_Clean_Area(uint8_t *Buffer_Frame, uint16_t xPos_Start, uint16_t yPos_Start, uint16_t width, uint16_t height);
void GFX_Draw_Pixel(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t pxColor);
void GFX_Invertion_Area(uint8_t *Buffer_Frame, uint16_t xPos_Start, uint16_t yPos_Start, uint16_t width, uint16_t height);
void GFX_Invertion_Display(uint8_t *Buffer_Frame);
void GFX_Draw_Char_Tahoma8_Byte(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, char Symbol, uint8_t Inversion);
void GFX_Draw_Char_Tahoma15_Byte(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, char Symbol, uint8_t Inversion);
void GFX_Draw_Char_Terminus15Dig_Byte(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t Symbol, uint8_t inversion);
void GFX_Output_String(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, char *String, GFX_Font_t font, uint8_t setChSpacing, uint8_t Inversion);
void GFX_Draw_Line(uint8_t *Buffer_Frame, GFX_LineHandleTypeDef *hLine);
void GFX_Draw_Rectangle(uint8_t *Buffer_Frame, GFX_RectangleHandleTypeDef *hRectangle);
void GFX_Draw_Circle(uint8_t *Buffer_Frame, GFX_CircleHandleTypeDef *hCircle);
void GFX_Draw_Triangle(uint8_t *Buffer_Frame, GFX_TriangleHandleTypeDef *hTriangle);
void GFX_Draw_Arrow(uint8_t *Buffer_Frame, GFX_ArrowHandleTypeDef *hArrow);
void GFX_Draw_Arc(uint8_t *Buffer_Frame, GFX_ArcHandleTypeDef *hArc);
void GFX_Plotter_uint8_t(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, uint8_t *data, uint32_t data_size, float data_step, uint8_t data_max);
void GFX_Plotter_uint16_t(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, uint16_t *data, uint32_t data_size, float data_step, uint16_t data_max);
void GFX_Plotter_int(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, int *data, uint32_t data_size, float data_step, int data_max);
void GFX_Plotter_float(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot, float *data, uint32_t data_size, float data_step, float data_max);
void __GFX_Draw_Line(uint8_t *Buffer_Frame, uint8_t xPos_Start, uint8_t yPos_Start, uint8_t xPos_End, uint8_t yPos_End, uint8_t pxColor);
void __GFX_Draw_Rectangle(uint8_t *Buffer_Frame, uint8_t xPos_Start, uint8_t yPos_Start, uint8_t rectangle_Width, uint8_t rectangle_Height, uint8_t pxColor);
void __GFX_Draw_Rectangle_Filled(uint8_t *Buffer_Frame, uint8_t xPos_Start, uint8_t yPos_Start, uint8_t rectangle_Width, uint8_t rectangle_Height, uint8_t pxColor);
void __GFX_Draw_Circle(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t circle_Radius, uint8_t pxColor);
void __GFX_Draw_Circle_Filled(uint8_t *Buffer_Frame, int8_t xPos, int8_t yPos, int8_t circle_Radius, uint8_t pxColor);
void __GFX_Draw_Triangle(uint8_t *Buffer_Frame,
uint8_t xPos1, uint8_t yPos1,
uint8_t xPos2, uint8_t yPos2,
uint8_t xPos3, uint8_t yPos3,
uint8_t pxColor);
void __GFX_Draw_Arrow(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t size, uint16_t angle, uint8_t pxColor);
void __GFX_Draw_Arrow_Ortho(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t size, uint16_t angle, uint8_t pxColor);
void __GFX_Draw_Arc(uint8_t *Buffer_Frame, uint8_t xPos, uint8_t yPos, uint8_t radius, uint16_t startAngle, uint16_t endAngle, uint8_t pxColor);
HAL_StatusTypeDef __GFX_StartPlot(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot);
void __GFX_Draw_Plotter_Value(uint8_t *Buffer_Frame, GFX_PlotterHandleTypeDef *hPlot);
#endif /* INC_PIXEL_GRAPHICS_H_ */

85
Core/OLED_Driver/oled.c Normal file
View File

@@ -0,0 +1,85 @@
/*
* oled.c
*
* Created on: Nov 17, 2021
* Author: wvv
*/
#include "oled.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <main.h>
extern I2C_HandleTypeDef hi2c1;
void oled_write_cmd(uint8_t cmd)
{
HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 0x100);
}
uint8_t oled_buf[OLED_HEIGHT * OLED_WIDTH] = { 0 };
void oled_clear(void)
{
memset(oled_buf, 0x00, sizeof(oled_buf));
}
void oled_refresh(void)
{
for (uint8_t i = 0; i < OLED_HEIGHT; i++)
{
oled_write_cmd(0xb0 + i);
oled_write_cmd(0x00);
oled_write_cmd(0x10);
HAL_StatusTypeDef ret = HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, 1,
(uint8_t*) &oled_buf[i * OLED_WIDTH], OLED_WIDTH, 100);
if (ret != HAL_OK)
{
HAL_I2C_DeInit(&hi2c1);
HAL_I2C_Init(&hi2c1);
}
}
}
void oled_init(void)
{
oled_write_cmd(0xAE);
oled_write_cmd(0x20);
oled_write_cmd(0x10);
oled_write_cmd(0xB0);
oled_write_cmd(0xC8);
oled_write_cmd(0x00);
oled_write_cmd(0x10);
oled_write_cmd(0x40);
oled_write_cmd(0x81);
oled_write_cmd(0xff);
oled_write_cmd(0xa1);
oled_write_cmd(0xa6);
oled_write_cmd(0xa8);
oled_write_cmd(0x1f);
oled_write_cmd(0xd3);
oled_write_cmd(0x00);
oled_write_cmd(0xd5);
oled_write_cmd(0xf0);
oled_write_cmd(0xd9);
oled_write_cmd(0x22);
oled_write_cmd(0xda);
oled_write_cmd(0x02);
oled_write_cmd(0xdb);
oled_write_cmd(0x20);
oled_write_cmd(0x8d);
oled_write_cmd(0x14);
oled_write_cmd(0xaf);
HAL_Delay(100);
oled_clear();
oled_refresh();
}

20
Core/OLED_Driver/oled.h Normal file
View File

@@ -0,0 +1,20 @@
/*
* oled.h
*
* Created on: Nov 17, 2021
* Author: wvv
*/
#ifndef OLED_H
#define OLED_H
#include "stm32g4xx_hal.h"
#define OLED_WIDTH 128
#define OLED_HEIGHT 8
#define PIXEL_MODE_PAINT 0
#define PIXEL_MODE_CLEAR 1
extern uint8_t oled_buf[OLED_HEIGHT * OLED_WIDTH];
void oled_refresh(void);
void oled_init(void);
#endif //OLED_H

125
Core/OLED_Driver/syscalls.c Normal file
View File

@@ -0,0 +1,125 @@
/**
******************************************************************************
* @file syscalls.c
* @author Auto-generated by STM32CubeIDE
* @brief STM32CubeIDE Minimal System calls file
*
* For more information about which c-functions
* need which of these lowlevel functions
* please consult the Newlib libc-manual
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes */
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <time.h>
/* Variables */
extern int __io_putchar(int ch) __attribute__((weak));
extern int __io_getchar(void) __attribute__((weak));
char *__env[1] = { 0 };
char **environ = __env;
/* Functions */
void initialise_monitor_handles()
{
}
int _getpid(void)
{
return 1;
}
int _kill(int pid, int sig)
{
errno = EINVAL;
return -1;
}
void _exit (int status)
{
_kill(status, -1);
while (1) {} /* Make sure we hang here */
}
__attribute__((weak)) int _read(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
*ptr++ = __io_getchar();
}
return len;
}
__attribute__((weak)) int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
int _close(int file)
{
return -1;
}
int _isatty(int file)
{
return 1;
}
int _lseek(int file, int ptr, int dir)
{
return 0;
}
int _open(char *path, int flags, ...)
{
/* Pretend like we always fail */
return -1;
}
int _wait(int *status)
{
errno = 0;
return -1;
}
int _unlink(char *name)
{
errno = 0;
return -1;
}
int _execve(char *name, char **argv, char **env)
{
errno = ENOMEM;
return -1;
}

148
Core/Src/i2c.c Normal file
View File

@@ -0,0 +1,148 @@
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file i2c.c
* @brief This file provides code for the configuration
* of the I2C instances.
******************************************************************************
* @attention
*
* Copyright (c) 2025 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "i2c.h"
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
I2C_HandleTypeDef hi2c1;
/* I2C1 init function */
void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x40B285C2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
/** Configure Analogue filter
*/
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
/** Configure Digital filter
*/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
/* USER CODE END I2C1_Init 2 */
}
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
if(i2cHandle->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspInit 0 */
/* USER CODE END I2C1_MspInit 0 */
/** Initializes the peripherals clocks
*/
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
Error_Handler();
}
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/**I2C1 GPIO Configuration
PA15 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
GPIO_InitStruct.Pin = GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* I2C1 clock enable */
__HAL_RCC_I2C1_CLK_ENABLE();
/* USER CODE BEGIN I2C1_MspInit 1 */
/* USER CODE END I2C1_MspInit 1 */
}
}
void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{
if(i2cHandle->Instance==I2C1)
{
/* USER CODE BEGIN I2C1_MspDeInit 0 */
/* USER CODE END I2C1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_I2C1_CLK_DISABLE();
/**I2C1 GPIO Configuration
PA15 ------> I2C1_SCL
PB7 ------> I2C1_SDA
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15);
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7);
/* USER CODE BEGIN I2C1_MspDeInit 1 */
/* USER CODE END I2C1_MspDeInit 1 */
}
}
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

View File

@@ -19,6 +19,7 @@
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "i2c.h"
#include "tim.h"
#include "gpio.h"
@@ -91,6 +92,7 @@ int main(void)
MX_ADC1_Init();
MX_TIM17_Init();
MX_TIM1_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
UKSI_Init();
/* USER CODE END 2 */

View File

@@ -60,7 +60,7 @@ float ADC_Calc(ADC_t *adc)
return 0;
ADC_Coefs_t *coefs = &adc->Coefs;
int16_t rawval = (int16_t)HAL_ADC_GetValue(adc->hadc);
int16_t rawval = HAL_ADC_GetValue(adc->hadc);
rawval = Filter_Process(&adc->mdn, rawval);
@@ -83,18 +83,22 @@ HAL_StatusTypeDef UKSI_Calc_Init(UKSI_Calc_t *calc, ADC_HandleTypeDef *hadc)
return HAL_ERROR;
calc->adc.hadc = hadc;
ADC_ConfigCoef(&calc->adc, 0, 1.411, 1860, 14);
// ADC_ConfigCoef(&calc->adc, 0, 1.259, 1639, 14);
ADC_ConfigCoef(&calc->adc, 0, 0.529, 703, 14);
ADC_ConfigFilter(&calc->adc, 10, 50000);
calc->RMeasOhm = 35060;
calc->RLimitOhm = 1.5e6;
calc->DCVoltage = 63;
calc->DCVoltage = 31.58;//60;
foster_init(&calc->adc.foster, 3000.0f);
foster_set_mse(&calc->adc.foster, 0.001f); /* Подберите под ваши значения напряжения */
HAL_ADCEx_Calibration_Start(hadc, ADC_SINGLE_ENDED);
calc->IsoOhm = 100e6;
calc->IsoMOhm = calc->IsoOhm / 1000000.0f;
return HAL_ADC_Start(hadc);
}
@@ -113,9 +117,13 @@ float UKSI_Calc_Isolation(UKSI_Calc_t *calc)
if(Filter_isDataReady(&calc->adc.avg))
{
/* Расчет тока */
float current = voltage / calc->RMeasOhm;
calc->IsoCurrentuA = current * 1000000.0f;
/* Проверка стабильности напряжения */
foster_add_sample(&calc->adc.foster, voltage);
if(foster_is_ready(&calc->adc.foster)) {
uint8_t stability = foster_check(&calc->adc.foster);
calc->adc.is_stable = stability;
@@ -126,14 +134,12 @@ float UKSI_Calc_Isolation(UKSI_Calc_t *calc)
}
}
/* Расчет изоляции */
float current = voltage / calc->RMeasOhm;
/* Расчет изоляции */
float Rtotal = calc->DCVoltage / current;
float Riso = Rtotal - (calc->RMeasOhm + calc->RLimitOhm);
calc->IsoOhm = Riso;
calc->IsoMOhm = Riso / 1000000.0f;
calc->IsoCurrentuA = current * 1000000.0f;
}
return calc->IsoOhm;

View File

@@ -1,37 +1,49 @@
#include "uksi_main.h"
#include "uksi_oled.h"
#include "adc.h"
#include "tim.h"
UKSI_Calc_t uksi_calc;
UKSI_DC_t uksi_dc;
float iso_result;
float iso_result = 100;
int dbg_dc = 0;
int dbg_dc_delay = 5000;
int dc_min_period = 5000;
int pause_period = 5000;
int measure_period = 2500;
void UKSI_Init()
{
DC_Init(&uksi_dc, &htim1, TIM_OCMODE_INACTIVE, TIM_OCMODE_ACTIVE);
UKSI_Calc_Init(&uksi_calc, &hadc1);
oled_init();
}
void UKSI_prewhile()
{
iso_result = uksi_calc.IsoOhm;
}
void UKSI_while()
{
static uint32_t prev_oled_tick = 0;
static uint32_t prev_dc_tick = 0;
static uint32_t start_measure_tick = 0;
float curr_iso = 0;
DC_Enable(&uksi_dc, dbg_dc);
if(uwTick - prev_oled_tick > 1000)
{
prev_oled_tick = uwTick;
UKSI_Print(iso_result/1000000, dbg_dc, uksi_calc.adc.Voltage, uksi_calc.IsoCurrentuA);
}
if(dbg_dc)
{
curr_iso = UKSI_Calc_Isolation(&uksi_calc);
if(uwTick - prev_dc_tick > dbg_dc_delay) // подаем импульс минимум на секунду
if(uwTick - prev_dc_tick > dc_min_period) // подаем импульс на минимальный период
{
if(!foster_check(&uksi_calc.adc.foster)) // если стабильный уровень найден - отключаем на секунду источник
if(!foster_check(&uksi_calc.adc.foster)) // если стабильный уровень найден
{
if(start_measure_tick == 0)
{
@@ -39,7 +51,7 @@ void UKSI_while()
}
else
{
if(uwTick - start_measure_tick > dbg_dc_delay)
if(uwTick - start_measure_tick > measure_period)
{
dbg_dc = 0;
start_measure_tick = 0;
@@ -48,11 +60,18 @@ void UKSI_while()
}
}
}
else if(curr_iso > 10000000)
{
dbg_dc = 0;
start_measure_tick = 0;
prev_dc_tick = uwTick;
iso_result = curr_iso;
}
}
}
else
{
if(uwTick - prev_dc_tick > dbg_dc_delay) // подаем импульс минимум на секунду
if(uwTick - prev_dc_tick > pause_period) // ждем паузу перед новой подачей импульса
{
dbg_dc = 1;
prev_dc_tick = uwTick;

85
Core/UKSI/uksi_oled.c Normal file
View File

@@ -0,0 +1,85 @@
#include "uksi_oled.h"
void UKSI_Print(float Iso, uint8_t DCState, float Voltage, float Current_uA)
{
int second_layer = 22;
// Очищаем буфер
GFX_Clean_Buffer_Frame(oled_buf);
// 1. Сопротивление изоляции - крупно сверху
char iso_str[20];
// Для STM32 sprintf не поддерживает %f, используем dtostrf или ручное форматирование
if (Iso >= 100.0f) {
sprintf(iso_str, "OL MOhm");
} else if (Iso >= 1.0f) {
int int_part = (int)Iso;
int dec_part = (int)((Iso - int_part) * 100);
sprintf(iso_str, "%d.%02d MOhm", int_part, dec_part);
} else if (Iso >= 0.001f) {
float kOhm = Iso * 1000.0f;
int int_part = (int)kOhm;
sprintf(iso_str, "%d kOhm", int_part);
} else {
float Ohm = Iso * 1000000.0f;
int int_part = (int)Ohm;
sprintf(iso_str, "%d Ohm", int_part);
}
// Отображаем сопротивление
GFX_Output_String(oled_buf, 10, 2, iso_str, GFX_FONT_TAHOMA_15, 1, 0);
// 2. Состояние DC
uint8_t x = 105; // позиция импульса
uint8_t y = 14; // нижний уровень
uint8_t h = 8; // высота импульса
uint8_t wl = 2; // длина нижнего уровня
uint8_t wh = 9; // ширина верхнего уровня
if (DCState)
{
// _|
__GFX_Draw_Line(oled_buf, x, y, x + wl, y, 1);
__GFX_Draw_Line(oled_buf, x + wl, y, x + wl, y - h, 1);
// ─ верх
__GFX_Draw_Line(oled_buf, x + wl, y - h, x + wl + wh, y - h, 1);
// |_
__GFX_Draw_Line(oled_buf, x + wl + wh, y - h, x + wl + wh, y, 1);
__GFX_Draw_Line(oled_buf, x + wl + wh, y, x + wl*2 + wh, y, 1);
}
else
{
// просто __
__GFX_Draw_Line(oled_buf, x, y, x + wl*2 + wh, y, 1);
}
// 3. Напряжение (0-2В)
char volt_str[16];
int volt_int = (int)(Voltage * 1000); // милливольты
sprintf(volt_str, "U: %d.%03dV", volt_int / 1000, volt_int % 1000);
GFX_Output_String(oled_buf, 10, 22, volt_str, GFX_FONT_TAHOMA_8, 1, 0);
// 4. Ток (уже в мкА)
char curr_str[16];
int curr_int = (int)Current_uA;
if (Current_uA >= 1000.0f) {
sprintf(curr_str, "I: %duA", curr_int);
} else if (Current_uA >= 100.0f) {
int dec_part = (int)((Current_uA - curr_int) * 1);
sprintf(curr_str, "I: %duA", curr_int);
} else if (Current_uA >= 10.0f) {
int dec_part = (int)((Current_uA - curr_int) * 10);
sprintf(curr_str, "I: %d.%01duA", curr_int, dec_part);
} else {
int dec_part = (int)((Current_uA - curr_int) * 100);
sprintf(curr_str, "I: %d.%02duA", curr_int, dec_part);
}
GFX_Output_String(oled_buf, 72, 22, curr_str, GFX_FONT_TAHOMA_8, 1, 0);
// 6. Обновляем дисплей
oled_refresh();
}

9
Core/UKSI/uksi_oled.h Normal file
View File

@@ -0,0 +1,9 @@
#ifndef _UKSI_OLED_H
#define _UKSI_OLED_H
#include "gfx_lib.h"
#include "oled.h"
void UKSI_Print(float Iso, uint8_t DCState, float Voltage, float Current);
#endif //_UKSI_OLED_H