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