diff --git a/MDK-ARM/motor.uvoptx b/MDK-ARM/motor.uvoptx
index f09921f..ec749b9 100644
--- a/MDK-ARM/motor.uvoptx
+++ b/MDK-ARM/motor.uvoptx
@@ -148,7 +148,24 @@
-
+
+
+ 0
+ 0
+ 146
+ 1
+ 134224336
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ ..\User\board\ssd096_oled.c
+
+ \\motor\../User/board/ssd096_oled.c\146
+
+
0
@@ -770,6 +787,18 @@
0
0
+
+ 8
+ 42
+ 1
+ 0
+ 0
+ 0
+ ..\User\board\ssd096_oled.c
+ ssd096_oled.c
+ 0
+ 0
+
@@ -780,7 +809,7 @@
0
9
- 42
+ 43
1
0
0
@@ -792,7 +821,7 @@
9
- 43
+ 44
1
0
0
@@ -804,7 +833,7 @@
9
- 44
+ 45
1
0
0
@@ -816,7 +845,7 @@
9
- 45
+ 46
1
0
0
@@ -828,7 +857,7 @@
9
- 46
+ 47
1
0
0
diff --git a/MDK-ARM/motor.uvprojx b/MDK-ARM/motor.uvprojx
index 0107133..6464715 100644
--- a/MDK-ARM/motor.uvprojx
+++ b/MDK-ARM/motor.uvprojx
@@ -1253,6 +1253,11 @@
1
..\User\board\board.c
+
+ ssd096_oled.c
+ 1
+ ..\User\board\ssd096_oled.c
+
diff --git a/MDK-ARM/motor/motor.hex b/MDK-ARM/motor/motor.hex
index 1ccb527..fc504b8 100644
--- a/MDK-ARM/motor/motor.hex
+++ b/MDK-ARM/motor/motor.hex
@@ -1,31 +1,31 @@
:020000040800F2
-:10000000802C002005010008950D0008AB010008B8
-:10001000910D00087101000879130008000000002C
-:10002000000000000000000000000000E5100008D3
-:10003000A901000800000000E50F0008E710000813
+:10000000802C002005010008A50D0008AB010008A8
+:10001000A10D00087101000889130008000000000C
+:10002000000000000000000000000000F5100008C3
+:10003000A901000800000000F50F0008F7100008F3
:100040001F0100081F0100081F0100081F01000810
:100050001F0100081F0100081F0100081F01000800
:100060001F0100081F0100081F0100081F010008F0
:100070001F0100081F0100088901000899010008FC
:100080001F0100081F0100081F0100081F010008D0
:100090001F0100081F0100081F0100081F010008C0
-:1000A0001F010008DD1100081F0100081F010008E2
-:1000B0001F010008AD1200081F0100081F01000801
+:1000A0001F010008ED1100081F0100081F010008D2
+:1000B0001F010008BD1200081F0100081F010008F1
:1000C0001F0100081F0100081F0100081F01000890
-:1000D0001F010008691300081F0100081F01000824
+:1000D0001F010008791300081F0100081F01000814
:1000E0001F0100081F0100081F010008DFF810D0E1
-:1000F00000F02CF800480047C5150008AFF3008059
+:1000F00000F02CF800480047CD160008AFF3008050
:10010000802C00200648804706480047FEE7FEE7AF
:10011000FEE7FEE7FEE7FEE7FEE7FEE7FEE7FEE7B7
-:10012000D9110008ED000008D2B201E000F8012B5F
+:10012000E9110008ED000008D2B201E000F8012B4F
:10013000491EFBD270470022F6E710B513460A4667
:1001400004461946FFF7F0FF204610BD064C074D48
:1001500006E0E06840F0010394E807009847103497
-:10016000AC42F6D3FFF7C6FF141F0008341F000887
+:10016000AC42F6D3FFF7C6FF28210008482100085B
:1001700000BFFEE7024600BF1AB901E000BF00BFA2
:10018000FCE700BF0120704710B50248006801F08D
-:1001900098FB10BD5C00002010B50248006801F01B
-:1001A00090FB10BD5C000020704700BFFEE7000020
+:10019000A2FC10BD5C00002010B50248006801F010
+:1001A0009AFC10BD5C000020704700BFFEE7000015
:1001B00008B50549C9690143034AD1611146C969B6
:1001C0000140009100BF08BD0010024008B505497C
:1001D00089690143034A916111468969014000918F
@@ -34,29 +34,29 @@
:100200000010024008B5054989690143034A91611C
:10021000114689690140009100BF08BD00100240ED
:1002200010B54A1E044B9A5C825822F001034A1E04
-:10023000014CA25C835010BDB81E000810B54A1EC8
+:10023000014CA25C835010BDCC20000810B54A1EB2
:10024000044B9A5C825842F001034A1E014CA25CA6
-:10025000835010BDB81E000810B54A1E044B9A5CAE
+:10025000835010BDCC20000810B54A1E044B9A5C98
:10026000825842F002034A1E014CA25C835010BD2A
-:10027000B81E000830B54B1E054CE35CC35823F490
+:10027000CC20000830B54B1E054CE35CC35823F47A
:10028000405313434C1E024D2C5D035130BD000002
-:10029000761E000830B54B1E064CE35C03445B68D9
+:100290008A20000830B54B1E064CE35C03445B68C3
:1002A0006FF30F0313434C1E024D2C5D0444636037
-:1002B00030BD0000B81E000830B54B1E054CE35C95
+:1002B00030BD0000CC20000830B54B1E054CE35C7F
:1002C000C35844F21004A34313434C1E014D2C5D4C
-:1002D000035130BD761E000810B54B1E024CE35C86
-:1002E0000344DA6010BD0000B81E000830B54B1E94
+:1002D000035130BD8A20000810B54B1E024CE35C70
+:1002E0000344DA6010BD0000CC20000830B54B1E7E
:1002F000054CE35CC35823F0800313434C1E024DAE
-:100300002C5D035130BD0000761E000830B54B1E39
+:100300002C5D035130BD00008A20000830B54B1E23
:10031000054CE35CC35823F4406313434C1E024D69
-:100320002C5D035130BD0000761E000830B54B1E19
+:100320002C5D035130BD00008A20000830B54B1E03
:10033000054CE35CC35823F0200313434C1E024DCD
-:100340002C5D035130BD0000761E000810B54B1E19
-:10035000024CE35C03449A6010BD0000B81E000824
+:100340002C5D035130BD00008A20000810B54B1E03
+:10035000024CE35C03449A6010BD0000CC2000080E
:1003600030B54B1E054CE35CC35823F040031343E8
-:100370004C1E024D2C5D035130BD0000761E00085E
+:100370004C1E024D2C5D035130BD00008A20000848
:1003800030B54B1E054CE35CC35823F44073134354
-:100390004C1E024D2C5D035130BD0000761E00083E
+:100390004C1E024D2C5D035130BD00008A20000828
:1003A0002DE9F04102460B461868C0F30F2595FA77
:1003B000A5F0B0FA80F480E00120A0402840002899
:1003C0007AD0082C04D240F2011000FA04F106E0C1
@@ -76,435 +76,468 @@
:1004A000A1FCBCFA8CFC4FEA8C0C00FA0CFC47EA6D
:1004B0000C07376000BF00BF641C25FA04F0002859
:1004C0007FF47AAFBDE8F081C1F30F22426170473B
-:1004D00002480068401C0149086070472000002065
-:1004E0004FF47A71B0FBF1F2521E4FF0E0235A61E3
-:1004F00000229A6105221A6100BF704710B50446B8
-:1005000000F0A6FD2060206800F06EFD606060686D
-:1005100000F07AFDA060606800F088FDE06010BD2A
-:10052000014908607047000000000020016821F0C8
-:10053000800101607047816821F08001816070470F
-:10054000016841F0010101607047C16841F001019B
-:10055000C160704710B5024613681C48824208D03B
-:10056000B2F1804F05D01A48824202D01948824227
-:1005700004D123F070004C6840EA0403134882421F
-:1005800008D0B2F1804F05D01148824202D0114804
-:10059000824204D123F44070CC6840EA0403136023
-:1005A0008868D06200BF0888906200BF0748824216
-:1005B00003D10869106300BF00BF00BF506940F05D
-:1005C0000100506100BF002010BD0000002C014060
-:1005D000000400400008004001460869C0F34000E4
-:1005E000704701460869C0F38000704701460869FA
-:1005F000C0F3C000704701460869C0F3001070479F
-:100600000146086900F0010070470146C868C0F360
-:10061000400070470146C868C0F38000704701463B
-:10062000C868C0F3C00070470146C868C0F3001036
-:1006300070470146C86800F00100704770B5024677
-:10064000012901D1002416E0042901D1012412E07E
-:10065000102901D102240EE0402901D103240AE02F
-:10066000B1F5807F01D1042405E0B1F5806F01D19F
-:10067000052400E006242346064CE55C02F118043C
-:1006800028190468044DEE5C0425B5402C43046031
-:1006900070BD0000531E00085A1E000870B50246C7
-:1006A000012901D1002416E0042901D1012412E01E
-:1006B000102901D102240EE0402901D103240AE0CF
-:1006C000B1F5807F01D1042405E0B1F5806F01D13F
-:1006D000052400E006242346064CE55C02F11804DC
-:1006E00028190468044DEE5C0825B5402C430460CD
-:1006F00070BD0000531E00085A1E00082DE9F0418D
-:1007000006460C4615460127012C08D0102C0CD0AB
-:10071000B4F5807F0FD0B4F5805F18D111E0294681
-:10072000304600F079FB074612E02946304600F0DB
-:10073000AFFB07460CE02946304600F0EBFB0746CE
-:1007400006E02946304600F021FC074600E000BFE5
-:1007500000BF3846BDE8F08181637047826844F28B
-:1007600007039A430A4382607047426822F070028E
-:100770000A434260704708B50168009100BF4168B4
-:10078000009100BF08BD6FF040010160704700009C
-:100790002DE9FF4104460D4601270026204600F0C2
-:1007A00055F8002833D1E968686808432969084387
-:1007B000E16841F20C6291430843E060A868216956
-:1007C00021F440510143216100BF6869616921F44E
-:1007D00040710143616100BF6846FFF78FFE0E481C
-:1007E000844201D1039E08E00C48844201D1029E5C
-:1007F00003E00B48844200D1029E46B1286830B124
-:100800000027314620462A6800F025F800BF384608
-:1008100004B0BDE8F0810000003801400044004011
-:100820000048004001460868C0F340007047014698
-:100830000868C0F38000704701460868C0F3C00034
-:10084000704701460868C0F3801070470146C868C9
-:10085000C0F34030704770B501EBC10303EB0113E7
-:100860009400B3FBF4F301EBC10404EB0114950015
-:10087000B4FBF5F46425B4FBF5F404EBC40505EB17
-:100880000414A3EB8403322404EB03136424B3FBAA
-:10089000F4F303F0F00301EBC10404EB0114950041
-:1008A000B4FBF5F46425B4FBF5F403EB041401EB9D
-:1008B000C10303EB01139500B3FBF5F301EBC10595
-:1008C00005EB01159600B5FBF6F56426B5FBF6F5CC
-:1008D00005EBC50606EB0515A3EB8503322505EBF5
-:1008E00003136425B3FBF5F303F00F0323449BB21A
-:1008F000836070BD38B50120144949690143134A2A
-:100900005161114649690140009100BF00BF00F0EC
-:100910004FFD05460022114600F03EFA04462146EE
-:100920000E2000F055FD0E2000F028FD00F040FDE7
-:1009300005460022114600F02FFA044621460F20FA
-:1009400000F046FD0F2000F019FD38BD00100240F8
-:1009500000B585B014216846FFF7EDFB1020FFF7C6
-:1009600035FC2020FFF732FC0420FFF72FFC082085
-:10097000FFF72CFC1C491D48FFF7A6FD1C491D482C
-:10098000FFF7A2FD1848009001200190022002907C
-:100990000020039069461548FFF702FD16480090B5
-:1009A0000020019069461148FFF7FAFC13480090B7
-:1009B0000020019069461248FFF7F2FC11480090B0
-:1009C0000020019069460B48FFF7EAFC08480090B8
-:1009D0000120019003200290002003906946054801
-:1009E000FFF7DEFC05B000BD200020040010014030
-:1009F00030003004000C0140C000C004FDFD99042B
-:100A000000080140FFFFCF0430B585B014216846CF
-:100A1000FFF791FB4FF40060FFF7E6FB00F0D0FC1E
-:100A200005460022032100F0D7F90446214619208B
-:100A300000F0E2FC192000F0AEFC41F61F40ADF8DA
-:100A40000000002001906320029000200390049099
-:100A500069460948FFF77EFD0748FFF767FD00215B
-:100A60000548FFF77BFE00210348FFF77EFE0248A2
-:100A7000FFF761FD05B030BD002C014000B593B01B
-:100A800014210EA8FFF757FB202106A8FFF753FB00
-:100A9000142101A8FFF74FFB0120FFF789FB00207D
-:100AA000ADF838000F9041F61F40109000201190D3
-:100AB0000EA94FF08040FFF74DFD00BF4FF0804082
-:100AC000006840F080004FF08041086000BF0021C6
-:100AD0004FF08040FFF742FE10218806FFF7DEFD51
-:100AE00070200690002007900890099002200A903C
-:100AF00006AA10214007FFF701FE10218806FFF724
-:100B00009DFD00214FF08040FFF72FFE4FF0804009
-:100B1000FFF711FD0420FFF767FB40F20220019070
-:100B200009200290022003900020049001A90248AD
-:100B3000FFF736FC13B000BD0008014030B585B0AA
-:100B400014216846FFF7F7FA0220FFF731FB00F0A7
-:100B500037FC05460022032100F03EF904462146F9
-:100B60001D2000F049FC1D2000F015FC41F61F403F
-:100B7000ADF8000000200190632002900020039057
-:100B800069460948FFF7E6FC0748FFF7CFFC00215C
-:100B90000548FFF7E3FD00210348FFF7E6FD0248A3
-:100BA000FFF7C9FC05B030BD000400402DE9F0415D
-:100BB0008CB01C2105A8FFF7BEFA14216846FFF788
-:100BC000BAFA4FF48040FFF71DFB0420FFF71AFB31
-:100BD00068480090092001900320029000200390B3
-:100BE00069466548FFF7DCFB6448009004200190EB
-:100BF00069466148FFF7D4FB002205216048FFF7F2
-:100C00005BFB002205215E48FFF734FB0022052133
-:100C10005B48FFF78BFB002205215948FFF7A0FB3B
-:100C2000802205215648FFF761FB00220521544828
-:100C3000FFF7A6FB002205215148FFF767FB1022B2
-:100C400004214F48FFF738FB002204214C48FFF7EE
-:100C500011FB002204214A48FFF768FB002204210F
-:100C60004748FFF77DFB802204214548FFF73EFB04
-:100C7000002204214248FFF783FB00220421404860
-:100C8000FFF744FB25213F4B1B68C3F302200524DB
-:100C900000250346C3F1070CBCF1040F02D94FF045
-:100CA000040C01E0C3F1070C674603F1040CBCF12E
-:100CB000070F02D24FF0000C01E0A3F1030C6646CF
-:100CC0004FF0010C0CFA07FCACF1010C0CEA040C1F
-:100CD0000CFA06FC4FF0010808FA06F8A8F1010822
-:100CE00008EA05084CEA080200BF002904DB1007E7
-:100CF000030E2548435407E01007040E21480C302A
-:100D000001F00F031B1FC45400BF2520002809DB7E
-:100D100000F01F02012191404209920002F1E022FD
-:100D2000C2F8001100BF4FF4E1300590002006909A
-:100D3000079008900C20099000200A900B9005A9BC
-:100D40001248FFF725FD00BF1048006920F49040CD
-:100D50000E4908610846406920F02A00486100BF3A
-:100D600000BF0846C06840F40050C86000BF0CB027
-:100D7000BDE8F08102000204000801400400040400
-:100D8000000002400CED00E000E400E0003801400B
-:100D900000BFFEE700BFFEE7F0B503460C4603F0D8
-:100DA0000701C1F10700042801D9042001E0C1F1C5
-:100DB00007000646081D072801D2002000E0C81ED3
-:100DC00005460120B040401E2040A8400127AF400A
-:100DD0007F1E17403843F0BDF0B503460C4603F0C4
-:100DE0000701C1F10700042801D9042001E0C1F185
-:100DF00007000646081D072801D2002000E0C81E93
-:100E000005460120B040401E2040A8400127AF40C9
-:100E10007F1E17403843F0BD70B50246106A20F0BF
-:100E200001001062136A5568946924F0030424F0E9
-:100E300070000E6840EA060423F002000E6940EAE2
-:100E4000060323F001004E6840EA06030F48824281
-:100E500013D123F008004E6940EA860323F0040012
-:100E60008E6840EA860325F480708E6940EA0605A4
-:100E700025F40070CE6940EA460555609461C86863
-:100E8000506300BF1362002070BD0000002C0140C1
-:100E90002DE9F04104460D46206A20F01000206242
-:100EA000266AD4F80480A76927F4407727F4E04045
-:100EB000296840EA012726F02000296940EA011646
-:100EC00026F01000696840EA01161148844213D1E7
-:100ED00026F08000696940EA811626F04000A96882
-:100EE00040EA811628F48060A96940EA810828F464
-:100EF0000060E96940EAC108C4F80480A76120469F
-:100F0000E968FFF729FC26620020BDE8F0810000B7
-:100F1000002C014070B50246106A20F48070106207
-:100F2000136A5568D46924F0030424F070000E6835
-:100F300040EA060423F400700E6940EA062323F415
-:100F400080704E6840EA06230F48824213D123F492
-:100F500000604E6940EA862323F480608E6840EA90
-:100F6000862325F480508E6940EA061525F400504A
-:100F7000CE6940EA46155560D461C868D06300BFA9
-:100F80001362002070BD0000002C014070B50246C5
-:100F9000106A20F480501062146A5568D36923F4F3
-:100FA000407323F4E0400E6840EA062324F4005026
-:100FB0000E6940EA063424F480504E6840EA063454
-:100FC0000748824204D125F480408E6940EA8615A4
-:100FD0005560D361C868106400BF1462002070BD02
-:100FE000002C014070470000014600BF04484068E3
-:100FF00000F0F0000009034A125C21FA02F0704789
-:1010000000100240A01E0008014600BF05484068CD
-:1010100000F4E060044A02EB1020027821FA02F0AA
-:101020007047000000100240B01E0008014600BFDB
-:101030000548406800F46050044A02EBD020027872
-:1010400021FA02F07047000000100240B01E0008B4
-:1010500010B5002400BF0B48406800F00C0020B120
-:10106000042804D0082808D103E0074C07E0064C08
-:1010700005E000F00BF8044601E0034C00BF00BFA0
-:10108000204610BD0010024000127A00002100220C
-:1010900000BF1148406800F4803002461AB1B2F532
-:1010A000803F0CD101E00D490BE000BF0A484068C9
-:1010B000C0F34040401C0A4BB3FBF0F101E007498C
-:1010C00000BF00BF00BF0448406800F47010022356
-:1010D00003EB9040484370470010024000093D0078
-:1010E00000127A007047704710B50220374909682E
-:1010F00021F007010143354A116000BF00BF00BF66
-:101100003248006800F007000228F8D100BF3048DC
-:10111000006840F480302E49086000BF00BF00BF67
-:101120002B480068C0F340400028F8D04FF48030CE
-:101130004FF4E011264A526822F47C1200F4403346
-:101140000B431A43224B5A6000BF00BF1846006889
-:1011500040F080701946086000BF00BF00BF1C4807
-:101160000068C0F340600028F8D0002018494968A2
-:1011700021F0F0010143164A516000BF10151146DD
-:10118000496821F4E0610143516000BF002011462D
-:10119000496821F460510143516000BF02201146AB
-:1011A000496821F003010143516000BF00BF00BF47
-:1011B0000748406800F00C000828F8D10548FFF700
-:1011C0008FF90448FFF7ACF910BD00000020024081
-:1011D0000010024000A24A047047000010B53148D8
-:1011E000FFF70EFA01285CD100BF2E48FFF7F4F993
-:1011F00001280AD12B48FFF708FA012805D100BFC2
-:10120000001F2849086100BF00BF2648FFF7E9F921
-:1012100001280AD12348FFF7FDF9012805D100BFB5
-:10122000801F2049086100BF00BF1E48FFF7DEF99C
-:1012300001280BD11B48FFF7F2F9012806D100BFA6
-:101240006FF008001749086100BF00BF1548FFF79D
-:10125000D2F901280BD11348FFF7E6F9012806D18E
-:1012600000BF6FF010000F49086100BF00BF0D48BC
-:10127000FFF7C6F901280AD10A48FFF7DAF9012871
-:1012800005D100BFC01E0749086100BF00BF00BFF5
-:10129000FFF71EF900BF04480068401C02490860BF
-:1012A00000BF10BD002C01405800002010B52D4893
-:1012B000FFF7A6F9012853D100BF2A48FFF78CF9A0
-:1012C00001280AD12748FFF7A0F9012805D100BF5E
-:1012D000001F2449086100BF00BF2248FFF781F9C1
-:1012E00001280AD11F48FFF795F9012805D100BF51
-:1012F000801F1C49086100BF00BF1A48FFF776F93C
-:1013000001280BD11748FFF78AF9012806D100BF41
-:101310006FF008001349086100BF00BF1148FFF7D4
-:101320006AF901280BD10F48FFF77EF9012806D191
-:1013300000BF6FF010000B49086100BF00BF0948F3
-:10134000FFF75EF901280AD10648FFF772F9012874
-:1013500005D100BFC01E0349086100BF00BF00BF28
-:1013600010BD00000004004010B50248006800F005
-:10137000D3FB10BD5C00002000BFFEE7002809DBA6
-:1013800000F01F02012191404209920002F1E02287
-:10139000C2F800117047002809DB00F01F0201218C
-:1013A00091404209920002F1E022C2F80011704718
-:1013B00002480068C0F30220704700000CED00E016
+:1004D000C1F30F2242617047C1F30F2202617047DE
+:1004E00002480068401C0149086070472000002055
+:1004F0004FF47A71B0FBF1F2521E4FF0E0235A61D3
+:1005000000229A6105221A6100BF704710B50446A7
+:1005100000F0A6FD2060206800F06EFD606060685D
+:1005200000F07AFDA060606800F088FDE06010BD1A
+:10053000014908607047000000000020016821F0B8
+:10054000800101607047816821F0800181607047FF
+:10055000016841F0010101607047C16841F001018B
+:10056000C160704710B5024613681C48824208D02B
+:10057000B2F1804F05D01A48824202D01948824217
+:1005800004D123F070004C6840EA0403134882420F
+:1005900008D0B2F1804F05D01148824202D01148F4
+:1005A000824204D123F44070CC6840EA0403136013
+:1005B0008868D06200BF0888906200BF0748824206
+:1005C00003D10869106300BF00BF00BF506940F04D
+:1005D0000100506100BF002010BD0000002C014050
+:1005E000000400400008004001460869C0F34000D4
+:1005F000704701460869C0F38000704701460869EA
+:10060000C0F3C000704701460869C0F3001070478E
+:100610000146086900F0010070470146C868C0F350
+:10062000400070470146C868C0F38000704701462B
+:10063000C868C0F3C00070470146C868C0F3001026
+:1006400070470146C86800F00100704770B5024667
+:10065000012901D1002416E0042901D1012412E06E
+:10066000102901D102240EE0402901D103240AE01F
+:10067000B1F5807F01D1042405E0B1F5806F01D18F
+:10068000052400E006242346064CE55C02F118042C
+:1006900028190468044DEE5C0425B5402C43046021
+:1006A00070BD0000672000086E20000870B502468B
+:1006B000012901D1002416E0042901D1012412E00E
+:1006C000102901D102240EE0402901D103240AE0BF
+:1006D000B1F5807F01D1042405E0B1F5806F01D12F
+:1006E000052400E006242346064CE55C02F11804CC
+:1006F00028190468044DEE5C0825B5402C430460BD
+:1007000070BD0000672000086E2000082DE9F04150
+:1007100006460C4615460127012C08D0102C0CD09B
+:10072000B4F5807F0FD0B4F5805F18D111E0294671
+:10073000304600F079FB074612E02946304600F0CB
+:10074000AFFB07460CE02946304600F0EBFB0746BE
+:1007500006E02946304600F021FC074600E000BFD5
+:1007600000BF3846BDE8F08181637047826844F27B
+:1007700007039A430A4382607047426822F070027E
+:100780000A434260704708B50168009100BF4168A4
+:10079000009100BF08BD6FF040010160704700008C
+:1007A0002DE9FF4104460D4601270026204600F0B2
+:1007B00055F8002833D1E968686808432969084377
+:1007C000E16841F20C6291430843E060A868216946
+:1007D00021F440510143216100BF6869616921F43E
+:1007E00040710143616100BF6846FFF78FFE0E480C
+:1007F000844201D1039E08E00C48844201D1029E4C
+:1008000003E00B48844200D1029E46B1286830B113
+:100810000027314620462A6800F025F800BF3846F8
+:1008200004B0BDE8F0810000003801400044004001
+:100830000048004001460868C0F340007047014688
+:100840000868C0F38000704701460868C0F3C00024
+:10085000704701460868C0F3801070470146C868B9
+:10086000C0F34030704770B501EBC10303EB0113D7
+:100870009400B3FBF4F301EBC10404EB0114950005
+:10088000B4FBF5F46425B4FBF5F404EBC40505EB07
+:100890000414A3EB8403322404EB03136424B3FB9A
+:1008A000F4F303F0F00301EBC10404EB0114950031
+:1008B000B4FBF5F46425B4FBF5F403EB041401EB8D
+:1008C000C10303EB01139500B3FBF5F301EBC10585
+:1008D00005EB01159600B5FBF6F56426B5FBF6F5BC
+:1008E00005EBC50606EB0515A3EB8503322505EBE5
+:1008F00003136425B3FBF5F303F00F0323449BB20A
+:10090000836070BD38B50120144949690143134A19
+:100910005161114649690140009100BF00BF00F0DC
+:100920004FFD05460022114600F03EFA04462146DE
+:100930000E2000F055FD0E2000F028FD00F040FDD7
+:1009400005460022114600F02FFA044621460F20EA
+:1009500000F046FD0F2000F019FD38BD00100240E8
+:1009600000B585B014216846FFF7E5FB1020FFF7BE
+:100970002DFC2020FFF72AFC0420FFF727FC08208D
+:10098000FFF724FC1C491D48FFF79EFD1C491D482C
+:10099000FFF79AFD18480090012001900220029074
+:1009A0000020039069461548FFF7FAFC16480090AE
+:1009B0000020019069461148FFF7F2FC13480090AF
+:1009C0000020019069461248FFF7EAFC11480090A8
+:1009D0000020019069460B48FFF7E2FC08480090B0
+:1009E00001200190032002900020039069460548F1
+:1009F000FFF7D6FC05B000BD200020040010014028
+:100A000030003004000C0140C000C004FDFD99041A
+:100A100000080140FFFFCF0430B585B014216846BF
+:100A2000FFF789FB4FF40060FFF7DEFB00F0D0FC1E
+:100A300005460022032100F0D7F90446214619207B
+:100A400000F0E2FC192000F0AEFC41F61F40ADF8CA
+:100A50000000002001906320029000200390049089
+:100A600069460948FFF77EFD0748FFF767FD00214B
+:100A70000548FFF77BFE00210348FFF77EFE024892
+:100A8000FFF761FD05B030BD002C014000B593B00B
+:100A900014210EA8FFF74FFB202106A8FFF74BFB00
+:100AA000142101A8FFF747FB0120FFF781FB00207D
+:100AB000ADF838000F9041F61F40109000201190C3
+:100AC0000EA94FF08040FFF74DFD00BF4FF0804072
+:100AD000006840F080004FF08041086000BF0021B6
+:100AE0004FF08040FFF742FE10218806FFF7DEFD41
+:100AF00070200690002007900890099002200A902C
+:100B000006AA10214007FFF701FE10218806FFF713
+:100B10009DFD00214FF08040FFF72FFE4FF08040F9
+:100B2000FFF711FD0420FFF75FFB40F20220019068
+:100B300009200290022003900020049001A902489D
+:100B4000FFF72EFC13B000BD0008014030B585B0A2
+:100B500014216846FFF7EFFA0220FFF729FB00F0A7
+:100B600037FC05460022032100F03EF904462146E9
+:100B70001D2000F049FC1D2000F015FC41F61F402F
+:100B8000ADF8000000200190632002900020039047
+:100B900069460948FFF7E6FC0748FFF7CFFC00214C
+:100BA0000548FFF7E3FD00210348FFF7E6FD024893
+:100BB000FFF7C9FC05B030BD000400402DE9F0414D
+:100BC0008CB01C2105A8FFF7B6FA14216846FFF780
+:100BD000B2FA4FF48040FFF715FB0420FFF712FB39
+:100BE00068480090092001900320029000200390A3
+:100BF00069466548FFF7D4FB6448009004200190E3
+:100C000069466148FFF7CCFB002205216048FFF7E9
+:100C100053FB002205215E48FFF72CFB0022052133
+:100C20005B48FFF783FB002205215948FFF798FB3B
+:100C3000802205215648FFF759FB00220521544820
+:100C4000FFF79EFB002205215148FFF75FFB1022B2
+:100C500004214F48FFF730FB002204214C48FFF7E6
+:100C600009FB002204214A48FFF760FB002204210F
+:100C70004748FFF775FB802204214548FFF736FB04
+:100C8000002204214248FFF77BFB00220421404858
+:100C9000FFF73CFB25213F4B1B68C3F302200524D3
+:100CA00000250346C3F1070CBCF1040F02D94FF035
+:100CB000040C01E0C3F1070C674603F1040CBCF11E
+:100CC000070F02D24FF0000C01E0A3F1030C6646BF
+:100CD0004FF0010C0CFA07FCACF1010C0CEA040C0F
+:100CE0000CFA06FC4FF0010808FA06F8A8F1010812
+:100CF00008EA05084CEA080200BF002904DB1007D7
+:100D0000030E2548435407E01007040E21480C3019
+:100D100001F00F031B1FC45400BF2520002809DB6E
+:100D200000F01F02012191404209920002F1E022ED
+:100D3000C2F8001100BF4FF4E1300590002006908A
+:100D4000079008900C20099000200A900B9005A9AC
+:100D50001248FFF725FD00BF1048006920F49040BD
+:100D60000E4908610846406920F02A00486100BF2A
+:100D700000BF0846C06840F40050C86000BF0CB017
+:100D8000BDE8F081020002040008014004000404F0
+:100D9000000002400CED00E000E400E000380140FB
+:100DA00000BFFEE700BFFEE7F0B503460C4603F0C8
+:100DB0000701C1F10700042801D9042001E0C1F1B5
+:100DC00007000646081D072801D2002000E0C81EC3
+:100DD00005460120B040401E2040A8400127AF40FA
+:100DE0007F1E17403843F0BDF0B503460C4603F0B4
+:100DF0000701C1F10700042801D9042001E0C1F175
+:100E000007000646081D072801D2002000E0C81E82
+:100E100005460120B040401E2040A8400127AF40B9
+:100E20007F1E17403843F0BD70B50246106A20F0AF
+:100E300001001062136A5568946924F0030424F0D9
+:100E400070000E6840EA060423F002000E6940EAD2
+:100E5000060323F001004E6840EA06030F48824271
+:100E600013D123F008004E6940EA860323F0040002
+:100E70008E6840EA860325F480708E6940EA060594
+:100E800025F40070CE6940EA460555609461C86853
+:100E9000506300BF1362002070BD0000002C0140B1
+:100EA0002DE9F04104460D46206A20F01000206232
+:100EB000266AD4F80480A76927F4407727F4E04035
+:100EC000296840EA012726F02000296940EA011636
+:100ED00026F01000696840EA01161148844213D1D7
+:100EE00026F08000696940EA811626F04000A96872
+:100EF00040EA811628F48060A96940EA810828F454
+:100F00000060E96940EAC108C4F80480A76120468E
+:100F1000E968FFF729FC26620020BDE8F0810000A7
+:100F2000002C014070B50246106A20F480701062F7
+:100F3000136A5568D46924F0030424F070000E6825
+:100F400040EA060423F400700E6940EA062323F405
+:100F500080704E6840EA06230F48824213D123F482
+:100F600000604E6940EA862323F480608E6840EA80
+:100F7000862325F480508E6940EA061525F400503A
+:100F8000CE6940EA46155560D461C868D06300BF99
+:100F90001362002070BD0000002C014070B50246B5
+:100FA000106A20F480501062146A5568D36923F4E3
+:100FB000407323F4E0400E6840EA062324F4005016
+:100FC0000E6940EA063424F480504E6840EA063444
+:100FD0000748824204D125F480408E6940EA861594
+:100FE0005560D361C868106400BF1462002070BDF2
+:100FF000002C014070470000014600BF04484068D3
+:1010000000F0F0000009034A125C21FA02F0704778
+:1010100000100240B4200008014600BF05484068A7
+:1010200000F4E060044A02EB1020027821FA02F09A
+:101030007047000000100240C4200008014600BFB5
+:101040000548406800F46050044A02EBD020027862
+:1010500021FA02F07047000000100240C42000088E
+:1010600010B5002400BF0B48406800F00C0020B110
+:10107000042804D0082808D103E0074C07E0064CF8
+:1010800005E000F00BF8044601E0034C00BF00BF90
+:10109000204610BD0010024000127A0000210022FC
+:1010A00000BF1148406800F4803002461AB1B2F522
+:1010B000803F0CD101E00D490BE000BF0A484068B9
+:1010C000C0F34040401C0A4BB3FBF0F101E007497C
+:1010D00000BF00BF00BF0448406800F47010022346
+:1010E00003EB9040484370470010024000093D0068
+:1010F00000127A007047704710B50220374909681E
+:1011000021F007010143354A116000BF00BF00BF55
+:101110003248006800F007000228F8D100BF3048CC
+:10112000006840F480302E49086000BF00BF00BF57
+:101130002B480068C0F340400028F8D04FF48030BE
+:101140004FF4E011264A526822F47C1200F4403336
+:101150000B431A43224B5A6000BF00BF1846006879
+:1011600040F080701946086000BF00BF00BF1C48F7
+:101170000068C0F340600028F8D000201849496892
+:1011800021F0F0010143164A516000BF10151146CD
+:10119000496821F4E0610143516000BF002011461D
+:1011A000496821F460510143516000BF022011469B
+:1011B000496821F003010143516000BF00BF00BF37
+:1011C0000748406800F00C000828F8D10548FFF7F0
+:1011D0008FF90448FFF7ACF910BD00000020024071
+:1011E0000010024000A24A047047000010B53148C8
+:1011F000FFF70EFA01285CD100BF2E48FFF7F4F983
+:1012000001280AD12B48FFF708FA012805D100BFB1
+:10121000001F2849086100BF00BF2648FFF7E9F911
+:1012200001280AD12348FFF7FDF9012805D100BFA5
+:10123000801F2049086100BF00BF1E48FFF7DEF98C
+:1012400001280BD11B48FFF7F2F9012806D100BF96
+:101250006FF008001749086100BF00BF1548FFF78D
+:10126000D2F901280BD11348FFF7E6F9012806D17E
+:1012700000BF6FF010000F49086100BF00BF0D48AC
+:10128000FFF7C6F901280AD10A48FFF7DAF9012861
+:1012900005D100BFC01E0749086100BF00BF00BFE5
+:1012A000FFF71EF900BF04480068401C02490860AF
+:1012B00000BF10BD002C01405800002010B52D4883
+:1012C000FFF7A6F9012853D100BF2A48FFF78CF990
+:1012D00001280AD12748FFF7A0F9012805D100BF4E
+:1012E000001F2449086100BF00BF2248FFF781F9B1
+:1012F00001280AD11F48FFF795F9012805D100BF41
+:10130000801F1C49086100BF00BF1A48FFF776F92B
+:1013100001280BD11748FFF78AF9012806D100BF31
+:101320006FF008001349086100BF00BF1148FFF7C4
+:101330006AF901280BD10F48FFF77EF9012806D181
+:1013400000BF6FF010000B49086100BF00BF0948E3
+:10135000FFF75EF901280AD10648FFF772F9012864
+:1013600005D100BFC01E0349086100BF00BF00BF18
+:1013700010BD00000004004010B50248006800F0F5
+:10138000D5FC10BD5C00002000BFFEE7002809DB93
+:1013900000F01F02012191404209920002F1E02277
+:1013A000C2F800117047002809DB00F01F0201217C
+:1013B00091404209920002F1E022C2F80011704708
:1013C00002480068C0F30220704700000CED00E006
-:1013D00010B5002804DB0A07130E054A135406E073
-:1013E0000A07140E034A00F00F031B1FD45410BD4C
-:1013F00000E400E018ED00E010B5002804DB0A0767
-:10140000130E054A135406E00A07140E034A00F0AF
-:101410000F031B1FD45410BD00E400E018ED00E0E2
-:1014200002E008C8121F08C1002AFAD170477047AD
-:10143000002001E001C1121F002AFBD1704700000B
-:10144000014601F1100000E0001D02681AB9024ACD
-:1014500012689042F8D370473400002010B5064857
-:10146000046803E02046FFF7EBFF044603480068EA
-:101470008442F7D310BD000030000020340000206B
-:1014800010B504462146002000F090F910BD10B5BB
-:1014900001E000F8011B131EA2F10104A2B2F8D171
-:1014A00010BD000010B500200A4908600A49086014
-:1014B00000BF0A48FFF744F80848FFF746F800BFA6
-:1014C00000BF0748FFF73CF80548FFF73EF800BFAC
-:1014D00010BD0000040000200C000020002C014082
-:1014E0000004004010B5034800F00CF8024800F07A
-:1014F00033F810BD040000200C00002010B500F0EF
-:10150000DBFA10BD08B5014600200090086810B154
-:10151000122813D108E000BF00BF0B4800684860E4
-:1015200000BF1220086000BF074A48681268101AFE
-:101530000A2801D2002008BD00BFEDE700200860A6
-:1015400000900320F7E700005800002001490860E0
-:10155000704700001C00002038B5014600200090B4
-:10156000086810B1252821D116E000BF124B134C9A
-:10157000E068C3F30F2222EA000400EA020544EA0D
-:1015800005440E4D2C6100BF00BF0D480068486047
-:1015900000BF2520086000BF094A48681268101A79
-:1015A000642801D2002038BD00BFDFE700200860BA
-:1015B00000900320F7E70000200020040010014005
-:1015C0005800002008B50120274989690143264AAF
-:1015D0009161114689690140009100BF00BF000779
-:1015E0001146C9690143D1611146C96901400091A1
-:1015F00000BF00BF032002461C4B19684FF6FF03D3
-:1016000019401B4B0B4343EA0221184B196000BFE2
-:1016100000BF1848406820F0E06040F000701549B5
-:10162000486000BFFFF760FD134800681349B0FB36
-:10163000F1F084B22046FFF789FFFFF789F9FFF741
-:1016400059F9FFF71BFAFFF7B1FAFFF7DDF9FFF7DA
-:1016500075FA002000F014F8FFF750FFFFF722FFA3
-:1016600001E0FFF73FFFFCE7001002400CED00E057
-:101670000000FA05000001400000002040420F0079
-:1016800010B504460C4951F824104A000B4951F892
-:101690002400002100F09EF8094951F82420074950
-:1016A000083951F82400002100F094F80121034882
-:1016B0000830015510BD0000FC1E00084C00002041
-:1016C0000C1F00082DE9F04704460F460025A946E7
-:1016D0002348005D20B92248183801682046884711
-:1016E0001FB94FF0FF30BDE8F0871E4850F82400C6
-:1016F000B7FBF0F61B4850F82400B7FBF0F100FBF5
-:10170000117000B1761C184850F82400451E22E0E4
-:101710001348083850F8240030F8150010B909F1C2
-:10172000010901E04FF00009B14513D14FF0000865
-:1017300009E00B48083850F8240005EB080220F8AF
-:10174000126008F10108B045F3D3064850F82400B0
-:101750006843C8E76D1E002DDADA4FF0FF30C2E7AC
-:1017600054000020041F0008FC1E000810B50146AC
-:101770000023002207E00B4850F8210030F8120047
-:1017800000B15B1C521C084850F821009042F2D86E
-:1017900064205843044C54F82140B0FBF4F0C0B22C
-:1017A00010BD00004C000020FC1E000870B504466F
-:1017B0000E4631462046FFF785FF0546681C08B9EE
-:1017C000002070BD024850F824002844F9E70000CA
-:1017D0004400002030B5034601E003F8011B141E4D
-:1017E000A2F10102F9D130BD10B5044604B910BD13
-:1017F00000202085A07D012808D1606A30B1218CAD
-:1018000089040A0C0021606AFFF741FE00BFEEE781
-:101810002DE9F05F0646884615469946DDE90B7BC3
-:10182000DDF828A00EB1012100E0002108462921A1
-:10183000FEF7A0FC4420FFF723FE04460CB1012173
-:1018400000E0002108462C21FEF794FC0120E07501
-:1018500000202076C4F83C902584C4F840B0A786C8
-:10186000002D0CDD2846FFF70BFEE061E16909B1B0
-:10187000012100E0002108463E21FEF77BFC002FFD
-:101880000CDD3846FFF7FCFD2063216B09B1012117
-:1018900000E0002108464521FEF76CFC84F8158025
-:1018A00084F82CA066602046BDE8F09F10B5044681
-:1018B00004B910BD002060852046FFF795FF00BFEA
-:1018C000F7E710B504460CB1012100E000210846FD
-:1018D00040F2D711FEF74EFC012084F83800216950
-:1018E000A068FEF79DFC2069082865D2DFE800F0BB
-:1018F0006404111E2C3A485600BFA0680168C1F369
-:10190000400121B1A0680221416000BF00BF00BFBB
-:1019100053E000BFA0680168C1F3401121B1A06885
-:101920002021416000BF00BF00BF46E000BFA068AB
-:101930000168C1F3402129B1A0684FF400714160F2
-:1019400000BF00BF00BF38E000BFA0680168C1F35E
-:10195000403129B1A0684FF40051416000BF00BF81
-:1019600000BF2AE000BFA0680168C1F3404129B16F
-:10197000A0684FF40031416000BF00BF00BF1CE011
-:1019800000BFA0680168C1F3405129B1A0684FF4BD
-:101990000011416000BF00BF00BF0EE000BFA068A3
-:1019A0000168C1F3406129B1A0684FF00071416046
-:1019B00000BF00BF00BF00E000BF00BF606800BF05
-:1019C00000BF00BF00F10C0252E8002F42F04001BE
-:1019D00000F10C0242E80013002BF3D100BF00BF5E
-:1019E0002069082865D2DFE800F06404111E2C3A53
-:1019F000485600BFA0680168C1F3C00121B1A068CA
-:101A00000821416000BF00BF00BF53E000BFA068D5
-:101A10000168C1F3C01121B1A0688021416000BFFD
-:101A200000BF00BF46E000BFA0680168C1F3C0214D
-:101A300029B1A0684FF40061416000BF00BF00BF42
-:101A400038E000BFA0680168C1F3C03129B1A068C7
-:101A50004FF40041416000BF00BF00BF2AE000BF5B
-:101A6000A0680168C1F3C04129B1A0684FF400210A
-:101A7000416000BF00BF00BF1CE000BFA06801685C
-:101A8000C1F3C05129B1A0684FF40001416000BF0B
-:101A900000BF00BF0EE000BFA0680168C1F3C061D5
-:101AA00029B1A0684FF00061416000BF00BF00BFD6
-:101AB00000E000BF00BF10BD0EB51348006808BBB2
-:101AC0000020F0210122114BCDE9002102900A46AD
-:101AD00001210F48FFF79CFE0B49086000200968B0
-:101AE00008700C480849096888600520064909689B
-:101AF000C8600420044909680861002102480068A0
-:101B000000F0E2F80EBD00005C0000204B1E000853
-:101B1000003801400000024038B5044604B938BD21
-:101B20006068C168C1F34011B9B160680168C1F370
-:101B3000401191B1608D218C884202DB2046FFF775
-:101B4000B5FE61684A68D2B2608D411C6185E16969
-:101B50000A5400202076E0753FE06068C168C1F358
-:101B60000011002939D060680168C1F30011002913
-:101B700033D0607D01282BD1D4E902014A1E514B9C
-:101B80009A5C02445268208C801A6085207DF8B9E6
-:101B9000D4E90201FEF744FBE06B80B1608D0028C0
-:101BA0000DDD608D218C884209DC628D2078E36B2D
-:101BB000E1699847228C0021E069FFF768FC228CDC
-:101BC000D4E90201FEF766FBD4E90201FEF736FB19
-:101BD000002060856068FEF7CEFD6068C168C1F3D3
-:101BE000801151B16068FEF72CFE30B1206C08B155
-:101BF000206C80476068FEF7C6FDA07D01285ED19D
-:101C000001256068C168C1F3002171B16068016895
-:101C100001F0010149B1022560680168009100BF2F
-:101C20004168009100BF00BF00BF6068FEF7FAFD89
-:101C300068B16068FEF7F6FD48B104256068016888
-:101C4000009100BF4168009100BF00BF00BF606805
-:101C5000FEF7EDFD60B16068FEF7E9FD40B1606838
-:101C60000168009100BF4168009100BF00BF00BF44
-:101C70006068FEF7E1FD68B16068FEF7DDFD48B120
-:101C8000102560680168009100BF4168009100BFA5
-:101C900000BF00BF012D11D0606A78B1618D491E6F
-:101CA00088B2228D616A01EB82014880228D616ACF
-:101CB00001F82250218D491C218500BF00BF00BFC3
-:101CC0002DE70000B81E000870B504460D46607D83
-:101CD00090B9A575606800BF00BF00BF00F10C029D
-:101CE00052E8002F42F0200100F10C0242E80013FC
-:101CF000002BF3D100BF70E00020A0756068FEF7F4
-:101D00003AFD2169A068FEF78BFAD4E90201FEF7DB
-:101D100087FA6068011D0E463246D4E90201FEF7DB
-:101D200015FBE269D4E90201FEF7D6FA228CD4E968
-:101D30000201FEF7AFFAD4E90201FEF78DFAD4E909
-:101D40000201FEF77BFA606800BF00BF00BF00F130
-:101D5000140252E8002F42F0400100F1140242E860
-:101D60000013002BF3D100BF00BF606800BF00BFAD
-:101D700000BF00F10C0252E8002F42F0100100F108
-:101D80000C0242E80013002BF3D100BF00BF6068D3
-:101D9000011D0E4632462169A068FEF7D7FA226B74
-:101DA0002169A068FEF798FA2169A068FEF754FA45
-:101DB000606800BF00BF00BF00F1140252E8002FAE
-:101DC00042F0800100F1140242E80013002BF3D12D
-:101DD00000BF00BF012084F83800A07D012833D166
-:101DE000606A68B9218C8800FFF74AFB6062616A0B
-:101DF00009B1012100E0002108468221FEF7BAF96D
-:101E0000606800BF00BF00BF00F10C0252E8002F65
-:101E100042F4807100F10C0242E80013002BF3D170
-:101E200000BF00BF606800BF00BF00BF00F1140228
-:101E300052E8002F42F0010100F1140242E80013C1
-:101E4000002BF3D100BF00BF70BD7047081C3044A9
-:101E5000586C80000000000404040000080000002A
-:101E6000080000080000000800020406080A0C0030
-:101E7000010203040506081C3044586C8000000071
-:101E8000000404040000080000000800000800002E
-:101E9000000800020406080A0C00010203040506FB
-:101EA000000000000000000001020304060708090A
-:101EB0000000000001020304081C3044586C80003C
-:101EC00000000004040400000800000008000008EE
-:101ED0000000000800020406080A0C0001020304C6
-:101EE00005065F6C697374006C69737420616C6CB7
-:101EF00020636F6D6D616E640000000000040000DF
-:101F000000000000080000000800000000200000A1
-:101F100000000000341F00080000002070000000D6
-:101F200020140008A41F000870000020102C0000DE
-:101F3000301400080024F40000000000000000003D
-:101F40000000000000000000000000000000000091
-:101F50000000000000000000000000000000000081
-:101F60000000000000000000000000000000000071
-:101F7000811600086D1700088000002000C00120B5
-:101F80008020002038000020000000000000000039
-:101F900000000000E21E0008E81E0008C6E533B499
-:041FA0005D140008C4
+:1013D00002480068C0F30220704700000CED00E0F6
+:1013E00010B5002804DB0A07130E054A135406E063
+:1013F0000A07140E034A00F00F031B1FD45410BD3C
+:1014000000E400E018ED00E010B5002804DB0A0756
+:10141000130E054A135406E00A07140E034A00F09F
+:101420000F031B1FD45410BD00E400E018ED00E0D2
+:1014300002E008C8121F08C1002AFAD1704770479D
+:10144000002001E001C1121F002AFBD170470000FB
+:10145000014601F1100000E0001D02681AB9024ABD
+:1014600012689042F8D370473400002010B5064847
+:10147000046803E02046FFF7EBFF044603480068DA
+:101480008442F7D310BD000030000020340000205B
+:1014900010B504462146002000F00CFA10BD10B52E
+:1014A00001E000F8011B131EA2F10104A2B2F8D161
+:1014B00010BD000010B500200A4908600A49086004
+:1014C00000BF0A48FFF744F80848FFF746F800BF96
+:1014D00000BF0748FFF73CF80548FFF73EF800BF9C
+:1014E00010BD0000040000200C000020002C014072
+:1014F0000004004010B5034800F00EF8024800F068
+:10150000AFF810BD040000200C00002010B500F062
+:10151000DDFB00F017FA10BD08B501460020009071
+:10152000086810B1122813D108E000BF00BF0B48B3
+:101530000068486000BF1220086000BF074A486882
+:101540001268101A0A2801D2002008BD00BFEDE77A
+:101550000020086000900320F7E7000058000020FA
+:1015600001490860704700001C00002010B50849C0
+:101570000848FEF7B1FF08490648FEF7ADFF0449E9
+:101580000448FEF7A5FF04490248FEF7A1FF10BD7D
+:1015900010001004000C01402000200410B5064982
+:1015A0000648FEF795FF06490448FEF795FF0249F5
+:1015B0000248FEF791FF10BD10001004000C01401E
+:1015C0002000200470B50446002518E004F08000D7
+:1015D000284120B10F491048FEF77EFF03E00D4976
+:1015E0000D48FEF775FF6006040E0C490A48FEF729
+:1015F00073FF0A490848FEF76BFF681CC5B2082D47
+:10160000E4DB06490448FEF767FF04490248FEF799
+:101610005FFF70BD10001004000C0140200020048A
+:1016200010B50446FFF7A2FF7820FFF7CBFF00209C
+:10163000FFF7C8FF2046FFF7C5FFFFF7AFFF10BD5C
+:1016400010B50446FFF792FF7820FFF7BBFF40205C
+:10165000FFF7B8FF2046FFF7B5FFFFF79FFF10BD6C
+:1016600038B5014600200090086810B1252821D126
+:1016700016E000BF124B134CE068C3F30F2222EABE
+:10168000000400EA020544EA05440E4D2C6100BF47
+:1016900000BF0D480068486000BF2520086000BFFB
+:1016A000094A48681268101A642801D2002038BD1F
+:1016B00000BFDFE70020086000900320F7E700008C
+:1016C00020002004001001405800002008B501202F
+:1016D000274989690143264A916111468969014078
+:1016E000009100BF00BF00071146C9690143D161E5
+:1016F0001146C9690140009100BF00BF03200246A6
+:101700001C4B19684FF6FF0319401B4B0B4343EA70
+:101710000221184B196000BF00BF1848406820F034
+:10172000E06040F000701549486000BFFFF7E4FC3E
+:10173000134800681349B0FBF1F084B22046FFF76C
+:101740000FFFFFF70DF9FFF7DDF8FFF79FF9FFF740
+:1017500035FAFFF761F9FFF7F9F9002000F014F806
+:10176000FFF7D4FEFFF7A6FE01E0FFF7C3FEFCE79C
+:10177000001002400CED00E00000FA0500000140FE
+:101780000000002040420F0010B504460C4951F8FB
+:1017900024104A000B4951F82400002100F09EF863
+:1017A000094951F824200749083951F8240000213B
+:1017B00000F094F8012103480830015510BD0000E5
+:1017C000102100084C000020202100082DE9F047DE
+:1017D00004460F460025A9462348005D20B922484B
+:1017E00018380168204688471FB94FF0FF30BDE820
+:1017F000F0871E4850F82400B7FBF0F61B4850F85D
+:101800002400B7FBF0F100FB117000B1761C184802
+:1018100050F82400451E22E01348083850F82400F0
+:1018200030F8150010B909F1010901E04FF0000985
+:10183000B14513D14FF0000809E00B48083850F8C3
+:10184000240005EB080220F8126008F10108B045F9
+:10185000F3D3064850F824006843C8E76D1E002DF6
+:10186000DADA4FF0FF30C2E75400002018210008F8
+:101870001021000810B501460023002207E00B48A4
+:1018800050F8210030F8120000B15B1C521C0848CF
+:1018900050F821009042F2D864205843044C54F888
+:1018A0002140B0FBF4F0C0B210BD00004C0000209D
+:1018B0001021000870B504460E4631462046FFF759
+:1018C00085FF0546681C08B9002070BD024850F825
+:1018D00024002844F9E700004400002030B5034606
+:1018E00001E003F8011B141EA2F10102F9D130BD81
+:1018F00070B500240EE00021204600F06EF80025AF
+:1019000004E00020FFF79CFE681CC5B2802DF8DBC8
+:10191000601CC4B2082CEEDB70BD70B500240EE074
+:101920000021204600F059F8002504E0FF20FFF7D1
+:1019300087FE681CC5B2802DF8DB601CC4B2082C81
+:10194000EEDB70BD10B5AE20FFF76AFED520FFF7C5
+:1019500067FE8020FFF764FEA820FFF761FE3F20AE
+:10196000FFF75EFED320FFF75BFE0020FFF758FE77
+:101970004020FFF755FEA120FFF752FEC820FFF7D9
+:101980004FFEDA20FFF74CFE1220FFF749FE8120C0
+:10199000FFF746FECF20FFF743FED920FFF740FEBA
+:1019A000F120FFF73DFEDB20FFF73AFE3020FFF786
+:1019B00037FEA420FFF734FEA620FFF731FE8D206E
+:1019C000FFF72EFE1420FFF72BFEAF20FFF728FEB7
+:1019D000FFF78EFFFFF7A1FF10BD70B504460D465F
+:1019E00045F0B000FFF71CFE102141EA1410FFF78C
+:1019F00017FE04F00F00FFF713FE70BD10B504468C
+:101A000004B910BD00202085A07D012808D1606A9E
+:101A100030B1218C89040A0C0021606AFFF73FFD78
+:101A200000BFEEE72DE9F05F064688461546994669
+:101A3000DDE90B7BDDF828A00EB1012100E00021DB
+:101A400008462921FEF796FB4420FFF721FD0446B6
+:101A50000CB1012100E0002108462C21FEF78AFB91
+:101A60000120E07500202076C4F83C902584C4F85D
+:101A700040B0A786002D0CDD2846FFF709FDE06188
+:101A8000E16909B1012100E0002108463E21FEF78D
+:101A900071FB002F0CDD3846FFF7FAFC2063216B49
+:101AA00009B1012100E0002108464521FEF762FB53
+:101AB00084F8158084F82CA066602046BDE8F09F6D
+:101AC00010B5044604B910BD002060852046FFF71C
+:101AD00095FF00BFF7E710B504460CB1012100E007
+:101AE0000021084640F2D711FEF744FB012084F89C
+:101AF00038002169A068FEF793FB2069082865D2A9
+:101B0000DFE800F06404111E2C3A485600BFA068BC
+:101B10000168C1F3400121B1A0680221416000BF0A
+:101B200000BF00BF53E000BFA0680168C1F34011CF
+:101B300021B1A0682021416000BF00BF00BF46E086
+:101B400000BFA0680168C1F3402129B1A0684FF42B
+:101B50000071416000BF00BF00BF38E000BFA06857
+:101B60000168C1F3403129B1A0684FF400514160D0
+:101B700000BF00BF00BF2AE000BFA0680168C1F33A
+:101B8000404129B1A0684FF40031416000BF00BF5F
+:101B900000BF1CE000BFA0680168C1F3405129B13B
+:101BA000A0684FF40011416000BF00BF00BF0EE00D
+:101BB00000BFA0680168C1F3406129B1A0684FF07F
+:101BC0000071416000BF00BF00BF00E000BF00BF68
+:101BD000606800BF00BF00BF00F10C0252E8002F98
+:101BE00042F0400100F10C0242E80013002BF3D157
+:101BF00000BF00BF2069082865D2DFE800F0640458
+:101C0000111E2C3A485600BFA0680168C1F3C001FC
+:101C100021B1A0680821416000BF00BF00BF53E0B0
+:101C200000BFA0680168C1F3C01121B1A068802184
+:101C3000416000BF00BF00BF46E000BFA068016870
+:101C4000C1F3C02129B1A0684FF40061416000BF19
+:101C500000BF00BF38E000BFA0680168C1F3C03119
+:101C600029B1A0684FF40041416000BF00BF00BF30
+:101C70002AE000BFA0680168C1F3C04129B1A06893
+:101C80004FF40021416000BF00BF00BF1CE000BF57
+:101C9000A0680168C1F3C05129B1A0684FF40001E8
+:101CA000416000BF00BF00BF0EE000BFA068016838
+:101CB000C1F3C06129B1A0684FF00061416000BF6D
+:101CC00000BF00BF00E000BF00BF10BD0EB513484D
+:101CD000006808BB0020F0210122114BCDE9002152
+:101CE00002900A4601210F48FFF79CFE0B4908604D
+:101CF0000020096808700C480849096888600520B8
+:101D000006490968C860042004490968086100217F
+:101D10000248006800F0E2F80EBD00005C00002000
+:101D20005F200008003801400000024038B504463A
+:101D300004B938BD6068C168C1F34011B9B16068C9
+:101D40000168C1F3401191B1608D218C884202DBA2
+:101D50002046FFF7B5FE61684A68D2B2608D411C2B
+:101D60006185E1690A5400202076E0753FE06068F3
+:101D7000C168C1F30011002939D060680168C1F35E
+:101D80000011002933D0607D01282BD1D4E9020154
+:101D90004A1E514B9A5C02445268208C801A60851E
+:101DA000207DF8B9D4E90201FEF73AFAE06B80B180
+:101DB000608D00280DDD608D218C884209DC628DEC
+:101DC0002078E36BE1699847228C0021E069FFF7F6
+:101DD00066FB228CD4E90201FEF75CFAD4E9020129
+:101DE000FEF72CFA002060856068FEF7CCFC606886
+:101DF000C168C1F3801151B16068FEF72AFD30B1AE
+:101E0000206C08B1206C80476068FEF7C4FCA07DA0
+:101E100001285ED101256068C168C1F3002171B15C
+:101E20006068016801F0010149B10225606801683C
+:101E3000009100BF4168009100BF00BF00BF606813
+:101E4000FEF7F8FC68B16068FEF7F4FC48B10425C1
+:101E500060680168009100BF4168009100BF00BF49
+:101E600000BF6068FEF7EBFC60B16068FEF7E7FC5E
+:101E700040B160680168009100BF4168009100BFF7
+:101E800000BF00BF6068FEF7DFFC68B16068FEF766
+:101E9000DBFC48B1102560680168009100BF416813
+:101EA000009100BF00BF00BF012D11D0606A78B162
+:101EB000618D491E88B2228D616A01EB82014880E2
+:101EC000228D616A01F82250218D491C218500BFB5
+:101ED00000BF00BF2DE70000CC20000870B504460D
+:101EE0000D46607D90B9A575606800BF00BF00BF5A
+:101EF00000F10C0252E8002F42F0200100F10C0228
+:101F000042E80013002BF3D100BF70E00020A07561
+:101F10006068FEF738FC2169A068FEF781F9D4E912
+:101F20000201FEF77DF96068011D0E463246D4E9D4
+:101F30000201FEF70BFAE269D4E90201FEF7CCF9DF
+:101F4000228CD4E90201FEF7A5F9D4E90201FEF7DB
+:101F500083F9D4E90201FEF771F9606800BF00BFA0
+:101F600000BF00F1140252E8002F42F0400100F1DE
+:101F7000140242E80013002BF3D100BF00BF6068D9
+:101F800000BF00BF00BF00F10C0252E8002F42F07A
+:101F9000100100F10C0242E80013002BF3D100BF46
+:101FA00000BF6068011D0E4632462169A068FEF739
+:101FB000CDF9226B2169A068FEF78EF92169A0682E
+:101FC000FEF74AF9606800BF00BF00BF00F11402CD
+:101FD00052E8002F42F0800100F1140242E80013A1
+:101FE000002BF3D100BF00BF012084F83800A07D92
+:101FF000012833D1606A68B9218C8800FFF748FA5C
+:102000006062616A09B1012100E000210846822175
+:10201000FEF7B0F8606800BF00BF00BF00F10C021F
+:1020200052E8002F42F4807100F10C0242E80013E4
+:10203000002BF3D100BF00BF606800BF00BF00BF2E
+:1020400000F1140252E8002F42F0010100F11402E5
+:1020500042E80013002BF3D100BF00BF70BD7047F2
+:10206000081C3044586C8000000000040404000088
+:102070000800000008000008000000080002040634
+:10208000080A0C00010203040506081C3044586CC1
+:1020900080000000000404040000080000000800A4
+:1020A00000080000000800020406080A0C000102F3
+:1020B0000304050600000000000000000102030404
+:1020C000060708090000000001020304081C304450
+:1020D000586C8000000000040404000008000000A8
+:1020E000080000080000000800020406080A0C00AE
+:1020F0000102030405065F6C697374006C697374F4
+:1021000020616C6C20636F6D6D616E640000000077
+:1021100000040000000000000800000008000000AB
+:1021200000200000000000004821000800000020FE
+:102130007000000030140008B82100087000002072
+:10214000102C0000401400080024F40000000000DF
+:10215000000000000000000000000000000000007F
+:10216000000000000000000000000000000000006F
+:10217000000000000000000000000000000000005F
+:102180000000000089170008751800088000002072
+:1021900000C0012080200020380000200000000046
+:1021A0000000000000000000F6200008FC200008ED
+:0821B000C6E533B46D1400080C
:04000005080000ED02
:00000001FF
diff --git a/User/board/board.c b/User/board/board.c
index 830cbdb..bbc564b 100644
--- a/User/board/board.c
+++ b/User/board/board.c
@@ -18,7 +18,6 @@ static void uart_init(void)
}
}
-
/**
* @brief 通过UART发送数据
*
@@ -39,4 +38,5 @@ void uart_send(uint8_t *data, uint16_t len)
void board_init(void)
{
uart_init();
+ ssd096_init();
}
diff --git a/User/board/board.h b/User/board/board.h
index 3958133..bf2e21c 100644
--- a/User/board/board.h
+++ b/User/board/board.h
@@ -1,6 +1,7 @@
#ifndef __BOARD_H__
#define __BOARD_H__
#include "lib.h"
+#include "ssd096_oled.h"
#define UART_RXSIZE (240u) // 接收240个字节
#define UART_TXSIZE (240u) // 发送240个字节
diff --git a/User/board/ssd096_oled.c b/User/board/ssd096_oled.c
new file mode 100644
index 0000000..c13a23e
--- /dev/null
+++ b/User/board/ssd096_oled.c
@@ -0,0 +1,147 @@
+#include "ssd096_oled.h"
+static void i2c_start(void)
+{
+ GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN);
+ GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN);
+ GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN);
+ GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN);
+}
+
+static void i2c_stop(void)
+{
+ GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN);
+ GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN);
+ GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN);
+}
+
+void i2c_write_byte(uint8_t data)
+{
+ uint8_t i;
+ for (i = 0; i < 8; i++)
+ {
+ if ((data & 0x80) >> i)
+ GPIO_SET(SSD096_SDA_PORT, SSD096_SDA_PIN);
+ else
+ GPIO_RESET(SSD096_SDA_PORT, SSD096_SDA_PIN);
+ data <<= 1;
+ GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN);
+ GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN);
+ }
+ GPIO_SET(SSD096_SCK_PORT, SSD096_SCK_PIN); // 额外的一个时钟,不处理应答信号
+ GPIO_RESET(SSD096_SCK_PORT, SSD096_SCK_PIN);
+}
+
+/**
+ * @brief 向I2C设备写入命令
+ *
+ * 通过I2C接口向指定设备写入一个命令字节。
+ *
+ * @param command 要写入的命令字节
+ */
+static void i2c_write_command(uint8_t command)
+{
+ i2c_start();
+ i2c_write_byte(0x78);
+ i2c_write_byte(0x00);
+ i2c_write_byte(command);
+ i2c_stop();
+}
+
+/**
+ * @brief 向I2C设备写入一个字节的数据
+ *
+ * 该函数通过I2C总线向指定设备写入一个字节的数据。
+ *
+ * @param data 要写入的数据字节
+ */
+static void i2c_write_data(uint8_t data)
+{
+ i2c_start();
+ i2c_write_byte(0x78);
+ i2c_write_byte(0x40);
+ i2c_write_byte(data);
+ i2c_stop();
+}
+
+/**
+ * @brief 设置SSD096 OLED显示屏上的光标位置
+ *
+ * 设置SSD096 OLED显示屏上的光标位置到指定的x和y坐标。
+ *
+ * @param x 横向位置,取值范围为0到127
+ * @param y 纵向位置,取值范围为0到63
+ */
+void ssd096_set_position(uint8_t x, uint8_t y)
+{
+ i2c_write_command(0xb0 | y);
+ i2c_write_command(0x10 | ((x & 0xf0) >> 4));
+ i2c_write_command(0x00 | (x & 0x0f));
+}
+
+/**
+ * @brief 清空SSD096显示屏
+ *
+ * 该函数将SSD096显示屏的内容清空,即将所有像素点设置为关闭状态。
+ *
+ * @note 该函数通过I2C接口向SSD096发送数据,以实现清屏操作。
+ */
+void ssd096_clear(void)
+{
+ uint8_t i, j;
+ for (i = 0; i < 8; i++)
+ {
+ ssd096_set_position(i, 0);
+ for (j = 0; j < 128; j++)
+ {
+ i2c_write_data(0x00);
+ }
+ }
+}
+void ssd096_full(void)
+{
+ uint8_t i, j;
+ for (i = 0; i < 8; i++)
+ {
+ ssd096_set_position(i, 0);
+ for (j = 0; j < 128; j++)
+ {
+ i2c_write_data(0xff);
+ }
+ }
+}
+
+/**
+ * @brief 初始化SSD096显示驱动
+ *
+ * 该函数用于初始化SSD096显示驱动,完成基本的配置和初始化工作。
+ */
+void ssd096_init(void)
+{
+ i2c_write_command(0xae);
+ i2c_write_command(0xd5);
+ i2c_write_command(0x80);
+ i2c_write_command(0xa8);
+ i2c_write_command(0x3f);
+ i2c_write_command(0xd3);
+ i2c_write_command(0x00);
+ i2c_write_command(0x40);
+ i2c_write_command(0xa1);
+ i2c_write_command(0xc8);
+ i2c_write_command(0xda);
+ i2c_write_command(0x12);
+ i2c_write_command(0x81);
+ i2c_write_command(0xcf);
+ i2c_write_command(0xd9);
+ i2c_write_command(0xf1);
+ i2c_write_command(0xdb);
+ i2c_write_command(0x30);
+ i2c_write_command(0xa4);
+ i2c_write_command(0xa6);
+ i2c_write_command(0x8d);
+ i2c_write_command(0x14);
+ i2c_write_command(0xaf);
+
+ ssd096_clear();
+
+ ssd096_full();
+}
diff --git a/User/board/ssd096_oled.h b/User/board/ssd096_oled.h
new file mode 100644
index 0000000..e66a082
--- /dev/null
+++ b/User/board/ssd096_oled.h
@@ -0,0 +1,12 @@
+#ifndef __SSD096_OLED_H
+#define __SSD096_OLED_H
+#include "main.h"
+#define SSD096_SDA_PORT OLED_SDA_GPIO_Port
+#define SSD096_SDA_PIN OLED_SDA_Pin
+#define SSD096_SCK_PORT OLDE_SCK_GPIO_Port
+#define SSD096_SCK_PIN OLDE_SCK_Pin
+
+void ssd096_init(void);
+void ssd096_clear(void);
+void ssd096_set_position(uint8_t x, uint8_t y);
+#endif // __SSD096_OLED_H
diff --git a/User/board/ssd1306_oled.c b/User/board/ssd1306_oled.c
deleted file mode 100644
index fad35c0..0000000
--- a/User/board/ssd1306_oled.c
+++ /dev/null
@@ -1,737 +0,0 @@
-/**
- * @file ssd1306_oled.c
- * @author xushenghao
- * @brief SSD1306 OLED display driver
- * @version 0.1
- * @note PB13-SCK PB12-SDA
- */
-#include "ssd1306_oled.h"
-
-#include "ssd1306_oled.h"
-
-/************************************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
-};
-
-static uint8_t _buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区
-
-static void i2c_start(void)
-{
- 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 i2c_stop(void)
-{
- 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);
-}
-
-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_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_test();
-}
-
-void ssd1306_display_on(void)
-{
- 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)
-{
- i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵
- i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 关闭电荷泵
- i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // OLED休眠
-}
-
-/**
- * @brief 更新SSD1306 OLED显示屏的内容
- *
- * 此函数将缓冲区中的数据写入SSD1306 OLED显示屏,从而更新显示内容。
- *
- * 首先,通过发送命令设置列地址和页地址,然后将缓冲区中的数据逐行写入显示屏。
- *
- * @note 在调用此函数之前,需要将需要显示的数据写入缓冲区。
- */
-void ssd1306_update_screen(void)
-{
- for (uint8_t i = 0; i < SSD1306_HEIGHT / 8; i++)
- {
- i2c_write_command(0xb0 + i);
- i2c_write_command(0x01);
- i2c_write_command(0x10);
- for (uint8_t j = 0; j < SSD1306_WIDTH; j++)
- {
- 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();
-}
-
-void ssd1306_clear_buffer(void)
-{
- osel_memset(_buffer, 0, ARRAY_LEN(_buffer));
-}
-
-/**
- * @brief 在指定区域内绘制BMP
- *
- * 在指定坐标区域内绘制一个BMP,使用SSD1306 OLED显示屏
- * ssd1306_draw_bmp(0, 0, SSD1306_WIDTH, 2);
- * @param x0 BMP绘制的起始X坐标
- * @param y0 BMP绘制的起始Y坐标
- * @param x1 BMP绘制的结束X坐标
- * @param y1 BMP绘制的结束Y坐标
- */
-void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *bmp)
-{
- uint8_t j = 0;
- uint8_t x, y;
- osel_memset(_buffer, 0, ARRAY_LEN(_buffer));
- if (y1 % 8 == 0)
- y = y1 / 8;
- else
- y = y1 / 8 + 1;
- for (y = y0; y < y1; y++)
- {
- set_position(x0, y);
- for (x = x0; x < x1; x++)
- {
- i2c_write_data(bmp[j++]);
- }
- }
-}
-
-/**
- * @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 * SSD1306_WIDTH) + 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 * SSD1306_WIDTH) + 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 * SSD1306_WIDTH) + 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 * SSD1306_WIDTH) + 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 * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i];
- for (i = 0; i < 8; i++)
- _buffer[((y + 1) * SSD1306_WIDTH) + 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++] = (int32_t)(num) % 10000 / 1000 + 48;
- ch[i++] = (int32_t)(num) % 1000 / 100 + 48;
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 1000)
- {
- ch[i++] = (int32_t)(num) % 10000 / 1000 + 48;
- ch[i++] = (int32_t)(num) % 1000 / 100 + 48;
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 100)
- {
- ch[i++] = (int32_t)(num) % 1000 / 100 + 48;
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 10)
- {
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 0)
- {
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- if (dot_num > 0 && i < 7)
- {
- ch[i++] = '.';
- num = num - (int32_t)num;
-
- if (dot_num == 1 && i < 8)
- {
- num = num * 10;
- ch[i++] = (int32_t)(num + 0.5) % 10 + 48;
- }
- if (dot_num >= 2 && i < 8)
- {
- num = num * 100;
- ch[i++] = (int32_t)num % 100 / 10 + 48;
- if (i < 8)
- ch[i++] = (int32_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 * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i];
- for (i = 0; i < 8; i++)
- _buffer[((y + 1) * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i + 8];
- x += 8;
- j++;
- }
-}
diff --git a/User/board/ssd1306_oled.h b/User/board/ssd1306_oled.h
deleted file mode 100644
index 013ea30..0000000
--- a/User/board/ssd1306_oled.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef __SSD1306_OLED_H
-#define __SSD1306_OLED_H
-
-#include "main.h"
-
-// OLED引脚定义
-#define SSD1306_SDA_PORT OLED_SDA_GPIO_Port
-#define SSD1306_SDA_PIN OLED_SDA_Pin
-#define SSD1306_SCK_PORT OLDE_SCK_GPIO_Port
-#define SSD1306_SCK_PIN OLDE_SCK_Pin
-
-// I2C地址
-#define SSD1306_I2C_ADDRESS 0x78
-// OLED显示参数
-#define SSD1306_WIDTH 128
-#define SSD1306_HEIGHT 64
-
-// OLED命令定义
-#define SSD1306_CMD_DISPLAY_OFF 0xAE
-#define SSD1306_CMD_DISPLAY_ON 0xAF
-#define SSD1306_CMD_SET_CONTRAST 0x81
-#define SSD1306_CMD_DISPLAY_ALL_ON_RESUME 0xA4
-#define SSD1306_CMD_DISPLAY_ALL_ON 0xA5
-#define SSD1306_CMD_NORMAL_DISPLAY 0xA6
-#define SSD1306_CMD_INVERT_DISPLAY 0xA7
-#define SSD1306_CMD_SET_DISPLAY_OFFSET 0xD3
-#define SSD1306_CMD_SET_COM_PINS 0xDA
-#define SSD1306_CMD_SET_VCOM_DETECT 0xDB
-#define SSD1306_CMD_SET_DISPLAY_CLOCK_DIV 0xD5
-#define SSD1306_CMD_SET_PRECHARGE 0xD9
-#define SSD1306_CMD_SET_MULTIPLEX 0xA8
-#define SSD1306_CMD_SET_LOW_COLUMN 0x00
-#define SSD1306_CMD_SET_HIGH_COLUMN 0x10
-#define SSD1306_CMD_SET_START_LINE 0x40
-#define SSD1306_CMD_MEMORY_MODE 0x20
-#define SSD1306_CMD_COLUMN_ADDR 0x21
-#define SSD1306_CMD_PAGE_ADDR 0x22
-#define SSD1306_CMD_COM_SCAN_INC 0xC0
-#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_update_screen(void);
-
-void ssd1306_fill(uint8_t color);
-void ssd1306_clear(void);
-void ssd1306_clear_buffer(void);
-void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *bmp);
-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