From 5b30352baaa40b3b54f8d93ad8855a305e989626 Mon Sep 17 00:00:00 2001 From: xushenghao Date: Fri, 6 Dec 2024 15:24:21 +0800 Subject: [PATCH] =?UTF-8?q?ssd1306=5Foled=20=20=E9=A9=B1=E5=8A=A8=E7=A7=BB?= =?UTF-8?q?=E6=A4=8D=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/main.h | 5 +- Core/Src/gpio.c | 20 +- Core/Src/main.c | 2 +- MDK-ARM/motor.uvoptx | 66 +-- MDK-ARM/motor/motor.hex | 900 ++++++++++++++++++++++++++------------ User/board/ssd1306_oled.c | 840 ++++++++++++++++++++++++++++++----- User/board/ssd1306_oled.h | 19 +- motor.ioc | 32 +- 8 files changed, 1421 insertions(+), 463 deletions(-) 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