diff --git a/Core/Inc/main.h b/Core/Inc/main.h
index b65bbf3..c0e874a 100644
--- a/Core/Inc/main.h
+++ b/Core/Inc/main.h
@@ -45,7 +45,8 @@ extern "C" {
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
-
+#include "sys.h"
+#include "delay.h"
#include "lib.h"
#include "bsp.h"
@@ -76,6 +77,8 @@ void Error_Handler(void);
/* Private defines -----------------------------------------------------------*/
#define LED_BLUE_Pin LL_GPIO_PIN_13
#define LED_BLUE_GPIO_Port GPIOC
+#define PWMA_Pin LL_GPIO_PIN_1
+#define PWMA_GPIO_Port GPIOA
#define OLED_SDA_Pin LL_GPIO_PIN_12
#define OLED_SDA_GPIO_Port GPIOB
#define OLDE_SCK_Pin LL_GPIO_PIN_13
diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c
index d2c5251..0760ad6 100644
--- a/Core/Src/gpio.c
+++ b/Core/Src/gpio.c
@@ -55,6 +55,9 @@ void MX_GPIO_Init(void)
/**/
LL_GPIO_ResetOutputPin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
+ /**/
+ LL_GPIO_ResetOutputPin(PWMA_GPIO_Port, PWMA_Pin);
+
/**/
LL_GPIO_ResetOutputPin(GPIOB, OLED_SDA_Pin|OLDE_SCK_Pin);
@@ -71,13 +74,20 @@ void MX_GPIO_Init(void)
LL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/**/
- GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_3
- |LL_GPIO_PIN_4|LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7
- |LL_GPIO_PIN_8|LL_GPIO_PIN_9|LL_GPIO_PIN_10|LL_GPIO_PIN_11
- |LL_GPIO_PIN_12|LL_GPIO_PIN_15;
+ GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_2|LL_GPIO_PIN_3|LL_GPIO_PIN_4
+ |LL_GPIO_PIN_5|LL_GPIO_PIN_6|LL_GPIO_PIN_7|LL_GPIO_PIN_8
+ |LL_GPIO_PIN_9|LL_GPIO_PIN_10|LL_GPIO_PIN_11|LL_GPIO_PIN_12
+ |LL_GPIO_PIN_15;
GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ /**/
+ GPIO_InitStruct.Pin = PWMA_Pin;
+ GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
+ GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
+ LL_GPIO_Init(PWMA_GPIO_Port, &GPIO_InitStruct);
+
/**/
GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1|LL_GPIO_PIN_2|LL_GPIO_PIN_10
|LL_GPIO_PIN_11|LL_GPIO_PIN_14|LL_GPIO_PIN_15|LL_GPIO_PIN_3
@@ -89,7 +99,7 @@ void MX_GPIO_Init(void)
/**/
GPIO_InitStruct.Pin = OLED_SDA_Pin|OLDE_SCK_Pin;
GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
- GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_LOW;
+ GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
diff --git a/Core/Src/main.c b/Core/Src/main.c
index 10fcf91..e0e66dc 100644
--- a/Core/Src/main.c
+++ b/Core/Src/main.c
@@ -90,7 +90,7 @@ int main(void)
SystemClock_Config();
/* USER CODE BEGIN SysInit */
-
+ delay_init((SystemCoreClock / 1000000));
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
diff --git a/MDK-ARM/motor.uvoptx b/MDK-ARM/motor.uvoptx
index 3ab2b27..1348ec6 100644
--- a/MDK-ARM/motor.uvoptx
+++ b/MDK-ARM/motor.uvoptx
@@ -125,7 +125,7 @@
0
CMSIS_AGDI
- UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_128 -FL020000 -FS08000000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)
+ -X"" -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)
0
@@ -148,56 +148,14 @@
-
-
- 0
- 0
- 241
- 1
- 134220930
- 0
- 0
- 0
- 0
- 0
- 1
- ../Core/Src/stm32f1xx_it.c
-
- \\motor\../Core/Src/stm32f1xx_it.c\241
-
-
- 1
- 0
- 47
- 1
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- startup_stm32f103xb.s
-
-
-
-
- 2
- 0
- 255
- 1
- 0
- 0
- 0
- 0
- 0
- 0
- 0
- startup_stm32f103xb.s
-
-
-
-
+
+
+
+ 0
+ 1
+ buffer
+
+
0
@@ -240,12 +198,6 @@
-
-
- System Viewer\TIM4
- 35905
-
-
diff --git a/MDK-ARM/motor/motor.hex b/MDK-ARM/motor/motor.hex
index ed0fae5..f066dca 100644
--- a/MDK-ARM/motor/motor.hex
+++ b/MDK-ARM/motor/motor.hex
@@ -1,8 +1,8 @@
:020000040800F2
-:100000008018002005010008A905000893010008D8
-:10001000A505000871010008A907000800000000FC
-:10002000000000000000000000000000AF05000814
-:100030009101000800000000AD050008B1050008AE
+:10000000801C002005010008250B0008930600084D
+:10001000210B00088D060008250D000800000000D7
+:100020000000000000000000000000002B0B000892
+:100030009106000800000000290B00082D0B0008A5
:100040001F0100081F0100081F0100081F01000810
:100050001F0100081F0100081F0100081F01000800
:100060001F0100081F0100081F0100081F010008F0
@@ -10,291 +10,621 @@
:100080001F0100081F0100081F0100081F010008D0
:100090001F0100081F0100081F0100081F010008C0
:1000A0001F0100081F0100081F0100081F010008B0
-:1000B000A90600081F0100081F0100081F01000811
+:1000B000250C00081F0100081F0100081F0100088F
:1000C0001F0100081F0100081F0100081F01000890
:1000D0001F0100081F0100081F0100081F01000880
:1000E0001F0100081F0100081F010008DFF810D0E1
-:1000F00000F02CF800480047350E0008AFF30080F0
-:10010000801800200648804706480047FEE7FEE7C3
+:1000F00000F0BAFA0048004785100008AFF300800E
+:10010000801C00200648804706480047FEE7FEE7BF
:10011000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7B7
-:10012000A5060008ED000008D2B201E000F8012B9E
+:10012000210C0008ED000008D2B201E000F8012B1C
:10013000491EFBD270470022F6E710B513460A4667
-:1001400004461946FFF7F0FF204610BD064C074D48
-:1001500006E0E06840F0010394E807009847103497
-:10016000AC42F6D3FFF7C6FFF811000818120008DA
-:1001700000BFFEE770B504460D4600BF2CB901F084
-:1001800001F801E000BF00BFFCE700BF012070BD27
-:10019000704700BFFEE7000008B5054989690143C3
-:1001A000034A9161114689690140009100BF08BD71
-:1001B000001002402DE9F04102460B461868C0F3DA
-:1001C0000F2595FAA5F0B0FA80F480E00120A04058
-:1001D000284000287AD0082C04D240F2011000FAFE
-:1001E00004F106E0A4F108004FF00116864046F045
-:1001F0008061586808280ED11869D66826EA112649
-:100200000F0A97FAA7F7B7FA87F700FA07F73E43FE
-:10021000D66000BF00BF586802EB116691FAA1FCDE
-:10022000BCFA8CFC4FEA8C084FF00F0C0CFA08FC5F
-:10023000376827EA0C0791FAA1FCBCFA8CFC4FEA5C
-:100240008C0C00FA0CFC47EA0C07376000BF5868BA
-:10025000012802D05868092838D1986802EB116645
-:1002600091FAA1FCBCFA8CFC4FEA8C084FF0030C0D
-:100270000CFA08FC376827EA0C0791FAA1FCBCFAD3
-:100280008CFC4FEA8C0C00FA0CFC47EA0C07376038
-:1002900000BFD86802EB116691FAA1FCBCFA8CFC95
-:1002A0004FEA8C084FF0040C0CFA08FC376827EA78
-:1002B0000C0791FAA1FCBCFA8CFC4FEA8C0C00FAFA
-:1002C0000CFC47EA0C07376000BF00BF641C25FA2E
-:1002D00004F000287FF47AAFBDE8F081C1F30F226B
-:1002E0004261704702480068401C0149086070473D
-:1002F0000C0000204FF47A71B0FBF1F2521E4FF067
-:10030000E0235A6100229A6105221A6100BF7047FA
-:1003100001490860704700000000002010B5024647
-:1003200013681C48824208D0B2F1804F05D01A48A9
-:10033000824202D01948824204D123F070004C68F6
-:1003400040EA04031348824208D0B2F1804F05D03E
-:100350001148824202D01148824204D123F44070F5
-:10036000CC6840EA040313608868D06200BF088844
-:10037000906200BF0748824203D10869106300BF42
-:1003800000BF00BF506940F00100506100BF002075
-:1003900010BD0000002C0140000400400008004097
-:1003A0000146086900F001007047000000B585B003
-:1003B00014216846FFF7BFFE1020FFF7EDFE202056
-:1003C000FFF7EAFE0420FFF7E7FE0820FFF7E4FE50
-:1003D0001C491D48FFF782FF1C491D48FFF77EFF9F
-:1003E0001848009001200190022002900020039004
-:1003F00069461548FFF7DEFE164800900020019080
-:1004000069461148FFF7D6FE13480090002001907E
-:1004100069461248FFF7CEFE114800900020019077
-:1004200069460B48FFF7C6FE08480090012001907E
-:10043000022002900020039069460548FFF7BAFEAB
-:1004400005B000BD20002004001001403000300441
-:10045000000C0140C000C004FFFF9F0400080140E1
-:10046000FFFFCF042DE9F04186B0142101A8FFF76A
-:1004700062FE01204849C9690143474AD1611146DA
-:10048000C9690140009100BF00BF1C21434B1B689C
-:10049000C3F302200F2400250346C3F1070CBCF16F
-:1004A000040F02D94FF0040C01E0C3F1070C6746BA
-:1004B00003F1040CBCF1070F02D24FF0000C01E075
-:1004C000A3F1030C66464FF0010C0CFA07FCACF1EB
-:1004D000010C0CEA040C0CFA06FC4FF0010808FAB7
-:1004E00006F8A8F1010808EA05084CEA080200BF6E
-:1004F000002904DB1007030E2948435407E01007C6
-:10050000040E26480C3001F00F031B1FC45400BF1B
-:100510001C20002809DB00F01F0201219140420944
-:10052000920002F1E022C2F8001100BF41F61F4024
-:10053000ADF8040000200290632003900020049096
-:1005400001A94FF08040FFF7E9FE00BF4FF0804067
-:10055000006820F080004FF08041086000BF00205C
-:10056000896844F20702914301434FF08042916051
-:1005700000BF00BF1146496821F07001014351607E
-:1005800000BF00BF1046806820F0800011468860E0
-:1005900000BF06B0BDE8F081001002400CED00E0A5
-:1005A00000E400E000BFFEE700BFFEE770477047D1
-:1005B0007047000010B502203749096821F0070193
-:1005C0000143354A116000BF00BF00BF32480068D8
-:1005D00000F007000228F8D100BF3048006840F45E
-:1005E00080302E49086000BF00BF00BF2B48006864
-:1005F000C0F340400028F8D04FF480304FF4E011B1
-:10060000264A526822F47C1200F440330B431A430A
-:10061000224B5A6000BF00BF1846006840F080704F
-:100620001946086000BF00BF00BF1C480068C0F347
-:1006300040600028F8D000201849496821F0F001F6
-:100640000143164A516000BF10151146496821F454
-:10065000E0610143516000BF00201146496821F468
-:1006600060510143516000BF02201146496821F0EA
-:1006700003010143516000BF00BF00BF074840684D
-:1006800000F00C000828F8D10548FFF733FE0448B5
-:10069000FFF73EFE10BD00000020024000100240A7
-:1006A00000A24A047047000010B54FF08040FFF7E9
-:1006B00077FE012874D100BF00BF80070069C0F336
-:1006C000400068B100BF4FF08040C068C0F34000F8
-:1006D00030B100BF6FF002008107086100BF00BFAA
-:1006E00000BF4FF080400069C0F3800070B100BFD0
-:1006F0004FF08040C068C0F3800038B100BF6FF099
-:1007000004004FF08041086100BF00BF00BF4FF000
-:1007100080400069C0F3C00070B100BF4FF080405E
-:10072000C068C0F3C00038B100BF6FF008004FF0E0
-:100730008041086100BF00BF00BF4FF080400069EA
-:10074000C0F3001070B100BF4FF08040C068C0F32C
-:10075000001038B100BF6FF010004FF08041086109
-:1007600000BF00BF4FF08040FFF71AFE01280DD1F7
-:1007700000BF8007C06800F0010038B100BF6FF013
-:1007800001004FF08041086100BF00BF00BFFFF7CC
-:10079000A9FD00BF03480068401C0249086000BF73
-:1007A00010BD00006000002000BFFEE702E008C8A6
-:1007B000121F08C1002AFAD170477047002001E0DB
-:1007C00001C1121F002AFBD170472DE9FC410446EC
-:1007D0000CB1012100E00021084640F26F21FFF733
-:1007E000C9FC25462C462E686F68D7E90401CDE97F
-:1007F00000016868D0F80CC097E80F00E047204679
-:1008000000F070FAD6E90401CDE900012868D0F8BB
-:1008100008C096E80F00E047204600F063FAD6E9EA
-:100820000401CDE900012868D0F80CC096E80F005B
-:10083000E047BDE8FC810000014601F1100000E046
-:10084000001D02681AB9024A12689042F8D3704734
-:100850002000002010B50648046803E02046FFF79A
-:10086000EBFF0446034800688442F7D310BD000044
-:100870001C000020200000202DE9FC4104460CB1A2
-:10088000012100E00021084640F28B21FFF772FCB5
-:1008900025462C462E686F68D7E90401CDE9000192
-:1008A0006868D0F808C097E80F00E047204600F0DD
-:1008B00019FAD6E90401CDE900012868D0F808C08A
-:1008C00096E80F00E047204600F00CFAD6E9040154
-:1008D000CDE900012868D0F80CC096E80F00E04789
-:1008E000BDE8FC810FB4DDE900108A68C0F30F2376
-:1008F0001A40C0F30F239A4201D1012200E00022E6
-:10090000D0B204B070472DE9FC47054689460DB1C9
-:10091000012100E0002108465F21FFF72BFC4FF08A
-:10092000000AD0462C462668676800BF3AE0D7E93F
-:100930000401CDE900016068D0F808C097E80F0015
-:10094000E047D6E90401CDE900012068D0F808C0ED
-:1009500096E80F00E0474FEA48604FEA10682846E3
-:1009600000F0C0F9D7E90401CDE900016068D0F8D2
-:1009700014C097E80F00E04718B108F1010000F03B
-:10098000FF08D6E90401CDE900012068D0F80CC0C9
-:1009900096E80F00E047284600F0A4F90AF10100AC
-:1009A00000F0FF0ABAF1080FC1DBB9F1010F03D162
-:1009B0002846FFF70AFF02E02846FFF75DFF4046A2
-:1009C000BDE8FC870FB4DDE90001C1F30F224261ED
-:1009D00000BF04B070470FB4DDE90001C1F30F227E
-:1009E000026100BF04B070472DE9FC4104460CB120
-:1009F000012100E0002108460F21FFF7BBFB25463F
-:100A00002C462E686F68D7E90401CDE900016868BB
-:100A1000D0F808C097E80F00E047D6E90401CDE917
-:100A200000012868D0F808C096E80F00E04720468B
-:100A300000F058F9D7E90401CDE900016868D0F861
-:100A40000CC097E80F00E047204600F04BF9D6E9CC
-:100A50000401CDE900012868D0F80CC096E80F0029
-:100A6000E047204600F03EF9BDE8FC812DE9FC415D
-:100A700004460CB1012100E0002108462D21FFF7BA
-:100A800079FB25462C462E686F68D6E90401CDE92E
-:100A900000012868D0F80CC096E80F00E047D7E9BD
-:100AA0000401CDE900016868D0F80CC097E80F0098
-:100AB000E047204600F016F9D6E90401CDE900012F
-:100AC0002868D0F808C096E80F00E047D7E904018D
-:100AD000CDE900016868D0F808C097E80F00E0474A
-:100AE000204600F0FFF8BDE8FC810FB430B5DDE929
-:100AF0000301C268C1F30F2323EA020402EA0305DB
-:100B000044EA0544046100BF30BC5DF814FB2DE9E4
-:100B1000FC4104460CB1012100E0002108464021BF
-:100B2000FFF728FB4FF0000825462C462E686F681B
-:100B3000D7E90401CDE900016868D0F808C097E85A
-:100B40000F00E047D6E90401CDE900012868D0F89C
-:100B500008C096E80F00E047204600F0C3F80CE01C
-:100B600008F1010000F0FF08B8F1FA0F05DD20469A
-:100B7000FFF77CFF0020BDE8FC81D7E90401CDE947
-:100B800000016868D0F814C097E80F00E04700281B
-:100B9000E6D1D6E90401CDE900012868D0F80CC0FF
-:100BA00096E80F00E047204600F09CF80120E2E7BD
-:100BB0002DE9FC47064688464FF000090EB1012199
-:100BC00000E0002108468821FFF7D4FA3446276860
-:100BD00065684FF0000946E008F0800050B1D5E9A3
-:100BE0000401CDE900016068D0F808C095E80F0065
-:100BF000E04709E0D5E90401CDE900016068D0F8DB
-:100C00000CC095E80F00E047D7E90401CDE90001E9
-:100C10002068D0F808C097E80F00E047304600F0A1
-:100C200061F84FEA48604FEA1068D7E90401CDE95E
-:100C300000012068D0F80CC097E80F00E04730466C
-:100C400000F050F8B9F1070F09D1D5E90401CDE959
-:100C500000016068D0F808C095E80F00E04709F18E
-:100C6000010000F0FF09B9F1080FB5DBBDE8FC8712
-:100C700070B506460D4600240BE0E00045FA00F092
-:100C8000C1B23046FFF794FF3046FFF740FF601CCB
-:100C9000C4B2022CF1DB70BD00200B49086000BF1C
-:100CA00000BF4FF08040006840F001004FF08041ED
-:100CB000086000BF00BF0846C06840F00100C8607F
-:100CC00000BF00BF704700000400002010B50248BC
-:100CD00000F07AF810BD00000400002010B500F00C
-:100CE000A7F910BD70B504460CB1012100E0002148
-:100CF000084640F25921FFF73DFA0025258900E01A
-:100D000000BF281EA5F101018DB2F9D170BD000010
-:100D10002DE9F04105460E4618273946002000F01F
-:100D200069F904460CB1012100E000210846362192
-:100D3000FFF720FA256066600548A0600548E0607E
-:100D400005482061054860612046BDE8F08100004B
-:100D5000D7090008C5090008EB0A0008E5080008E3
-:100D6000F7B515465C263146002000F043F90446ED
-:100D700020466946082203E011F8013B00F8013BD8
-:100D8000131EA2F10106B2B2F6D100BF25810848B8
-:100D9000A0630849E163084921640849A16408493E
-:100DA00061640849E1640020A4F858002046FEBDB3
-:100DB000E90900086D0A00080F0B00080709000880
-:100DC000B10B0008710C000838B5014600200090F6
-:100DD000086810B1152821D116E000BF124B134C42
-:100DE000E068C3F30F2222EA000400EA020544EAA5
-:100DF00005440E4D2C6100BF00BF0D4800684860DF
-:100E000000BF1520086000BF094A48681268101A20
-:100E1000642801D2002038BD00BFDFE70020086051
-:100E200000900320F7E7000020002004001001409C
-:100E30006000002008B501201F49896901431E4A4E
-:100E40009161114689690140009100BF00BF000710
-:100E50001146C9690143D1611146C9690140009138
-:100E600000BF00BF03200246144B19684FF6FF0372
-:100E70001940134B0B4343EA0221104B196000BF8A
-:100E800000BF1048406820F0E06040F000700D495D
-:100E9000486000BFFFF78EFBFFF788FAFFF7E2FA22
-:100EA000002000F011F8FFF719FFFFF7F5FE01E051
-:100EB000FFF70CFFFCE70000001002400CED00E023
-:100EC0000000FA050000014010B504460C4951F835
-:100ED00024104A000B4951F82400002100F09EF82C
-:100EE000094951F824200749083951F82400002104
-:100EF00000F094F8012103480830015510BD0000AE
-:100F0000E011000854000020F01100082DE9F0471E
-:100F100004460F460025A9462348005D20B9224813
-:100F200018380168204688471FB94FF0FF30BDE8E8
-:100F3000F0871E4850F82400B7FBF0F61B4850F825
-:100F40002400B7FBF0F100FB117000B1761C1848CB
-:100F500050F82400451E22E01348083850F82400B9
-:100F600030F8150010B909F1010901E04FF000094E
-:100F7000B14513D14FF0000809E00B48083850F88C
-:100F8000240005EB080220F8126008F10108B045C2
-:100F9000F3D3064850F824006843C8E76D1E002DBF
-:100FA000DADA4FF0FF30C2E75C000020E8110008F9
-:100FB000E011000810B501460023002207E00B48AD
-:100FC00050F8210030F8120000B15B1C521C084898
-:100FD00050F821009042F2D864205843044C54F851
-:100FE0002140B0FBF4F0C0B210BD0000540000205E
-:100FF000E011000870B504460E4631462046FFF762
-:1010000085FF0546681C08B9002070BD024850F8ED
-:1010100024002844F9E700004C00002030B50346C6
-:1010200001E003F8011B141EA2F10102F9D130BD49
-:101030001CB52F492F48FFF76BFE00902E492D4815
-:10104000FFF766FE01900022DDE90001FFF788FE50
-:101050002A490860AE2000F055F8D52000F052F87B
-:10106000802000F04FF8A82000F04CF83F2000F05E
-:1010700049F8D32000F046F8002000F043F8402063
-:1010800000F040F88D2000F03DF8142000F03AF810
-:10109000202000F037F8002000F034F8A12000F004
-:1010A00031F8C82000F02EF8DA2000F02BF81220DA
-:1010B00000F028F8812000F025F8CF2000F022F879
-:1010C000D92000F01FF8F12000F01CF8DB2000F020
-:1010D00019F8402000F016F8A42000F013F8A6201C
-:1010E00000F010F8AF2000F00DF800F009F81CBD7A
-:1010F00020002004000C01401000100464000020B7
-:101100007047000038B5044600208DF800008DF8C7
-:1011100001401B480068816B1948006888471848DF
-:1011200000687821426C16480068904714480068AF
-:10113000016C1348006888479DF80010104800684B
-:10114000426C0F48006890470D480068016C0C48DD
-:10115000006888479DF8011009480068426C0848FB
-:101160000068904706480068016C05480068884799
-:1011700003480068C16B02480068884738BD00001A
-:101180006400002000BF00BF00BF00BF00BFBFF36E
-:101190004F8F00BF00BF00BF0948006800F4E06047
-:1011A00008490843001D0649086000BF00BF00BF92
-:1011B000BFF34F8F00BF00BF00BF00BF00BFFDE700
-:1011C0000CED00E00000FA055F6C697374006C6957
-:1011D000737420616C6C20636F6D6D616E640000D0
-:1011E00000020000000000000800000008000000ED
-:1011F000001000000000000018120008000000208D
-:1012000078000000AC070008901200087800002069
-:1012100008180000BC0700080024F40000000000CB
-:1012200000000000000000000000000000000000BE
-:1012300000000000000000000000000000000000AE
-:10124000000000000000000000000000000000009E
-:10125000000000000000000000000000C90E0008AF
-:10126000B50F000880000020400000208010002002
-:10127000420000200000000000000000000000000C
-:10128000C8110008CE110008C6E533B4550800089F
+:1001400004461946FFF7F0FF204610BDF0B480EAE0
+:100150000102D40F4200B2EB410F02D20246084620
+:1001600011464A0042D0C30DDDB2C1F3C752AD1AE9
+:10017000202D35DAC1F3160141F4000204B15242D8
+:10018000C5F1200602FA06F12A411044B3EBD05F14
+:1001900023D0C4B1012DA0EBC35009DCF0BC4FF05B
+:1001A000004202EAC352DBB200F5000000F0D0B911
+:1001B000400000F1807000EBC350A0F1807040EA75
+:1001C000D170490009E0490841EAC071A0EBC35071
+:1001D00000F50000400800EBC350F0BC00F0AFB9E0
+:1001E0006142012202EB4101001BF6E7F0BC7047BF
+:1001F00081F00041AAE780F00040A7E780EA010211
+:1002000010B502F00043400022D04A001FD0010E7A
+:1002100001EB1261C0F35600C2F3560240F4000035
+:1002200042F40002A0FB022000047F39140400D035
+:10023000401C50EA124001D44000491EC2B20C06D4
+:1002400004EBD010401C4008802A02D003E00020BC
+:1002500010BD20F00100002900DA0020184310BD75
+:1002600030B480EA010202F0004530F0004221F093
+:10027000004013D090B1C30DD40DC2F31601C0F3EA
+:100280001600E41A41F4000140F400027D3491426A
+:1002900001D3641C00E04900002C02DA30BC0020CD
+:1002A00070474FF400000023914201D3891A0343A1
+:1002B00040084FEA4101F7D151B1914202D14FF0CC
+:1002C000004105E002D24FF0010101E06FF00101B1
+:1002D00003EBC450284430BC00F031B92DE9FE4F87
+:1002E000804681EA0300C00F0C46009021F00041D7
+:1002F00023F00045B8EB0200A94105D24046214653
+:1003000090461C460B46024623F00040104347D05F
+:10031000270DC7F30A00C3F30A510290401A019057
+:1003200040286BDAC3F3130040F4801B0098924618
+:1003300020B10023D2EB030A63EB0B0B0198594663
+:10034000C0F14002504600F0C9F806460D4650463E
+:100350005946019A00F0E1F810EB080061410024D1
+:1003600087EA115284EAE7731A4340D0009A62B3D5
+:10037000019A012A4FEA075215DC001B61EB0201CA
+:100380004FF0004202EA0752CDE90042001C41F55D
+:10039000801132462B4600F018F903B0BDE8F08F0B
+:1003A00040462146F9E7001B61EB0201001C41F5C4
+:1003B000801300185B412018A2F5001747EB0301DA
+:1003C00040EAD570B6196D4111E06D084FEA360666
+:1003D00045EAC0754FEA0752001B61EB0201001CA1
+:1003E00041F5801149084FEA300000195141324669
+:1003F0002B4603B0BDE8F04F00F0D8B800980122BA
+:1004000040000023D0EB020263EBE073009821462A
+:100410004FEAE074B8EB000061EB0401E9E783F018
+:1004200000435BE781F0004158E796230022114624
+:1004300000F08EB820F00040C10DC0F3160040F46B
+:1004400000007F2901DA00207047962903DCC1F102
+:100450009601C8407047963988407047C1F30A52E8
+:1004600010B5C1F3130140F2FF3341F480119A42F9
+:1004700001DA002010BD40F233439A42A2F2334227
+:1004800003DC524200F039F810BD904010BD00F07E
+:10049000004230F000400AD0C10D01F56071C0F398
+:1004A000160042EA0151C20840071143704700207C
+:1004B00001467047002801DBC0F10040002901DB44
+:1004C000C1F1004181427047002801DBC0F10040CA
+:1004D000002901DBC1F1004188427047202A04DB7A
+:1004E000203A00FA02F1002070479140C2F1200347
+:1004F00020FA03F3194390407047202A04DB203A86
+:1005000021FA02F00021704721FA02F3D040C2F133
+:1005100020029140084319467047202A06DBCB177A
+:10052000203A41FA02F043EAE07306E041FA02F3AE
+:10053000D040C2F12002914008431946704700297B
+:10054000A8BF7047401C490008BF20F00100704759
+:1005500010B4B0FA80FC00FA0CF050EA010404BFB9
+:1005600010BC704749B1CCF1200421FA04F411FA0F
+:100570000CF118BF012121430843A3EB0C01CB1D53
+:100580004FEA00614FEA102042BF002010BC7047C4
+:1005900000EBC35010440029A4BF10BC7047401C9E
+:1005A000490008BF20F0010010BC704710B5141EB0
+:1005B00073F1000408DA401C41F1000192185B411C
+:1005C0001A4301D120F0010010BD2DE9F04D9246F3
+:1005D0009B4611B1B1FA81F202E0B0FA80F220320A
+:1005E0009046FFF77BFF04460F4640EA0A0041EAC7
+:1005F0000B0153465A46084313D0114653EA0100F3
+:1006000019D0C8F140025046FFF777FF05460E4665
+:10061000504659464246FFF761FF084305D0012086
+:1006200004E020463946BDE8F08D0020054346EA47
+:10063000E0762C4337430A986305E40AA0EB0800F0
+:100640000022FD0A44EA47540A3002D50020014640
+:10065000E9E7010510196941DDE90845001969411B
+:10066000BDE8F04DA2E70000064C074D06E0E0684B
+:1006700040F0010394E8070098471034AC42F6D3E9
+:10068000FFF738FD94260008B426000800BFFEE7F7
+:10069000704700BFFEE7000008B5054989690143BE
+:1006A000034A9161114689690140009100BF08BD6C
+:1006B000001002402DE9F04102460B461868C0F3D5
+:1006C0000F2595FAA5F0B0FA80F480E00120A04053
+:1006D000284000287AD0082C04D240F2011000FAF9
+:1006E00004F106E0A4F108004FF00116864046F040
+:1006F0008061586808280ED11869D66826EA112644
+:100700000F0A97FAA7F7B7FA87F700FA07F73E43F9
+:10071000D66000BF00BF586802EB116691FAA1FCD9
+:10072000BCFA8CFC4FEA8C084FF00F0C0CFA08FC5A
+:10073000376827EA0C0791FAA1FCBCFA8CFC4FEA57
+:100740008C0C00FA0CFC47EA0C07376000BF5868B5
+:10075000012802D05868092838D1986802EB116640
+:1007600091FAA1FCBCFA8CFC4FEA8C084FF0030C08
+:100770000CFA08FC376827EA0C0791FAA1FCBCFACE
+:100780008CFC4FEA8C0C00FA0CFC47EA0C07376033
+:1007900000BFD86802EB116691FAA1FCBCFA8CFC90
+:1007A0004FEA8C084FF0040C0CFA08FC376827EA73
+:1007B0000C0791FAA1FCBCFA8CFC4FEA8C0C00FAF5
+:1007C0000CFC47EA0C07376000BF00BF641C25FA29
+:1007D00004F000287FF47AAFBDE8F081024690680B
+:1007E000C1F30F231840C1F30F23984201D1012018
+:1007F00070470020FCE7C1F30F2242617047C1F34C
+:100800000F2242617047C1F30F220261704770B539
+:1008100000EB116391FAA1F5B5FA85F5AE000F254D
+:10082000B5401C68AC4391FAA1F5B5FA85F5AD0069
+:1008300002FA05F52C431C6070BD000002480068F8
+:10084000401C014908607047100000204FF47A7185
+:10085000B0FBF1F2521E4FF0E0235A6100229A6180
+:1008600005221A6100BF7047014908607047000007
+:100870000000002010B5024613681C48824208D0D0
+:10088000B2F1804F05D01A48824202D01948824204
+:1008900004D123F070004C6840EA040313488242FC
+:1008A00008D0B2F1804F05D01148824202D01148E1
+:1008B000824204D123F44070CC6840EA0403136000
+:1008C0008868D06200BF0888906200BF07488242F3
+:1008D00003D10869106300BF00BF00BF506940F03A
+:1008E0000100506100BF002010BD0000002C01403D
+:1008F00000040040000800400146086900F00100C3
+:100900007047000000B585B014216846FFF713FC5E
+:100910001020FFF7C1FE2020FFF7BEFE0420FFF7E6
+:10092000BBFE0820FFF7B8FE25492648FFF763FF06
+:1009300040F202212448FFF75EFF24492448FFF7D4
+:100940005AFF1F48009001200190022002900020D1
+:10095000039069461B48FFF7ADFE1E48009000203B
+:10096000019069461748FFF7A5FE1B48009000203C
+:10097000019069461448FFF79DFE40F20220009066
+:1009800001200190022002900020039069460E4849
+:10099000FFF790FE114800900020019069460C4836
+:1009A000FFF788FE09480090012001900320029083
+:1009B0000020039069460648FFF77CFE05B000BDA5
+:1009C00020002004001001400008014030003004E5
+:1009D000000C0140C000C004FFFD9F04FFFFCF04D6
+:1009E0002DE9F04186B0142101A8FFF7A4FB0120F6
+:1009F0004849C9690143474AD1611146C969014063
+:100A0000009100BF00BF1C21434B1B68C3F30220B1
+:100A10000F2400250346C3F1070CBCF1040F02D9D3
+:100A20004FF0040C01E0C3F1070C674603F1040C1E
+:100A3000BCF1070F02D24FF0000C01E0A3F1030C50
+:100A400066464FF0010C0CFA07FCACF1010C0CEA05
+:100A5000040C0CFA06FC4FF0010808FA06F8A8F19D
+:100A6000010808EA05084CEA080200BF002904DB77
+:100A70001007030E2948435407E01007040E2648C8
+:100A80000C3001F00F031B1FC45400BF1C200028B2
+:100A900009DB00F01F02012191404209920002F19E
+:100AA000E022C2F8001100BF41F61F40ADF804007B
+:100AB00000200290632003900020049001A94FF0D1
+:100AC0008040FFF7D7FE00BF4FF08040006820F065
+:100AD00080004FF08041086000BF0020896844F228
+:100AE0000702914301434FF08042916000BF00BF75
+:100AF0001146496821F070010143516000BF00BFF9
+:100B00001046806820F080001146886000BF06B063
+:100B1000BDE8F081001002400CED00E000E400E0D0
+:100B200000BFFEE700BFFEE7704770477047000058
+:100B300010B502203749096821F007010143354A01
+:100B4000116000BF00BF00BF3248006800F007001E
+:100B50000228F8D100BF3048006840F480302E49A8
+:100B6000086000BF00BF00BF2B480068C0F34040D2
+:100B70000028F8D04FF480304FF4E011264A526834
+:100B800022F47C1200F440330B431A43224B5A6088
+:100B900000BF00BF1846006840F08070194608602A
+:100BA00000BF00BF00BF1C480068C0F340600028C1
+:100BB000F8D000201849496821F0F0010143164A95
+:100BC000516000BF10151146496821F4E0610143EE
+:100BD000516000BF00201146496821F46051014373
+:100BE000516000BF02201146496821F00301014312
+:100BF000516000BF00BF00BF0748406800F00C0014
+:100C00000828F8D10548FFF721FE0448FFF72CFE1D
+:100C100010BD0000002002400010024000A24A0463
+:100C20007047000010B54FF08040FFF765FE0128C7
+:100C300074D100BF00BF80070069C0F3400068B1F5
+:100C400000BF4FF08040C068C0F3400030B100BF2B
+:100C50006FF002008107086100BF00BF00BF4FF0C6
+:100C600080400069C0F3800070B100BF4FF0804049
+:100C7000C068C0F3800038B100BF6FF004004FF0CF
+:100C80008041086100BF00BF00BF4FF08040006995
+:100C9000C0F3C00070B100BF4FF08040C068C0F327
+:100CA000C00038B100BF6FF008004FF0804108610C
+:100CB00000BF00BF00BF4FF080400069C0F30010CC
+:100CC00070B100BF4FF08040C068C0F3001038B171
+:100CD00000BF6FF010004FF08041086100BF00BFFF
+:100CE0004FF08040FFF708FE01280DD100BF8007BC
+:100CF000C06800F0010038B100BF6FF001004FF094
+:100D00008041086100BF00BF00BFFFF797FD00BF33
+:100D100003480068401C0249086000BF10BD000085
+:100D20006000002000BFFEE702E008C8121F08C1F3
+:100D3000002AFAD170477047002001E001C1121F5C
+:100D4000002AFBD170470000014601F1100000E0CD
+:100D5000001D02681AB9024A12689042F8D370471F
+:100D60002400002010B50648046803E02046FFF781
+:100D7000EBFF0446034800688442F7D310BD00002F
+:100D8000200000202400002010B501E000F8011B25
+:100D9000131EA2F10104A2B2F8D110BD00200B492C
+:100DA000086000BF00BF4FF08040006840F00100C5
+:100DB0004FF08041086000BF00BF0846C06840F0A7
+:100DC0000100C86000BF00BF7047000004000020A1
+:100DD00010B5024800F020F910BD0000040000200A
+:100DE00010B500F01FFD10BD0149086070470000FC
+:100DF0000C00002070B5034600224FF0E026756914
+:100E00000D4E366803FB06F44FF0E026B16910E0A2
+:100E10004FF0E026B06988420BD0884202D20E1A09
+:100E2000324402E02E1A0E4432440146A24200D35C
+:100E300000E0EDE700BF70BD0C00002010B500BF62
+:100E400001220E490E48FFF7E2FC00BF0B490C4897
+:100E5000FFF7D9FC0B490A48FFF7D5FC0420FFF740
+:100E6000C9FF06490648FFF7CAFC0420FFF7C2FF86
+:100E700004490348FFF7C3FC10BD00001000100434
+:100E8000000C01402000200410B500BF01220E49D3
+:100E90000E48FFF7BCFC00BF0D490C48FFF7AFFC44
+:100EA00009490A48FFF7ABFC0420FFF7A3FF0849F4
+:100EB0000648FFF7A8FC04490448FFF7A4FC0420F7
+:100EC000FFF798FF10BD000010001004000C014057
+:100ED0002000200410B50024082213491348FFF70E
+:100EE00096FC11491148FFF78EFC0420FFF782FFA2
+:100EF0000F490E48FFF787FC0420FFF77BFF07E050
+:100F0000601CC4B2FA2C03DDFFF7BEFF002010BD49
+:100F100005490648FFF762FC0028F1D1044903485F
+:100F2000FFF76DFC0120F2E710001004000C0140F7
+:100F30002000200470B50446002500BF0122174997
+:100F40001748FFF764FC00BF16491548FFF757FC28
+:100F500000BF1FE0E00920B110491148FFF753FC22
+:100F600003E00E490E48FFF74AFC6006040E02201B
+:100F7000FFF740FF0B490A48FFF745FC0220FFF747
+:100F800039FF08490648FFF73AFC0220FFF732FF15
+:100F9000681CC5B2082DDDDB70BD00001000100418
+:100FA000000C01402000200438B5044600208DF8D4
+:100FB00000008DF80140FFF741FF7820FFF7BAFFEE
+:100FC000FFF788FF9DF80000FFF7B4FFFFF782FFEF
+:100FD0009DF80100FFF7AEFFFFF77CFFFFF754FF1E
+:100FE00038BD38B5044640208DF800008DF801402A
+:100FF000FFF724FF7820FFF79DFFFFF76BFF9DF8B9
+:101000000000FFF797FFFFF765FF9DF80100FFF76E
+:1010100091FFFFF75FFF38BD38B501460020009013
+:10102000086810B1152821D116E000BF124B134CEF
+:10103000E068C3F30F2222EA000400EA020544EA52
+:1010400005440E4D2C6100BF00BF0D48006848608C
+:1010500000BF1520086000BF094A48681268101ACE
+:10106000642801D2002038BD00BFDFE700200860FF
+:1010700000900320F7E7000020002004001001404A
+:101080006000002008B50120234989690143224AF4
+:101090009161114689690140009100BF00BF0007BE
+:1010A0001146C9690143D1611146C96901400091E6
+:1010B00000BF00BF03200246184B19684FF6FF031C
+:1010C0001940174B0B4343EA0221144B196000BF30
+:1010D00000BF1448406820F0E06040F00070114903
+:1010E000486000BFFFF724FD0F4800680F49B0FBC0
+:1010F000F1F084B22046FFF777FEFFF703FCFFF71D
+:101100006FFC002000F014F8FFF76AFEFFF746FEC0
+:1011100001E0FFF75DFEFCE7001002400CED00E08F
+:101120000000FA05000001400000002040420F00CE
+:1011300010B504460C4951F824104A000B4951F8E7
+:101140002400002100F036F8094951F8242007490D
+:10115000083951F82400002100F02CF8012103483F
+:101160000830015510BD0000781900085400002017
+:101170008819000810B501460023002207E00B483B
+:1011800050F8210030F8120000B15B1C521C0848D6
+:1011900050F821009042F2D864205843044C54F88F
+:1011A0002140B0FBF4F0C0B210BD0000540000209C
+:1011B0007819000830B5034601E003F8011B141E3E
+:1011C000A2F10102F9D130BD2DE9FF4F83B00746EE
+:1011D0000E4692464FF0000B0024A14657A103C9CA
+:1011E000CDE9010120E01AF80900203800F0FF0BDA
+:1011F0007E2F02DD0027701CC6B200240CE00BEB32
+:101200004B00504901EB4000005D07EBC611214443
+:101210004D4A5054601CC4B2062CF0DBB81DC7B256
+:1012200009F1010000F0FF091AF809000028DAD1DD
+:1012300046481099FEF7E2FF0090FFF7FBF8804662
+:1012400000250EE00A20B8FBF0F100FB118040B24F
+:10125000C5F1060101AA50540A20B8FBF0F8681C39
+:1012600045B2032DEEDB04250EE00A20B8FBF0F1B9
+:1012700000FB118040B2C5F1060101AA50540A20BA
+:10128000B8FBF0F8681C45B2072DEEDB304910982A
+:10129000FFF71AF901D800250CE02E491098FFF746
+:1012A00013F901D8012505E000211098FFF70CF98A
+:1012B00000D8022522E001A8405D103000F0FF0BAD
+:1012C0007E2F02DD0027701CC6B200240CE00BEB61
+:1012D0004B001C4901EB4000005D07EBC6112144A7
+:1012E000194A5054601CC4B2062CF0DBB81DC7B2BA
+:1012F00009F1010000F0FF09681C45B2072DDADB97
+:10130000002015E00699203901F0FF0B00240CE0C5
+:101310000BEB4B010B4A02EB4101095D07EBC612D7
+:101320002244094B9954611CCCB2062CF0DB401CC2
+:101330000728E7DB07B0BDE8F08F0000000000FEE3
+:10134000000000007A1A00088014002000007A448F
+:101350000000C842000020412DE9F04F87B005464B
+:101360000E46174698460020049005900690814648
+:101370000024824600213846FFF79CF807D22D2230
+:101380002046611CCCB204A90A5487F00047F549F5
+:101390003846FFF799F802D207B0BDE8F08FC4F1E4
+:1013A000080000F0FF09F0493846FFF78DF85DD2DC
+:1013B000ED493846FEF754FFEC490390FEF7C6FEB0
+:1013C0008346FFF737F8C2B22046611CCCB204A9AD
+:1013D0000A543846FFF72EF8C0B242F2107190FB63
+:1013E000F1F201FB12004FF47A7190FBF1F0303012
+:1013F000C2B22046611CCCB204A90A543846FFF799
+:1014000019F8C0B24FF47A7190FBF1F201FB1200AF
+:10141000642190FBF1F03030C2B22046611CCCB2A6
+:1014200004A90A543846FFF705F8C0B2642190FBBE
+:10143000F1F201FB12000A2190FBF1F03030C2B250
+:101440002046611CCCB204A90A543846FEF7F2FFCC
+:10145000C0B20A2190FBF1F201FB12003030C2B29F
+:101460002046611CCCB204A90A54CCE0C0493846DD
+:10147000FFF72AF84CD23846FEF7DCFFC0B242F242
+:10148000107190FBF1F201FB12004FF47A7190FBA6
+:10149000F1F03030C2B22046611CCCB204A90A542B
+:1014A0003846FEF7C7FFC0B24FF47A7190FBF1F2F5
+:1014B00001FB1200642190FBF1F03030C2B22046F3
+:1014C000611CCCB204A90A543846FEF7B3FFC0B27F
+:1014D000642190FBF1F201FB12000A2190FBF1F074
+:1014E0003030C2B22046611CCCB204A90A5438463E
+:1014F000FEF7A0FFC0B20A2190FBF1F201FB12003F
+:101500003030C2B22046611CCCB204A90A547AE041
+:1015100098493846FEF7D8FF37D23846FEF78AFF9B
+:10152000C0B24FF47A7190FBF1F201FB120064211A
+:1015300090FBF1F03030C2B22046611CCCB204A95D
+:101540000A543846FEF776FFC0B2642190FBF1F2F0
+:1015500001FB12000A2190FBF1F03030C2B22046AC
+:10156000611CCCB204A90A543846FEF763FFC0B22E
+:101570000A2190FBF1F201FB12003030C2B220468A
+:10158000611CCCB204A90A543DE07B493846FEF701
+:101590009BFF23D23846FEF74DFFC0B2642190FB7B
+:1015A000F1F201FB12000A2190FBF1F03030C2B2DF
+:1015B0002046611CCCB204A90A543846FEF73AFF13
+:1015C000C0B20A2190FBF1F201FB12003030C2B22E
+:1015D0002046611CCCB204A90A5414E0002138460C
+:1015E000FEF772FF0FD83846FEF724FFC0B20A217B
+:1015F00090FBF1F201FB12003030C2B22046611CB8
+:10160000CCB204A90A54B8F1000F71DD072C6FDACF
+:101610002E222046611CCCB204A90A543846FEF79B
+:1016200009FF00F0FF0B5846FEF7FFFE3946039016
+:10163000FEF7E1FD0746B8F1010F20D1082C1EDAB4
+:101640004D493846FEF7DAFD07463846FEF71FFFDC
+:1016500000224A4BCDE90001FEF740FECDE9020130
+:10166000FEF7FCFEC0B20A2190FBF1F201FB120072
+:101670003030C2B22046611CCCB204A90A54B8F181
+:10168000020F35DB082C33DA3A493846FEF7B6FD4F
+:1016900007463846FEF7CEFEC0B2642190FBF1F259
+:1016A00001FB12000A2190FBF1F03030C2B220465B
+:1016B000611CCCB204A90A54082C19DA3846FEF78A
+:1016C000E6FE00222D4BCDE90001FEF707FECDE935
+:1016D0000201FEF7C3FEC0B20A2190FBF1F201FB4A
+:1016E00012003030C2B22046611CCCB204A90A54A8
+:1016F00031E004A810F80A00203800F0FF09782D26
+:1017000002DD0025701CC6B200240AE004EB0910BB
+:101710001B49085C05EBC61121441A4A5054601C51
+:10172000C4B2082CF2DB00240CE004EB09100830F2
+:101730001349095C701C05EBC0102044114A115478
+:10174000601CC4B2082CF0DB05F10800C5B20AF138
+:10175000010000F0FF0A04A810F80A000028C8D110
+:1017600000BF19E60000FA4600401C460000404257
+:1017700000007A440000C842000020410000E03F21
+:10178000A21C000880140020F0B503461446002275
+:101790000020002530E0665D203EF2B2782B02DDAD
+:1017A00000234E1CF1B200200CE000EB0216144F97
+:1017B000BE5D03EBC1170744DFF848C00CF80760B3
+:1017C000461CF0B20828F0DB00200EE000EB021609
+:1017D00008360B4FBF5D4E1C03EBC6160644DFF800
+:1017E00024C00CF80670461CF0B20828EEDB03F1AA
+:1017F0000806F3B26E1CF5B2665D002ECBD1F0BDCB
+:10180000A21C00088014002010B504464FF480622A
+:1018100021460348FFF7B8FA00F080F810BD000039
+:101820008014002010B5AE20FFF7BEFB2020FFF78C
+:10183000BBFB1020FFF7B8FBC820FFF7B5FB00206B
+:10184000FFF7B2FB1020FFF7AFFB4020FFF7ACFB28
+:101850008120FFF7A9FBFF20FFF7A6FBA120FFF7E0
+:10186000A3FBA620FFF7A0FBA820FFF79DFB3F20CE
+:10187000FFF79AFBA420FFF797FBD320FFF794FB19
+:101880000020FFF791FBD520FFF78EFBF020FFF73C
+:101890008BFBD920FFF788FB2220FFF785FBDA209E
+:1018A000FFF782FB1220FFF77FFBDB20FFF77CFBBB
+:1018B0002020FFF779FB8D20FFF776FB1420FFF740
+:1018C00073FBAF20FFF770FB0020FFF79DFF00F0D8
+:1018D00001F810BD08B50BA200210846FFF754FF20
+:1018E00002230A4A00212820FFF736FD0848562324
+:1018F00008A2032100900020FFF766FC00F00EF81C
+:1019000008BD00005445535400000000F62874C17F
+:101910000000C0412040414443313A0070B50024EA
+:1019200018E004F1B001C8B2FFF73EFB0120FFF759
+:101930003BFB1020FFF738FB002507E005EBC41147
+:10194000064A505CFFF74DFB681CC5B2802DF5DBE5
+:10195000601CC4B2082CE4DB70BD000080140020C1
+:101960005F6C697374006C69737420616C6C2063C4
+:101970006F6D6D616E6400000002000000000000E9
+:101980000800000008000000001000000000000037
+:10199000081C3044586C800000000004040400005F
+:1019A000080000000800000800000008000204060B
+:1019B000080A0C0001020304050600F808888808DC
+:1019C000080000E010080810E00000192120201194
+:1019D0000E00000F102020100F001060028C0080FD
+:1019E00000F0020418000080000004047E010807D3
+:1019F000003F4040404078000700202424A4FE23FC
+:101A0000222000F8080808F8000010080601FF016D
+:101A10000600003F1010103F0000109453321E3299
+:101A20005210007E4242427E0000000000FF494901
+:101A30004949494949FF0000000008CC4A49484A41
+:101A4000CC18007F88888482E00000FF1212529236
+:101A50007F00007E88888482E00000000000000093
+:101A6000000000000000000000000000363600000A
+:101A70000000000000000000000000000000000066
+:101A80000000002F000000000700070000147F1472
+:101A90007F1400242A7F2A12006264081323003670
+:101AA0004955225000000503000000001C2241009F
+:101AB000000041221C000014083E08140008083EE3
+:101AC0000808000000A060000008080808080000DE
+:101AD00060600000002010080402003E5149453EAD
+:101AE0000000427F400000426151494600214145CB
+:101AF0004B31001814127F10002745454539003C32
+:101B00004A494930000171090503003649494936FF
+:101B100000064949291E00003636000000005636EE
+:101B200000000008142241000014141414140000D2
+:101B30004122140800020151090600324959513E60
+:101B4000007C1211127C007F49494936003E414118
+:101B50004122007F4141221C007F49494941007FC9
+:101B600009090901003E4149497A007F0808087FB8
+:101B70000000417F4100002040413F01007F0814E8
+:101B80002241007F40404040007F020C027F007FE6
+:101B90000408107F003E4141413E007F09090906CB
+:101BA000003E4151215E007F0919294600464949FE
+:101BB00049310001017F0101003F4040403F001FCB
+:101BC0002040201F003F4038403F0063140814634A
+:101BD00000070870080700615149454300007F4134
+:101BE000410000552A552A55000041417F0000045C
+:101BF0000201020400404040404000000102040095
+:101C0000002054545478007F4844443800384444F9
+:101C1000442000384444487F003854545418000885
+:101C20007E0901020018A4A4A47C007F08040478A3
+:101C30000000447D4000004080847D00007F10282B
+:101C400044000000417F4000007C04180478007CC0
+:101C50000804047800384444443800FC2424241840
+:101C60000018242418FC007C08040408004854547C
+:101C7000542000043F444020003C4040207C001C95
+:101C80002040201C003C4030403C004428102844A8
+:101C9000001CA0A0A07C004464544C4414141414F0
+:101CA000141400000000000000000000000000000C
+:101CB0000000000000F800000000000000333000C9
+:101CC000000000100C06100C0600000000000000D0
+:101CD000000040C07840C0784000043F04043F0446
+:101CE0000400007088FC08300000001820FF211E4E
+:101CF0000000F008F000E018000000211C031E2185
+:101D00001E0000F00888700000001E2123241927FF
+:101D1000211010160E00000000000000000000005E
+:101D20000000000000E01804020000000007182076
+:101D3000400000020418E0000000004020180700E6
+:101D40000000404080F0804040000202010F01028C
+:101D50000200000000F0000000000101011F01016D
+:101D60000100000000000000000080B070000000D2
+:101D7000000000000000000000000001010101015E
+:101D800001010000000000000000003030000000F1
+:101D900000000000000080601804006018060100C8
+:101DA000000000E010080810E000000F10202010D4
+:101DB0000F00001010F8000000000020203F20203D
+:101DC00000000070080808887000003028242221D4
+:101DD000300000300888884830000018202020118A
+:101DE0000E000000C02010F8000000070424243F6B
+:101DF000240000F808888808080000192120201114
+:101E00000E0000E0108888180000000F112020113B
+:101E10000E0000380808C83808000000003F000025
+:101E200000000070880808887000001C2221212210
+:101E30001C0000E010080810E00000003122221110
+:101E40000F00000000C0C0000000000000303000A3
+:101E50000000000000800000000000008060000022
+:101E6000000000008040201008000001020408105B
+:101E7000200040404040404040000404040404046A
+:101E80000400000810204080000000201008040218
+:101E90000100007048080808F0000000003036011A
+:101EA0000000C030C828E810E000071827242314D9
+:101EB0000B000000C038E0000000203C2302022795
+:101EC000382008F8888888700000203F20202011E2
+:101ED0000E00C0300808080838000718202020101D
+:101EE000080008F808080810E000203F2020201013
+:101EF0000F0008F88888E8081000203F20202320E1
+:101F0000180008F88888E8081000203F2000030027
+:101F10000000C03008080838000007182020221EE2
+:101F2000020008F808000008F808203F21010121FC
+:101F30003F20000808F8080800000020203F20206B
+:101F4000000000000808F8080800C08080807F00BA
+:101F5000000008F888C028180800203F2001263813
+:101F6000200008F8080000000000203F202020206A
+:101F7000300008F8F800F8F80800203F003F003F64
+:101F8000200008F830C00008F808203F200007189B
+:101F90003F00E01008080810E0000F10202020107B
+:101FA0000F0008F808080808F000203F210101018F
+:101FB0000000E01008080810E0000F182424385032
+:101FC0004F0008F8888888887000203F2000030CA4
+:101FD00030200070880808083800003820212122AD
+:101FE0001C00180808F8080818000000203F20000E
+:101FF000000008F808000008F808001F2020202032
+:102000001F000878880000C83808000007380E0153
+:102010000000F80800F80008F800033C0700073C3F
+:102020000300081868808068180820302C03032CEF
+:1020300030200838C800C83808000000203F2000C1
+:10204000000010080808C838080020382621202081
+:102050001800000000FE020202000000007F404065
+:102060004000000C30C000000000000000010638F5
+:10207000C00000020202FE000000004040407F005D
+:102080000000000004020202040000000000000042
+:102090000000000000000000000080808080808040
+:1020A0008080000202040000000000000000000028
+:1020B000000000008080808000000019242222227D
+:1020C0003F2008F8008080000000003F1120201110
+:1020D0000E000000008080800000000E11202020F3
+:1020E0001100000000808088F800000E11202010F0
+:1020F0003F200000808080800000001F22222222DA
+:102100001300008080F0888888180020203F20205D
+:1021100000000000808080808000006B9494949385
+:10212000600008F8008080800000203F210000202F
+:102130003F2000809898000000000020203F2020D1
+:102140000000000000809898000000C08080807F20
+:10215000000008F8000080808000203F24022D301D
+:102160002000000808F8000000000020203F202088
+:1021700000008080808080808000203F20003F2001
+:10218000003F8080008080800000203F21000020F0
+:102190003F200000808080800000001F2020202041
+:1021A0001F00808000808000000080FFA12020119F
+:1021B0000E000000008080808000000E112020A012
+:1021C000FF80808080008080800020203F212000D0
+:1021D00001000000808080808000003324242424BB
+:1021E0001900008080E0808000000000001F202097
+:1021F00000008080000000808000001F2020201050
+:102200003F20808080000080808000010E30080622
+:10221000010080800080008080800F300C030C3033
+:102220000F0000808000808080000020312E0E3161
+:102230002000808080000080808080818E70180661
+:10224000010000808080808080000021302C2221CD
+:10225000300000000000807C020200000000003F0F
+:10226000404000000000FF00000000000000FF00F0
+:1022700000000002027C800000000040403F00009F
+:10228000000000060101020204040000000000003A
+:1022900000000003050911FF118905C300E000F0EB
+:1022A00000F8000000000000004428FF11AA4400CC
+:1022B000000000000000000000000000000000001E
+:1022C000000000000000000000000000000000000E
+:1022D00000000000000000000000000000000000FE
+:1022E00000000000000000000000000083013844EE
+:1022F000829292740183000000000000007C44C7B9
+:10230000017D7D7D7D017D7D7D7D017D7D7D7D01ED
+:10231000FF000000000000010001000100010001B9
+:1023200000010000000000000000000101000000AA
+:10233000000000000000000000000000000000009D
+:10234000000000000000000000000000000000008D
+:10235000000000000000000000000000000000007D
+:10236000000000000000000000000000010100006B
+:10237000000000000101000000000000000000015A
+:10238000010101010101010101010101010101013D
+:1023900001000000000000000000004040404040FC
+:1023A00000006D6D6D6D6D0000606060606000002C
+:1023B00040404040400000000000000000000000DD
+:1023C000000000000000000000000000000000000D
+:1023D00000000000000000000000000000000000FD
+:1023E00000000000000000000000000000000000ED
+:1023F00000000000000000000000000000000000DD
+:1024000000000000000000000000000000000000CC
+:102410000000000000000000000000DBDBDBDBDB75
+:102420000000DBDBDBDBDB0000DBDBDBDBDB00001E
+:10243000DBDBDBDBDB0000DADADADADA0000D8D863
+:10244000D8D8D80000C0C0C0C0C00000C0C0C0C044
+:10245000C00000C0C0C0C0C00000C0C0C0C0C0003C
+:1024600000808080808000000000000000000000EC
+:10247000000000000000000000000000000000005C
+:10248000000000000000000000000000000000004C
+:10249000000000000000000000000006060606061E
+:1024A00000000606060606000006060606060000F0
+:1024B00006060606060000060606E6662000060674
+:1024C00086060600000606060686000006060606C4
+:1024D000060000868686868680808686068686C07A
+:1024E000C08686860606D0307606060606000006FA
+:1024F0000606060600000606060606000006060694
+:1025000006060000060606060600000000000000A1
+:1025100000000000000000000000000000000000BB
+:1025200000000000000000000000000000000000AB
+:10253000000000000000000000000000601C00FE21
+:1025400000010200C41820029E63B20E00FF8181C8
+:10255000FF00008040300F00000000FF0023EAAAC7
+:10256000BFAAEA033F00FF000000000000000000D7
+:10257000000000000000000000000000000000005B
+:10258000000000000000000000000000000000004B
+:10259000000000000080808000000000008080803B
+:1025A000000000000000000000000000000000002B
+:1025B000000000000000000000000E0C08000001F8
+:1025C0000101010100000001000000010081808084
+:1025D0008180818080808001010101000000010074
+:1025E000000001000101090C0E00000000000000C5
+:1025F00000000000000000000000C0C0C0C0C0C05B
+:10260000C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0CA
+:10261000C000001E21404050215E001E214040505D
+:10262000215E00000000000000000000000000002B
+:10263000000000000000000000000000000000009A
+:1026400000000000000000000000000000FFFFC1CB
+:10265000C1FFFFC1C1FFFF0000000000000000003B
+:10266000000000000000000000000000000000006A
+:1026700000000000000000000000FFFF80FCF3EFFE
+:10268000F3FC80FF80EEEEEEF5FBFF9CBEB6B68855
+:10269000FF000000B42600080000002074000000C5
+:1026A000280D000828270008740000200C1C0000DA
+:1026B000380D00080024F4000000000000000000B5
+:1026C000000000000000000000000000000000000A
+:1026D00000000000000000000000000000000000FA
+:1026E00000000000000000000000000000000000EA
+:1026F0000000000000000000311100087511000802
+:1027000080000020400000208010002042000020B7
+:1027100000000000000000006019000866190008B1
+:08272000C6E533B4650D0008A5
:04000005080000ED02
:00000001FF
diff --git a/User/board/ssd1306_oled.c b/User/board/ssd1306_oled.c
index 061d4ec..78f04b2 100644
--- a/User/board/ssd1306_oled.c
+++ b/User/board/ssd1306_oled.c
@@ -8,123 +8,511 @@
#include "ssd1306_oled.h"
#include "ssd1306_oled.h"
+const uint8_t F16x16[] =
+ {
+ 0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00,
+ 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, // 50
-static i2c_t *ssd1306_oled;
-static uint8_t buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区
+ 0x10, 0x60, 0x02, 0x8C, 0x00, 0x80, 0x00, 0xF0, 0x02, 0x04, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x04, 0x04, 0x7E, 0x01, 0x08, 0x07, 0x00, 0x3F, 0x40, 0x40, 0x40, 0x40, 0x78, 0x00, 0x07, 0x00, // 沁
-static void ssd1306_write_command(uint8_t command)
+ 0x20, 0x24, 0x24, 0xA4, 0xFE, 0x23, 0x22, 0x20, 0x00, 0xF8, 0x08, 0x08, 0x08, 0xF8, 0x00, 0x00,
+ 0x10, 0x08, 0x06, 0x01, 0xFF, 0x01, 0x06, 0x00, 0x00, 0x3F, 0x10, 0x10, 0x10, 0x3F, 0x00, 0x00, // 和
+
+ 0x10, 0x94, 0x53, 0x32, 0x1E, 0x32, 0x52, 0x10, 0x00, 0x7E, 0x42, 0x42, 0x42, 0x7E, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFF, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0x49, 0xFF, 0x00, 0x00, 0x00, 0x00, // 智
+
+ 0x08, 0xCC, 0x4A, 0x49, 0x48, 0x4A, 0xCC, 0x18, 0x00, 0x7F, 0x88, 0x88, 0x84, 0x82, 0xE0, 0x00,
+ 0x00, 0xFF, 0x12, 0x12, 0x52, 0x92, 0x7F, 0x00, 0x00, 0x7E, 0x88, 0x88, 0x84, 0x82, 0xE0, 0x00, // 能
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //:
+};
+
+/************************************6*8的点阵************************************/
+const uint8_t F6x8[][6] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp
+ 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // !
+ 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // "
+ 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // #
+ 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $
+ 0x00, 0x62, 0x64, 0x08, 0x13, 0x23, // %
+ 0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // &
+ 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // '
+ 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // (
+ 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // )
+ 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // *
+ 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // +
+ 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // ,
+ 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // -
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // .
+ 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // /
+ 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
+ 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 1
+ 0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 2
+ 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 3
+ 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 4
+ 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 5
+ 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6
+ 0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 7
+ 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 8
+ 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 9
+ 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // :
+ 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ;
+ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // <
+ 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // =
+ 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // >
+ 0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ?
+ 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @
+ 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A
+ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B
+ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C
+ 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D
+ 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E
+ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F
+ 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G
+ 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H
+ 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I
+ 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J
+ 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K
+ 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L
+ 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
+ 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N
+ 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O
+ 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P
+ 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
+ 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R
+ 0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S
+ 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T
+ 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U
+ 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V
+ 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W
+ 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X
+ 0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y
+ 0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z
+ 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [
+ 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55
+ 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ]
+ 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^
+ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _
+ 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // '
+ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // a
+ 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, // b
+ 0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // c
+ 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // d
+ 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // e
+ 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // f
+ 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g
+ 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // h
+ 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // i
+ 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // j
+ 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k
+ 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // l
+ 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // m
+ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // n
+ 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // o
+ 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // p
+ 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // q
+ 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // r
+ 0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // s
+ 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // t
+ 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // u
+ 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // v
+ 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // w
+ 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // x
+ 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y
+ 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // z
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // horiz lines
+};
+/****************************************8*16的点阵************************************/
+const uint8_t F8X16[] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0
+ 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00, //! 1
+ 0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //" 2
+ 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00, // # 3
+ 0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00, //$ 4
+ 0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00, //% 5
+ 0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10, //& 6
+ 0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //' 7
+ 0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, //( 8
+ 0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, //) 9
+ 0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, //* 10
+ 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, //+ 11
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, //, 12
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //- 13
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //. 14
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, /// 15
+ 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, // 0 16
+ 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // 1 17
+ 0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, // 2 18
+ 0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // 3 19
+ 0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, // 4 20
+ 0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, // 5 21
+ 0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // 6 22
+ 0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, // 7 23
+ 0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, // 8 24
+ 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, // 9 25
+ 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, //: 26
+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, //; 27
+ 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, //< 28
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, //= 29
+ 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, //> 30
+ 0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, //? 31
+ 0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, //@ 32
+ 0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, // A 33
+ 0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // B 34
+ 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, // C 35
+ 0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // D 36
+ 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, // E 37
+ 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, // F 38
+ 0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, // G 39
+ 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, // H 40
+ 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // I 41
+ 0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, // J 42
+ 0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, // K 43
+ 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, // L 44
+ 0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, // M 45
+ 0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, // N 46
+ 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // O 47
+ 0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, // P 48
+ 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, // Q 49
+ 0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, // R 50
+ 0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, // S 51
+ 0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // T 52
+ 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // U 53
+ 0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, // V 54
+ 0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, // W 55
+ 0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, // X 56
+ 0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // Y 57
+ 0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, // Z 58
+ 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, //[ 59
+ 0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, //\ 60
+ 0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, //] 61
+ 0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //^ 62
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //_ 63
+ 0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //` 64
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, // a 65
+ 0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // b 66
+ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, // c 67
+ 0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, // d 68
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, // e 69
+ 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // f 70
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, // g 71
+ 0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // h 72
+ 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // i 73
+ 0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, // j 74
+ 0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, // k 75
+ 0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // l 76
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, // m 77
+ 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // n 78
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // o 79
+ 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, // p 80
+ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, // q 81
+ 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, // r 82
+ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, // s 83
+ 0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, // t 84
+ 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, // u 85
+ 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, // v 86
+ 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, // w 87
+ 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, // x 88
+ 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, // y 89
+ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, // z 90
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, //{ 91
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //| 92
+ 0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, //} 93
+ 0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94
+};
+
+const uint8_t BMP1[] =
+ {
+ 0x00, 0x03, 0x05, 0x09, 0x11, 0xFF, 0x11, 0x89, 0x05, 0xC3, 0x00, 0xE0, 0x00, 0xF0, 0x00, 0xF8,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x28, 0xFF, 0x11, 0xAA, 0x44, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x01, 0x38, 0x44, 0x82, 0x92,
+ 0x92, 0x74, 0x01, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x44, 0xC7, 0x01, 0x7D,
+ 0x7D, 0x7D, 0x7D, 0x01, 0x7D, 0x7D, 0x7D, 0x7D, 0x01, 0x7D, 0x7D, 0x7D, 0x7D, 0x01, 0xFF, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00,
+ 0x6D, 0x6D, 0x6D, 0x6D, 0x6D, 0x00, 0x00, 0x60, 0x60, 0x60, 0x60, 0x60, 0x00, 0x00, 0x40, 0x40,
+ 0x40, 0x40, 0x40, 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, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00,
+ 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDB, 0xDB, 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDB, 0xDB,
+ 0xDB, 0xDB, 0xDB, 0x00, 0x00, 0xDA, 0xDA, 0xDA, 0xDA, 0xDA, 0x00, 0x00, 0xD8, 0xD8, 0xD8, 0xD8,
+ 0xD8, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
+ 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 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,
+ 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, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00,
+ 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06,
+ 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0xE6, 0x66, 0x20, 0x00, 0x06, 0x06, 0x86, 0x06,
+ 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x86, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00,
+ 0x00, 0x86, 0x86, 0x86, 0x86, 0x86, 0x80, 0x80, 0x86, 0x86, 0x06, 0x86, 0x86, 0xC0, 0xC0, 0x86,
+ 0x86, 0x86, 0x06, 0x06, 0xD0, 0x30, 0x76, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06,
+ 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06,
+ 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1C, 0x00, 0xFE, 0x00, 0x01,
+ 0x02, 0x00, 0xC4, 0x18, 0x20, 0x02, 0x9E, 0x63, 0xB2, 0x0E, 0x00, 0xFF, 0x81, 0x81, 0xFF, 0x00,
+ 0x00, 0x80, 0x40, 0x30, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x23, 0xEA, 0xAA, 0xBF, 0xAA,
+ 0xEA, 0x03, 0x3F, 0x00, 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, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 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, 0x0E, 0x0C, 0x08, 0x00, 0x00, 0x01, 0x01, 0x01,
+ 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x81, 0x80, 0x80, 0x81, 0x80,
+ 0x81, 0x80, 0x80, 0x80, 0x80, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0x01, 0x09, 0x0C, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
+ 0x00, 0x1E, 0x21, 0x40, 0x40, 0x50, 0x21, 0x5E, 0x00, 0x1E, 0x21, 0x40, 0x40, 0x50, 0x21, 0x5E,
+ 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, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xC1, 0xC1, 0xFF,
+ 0xFF, 0xC1, 0xC1, 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, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x80, 0xFC, 0xF3, 0xEF, 0xF3, 0xFC,
+ 0x80, 0xFF, 0x80, 0xEE, 0xEE, 0xEE, 0xF5, 0xFB, 0xFF, 0x9C, 0xBE, 0xB6, 0xB6, 0x88, 0xFF, 0x00, /*"D:\DreamSpark\OLED\MP3_UI.bmp",0*/
+};
+
+static uint8_t _buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区
+
+static void i2c_start(void)
{
- uint8_t data[2];
- data[0] = SSD1306_CMD_SET_LOW_COLUMN; // Co = 0, D/C# = 0
- data[1] = command;
- ssd1306_oled->interface.start(ssd1306_oled);
- ssd1306_oled->interface.write_byte(ssd1306_oled, SSD1306_I2C_ADDRESS);
- ssd1306_oled->interface.wait_ack(ssd1306_oled);
- ssd1306_oled->interface.write_byte(ssd1306_oled, data[0]);
- ssd1306_oled->interface.wait_ack(ssd1306_oled);
- ssd1306_oled->interface.write_byte(ssd1306_oled, data[1]);
- ssd1306_oled->interface.wait_ack(ssd1306_oled);
- ssd1306_oled->interface.stop(ssd1306_oled);
+ SDA_OUT();
+ GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(4);
+ GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ delay_us(4);
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
}
-static void ssd1306_write_data(uint8_t data)
+static void i2c_stop(void)
{
- uint8_t buffer[2];
- buffer[0] = SSD1306_CMD_SET_START_LINE; // Co = 0, D/C# = 1
- buffer[1] = data;
- ssd1306_oled->interface.start(ssd1306_oled);
- ssd1306_oled->interface.write_byte(ssd1306_oled, SSD1306_I2C_ADDRESS);
- ssd1306_oled->interface.wait_ack(ssd1306_oled);
- ssd1306_oled->interface.write_byte(ssd1306_oled, buffer[0]);
- ssd1306_oled->interface.wait_ack(ssd1306_oled);
- ssd1306_oled->interface.write_byte(ssd1306_oled, buffer[1]);
- ssd1306_oled->interface.wait_ack(ssd1306_oled);
- ssd1306_oled->interface.stop(ssd1306_oled);
+ SDA_OUT();
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ delay_us(4);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ delay_us(4);
+}
+
+static BOOL i2c_wait_ack(void)
+{
+ uint8_t count = 0;
+ SDA_IN();
+ GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ delay_us(4);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(4);
+ while (GPIO_READ(SSD1306_SDA_PORT, SSD1306_SDA_PIN))
+ {
+ count++;
+ if (count > 250)
+ {
+ i2c_stop();
+ return FALSE;
+ }
+ }
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ return TRUE;
+}
+
+static void i2c_ack(void)
+{
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ SDA_OUT();
+ GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ delay_us(2);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(2);
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+}
+
+static void i2c_nack(void)
+{
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ SDA_OUT();
+ GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ delay_us(2);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(2);
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+}
+
+uint8_t i2c_read_byte(BOOL ack)
+{
+ uint8_t i = 0, receive = 0;
+ SDA_IN();
+ for (i = 0; i < 8; i++)
+ {
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(2);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ receive <<= 1;
+ if (GPIO_READ(SSD1306_SDA_PORT, SSD1306_SDA_PIN))
+ {
+ receive++;
+ }
+ delay_us(1);
+ }
+
+ if (!ack)
+ {
+ i2c_nack();
+ }
+ else
+ {
+ i2c_ack();
+ }
+
+ return receive;
+}
+
+void i2c_write_byte(uint8_t data)
+{
+ uint8_t i = 0;
+ SDA_OUT();
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ for (i = 0; i < 8; i++)
+ {
+ // IIC_SDA=(txd&0x80)>>7;
+ if ((data & 0x80) >> 7)
+ GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ else
+ GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+
+ data <<= 1;
+ delay_us(2);
+ GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(2);
+ GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
+ delay_us(2);
+ }
+}
+
+static void i2c_write_command(uint8_t command)
+{
+ uint8_t dd[2];
+ dd[0] = SSD1306_CMD_SET_LOW_COLUMN; // Co = 0, D/C# = 0
+ dd[1] = command;
+ i2c_start();
+ i2c_write_byte(SSD1306_I2C_ADDRESS);
+ i2c_wait_ack();
+
+ i2c_write_byte(dd[0]);
+ i2c_wait_ack();
+
+ i2c_write_byte(dd[1]);
+ i2c_wait_ack();
+ i2c_stop();
+}
+
+static void i2c_write_data(uint8_t data)
+{
+ uint8_t dd[2];
+ dd[0] = SSD1306_CMD_SET_START_LINE; // Co = 0, D/C# = 1
+ dd[1] = data;
+ i2c_start();
+ i2c_write_byte(SSD1306_I2C_ADDRESS);
+ i2c_wait_ack();
+
+ i2c_write_byte(dd[0]);
+ i2c_wait_ack();
+
+ i2c_write_byte(dd[1]);
+ i2c_wait_ack();
+}
+
+/**
+ * @brief 设置SSD1306 OLED显示屏上的显示位置
+ *
+ * 该函数用于设置SSD1306 OLED显示屏上的显示位置,通过x和y坐标确定显示位置。
+ *
+ * @param x 要设置的横坐标(0-127)
+ * @param y 要设置的纵坐标(0-7,对应SSD1306 OLED的8个页面)
+ */
+void set_position(uint8_t x, uint8_t y)
+{
+ i2c_write_command(0xb0 + y);
+ i2c_write_command(((x & 0xf0) >> 4) | 0x10);
+ i2c_write_command((x & 0x0f) | 0x01);
}
static void ssd1306_test(void)
{
+ ssd1306_f8x16_string(0, 0, "TEST");
+ ssd1306_f8x16_number(40, 0, -15.26, 2);
+ ssd1306_f6x8_string_number(0, 3, " @ADC1:", 'V', 24);
+ ssd1306_update_screen();
}
void ssd1306_init(void)
{
- i2c_gpio_group_t gpios;
- gpios.scl = gpio_create(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- gpios.sda = gpio_create(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
+ i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // display off
+ i2c_write_command(SSD1306_CMD_MEMORY_MODE); // Set Memory Addressing Mode
+ i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
+ i2c_write_command(SSD1306_CMD_COM_SCAN_DEC); // Set COM Output Scan Direction
+ i2c_write_command(SSD1306_CMD_SET_LOW_COLUMN); //---set low column address
+ i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); //---set high column address
+ i2c_write_command(SSD1306_CMD_SET_START_LINE); //--set start line address
+ i2c_write_command(SSD1306_CMD_SET_CONTRAST); //--set contrast control register
+ i2c_write_command(0xff); // 亮度调节 0x00~0xff
+ i2c_write_command(0xa1); //--set segment re-map 0 to 127
+ i2c_write_command(SSD1306_CMD_NORMAL_DISPLAY); //--set normal display
+ i2c_write_command(SSD1306_CMD_SET_MULTIPLEX); //--set multiplex ratio(1 to 64)
+ i2c_write_command(0x3f); //
+ i2c_write_command(SSD1306_CMD_DISPLAY_ALL_ON_RESUME); // 0xa4,Output follows RAM content;0xa5,Output ignores RAM content
+ i2c_write_command(SSD1306_CMD_SET_DISPLAY_OFFSET); //-set display offset
+ i2c_write_command(SSD1306_CMD_SET_LOW_COLUMN); //-not offset
+ i2c_write_command(SSD1306_CMD_SET_DISPLAY_CLOCK_DIV); //--set display clock divide ratio/oscillator frequency
+ i2c_write_command(0xf0); //--set divide ratio
+ i2c_write_command(SSD1306_CMD_SET_PRECHARGE); //--set pre-charge period
+ i2c_write_command(SSD1306_CMD_PAGE_ADDR); //
+ i2c_write_command(SSD1306_CMD_SET_COM_PINS); //--set com pins hardware configuration
+ i2c_write_command(0x12);
+ i2c_write_command(SSD1306_CMD_SET_VCOM_DETECT); //--set vcomh
+ i2c_write_command(SSD1306_CMD_MEMORY_MODE); // 0x20,0.77xVcc
+ i2c_write_command(SSD1306_CMD_CHARGE_PUMP); //--set DC-DC enable
+ i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); //
+ i2c_write_command(SSD1306_CMD_DISPLAY_ON); //--turn on oled panel
+ ssd1306_fill(0);
- ssd1306_oled = i2c_create(gpios, 0);
-
- ssd1306_write_command(SSD1306_CMD_DISPLAY_OFF);
- ssd1306_write_command(SSD1306_CMD_SET_DISPLAY_CLOCK_DIV);
- ssd1306_write_command(0x80);
- ssd1306_write_command(SSD1306_CMD_SET_MULTIPLEX);
- ssd1306_write_command(SSD1306_HEIGHT - 1);
- ssd1306_write_command(SSD1306_CMD_SET_DISPLAY_OFFSET);
- ssd1306_write_command(0x00);
- ssd1306_write_command(SSD1306_CMD_SET_START_LINE | 0x00);
- ssd1306_write_command(SSD1306_CMD_CHARGE_PUMP);
- ssd1306_write_command(0x14);
- ssd1306_write_command(SSD1306_CMD_MEMORY_MODE);
- ssd1306_write_command(0x00);
- ssd1306_write_command(SSD1306_CMD_SEG_REMAP | 0x01);
- ssd1306_write_command(SSD1306_CMD_COM_SCAN_DEC);
- ssd1306_write_command(SSD1306_CMD_SET_COM_PINS);
- ssd1306_write_command(0x12);
- ssd1306_write_command(SSD1306_CMD_SET_CONTRAST);
- ssd1306_write_command(0xCF);
- ssd1306_write_command(SSD1306_CMD_SET_PRECHARGE);
- ssd1306_write_command(0xF1);
- ssd1306_write_command(SSD1306_CMD_SET_VCOM_DETECT);
- ssd1306_write_command(0x40);
- ssd1306_write_command(SSD1306_CMD_DISPLAY_ALL_ON_RESUME);
- ssd1306_write_command(SSD1306_CMD_NORMAL_DISPLAY);
- ssd1306_write_command(SSD1306_CMD_DISPLAY_ON);
-
- ssd1306_test();
+ // ssd1306_test();
}
void ssd1306_display_on(void)
{
- ssd1306_write_command(SSD1306_CMD_DISPLAY_ON);
+ i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵
+ i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); // 开启电荷泵
+ i2c_write_command(SSD1306_CMD_DISPLAY_ON); // OLED唤醒
}
void ssd1306_display_off(void)
{
- ssd1306_write_command(SSD1306_CMD_DISPLAY_OFF);
-}
-
-void ssd1306_clear(void)
-{
- for (uint16_t i = 0; i < SSD1306_WIDTH * SSD1306_HEIGHT / 8; i++)
- {
- ssd1306_write_data(0x00);
- }
-}
-
-/**
- * @brief 在SSD1306屏幕上绘制一个像素点
- *
- * 在SSD1306 OLED显示屏上绘制一个像素点,如果指定位置超出屏幕范围,则不执行任何操作。
- *
- * @param x 像素点的x坐标
- * @param y 像素点的y坐标
- * @param color 像素点的颜色,非零值表示绘制像素点,零值表示清除像素点
- */
-void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color)
-{
- if (x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT)
- {
- return;
- }
-
- if (color)
- {
- buffer[x + (y / 8) * SSD1306_WIDTH] |= (1 << (y % 8));
- }
- else
- {
- buffer[x + (y / 8) * SSD1306_WIDTH] &= ~(1 << (y % 8));
- }
+ i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵
+ i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 关闭电荷泵
+ i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // OLED休眠
}
/**
@@ -140,16 +528,264 @@ void ssd1306_update_screen(void)
{
for (uint8_t i = 0; i < SSD1306_HEIGHT / 8; i++)
{
- ssd1306_write_command(SSD1306_CMD_COLUMN_ADDR);
- ssd1306_write_command(0);
- ssd1306_write_command(SSD1306_WIDTH - 1);
- ssd1306_write_command(SSD1306_CMD_PAGE_ADDR);
- ssd1306_write_command(i);
- ssd1306_write_command(i);
-
+ i2c_write_command(0xb0 + i);
+ i2c_write_command(0x01);
+ i2c_write_command(0x10);
for (uint8_t j = 0; j < SSD1306_WIDTH; j++)
{
- ssd1306_write_data(buffer[j + i * SSD1306_WIDTH]);
+ i2c_write_data(_buffer[j + i * SSD1306_WIDTH]);
}
}
}
+
+/**
+ * @brief 填充整个屏幕为指定颜色
+ *
+ * 该函数将 SSD1306 OLED 显示屏的每一个像素点都设置为指定的颜色。
+ *
+ * @param color 颜色值,0x00 表示关闭像素点(黑色),0xFF 表示打开像素点(白色)
+ */
+void ssd1306_fill(uint8_t color)
+{
+ osel_memset(_buffer, color, ARRAY_LEN(_buffer));
+ ssd1306_update_screen();
+}
+
+/**
+ * @brief 清空SSD1306显示屏
+ *
+ * 该函数通过向SSD1306显示屏发送一系列命令来清空显示内容。
+ *
+ * 首先,通过循环遍历每个页面(SSD1306显示屏有8个页面),
+ * 对每个页面执行以下操作:
+ * 1. 发送页面地址命令(0xb0 + y),其中y为当前页面索引。
+ * 2. 发送列地址低位命令(0x01)。
+ * 3. 发送列地址高位命令(0x10),表示从第一列开始。
+ * 4. 循环遍历每一列(SSD1306显示屏的宽度),
+ * 发送数据0x00以清空该列的内容。
+ */
+void ssd1306_clear(void)
+{
+ osel_memset(_buffer, 0, ARRAY_LEN(_buffer));
+ ssd1306_update_screen();
+}
+
+/**
+ * @brief 在SSD1306 OLED显示屏上显示字符串
+ *
+ * 在SSD1306 OLED显示屏上以6x8像素的字体显示给定的字符串。
+ *
+ * @param x 显示字符串的起始x坐标
+ * @param y 显示字符串的起始y坐标
+ * @param str 要显示的字符串
+ */
+void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch)
+{
+ uint8_t c = 0, i = 0, j = 0;
+ while (ch[j] != '\0')
+ {
+ c = ch[j] - 32;
+ if (x > 126)
+ {
+ x = 0;
+ y++;
+ }
+ for (i = 0; i < 6; i++)
+ _buffer[(y * 128) + x + i] = F6x8[c][i];
+ x += 6;
+ j++;
+ }
+}
+
+/**
+ * @brief 在SSD1306 OLED屏幕上显示字符串和数字
+ *
+ * 该函数用于在SSD1306 OLED屏幕上显示字符串和数字。首先显示一个字符串,
+ * 然后显示一个浮点数。字符串和数字按照指定的位置和单位显示。
+ *
+ * @param x 起始位置的x坐标
+ * @param y 起始位置的y坐标
+ * @param ch 要显示的字符串
+ * @param unit 数字的单位,例如'm'表示米
+ * @param num 要显示的浮点数
+ */
+void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num)
+{
+ uint8_t c = 0, i = 0, j = 0;
+ int8_t a, number[7] = {0, 0, 0, -2, 0, 0, 0};
+ uint32_t d;
+ while (ch[j] != '\0')
+ {
+ c = ch[j] - 32;
+ if (x > 126)
+ {
+ x = 0;
+ y++;
+ }
+ for (i = 0; i < 6; i++)
+ _buffer[(y * 128) + x + i] = F6x8[c][i];
+ x += 6;
+ j++;
+ }
+ d = 1000 * num;
+ for (a = 0; a < 3; a++)
+ {
+ number[6 - a] = d % 10;
+ d = d / 10;
+ }
+ for (a = 4; a < 7; a++)
+ {
+ number[6 - a] = d % 10;
+ d = d / 10;
+ }
+ if (num >= 100)
+ {
+ a = 0;
+ }
+ else if (num >= 10)
+ {
+ a = 1;
+ }
+ else if (num >= 0)
+ {
+ a = 2;
+ }
+ for (; a < 7; a++)
+ {
+ c = number[a] + 16;
+ if (x > 126)
+ {
+ x = 0;
+ y++;
+ }
+ for (i = 0; i < 6; i++)
+ _buffer[(y * 128) + x + i] = F6x8[c][i];
+ x += 6;
+ j++;
+ }
+ for (int h = 0; h < 7; h++)
+ {
+ c = unit - 32;
+ for (i = 0; i < 6; i++)
+ _buffer[(y * 128) + x + i] = F6x8[c][i];
+ }
+}
+
+/**
+ * @brief 在SSD1306 OLED显示屏上显示8x16大小的字符串
+ *
+ * 该函数使用8x16字体在SSD1306 OLED显示屏上显示指定的字符串。字符串的字符位置由x和y参数指定。
+ *
+ * @param x 显示字符串的起始x坐标
+ * @param y 显示字符串的起始y坐标
+ * @param str 要显示的字符串
+ */
+void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch)
+{
+ uint8_t c = 0, i = 0, j = 0;
+ while (ch[j] != '\0')
+ {
+ c = ch[j] - 32;
+ if (x > 120)
+ {
+ x = 0;
+ y++;
+ }
+ for (i = 0; i < 8; i++)
+ _buffer[(y * 128) + x + i] = F8X16[c * 16 + i];
+ for (i = 0; i < 8; i++)
+ _buffer[((y + 1) * 128) + x + i] = F8X16[c * 16 + i + 8];
+ x += 8;
+ j++;
+ }
+}
+
+/**
+ * @brief 在SSD1306 OLED显示屏上以8x16像素字体显示浮点数
+ *
+ * 在指定的坐标位置 (x, y) 上,使用8x16像素大小的字体显示浮点数 num,并显示指定数量的小数点 dot_num。
+ *
+ * @param x 显示位置的x坐标
+ * @param y 显示位置的y坐标
+ * @param num 要显示的浮点数
+ * @param dot_num 要显示的小数点数量
+ */
+void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num)
+{
+ uint8_t ch[9] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
+ uint8_t c = 0, i = 0, j = 0;
+ if (num < 0)
+ {
+ ch[i++] = '-';
+ num = -num;
+ }
+ if (num > 32000)
+ return;
+
+ c = 8 - i;
+
+ if (num > 10000)
+ {
+ ch[i++] = num / 10000 + 48;
+ ch[i++] = (uint8_t)(num) % 10000 / 1000 + 48;
+ ch[i++] = (uint8_t)(num) % 1000 / 100 + 48;
+ ch[i++] = (uint8_t)(num) % 100 / 10 + 48;
+ ch[i++] = (uint8_t)(num) % 10 + 48;
+ }
+ else if (num > 1000)
+ {
+ ch[i++] = (uint8_t)(num) % 10000 / 1000 + 48;
+ ch[i++] = (uint8_t)(num) % 1000 / 100 + 48;
+ ch[i++] = (uint8_t)(num) % 100 / 10 + 48;
+ ch[i++] = (uint8_t)(num) % 10 + 48;
+ }
+ else if (num > 100)
+ {
+ ch[i++] = (uint8_t)(num) % 1000 / 100 + 48;
+ ch[i++] = (uint8_t)(num) % 100 / 10 + 48;
+ ch[i++] = (uint8_t)(num) % 10 + 48;
+ }
+ else if (num > 10)
+ {
+ ch[i++] = (uint8_t)(num) % 100 / 10 + 48;
+ ch[i++] = (uint8_t)(num) % 10 + 48;
+ }
+ else if (num >= 0)
+ {
+ ch[i++] = (uint8_t)(num) % 10 + 48;
+ }
+ if (dot_num > 0 && i < 7)
+ {
+ ch[i++] = '.';
+ num = num - (uint8_t)num;
+
+ if (dot_num == 1 && i < 8)
+ {
+ num = num * 10;
+ ch[i++] = (uint8_t)(num + 0.5) % 10 + 48;
+ }
+ if (dot_num >= 2 && i < 8)
+ {
+ num = num * 100;
+ ch[i++] = (uint8_t)num % 100 / 10 + 48;
+ if (i < 8)
+ ch[i++] = (uint8_t)(num + 0.5) % 10 + 48;
+ }
+ }
+
+ while (ch[j] != '\0')
+ {
+ c = ch[j] - 32;
+ if (x > 120)
+ {
+ x = 0;
+ y++;
+ }
+ for (i = 0; i < 8; i++)
+ _buffer[(y * 128) + x + i] = F8X16[c * 16 + i];
+ for (i = 0; i < 8; i++)
+ _buffer[((y + 1) * 128) + x + i] = F8X16[c * 16 + i + 8];
+ x += 8;
+ j++;
+ }
+}
diff --git a/User/board/ssd1306_oled.h b/User/board/ssd1306_oled.h
index cb59bc8..cac9120 100644
--- a/User/board/ssd1306_oled.h
+++ b/User/board/ssd1306_oled.h
@@ -39,13 +39,28 @@
#define SSD1306_CMD_COM_SCAN_DEC 0xC8
#define SSD1306_CMD_SEG_REMAP 0xA0
#define SSD1306_CMD_CHARGE_PUMP 0x8D
+#define SSD1306_CMD_SET_DC_DC_ENABLE 0x14
+
+#define SDA_OUT() \
+ { \
+ GPIO_SET_OUTPUT(SSD1306_SDA_PORT, SSD1306_SDA_PIN); \
+ }
+
+#define SDA_IN() \
+ { \
+ GPIO_SET_INPUT(SSD1306_SDA_PORT, SSD1306_SDA_PIN); \
+ }
// 函数声明
void ssd1306_init(void);
void ssd1306_display_on(void);
void ssd1306_display_off(void);
-void ssd1306_clear(void);
-void ssd1306_draw_pixel(uint8_t x, uint8_t y, uint8_t color);
void ssd1306_update_screen(void);
+void ssd1306_fill(uint8_t color);
+void ssd1306_clear(void);
+void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch);
+void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num);
+void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch);
+void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num);
#endif // __SSD1306_OLED_H
diff --git a/motor.ioc b/motor.ioc
index 56954af..7f22e1c 100644
--- a/motor.ioc
+++ b/motor.ioc
@@ -17,13 +17,14 @@ Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PD0-OSC_IN
Mcu.Pin2=PD1-OSC_OUT
-Mcu.Pin3=PB12
-Mcu.Pin4=PB13
-Mcu.Pin5=PA13
-Mcu.Pin6=PA14
-Mcu.Pin7=VP_SYS_VS_Systick
-Mcu.Pin8=VP_TIM2_VS_ClockSourceINT
-Mcu.PinsNb=9
+Mcu.Pin3=PA1
+Mcu.Pin4=PB12
+Mcu.Pin5=PB13
+Mcu.Pin6=PA13
+Mcu.Pin7=PA14
+Mcu.Pin8=VP_SYS_VS_Systick
+Mcu.Pin9=VP_TIM2_VS_ClockSourceINT
+Mcu.PinsNb=10
Mcu.ThirdParty0=RealThread.RT-Thread.3.1.5
Mcu.ThirdPartyNb=1
Mcu.UserConstants=
@@ -42,15 +43,26 @@ NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false
NVIC.TIM2_IRQn=true\:15\:0\:true\:false\:true\:true\:true\:true
NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+PA1.GPIOParameters=GPIO_Label
+PA1.GPIO_Label=PWMA
+PA1.Signal=GPIO_Output
PA13.Mode=Serial_Wire
PA13.Signal=SYS_JTMS-SWDIO
PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK
-PB12.GPIOParameters=GPIO_Label
+PB12.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB12.GPIO_Label=OLED_SDA
+PB12.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
+PB12.GPIO_PuPd=GPIO_NOPULL
+PB12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
+PB12.PinState=GPIO_PIN_RESET
PB12.Signal=GPIO_Output
-PB13.GPIOParameters=GPIO_Label
+PB13.GPIOParameters=GPIO_Speed,PinState,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP
PB13.GPIO_Label=OLDE_SCK
+PB13.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP
+PB13.GPIO_PuPd=GPIO_NOPULL
+PB13.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
+PB13.PinState=GPIO_PIN_RESET
PB13.Signal=GPIO_Output
PC13-TAMPER-RTC.GPIOParameters=GPIO_Label
PC13-TAMPER-RTC.GPIO_Label=LED_BLUE
@@ -90,7 +102,7 @@ ProjectManager.ToolChainLocation=
ProjectManager.UAScriptAfterPath=
ProjectManager.UAScriptBeforePath=
ProjectManager.UnderRoot=false
-ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_TIM4_Init-TIM4-false-LL-true,3-MX_TIM2_Init-TIM2-false-LL-true
+ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-LL-false,2-MX_GPIO_Init-GPIO-false-LL-true,3-MX_TIM2_Init-TIM2-false-LL-true
RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2