{"id":480302,"date":"2026-05-19T16:10:09","date_gmt":"2026-05-19T16:10:09","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=480302"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=480302","title":{"rendered":"\u0412\u0430\u0439\u0431-\u043c\u043e\u043d\u0442\u0430\u0436 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442 \u0438 \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u043e\u0434"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0420\u0443\u0431\u0440\u0438\u043a\u0430 \u043f\u044f\u0442\u043d\u0438\u0447\u043d\u043e\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a05\/3c3\/433\/a053c3433602ec45231dee616c469722.png\" width=\"850\" height=\"513\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/a05\/3c3\/433\/a053c3433602ec45231dee616c469722.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a05\/3c3\/433\/a053c3433602ec45231dee616c469722.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0432\u0441\u043a\u0438\u0434\u043a\u0443 \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0411\u0443\u0434\u044c \u0442\u043e 3D \u043f\u0440\u0438\u043d\u0442\u0435\u0440, \u0438\u043b\u0438 \u0442\u043e \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043b\u0435\u0438\u0442\u044c. \u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u043c\u043e\u043d\u0442\u043e\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0441\u0446\u0438\u043b\u043b\u043e\u0433\u0440\u0430\u0444\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043b\u0438\u0432 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u043d\u043e\u0439. \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u0442\u0447\u0430 \u0438 \u0441\u0438\u043d\u0435\u0439 \u0438\u0437\u043e\u043b\u0435\u043d\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.  <\/p>\n<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u0440\u0443\u0436\u043a\u0430 \u043a\u0440\u043e\u0439\u043a\u0438 \u0438 \u0448\u0438\u0442\u044c\u044f \u043b\u0438\u0448\u0451\u043d \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u0432 \u043f\u043e\u0434\u0430\u0440\u043e\u0447\u043d\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043a\u0443 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 VsCode + CortexM3 MD + JTAG + \u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0432 \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u0435, \u043f\u043e\u0435\u0437\u0434\u0435 \u0438\u043b\u0438 \u0441\u0430\u043c\u043e\u043b\u0451\u0442\u0435.  <\/p>\n<p>\u041a\u0430\u043a \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043f\u0435\u0447\u0430\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c Cortex M3 Medium Density \u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c lcd 12864, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f tmc2209, \u044d\u043d\u043a\u043e\u0434\u0435\u0440 mt6701, JTAG &#8212; \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. <\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442, \u0438, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0434\u043b\u044f \u0438\u0445 \u043c\u043e\u043d\u0442\u0430\u0436\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b45\/dd9\/82f\/b45dd982f17f509c26f22dc7649eb249.png\" alt=\"\u041f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0447\u0435\u043b\u043d\u043e\u043a \u0434\u043b\u044f \u043d\u0430\u043c\u043e\u0442\u043a\u0438 \u043a\u043e\u043b\u0435\u0446\" title=\"\u041f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0447\u0435\u043b\u043d\u043e\u043a \u0434\u043b\u044f \u043d\u0430\u043c\u043e\u0442\u043a\u0438 \u043a\u043e\u043b\u0435\u0446\" width=\"531\" height=\"54\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b45\/dd9\/82f\/b45dd982f17f509c26f22dc7649eb249.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b45\/dd9\/82f\/b45dd982f17f509c26f22dc7649eb249.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0447\u0435\u043b\u043d\u043e\u043a \u0434\u043b\u044f \u043d\u0430\u043c\u043e\u0442\u043a\u0438 \u043a\u043e\u043b\u0435\u0446<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b: \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u044b \u0438 \u043a\u0430\u043f\u0440\u043e\u043d\u043e\u0432\u0430\u044f \u043d\u0438\u0442\u043a\u0430 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043d\u043e\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438, \u0433\u0434\u0435-\u0442\u043e 0.5 \u043c\u043c \u0434\u0438\u0430\u043c\u0435\u0442\u0440, \u0442\u043e\u043b\u0441\u0442\u044b\u0439 \u043f\u043e\u043b\u0438\u044d\u0442\u0438\u043b\u0435\u043d\u043e\u0432\u044b\u0439 \u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u043f\u0440\u043e\u043f\u0438\u043b\u0435\u043d\u043e\u0432\u044b\u0439\/\u043f\u043e\u043b\u0438\u0441\u0442\u0438\u0440\u043e\u043b\u043e\u0432\u044b\u0439 (?) \u0431\u0435\u043b\u044b\u0439 \u043f\u043e\u0440\u043e\u043b\u043e\u043d, \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u044b\u0439 \u0442\u043e\u043b\u0449\u0438\u043d\u043e\u0439 3-4 \u0441\u043c. <\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/12d\/64c\/052\/12d64c052ba24d3920930c67e15be617.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u043f\u043b\u0430\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0442\u0430\u0436\u0430 - \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439, \u0442\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u0433\u0438\u0431\u0430\u0435\u043c\u044b\u0445 \u0444\u0438\u043a\u0441\u0430\u0442\u043e\u0440\u043e\u0432-\u0437\u0430\u0449\u0451\u043b\u043e\u043a \" title=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u043f\u043b\u0430\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0442\u0430\u0436\u0430 - \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439, \u0442\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u0433\u0438\u0431\u0430\u0435\u043c\u044b\u0445 \u0444\u0438\u043a\u0441\u0430\u0442\u043e\u0440\u043e\u0432-\u0437\u0430\u0449\u0451\u043b\u043e\u043a \" width=\"867\" height=\"519\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/12d\/64c\/052\/12d64c052ba24d3920930c67e15be617.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/12d\/64c\/052\/12d64c052ba24d3920930c67e15be617.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u043f\u043b\u0430\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0442\u0430\u0436\u0430 &#8212; \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439, \u0442\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u0433\u0438\u0431\u0430\u0435\u043c\u044b\u0445 \u0444\u0438\u043a\u0441\u0430\u0442\u043e\u0440\u043e\u0432-\u0437\u0430\u0449\u0451\u043b\u043e\u043a <\/figcaption><\/div>\n<\/figure>\n<p> \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u043d\u0442\u0430\u0436\u0430. \u041d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0449\u0435: \u043f\u0440\u043e\u0434\u0435\u0432\u0430\u0435\u043c \u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c \u043f\u0440\u043e\u0442\u044b\u043a\u0430\u0435\u043c \u043f\u043e\u0440\u043e\u043b\u043e\u043d.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/88f\/a35\/fb2\/88fa35fb2131af6d5902b34f6db50737.png\" alt=\"\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 1 - \u043f\u0440\u043e\u0434\u0435\u0442\u044c \u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u043e\u043b\u043e\u043d\" title=\"\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 1 - \u043f\u0440\u043e\u0434\u0435\u0442\u044c \u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u043e\u043b\u043e\u043d\" width=\"254\" height=\"317\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/88f\/a35\/fb2\/88fa35fb2131af6d5902b34f6db50737.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/88f\/a35\/fb2\/88fa35fb2131af6d5902b34f6db50737.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 1 &#8212; \u043f\u0440\u043e\u0434\u0435\u0442\u044c \u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u043e\u043b\u043e\u043d<\/figcaption><\/div>\n<\/figure>\n<p> \u0414\u0430\u043b\u0435\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0445\u043e\u0434\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u043f\u0435\u0442\u043b\u044e \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c, \u0432\u0441\u0451 \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434 \u0440\u0443\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af0\/e86\/568\/af0e8656837c84049eac31468e67210d.png\" alt=\"\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 2 - \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u043f\u0435\u0442\u043b\u0438 \" title=\"\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 2 - \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u043f\u0435\u0442\u043b\u0438 \" width=\"254\" height=\"317\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/af0\/e86\/568\/af0e8656837c84049eac31468e67210d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/af0\/e86\/568\/af0e8656837c84049eac31468e67210d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 2 &#8212; \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u043f\u0435\u0442\u043b\u0438 <\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/382\/ffa\/78a\/382ffa78a1c3185278f38df24852154d.png\" alt=\"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043c\u043e\u043d\u0442\u0430\u0436\u0443\" title=\"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043c\u043e\u043d\u0442\u0430\u0436\u0443\" width=\"786\" height=\"288\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/382\/ffa\/78a\/382ffa78a1c3185278f38df24852154d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/382\/ffa\/78a\/382ffa78a1c3185278f38df24852154d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043c\u043e\u043d\u0442\u0430\u0436\u0443<\/figcaption><\/div>\n<\/figure>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cfb\/44b\/b60\/cfb44bb60d6360de4efeb6b0104d3832.png\" alt=\"\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043c\u043f\u0444\u0438\u0440\u043e\u0432\u0430\u043d\" title=\"\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043c\u043f\u0444\u0438\u0440\u043e\u0432\u0430\u043d\" width=\"534\" height=\"277\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/cfb\/44b\/b60\/cfb44bb60d6360de4efeb6b0104d3832.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cfb\/44b\/b60\/cfb44bb60d6360de4efeb6b0104d3832.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043c\u043f\u0444\u0438\u0440\u043e\u0432\u0430\u043d<\/figcaption><\/div>\n<\/figure>\n<p>\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u043c\u043e\u043d\u0442\u0430\u0436 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0451 \u043a\u0440\u0435\u043f\u0438\u043c \u043a\u0430\u043a \u0445\u043e\u043c\u0443\u0442\u043e\u043c<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a9\/a85\/26d\/6a9a8526d319c16dce28fca8f85e8fab.png\" alt=\"\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u043e\u0447\u043a\u0430\u0445\" title=\"\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u043e\u0447\u043a\u0430\u0445\" width=\"701\" height=\"263\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6a9\/a85\/26d\/6a9a8526d319c16dce28fca8f85e8fab.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a9\/a85\/26d\/6a9a8526d319c16dce28fca8f85e8fab.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u043e\u0447\u043a\u0430\u0445<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0443 \u0438 \u043a\u0430\u043a \u0436\u0435 \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e UART. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043b\u0430\u0442\u043a\u0443 \u0441 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u043e\u0439 FTDI. \u041d\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u0435\u043b\u0430\u0435\u043c 3D-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e. \u041f\u0440\u044f\u0447\u0435\u043c \u0442\u0435\u0441\u0442\u0435\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 \u0432 \u043a\u0430\u0440\u043c\u0430\u043d, \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0446\u0435\u043b\u044f\u0440\u0441\u043a\u0438\u043c \u043d\u043e\u0436\u043e\u043c.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b5e\/813\/e25\/b5e813e256dfc1cdb163e8b2c997c21d.png\" alt=\"3D-\u043c\u043e\u043d\u0442\u0430\u0436\" title=\"3D-\u043c\u043e\u043d\u0442\u0430\u0436\" width=\"862\" height=\"191\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b5e\/813\/e25\/b5e813e256dfc1cdb163e8b2c997c21d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b5e\/813\/e25\/b5e813e256dfc1cdb163e8b2c997c21d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>3D-\u043c\u043e\u043d\u0442\u0430\u0436<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u043a\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0442\u044c\u044e, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c USB, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. <\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee3\/6d8\/eb5\/ee36d8eb542adf0fdddfc315bdd25c8b.png\" alt=\"\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 RX-TX \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u0430\u0439\u0431 \u0441\u043a\u0432\u043e\u0437\u044c \u043c\u043e\u043d\u0442\u0430\u0436\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c\" title=\"\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 RX-TX \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u0430\u0439\u0431 \u0441\u043a\u0432\u043e\u0437\u044c \u043c\u043e\u043d\u0442\u0430\u0436\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c\" width=\"762\" height=\"238\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ee3\/6d8\/eb5\/ee36d8eb542adf0fdddfc315bdd25c8b.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee3\/6d8\/eb5\/ee36d8eb542adf0fdddfc315bdd25c8b.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 RX-TX \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u0430\u0439\u0431 \u0441\u043a\u0432\u043e\u0437\u044c \u043c\u043e\u043d\u0442\u0430\u0436\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c<\/figcaption><\/div>\n<\/figure>\n<p> \u0414\u043b\u044f \u043c\u043e\u043d\u0442\u0430\u0436\u0430 \u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f, \u0447\u0443\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u043c \u0435\u0433\u043e, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u043d\u0442\u0430\u0436 \u0441 \u043d\u0430\u0442\u044f\u0436\u0435\u043d\u0438\u0435\u043c<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/349\/594\/d53\/349594d5383fbfdd187433598d2f8492.png\" alt=\"\u0428\u0430\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u043e\u0442\u0430\u043d \u043a \u0434\u0435\u043c\u043f\u0444\u0435\u0440\u0443\" title=\"\u0428\u0430\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u043e\u0442\u0430\u043d \u043a \u0434\u0435\u043c\u043f\u0444\u0435\u0440\u0443\" width=\"527\" height=\"352\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/349\/594\/d53\/349594d5383fbfdd187433598d2f8492.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/349\/594\/d53\/349594d5383fbfdd187433598d2f8492.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0428\u0430\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u043e\u0442\u0430\u043d \u043a \u0434\u0435\u043c\u043f\u0444\u0435\u0440\u0443<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b74\/718\/ed2\/b74718ed20950f1381b8e45946c7a278.png\" alt=\"\u0423\u0437\u0435\u043b\u043a\u0438 \u0438 \u043f\u0435\u0442\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\" title=\"\u0423\u0437\u0435\u043b\u043a\u0438 \u0438 \u043f\u0435\u0442\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\" width=\"1022\" height=\"356\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b74\/718\/ed2\/b74718ed20950f1381b8e45946c7a278.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b74\/718\/ed2\/b74718ed20950f1381b8e45946c7a278.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0423\u0437\u0435\u043b\u043a\u0438 \u0438 \u043f\u0435\u0442\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e AI \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 0-\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u0443\u044e Embedded-\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0441\u0430\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430 \u0421 \u0438\u043b\u0438 \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0432\u044b\u043c\u0443\u0447\u0438\u0432\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0439\u0442 \u0438\u043b\u0438 \u0442\u0430\u043a\u0442. <\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u043d\u0430\u0431\u043e\u0440\u0430\u043c \u0432\u0430\u0439\u0431\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 md-\u0441\u0430\u043c\u043c\u0430\u0440\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. MD-\u0441\u0430\u043c\u043c\u0430\u0440\u0438 \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u0438\u043b\u043b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c +- \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0438\u0441\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u043c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"markdown\"># \u0421\u0430\u043c\u043c\u0430\u0440\u0438: \u0441\u043a\u0440\u0438\u043f\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u044c\u044e \u0448\u0440\u0438\u0444\u0442\u043e\u0432## \u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u0441\u0435 \u043c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u0434\u0438\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (PNG) \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0438\u0445 \u0438\u043c\u0451\u043d \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.## \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u04421. **\u041f\u043e\u0438\u0441\u043a \u0448\u0440\u0438\u0444\u0442\u043e\u0432**:   * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 `fc-list`.   * \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b (`spacing=100`).2. **\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445**:   * \u041f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f.   * \u0423\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b.   * \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e `basename` \u043e\u0442\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u2014 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432.3. **\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433**:   * \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0440\u0438\u0444\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ImageMagick \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 `\u0418\u043c\u044f\u0424\u0430\u0439\u043b\u0430: abcdefghij`.4. **\u0421\u0431\u043e\u0440\u043a\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f**:   * \u0412\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438.   * \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d PNG\u2011\u0444\u0430\u0439\u043b.## \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438### \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438* `fontconfig` (\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b `fc-list`).* `ImageMagick` (\u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f).  * \u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 ImageMagick: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 `magick` \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0440\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 `convert`.### \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435* `OUTPUT_FILE` \u2014 \u0438\u043c\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: `monospace_filenames.png`).* `FONT_SIZE` \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: 32).* `PREVIEW_TEXT` \u2014 \u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: `abcdefghij`).<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<pre><code class=\"bash\">#!\/bin\/bash# ConfigurationOUTPUT_FILE=\"monospace_filenames.png\"FONT_SIZE=32PREVIEW_TEXT=\"abcdefghij\"# Compatibility check for ImageMagickCOMMAND=$(command -v magick || command -v convert)if [ -z \"$COMMAND\" ]; then    echo \"Error: ImageMagick is not installed.\"    exit 1fiecho \"Generating preview using filenames...\"# 1. Fetch file paths for monospace fonts# 2. Sort to remove duplicates# 3. Use basename to extract just the filename (e.g., 'UbuntuMono-R.ttf')fc-list :spacing=100 -f \"%{file}\\n\" | sort -u | while read -r path; do    if [ -f \"$path\" ]; then        # Get just the filename from the full path        fname=$(basename \"$path\")        $COMMAND -background white \\                 -fill black \\                 -font \"$path\" \\                 -pointsize \"$FONT_SIZE\" \\                 label:\"$fname: $PREVIEW_TEXT\" miff:-    fidone | $COMMAND - -append \"$OUTPUT_FILE\"echo \"Done! Preview saved to: $OUTPUT_FILE\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c7e\/83d\/599\/c7e83d5996fe62598bc318ffb88bedfc.png\" alt=\"\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0447\u0442\u043e \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c\" title=\"\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0447\u0442\u043e \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c\" width=\"187\" height=\"607\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/c7e\/83d\/599\/c7e83d5996fe62598bc318ffb88bedfc.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c7e\/83d\/599\/c7e83d5996fe62598bc318ffb88bedfc.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0447\u0442\u043e \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u041f\u0438\u0448\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 C-\u0444\u0430\u0439\u043b \u0441 \u0431\u0438\u0442\u043c\u0430\u043f\u043e\u043c. \u0420\u0435\u043c\u0430\u0440\u043a\u0430. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043e\u0442 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u043d\u0434\u0435\u0440 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c h-\u0444\u0430\u0439\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0434\u0434\u0438\u043d\u0433 \u0434\u043b\u044f \u0431\u0443\u043a\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, g, \u0443, \u0446 \u0438\u0442\u0434, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u043d\u0435\u0439 \u043b\u0438\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f. <\/p>\n<p>\u041f\u0440\u043e\u043c\u043f\u0442\u044b \u0434\u043b\u044f \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u043b \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043d\u0451\u043c \u0431\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u0438 \u043f\u043e \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0447\u0443\u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u0441 \u0430\u043d\u0433\u043b. \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438. <\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c .c \u0438 .h<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u043e\u0432:<\/p>\n<pre><code class=\"markdown\"># \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Python \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430:* `display_fonts.c` \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 C;* `fontdef.h` \u2014 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439;* `font_preview.png` \u2014 PNG\u2011\u043f\u0440\u0435\u0432\u044c\u044e \u0441\u0435\u0442\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.## \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438### \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0448\u0440\u0438\u0444\u0442\u0430 \u0438 \u0441\u0435\u0442\u043a\u0438* **`FONT_PATH`** \u2014 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0448\u0440\u0438\u0444\u0442\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e `cour.ttf`).* **`FONT_SIZE`** = $12$ \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043f\u0443\u043d\u043a\u0442\u0430\u0445.* **`WIDTH`** = $6$, **`HEIGHT`** = $12$ \u2014 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 (\u0448\u0438\u0440\u0438\u043d\u0430\u00a0\u00d7\u00a0\u0432\u044b\u0441\u043e\u0442\u0430).* **`FIRST_CHAR`** = `ord(' ')` ($32$) \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 ASCII\u2011\u043a\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.* **`LAST_CHAR`** = `ord('}')` ($125$) \u2014 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 ASCII\u2011\u043a\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.* **`COLS`** = $16$ \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u0441\u0435\u0442\u043a\u0435 \u043f\u0440\u0435\u0432\u044c\u044e PNG.### \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0438\u043f\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0438* **`V_ALIGN`** = `\"BOTTOM\"` \u2014 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f: `\"TOP\"`, `\"CENTER\"` \u0438\u043b\u0438 `\"BOTTOM\"`.* **`USE_DUAL_BBOX`** = `True` \u2014 \u0444\u043b\u0430\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0441\u043e\u043a (`True`) \u0438\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a \u0434\u0432\u0438\u0436\u043a\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 (`False`).* **`NON_DESCENDER_OFFSET`** = $-2$ \u2014 \u0441\u0434\u0432\u0438\u0433 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0432\u043d\u0438\u0437, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u2014 \u0432\u0432\u0435\u0440\u0445).* **`DESCENDER_RELATIVE_OFFSET`** = $-1$ \u2014 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u043d\u0438\u0436\u043d\u0438\u043c\u0438 \u0432\u044b\u043d\u043e\u0441\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abg\u00bb, \u00abp\u00bb).* **`DESCENDER_CHARS`** \u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u0432\u044b\u043d\u043e\u0441\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0438\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438: `set(\"gjpqy,;Q\")`.### \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 (\u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u044f)* **`FLIP_HORIZONTAL`** = `False` \u2014 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 (\u0435\u0441\u043b\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e).* **`FLIP_VERTICAL`** = `False` \u2014 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 (\u0435\u0441\u043b\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437).### \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0435\u0432\u044c\u044e* **`APPLY_FLIPS_TO_PREVIEW`** = `False` \u2014 \u0444\u043b\u0430\u0433 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0439 \u043a \u043f\u0440\u0435\u0432\u044c\u044e:    * `True` \u2014 \u043f\u0440\u0435\u0432\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0441\u043f\u043b\u0435\u044f;    * `False` \u2014 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430.## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u04301. **\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0448\u0440\u0438\u0444\u0442\u0430.** \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0438\u0437 `FONT_PATH`. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0448\u0440\u0438\u0444\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.2. **\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.** \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 `FIRST_CHAR` \u0434\u043e `LAST_CHAR`.3. **\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0442\u043b\u0430\u0441\u0430 PNG.** \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (`'1'` mode) \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e `COLS`, `WIDTH` \u0438 `HEIGHT`.4. **\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430:**    * \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430;    * \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 bounding box (\u0441 \u0443\u0447\u0451\u0442\u043e\u043c `USE_DUAL_BBOX`);    * \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 (`V_ALIGN`) \u0438 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 (`NON_DESCENDER_OFFSET`, `DESCENDER_RELATIVE_OFFSET`);    * \u0440\u0438\u0441\u0443\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0441 \u0442\u043e\u0447\u043d\u044b\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c;    * \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e (`FLIP_HORIZONTAL`, `FLIP_VERTICAL`) \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u0440\u0435\u0432\u044c\u044e.5. **\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.** \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0439\u0442\u043e\u0432, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e (\u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c).6. **\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 C\u2011\u0444\u0430\u0439\u043b\u0430.** \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 `display_fonts.c` \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 `uint8_t`.7. **\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.** \u0421\u043e\u0437\u0434\u0430\u0451\u0442 `fontdef.h` \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e (\u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u0444\u043b\u0430\u0433\u0438 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0442.\u00a0\u0434.).8. **\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u044c\u044e.** \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u0430\u0442\u043b\u0430\u0441 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a `font_preview.png` \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f.## \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b* **`display_fonts.c`**    * \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 `fontCRC` \u0441 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432;    * \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 `0xHH`.* **`fontdef.h`**    * \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438;    * \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b (`CRCFONT_WIDTH`, `CRCFONT_HEIGHT`), \u043a\u043e\u0434\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (`CRCFONT_FIRSTCHAR`, `CRCFONT_LASTCHAR`), \u0444\u043b\u0430\u0433\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 (`CRCFONT_VALIGN_BOTTOM`, `CRCFONT_VFLIP`, `CRCFONT_HFLIP`).* **`font_preview.png`**    * \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0432\u044c\u044e \u0441\u0435\u0442\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432;    * \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 $4$\u00a0\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430;    * \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0448\u0440\u0438\u0444\u0442\u0430.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 python-\u0432\u044b\u0432\u043e\u0434<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import mathfrom PIL import Image, ImageFont, ImageDraw# ==================== CONFIGURATION ====================FONT_PATH = \"cour.ttf\"       # Ensure this file is in your script directoryFONT_SIZE = 12                # Font size to renderWIDTH, HEIGHT = 6, 12        # Works perfectly with odd, even, large, or small gridsFIRST_CHAR = ord(' ')        # ASCII range start (32)LAST_CHAR = ord('}')         # ASCII range end (125)COLS = 16                     # Number of columns in the PNG preview grid# --- Alignment &amp; Typographical Tuning ---V_ALIGN = \"BOTTOM\"            # Base alignment strategy: \"TOP\", \"CENTER\", or \"BOTTOM\"USE_DUAL_BBOX = True          # True: Use pixel-perfect masks | False: Use font-engine metrics# --- Fine-Grained Fine Tuning Controls ---NON_DESCENDER_OFFSET = -2     # Shift normal chars (+ down, - up). e.g., -2 lifts them up from baseline.DESCENDER_RELATIVE_OFFSET = -1 # Relative shift for descenders (+ down, - up) to position tails perfectly.# Characters that naturally drop below the baseline horizonDESCENDER_CHARS = set(\"gjpqy,;Q\") # --- Hardware Orientation Inversion Toggles ---FLIP_HORIZONTAL = False       # Mirror Left-to-Right (True if hardware is H-mirrored)FLIP_VERTICAL = False         # Mirror Top-to-Bottom (True if hardware is V-mirrored)# --- Preview Customization ---APPLY_FLIPS_TO_PREVIEW = False # True: preview mimics H\/W mirror | False: normal text preview# =======================================================def generate_font_assets():    try:        font = ImageFont.truetype(FONT_PATH, FONT_SIZE)    except Exception:        print(f\"Warning: Could not load '{FONT_PATH}'. Using default font.\")        font = ImageFont.load_default()    chars_to_gen = [chr(code) for code in range(FIRST_CHAR, LAST_CHAR + 1)]    rows = math.ceil(len(chars_to_gen) \/ COLS)        # Initialize PNG Atlas (1-bit monochrome mode)    atlas = Image.new('1', (COLS * WIDTH, rows * HEIGHT), 0)    bytes_per_col = math.ceil(HEIGHT \/ 8)        c_lines = [        '#include \"fontdef.h\"',        '#include &lt;stdint.h&gt;',        '',        '\/* ',        ' * Ultimate Optimized Font Data',        f' * Configuration - H-Flip: {FLIP_HORIZONTAL}, V-Flip: {FLIP_VERTICAL}, V-Align: {V_ALIGN}',        ' * Packed vertically column-by-column to match display page layout.',        f' * Each column takes {bytes_per_col} bytes based on an exact height of {HEIGHT}px.',        ' *\/',        'const uint8_t fontCRC [] = {'    ]    for i, char in enumerate(chars_to_gen):        char_img = Image.new('1', (WIDTH, HEIGHT), 0)        draw = ImageDraw.Draw(char_img)                # 1. Fetch layout metrics bounding box using Left-Top anchor format        m_left, m_top, m_right, m_bottom = draw.textbbox((0, 0), char, font=font, anchor=\"lt\")                # 2. Fetch True Pixel Mask Rendering Bounding Box        mask_tuple = font.getmask(char).getbbox() if USE_DUAL_BBOX else None                if USE_DUAL_BBOX and mask_tuple:            b_left, b_top, b_right, b_bottom = mask_tuple        else:            b_left, b_top, b_right, b_bottom = m_left, m_top, m_right, m_bottom                tw = b_right - b_left        th = b_bottom - b_top                if tw &lt;= 0 or th &lt;= 0:            x_off, y_off = 0, 0        else:            # Horizontal centering calculation relative to absolute left point            x_off = math.floor((WIDTH - tw) \/ 2.0) - b_left                        # --- VERTICAL ALIGNMENT MATH ---            align = V_ALIGN.upper()            if align == \"TOP\":                base_y = 0 - b_top            elif align == \"BOTTOM\":                base_y = (HEIGHT - th) - b_top            else:  # CENTER                base_y = math.floor((HEIGHT - th) \/ 2.0) - b_top                            # --- SEPARATED OFFSET TRIMMING ENGINE ---            if char in DESCENDER_CHARS:                # Independent shift for descenders relative to the base calculation                y_off = base_y + DESCENDER_RELATIVE_OFFSET            else:                # Independent shift for flat baseline characters                y_off = base_y + NON_DESCENDER_OFFSET        # Draw character safely with explicit positioning anchors        draw.text((x_off, y_off), char, font=font, fill=1, anchor=\"lt\")                # Create matching preview glyph        preview_img = char_img.copy()                # --- Apply Hardware Inversion Adjustments to Data Image ---        if FLIP_HORIZONTAL:            char_img = char_img.transpose(Image.FLIP_LEFT_RIGHT)        if FLIP_VERTICAL:            char_img = char_img.transpose(Image.FLIP_TOP_BOTTOM)                # --- Apply Inversion Options to Preview Image ---        if APPLY_FLIPS_TO_PREVIEW:            if FLIP_HORIZONTAL:                preview_img = preview_img.transpose(Image.FLIP_LEFT_RIGHT)            if FLIP_VERTICAL:                preview_img = preview_img.transpose(Image.FLIP_TOP_BOTTOM)                        # Paste the transformed glyph into the PNG atlas grid        atlas.paste(preview_img, ((i % COLS) * WIDTH, (i \/\/ COLS) * HEIGHT))                pixels = char_img.load()        hex_values = []                # Pack raw pixel bits vertically based on active canvas dimensions        for x in range(WIDTH):            for b_idx in range(bytes_per_col):                byte_val = 0                start_y = b_idx * 8                                for bit in range(8):                    target_y = start_y + bit                    if target_y &lt; HEIGHT:                        if pixels[x, target_y]:                            byte_val |= (1 &lt;&lt; bit)                                            hex_values.append(f\"0x{byte_val:02X}\")                comment_char = '\\\\\\\\' if char == '\\\\' else char        c_lines.append(f\"    {', '.join(hex_values)}, \/* \\\"{comment_char}\\\" *\/\")    c_lines.append(\"};\")        # Write optimized array source data    with open(\"display_fonts.c\", \"w\", encoding=\"utf-8\") as f:        f.write(\"\\n\".join(c_lines) + \"\\n\")            # --- Map high-level configuration properties to hardware flags ---    valign_flag = 1 if V_ALIGN.upper() == \"BOTTOM\" else 0    vflip_flag = 1 if FLIP_VERTICAL else 0    hflip_flag = 1 if FLIP_HORIZONTAL else 0    # Write tracking architecture configuration header definitions    h_lines = [        \"#ifndef FONTDEF_H\",        \"#define FONTDEF_H\",        \"\",        \"#include &lt;stdint.h&gt;\",        \"\",        f\"#define CRCFONT_WIDTH           {WIDTH}\",        f\"#define CRCFONT_HEIGHT          {HEIGHT}\",        f\"#define CRCFONT_BYTES_PER_COL   {bytes_per_col}\",        f\"#define CRCFONT_BYTES_PER_CHAR  {WIDTH * bytes_per_col}\",        f\"#define CRCFONT_FIRSTCHAR       ((uint8_t)'{chr(FIRST_CHAR)}')\",        f\"#define CRCFONT_LASTCHAR        ((uint8_t)'{chr(LAST_CHAR)}')\",        \"\",        \"\/\/ --- NEW CRITICAL GENERATOR FLAGS ---\",        f\"#define CRCFONT_VALIGN_BOTTOM     {valign_flag}  \/\/ 1 if aligned to container bottom, 0 if top\",        f\"#define CRCFONT_VFLIP             {vflip_flag}  \/\/ 1 if bits flow upside down, 0 if normal\",        f\"#define CRCFONT_HFLIP             {hflip_flag}  \/\/ 1 if columns flow right-to-left, 0 if normal\",        \"\",        \"extern const uint8_t fontCRC [];\",        \"\",        \"#endif \/* FONTDEF_H *\/\"    ]        with open(\"fontdef.h\", \"w\", encoding=\"utf-8\") as f:        f.write(\"\\n\".join(h_lines) + \"\\n\")        # Save a scaled preview sheet to inspect orientation transformations visually    preview_scale = 4    atlas_rescaled = atlas.resize(        (atlas.width * preview_scale, atlas.height * preview_scale),         resample=Image.NEAREST    )    atlas_rescaled.save(\"font_preview.png\")    print(f\"Success! Generated stable assets with split character group offset fine-tuning.\")if __name__ == \"__main__\":    generate_font_assets()<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 \u043d\u0430 \u0421<\/p>\n<details class=\"spoiler\">\n<summary>\u0421-\u0440\u0435\u043d\u0434\u0435\u0440 (\u043f\u0440\u0438\u043c\u0435\u0440)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">\/\/ External display variables referenced by your graphics engineextern uint8_t display_buffer[DISPLAY_WIDTH * DISPLAY_PAGES];extern uint8_t display_update_needed;uint8_t Display_DrawCharFont(uint8_t x, uint8_t y, char ch){    \/\/ 1. Instant out-of-bounds boundary validation    if (ch &lt; CRCFONT_FIRSTCHAR || ch &gt; CRCFONT_LASTCHAR || x &gt;= DISPLAY_WIDTH || y &gt;= DISPLAY_HEIGHT) {        return 0;    }    \/\/ 2. Pre-calculate flash memory character pointer offset dynamically    const uint32_t char_offset = (uint32_t)(ch - CRCFONT_FIRSTCHAR) * CRCFONT_BYTES_PER_CHAR;    const uint8_t *font_ptr = &amp;fontCRC[char_offset];    \/\/ 3. Compute buffer page mapping offsets and safe drawing boundaries    uint8_t start_page = y &gt;&gt; 3;         \/\/ Fast division by 8    uint8_t bit_shift  = y &amp; 0x07;       \/\/ Fast modulo 8 calculation    uint8_t max_cols   = (x + CRCFONT_WIDTH &lt;= DISPLAY_WIDTH) ? CRCFONT_WIDTH : (DISPLAY_WIDTH - x);    \/\/ 4. Generate dynamic master mask based strictly on font height macro (12 bits)    uint32_t master_mask = (1UL &lt;&lt; CRCFONT_HEIGHT) - 1UL;    \/\/ 5. Blit vertical pixel strips across screen columns    for (uint8_t col = 0; col &lt; max_cols; col++) {                \/\/ --- FINAL LEFT-RIGHT MIRROR CORRECTION ---        \/\/ Restore standard left-to-right sequence to achieve final horizontal orientation        uint8_t target_col = col;                 \/\/ --- NATIVE LITTLE-ENDIAN WORD ASSEMBLY ---        uint32_t glyph_32 = 0;        for (uint8_t b = 0; b &lt; CRCFONT_BYTES_PER_COL; b++) {            glyph_32 |= ((uint32_t)font_ptr[(target_col * CRCFONT_BYTES_PER_COL) + b]) &lt;&lt; (b * 8);        }        \/\/ Clean out any remaining padding artifacts outside the active font height        glyph_32 &amp;= master_mask;        \/\/ --- VERTICAL MIRROR PIPELINE ---        \/\/ Reverses the bits within the active 12-bit window to keep text right-side up        uint32_t flipped_glyph = 0;        for (uint8_t i = 0; i &lt; CRCFONT_HEIGHT; i++) {            if (glyph_32 &amp; (1UL &lt;&lt; i)) {                flipped_glyph |= (1UL &lt;&lt; (CRCFONT_HEIGHT - 1 - i));            }        }        glyph_32 = flipped_glyph;                \/\/ Dynamically align both font strip and mask to coordinate 'y' bit shift        uint32_t shifted_glyph = glyph_32 &lt;&lt; bit_shift;        uint32_t shifted_mask  = master_mask &lt;&lt; bit_shift;        uint16_t base_idx = x + col;        uint8_t current_page = start_page;        \/\/ Loop dynamically through display pages until shifted mask bits are exhausted        while (shifted_mask &gt; 0) {            if (current_page &lt; DISPLAY_PAGES) {                uint8_t p_mask = (uint8_t)(shifted_mask &amp; 0xFFUL);                                if (p_mask) {                    uint8_t p_data = (uint8_t)(shifted_glyph &amp; 0xFFUL);                    uint16_t page_idx = (uint16_t)current_page * DISPLAY_WIDTH + base_idx;                                        display_buffer[page_idx] &amp;= ~p_mask;                    display_buffer[page_idx] |= p_data;                }            } else {                break;             }            shifted_glyph &gt;&gt;= 8;            shifted_mask  &gt;&gt;= 8;            current_page++;        }    }    display_update_needed = 1;    return (CRCFONT_WIDTH + 1); }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 &#8212; \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442 \u0438 \u0435\u0433\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0440\u0430\u0442\u043d\u043e\u0435 8, 4, 2 \u0438\u0442\u0434<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0431\u0438\u0442\u043c\u0430\u043f\u0430:<\/p>\n<pre><code class=\"cpp\">\/\/\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u0438\u043a#ifndef FONTDEF_H#define FONTDEF_H#include &lt;stdint.h&gt;#define CRCFONT_WIDTH           6#define CRCFONT_HEIGHT          12#define CRCFONT_BYTES_PER_COL   2#define CRCFONT_BYTES_PER_CHAR  12#define CRCFONT_FIRSTCHAR       ((uint8_t)' ')#define CRCFONT_LASTCHAR        ((uint8_t)'}')\/\/ --- NEW CRITICAL GENERATOR FLAGS ---#define CRCFONT_VALIGN_BOTTOM     1  \/\/ 1 if aligned to container bottom, 0 if top#define CRCFONT_VFLIP             0  \/\/ 1 if bits flow upside down, 0 if normal#define CRCFONT_HFLIP             0  \/\/ 1 if columns flow right-to-left, 0 if normalextern const uint8_t fontCRC [];#endif \/* FONTDEF_H *\/\/\/\u0434\u0430\u043d\u043d\u044b\u0435#include \"fontdef.h\"#include &lt;stdint.h&gt;\/*  * Ultimate Optimized Font Data * Configuration - H-Flip: False, V-Flip: False, V-Align: BOTTOM * Packed vertically column-by-column to match display page layout. * Each column takes 2 bytes based on an exact height of 12px. *\/const uint8_t fontCRC [] = {    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \/* \" \" *\/    0x00, 0x00, 0x00, 0x00, 0x7C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \/* \"!\" *\/    0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, \/* \"\"\" *\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 &#8212; \u0434\u0430\u043d\u043d\u044b\u0439 \u0421-\u0441\u043a\u0435\u0442\u0447 \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0441\u043e\u0437\u043d\u0430\u0432\u0430\u0435\u043c \u0418\u0418, \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u0435\u043d \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u0447\u0435\u0433\u043e \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e.<\/p>\n<p>\u041f\u0430\u0434\u0434\u0438\u043d\u0433 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0444\u0430\u0439\u043b\u0430 \u0441\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u043c<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6f1\/60e\/267\/6f160e267332084e4704f6aea153f47a.png\" width=\"388\" height=\"287\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/6f1\/60e\/267\/6f160e267332084e4704f6aea153f47a.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6f1\/60e\/267\/6f160e267332084e4704f6aea153f47a.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<\/div>\n<\/details>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0448\u0440\u0438\u0444\u0442\u043e\u0432<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dd0\/2ec\/aae\/dd02ecaae6432fd7b0432acf0a428697.png\" alt=\"\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b: \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430 \u0437\u0430\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435 - \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a (\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u044b\u043c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0431\u0435\u0437 \u043c\u0430\u0441\u043a\u0438)\" title=\"\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b: \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430 \u0437\u0430\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435 - \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a (\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u044b\u043c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0431\u0435\u0437 \u043c\u0430\u0441\u043a\u0438)\" width=\"853\" height=\"318\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/dd0\/2ec\/aae\/dd02ecaae6432fd7b0432acf0a428697.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dd0\/2ec\/aae\/dd02ecaae6432fd7b0432acf0a428697.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b: \u0442\u0435\u043b\u0435\u0444\u043e\u043d \u0444\u043e\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0440\u0443\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0430 \u0437\u0430\u0434\u043d\u0435\u043c \u043f\u043b\u0430\u043d\u0435 &#8212; \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a (\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u044b\u043c \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0431\u0435\u0437 \u043c\u0430\u0441\u043a\u0438)<\/figcaption><\/div>\n<\/figure>\n<p>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 png-&gt;\u0421 \u0431\u0438\u0442\u043c\u0430\u043f \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u0441\u0442\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0447\/\u0431 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0412\u043d\u0430\u0447\u0430\u043b\u0435 RGB-&gt;B\/W \u0437\u0430\u0442\u0435\u043c \u0432\u0441\u0451 \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 127 &#8212; \u0431\u0435\u043b\u043e\u0435, \u043c\u0435\u043d\u044c\u0448\u0435 &#8212; \u0447\u0451\u0440\u043d\u043e\u0435. \u041f\u0438\u043a\u0441\u0435\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"markdown\"># \u0421\u0430\u043c\u043c\u0430\u0440\u0438 \u043a\u043e\u0434\u0430: \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 bitmap\u2011\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c## \u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Python \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u044b\u0439 bitmap \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 C\u2011\u0444\u0430\u0439\u043b\u044b (`image.h` \u0438 `image.c`) \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445).## \u0418\u043c\u043f\u043e\u0440\u0442\u044b- `os` \u2014 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f;- `math` \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u0434\u0435 (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e);- `PIL.Image` \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435, \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f).## \u0424\u0443\u043d\u043a\u0446\u0438\u044f `generate_bitmap`### \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b- `image_path` \u2014 \u043f\u0443\u0442\u044c \u043a \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044e;- `output_name` (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e `\"my_generated_image\"`) \u2014 \u0438\u043c\u044f \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 C\u2011\u043a\u043e\u0434\u0435;- `max_w` (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 128) \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f;- `max_h` (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 64) \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.### \u042d\u0442\u0430\u043f\u044b \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f1. **\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f**     \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 `Image.open()`, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b.2. **\u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435**     - \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435 (`scale_w`) \u0438 \u0432\u044b\u0441\u043e\u0442\u0435 (`scale_h`).   - \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 (`scale_factor`), \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438.   - \u0415\u0441\u043b\u0438 `scale_factor &lt; 1.0`, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e `resize()` (\u043c\u0435\u0442\u043e\u0434 Bicubic) \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c.3. **\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0432 \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u043e\u0433\u043e**     \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c `'L'` (grayscale).4. **\u0411\u0438\u043d\u0430\u0440\u0438\u0437\u0430\u0446\u0438\u044f (\u0447\u0451\u0440\u043d\u043e\u2011\u0431\u0435\u043b\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)**     \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u043e\u0433 `127`: \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u044f\u0440\u0447\u0435 \u2014 \u0431\u0435\u043b\u044b\u0435 (`1`), \u0442\u0435\u043c\u043d\u0435\u0435 \u2014 \u0447\u0451\u0440\u043d\u044b\u0435 (`0`). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 `'1'`.5. **\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u0431\u0430\u0439\u0442\u044b**     - \u041f\u0438\u043a\u0441\u0435\u043b\u0438 (1 \u0431\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439) \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u0431\u0430\u0439\u0442\u044b (8 \u0431\u0438\u0442), \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441\u043e \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u0431\u0438\u0442\u0430 (MSB first).   - \u0415\u0441\u043b\u0438 \u043e\u0431\u0449\u0435\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0435 \u043a\u0440\u0430\u0442\u043d\u043e 8, \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0431\u0438\u0442\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0443\u043b\u044f\u043c\u0438.6. **\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f `image.h`**     \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441:   - \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (`#ifndef IMAGE_H_`);   - \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c `&lt;stdint.h&gt;`;   - \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b `DisplayImage_t` (\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u0448\u0438\u0440\u0438\u043d\u0430, \u0432\u044b\u0441\u043e\u0442\u0430);   - \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c `output_name`.7. **\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f `image.c`**     \u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0444\u0430\u0439\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441:   - \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c `output_name_data` \u0442\u0438\u043f\u0430 `const uint8_t`, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435, `0xXX`);   - \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b `DisplayImage_t` \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435, \u0448\u0438\u0440\u0438\u043d\u044b \u0438 \u0432\u044b\u0441\u043e\u0442\u044b.## \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u043b\u043e\u043a (`if __name__ == \"__main__\":`)- \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 `logo.png`.- \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u043d\u0430\u0439\u0434\u0435\u043d, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 `generate_bitmap()` \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 `max_w=128` \u0438 `max_h=64`.- \u0415\u0441\u043b\u0438 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435\u0442, \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.## \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430:- \u0432\u044b\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 (\u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e) \u0438 \u0443\u0441\u043f\u0435\u0445\u0435;- \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u044b `image.h` \u0438 `image.c`, \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<details class=\"spoiler\">\n<summary>\u041f\u0438\u0442\u043e\u043d-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0421-\u0431\u0438\u0442\u043c\u0430\u043f\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import osimport mathfrom PIL import Imagedef generate_bitmap(image_path, output_name=\"my_generated_image\", max_w=128, max_h=64):    # 1. Open the image    img = Image.open(image_path)    orig_w, orig_h = img.size        # 2. Calculate proportional scale down factors    scale_w = max_w \/ orig_w    scale_h = max_h \/ orig_h    scale_factor = min(scale_w, scale_h)        # Only downscale if the image exceeds display limits    if scale_factor &lt; 1.0:        new_w = int(orig_w * scale_factor)        new_h = int(orig_h * scale_factor)        # Apply high-quality Bicubic scaling        img = img.resize((new_w, new_h), Image.Resampling.BICUBIC)        print(f\"Rescaled image from {orig_w}x{orig_h} down to {new_w}x{new_h}\")        # 3. Convert to grayscale ('L' mode)    img_gray = img.convert('L')        # 4. Posterize by 255\/2 threshold (127) to convert to sharp black and white    threshold = 127    img_bw = img_gray.point(lambda p: 1 if p &gt; threshold else 0, mode='1')        width, height = img_bw.size    pixels = list(img_bw.getdata())        # 5. Pack 1-bit pixels into array of bytes (MSB first)    byte_array = []    current_byte = 0    bit_count = 0        for pixel in pixels:        current_byte = (current_byte &lt;&lt; 1) | pixel        bit_count += 1                if bit_count == 8:            byte_array.append(current_byte)            current_byte = 0            bit_count = 0                # Pad trailing bits if total pixel count is not a multiple of 8    if bit_count &gt; 0:        current_byte = current_byte &lt;&lt; (8 - bit_count)        byte_array.append(current_byte)    # 6. Generate image.h    with open(\"image.h\", \"w\") as h_file:        h_file.write(\"#ifndef IMAGE_H_\\n#define IMAGE_H_\\n\\n\")        h_file.write(\"#include &lt;stdint.h&gt;\\n\\n\")        h_file.write(\"typedef struct {\\n    const uint8_t *data;\\n    uint8_t width;\\n    uint8_t height;\\n} DisplayImage_t;\\n\\n\")        h_file.write(f\"extern const DisplayImage_t {output_name};\\n\\n\")        h_file.write(\"#endif \/\/ IMAGE_H_\\n\")    # 7. Generate image.c    with open(\"image.c\", \"w\") as c_file:        c_file.write('#include \"image.h\"\\n\\n')        c_file.write(f\"static const uint8_t {output_name}_data[{len(byte_array)}] = {{\\n    \")                for i, byte in enumerate(byte_array):            c_file.write(f\"0x{byte:02X}, \")            if (i + 1) % 12 == 0:                c_file.write(\"\\n    \")                        c_file.write(\"\\n};\\n\\n\")        c_file.write(f\"const DisplayImage_t {output_name} = {{\\n\")        c_file.write(f\"    .data = {output_name}_data,\\n\")        c_file.write(f\"    .width = {width},\\n\")        c_file.write(f\"    .height = {height}\\n\")        c_file.write(\"};\\n\")    print(f\"Success! Generated image.h and image.c for '{image_path}' ({width}x{height})\")if __name__ == \"__main__\":    target_image = \"logo.png\"         if os.path.exists(target_image):        # Passes target layout max dimensions (128 width, 64 height)        generate_bitmap(target_image, max_w=128, max_h=64)    else:        print(f\"Please place your source image as '{target_image}' or edit the script path variable.\")<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0413\u043e\u0442\u043e\u0432\u0430\u044f \u043f\u0438\u043a\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u043a\u0430<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/830\/796\/f55\/830796f5577578b66a3bb8207e94eeb8.png\" width=\"37\" height=\"41\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/830\/796\/f55\/830796f5577578b66a3bb8207e94eeb8.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/830\/796\/f55\/830796f5577578b66a3bb8207e94eeb8.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0421-\u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<pre><code class=\"cpp\">\/\/\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u0438\u043a#ifndef IMAGE_H_#define IMAGE_H_#include &lt;stdint.h&gt;typedef struct {    const uint8_t *data;    uint8_t width;    uint8_t height;} DisplayImage_t;extern const DisplayImage_t my_generated_image;#endif \/\/ IMAGE_H_\/\/ \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f#include \"image.h\"static const uint8_t my_generated_image_data[190] = {    0xEF, 0xF8, 0x29, 0xFF, 0xFF, 0x1C, 0x00, 0x7F, 0xFE, 0xEC, 0x01, 0x67,    0xFF, 0xFE, 0x80, 0x09, 0xFF, 0xBF, 0xD0, 0x12, 0x8E, 0x87, 0xE0, 0x06,    0x96, 0x66, 0x3E, 0x1C, 0x3F, 0xD1, 0x0C, 0x04, 0x15, 0x83, 0x18, 0x04,....  const DisplayImage_t my_generated_image = {    .data = my_generated_image_data,    .width = 37,    .height = 41};...  \/\/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u043f\u0438\u043a\u0442\u043e\u0440\u0433\u0440\u0430\u043c\u043c\u043a\u0438    <\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 &#8212; \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0444\u043e\u0442\u043e<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u0441\u0430\u043c\u043c\u0430\u0440\u0438 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u044f (\u043f\u043e\u043b\u043d\u044b\u0439) \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0441 Python-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u0432. <\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0430\u043c\u043c\u0430\u0440\u0438 \u043f\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"markdown\"># \u0421\u0430\u043c\u043c\u0430\u0440\u0438 \u043f\u043e \u0444\u0430\u0439\u043b\u0443 `display_draw.c`\u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u0438 \u0432\u044b\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c 128x64, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c ST7565R (\u0438\u043b\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u043c). \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438\u0437 `display.c`.## \u041e\u0431\u0449\u0438\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f- **\u0426\u0435\u043b\u044c \u0444\u0430\u0439\u043b\u0430**: \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043b\u0438\u043d\u0438\u0439, \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432, \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.- **\u0420\u0430\u0437\u043c\u0435\u0440\u044b \u0434\u0438\u0441\u043f\u043b\u0435\u044f**: 128 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443, 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u0432\u044b\u0441\u043e\u0442\u0443. \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c (8 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u043e 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u0432\u044b\u0441\u043e\u0442\u0443).- **\u0411\u0443\u0444\u0435\u0440\u044b**: \u0424\u0430\u0439\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0435 \u0431\u0443\u0444\u0435\u0440\u044b `display_buffer` \u0438 `last_display_buffer`, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 `display.c`. \u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f `display_update_needed` \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f.## \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b### 1. `Display_SetPixel(x, y, color)`\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0438\u043b\u0438 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.- **\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c**:   - \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0434\u0438\u0441\u043f\u043b\u0435\u044f.  - \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442, \u043a \u043a\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 (`page = y \/ 8`) \u0438 \u043a\u0430\u043a\u043e\u043c\u0443 \u0431\u0430\u0439\u0442\u0443 \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u044c.  - \u041c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0431\u0438\u0442 \u0432 \u0431\u0430\u0439\u0442\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (`|=` \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, `&amp;=~` \u0434\u043b\u044f \u0441\u0431\u0440\u043e\u0441\u0430).  - \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0444\u043b\u0430\u0433 `display_update_needed`.### 2. `Display_DrawString(x, y, str)`\u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439.- **\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c**:  - \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.  - \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.  - \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 `Display_DrawCharFont`, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0448\u0438\u0440\u0438\u043d\u0443.  - \u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443 `x` \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0441\u043f\u0440\u0430\u0432\u0430 \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e.  - \u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u043f\u0440\u0430\u0432\u044b\u0439 \u043a\u0440\u0430\u0439 \u044d\u043a\u0440\u0430\u043d\u0430.### 3. `Display_DrawCharFont(x, y, ch)`\u0420\u0438\u0441\u0443\u0435\u0442 \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0448\u0440\u0438\u0444\u0442\u0430 (fontCRC) \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435. \u042d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0448\u0440\u0438\u0444\u0442\u0430.- **\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c**:  - **\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u0440\u0430\u043d\u0438\u0446**: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0438 \u0447\u0442\u043e \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 `x` \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u044d\u043a\u0440\u0430\u043d\u0430.  - **\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0448\u0440\u0438\u0444\u0442\u0430**: \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 `fontCRC` \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0434\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.  - **\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438**: \u0421\u0438\u043c\u0432\u043e\u043b \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e). \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c (`start_page`).  - **\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (Mirroring)**: \u0414\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 `fontCRC` \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u0432\u0438\u0434\u0435. \u041f\u0435\u0440\u0435\u0434 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \"\u043f\u0435\u0440\u0435\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\" \u0431\u0438\u0442\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b\u0441\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.  - **\u041f\u043e\u0431\u043b\u043e\u0447\u043d\u0430\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430**: \u0421\u0438\u043c\u0432\u043e\u043b \u0440\u0438\u0441\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f 32-\u0431\u0438\u0442\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e.  - **\u0421\u0434\u0432\u0438\u0433 \u0438 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435**: \u0421\u043b\u043e\u0432\u043e \u0441\u043e \u0441\u0434\u0432\u0438\u043d\u0443\u0442\u043e \u043d\u0430 `bit_shift` \u0431\u0438\u0442\u043e\u0432 (\u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b) \u0438 \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u0430\u0441\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438.  - **\u041c\u0435\u0436\u0441\u0442\u0440\u043e\u0447\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435**: \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0448\u0438\u0440\u0438\u043d\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u043f\u043b\u044e\u0441 \u043e\u0434\u0438\u043d \u043f\u0438\u043a\u0441\u0435\u043b\u044c (\u043f\u0440\u043e\u0431\u0435\u043b), \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.### 4. `Display_DrawLine`, `Display_DrawRectangle`, `Display_FillRectangle`\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043b\u0438\u043d\u0438\u0439, \u043a\u043e\u043d\u0442\u0443\u0440\u043e\u0432 \u0438 \u0437\u0430\u043a\u0440\u0430\u0448\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.- **\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c**:  - `DrawHLine` \u0438 `DrawVLine`: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0446\u0438\u043a\u043b \u0438 `Display_SetPixel` \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432\u0434\u043e\u043b\u044c \u043b\u0438\u043d\u0438\u0438.  - `DrawRectangle`: \u0420\u0438\u0441\u0443\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u043b\u0438\u043d\u0438\u0438 (\u0434\u0432\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435, \u0434\u0432\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435).  - `FillRectangle`: \u0417\u0430\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 \u0446\u0438\u043a\u043b\u0435.### 5. `Display_DrawImage(img, configuration)`\u0420\u0438\u0441\u0443\u0435\u0442 \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u0442\u0440\u0430\u0436\u0435\u043d\u0438\u044f.- **\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c**:  - \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b `start_x` \u0438 `start_y` \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u043b\u0430\u0433\u043e\u0432 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f (\u0446\u0435\u043d\u0442\u0440, \u043f\u0440\u0430\u0432\u043e, \u043d\u0438\u0437 \u0438 \u0442.\u0434.).  - \u0426\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.  - \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0446\u0432\u0435\u0442 \u043f\u043e \u0431\u0438\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0441\u043a\u0435 \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 `img-&gt;data`.  - \u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0444\u043b\u0430\u0433\u0438 `FLIP_LR` \u0438\u043b\u0438 `FLIP_TB`, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0442\u0441\u044f.  - \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 `Display_SetPixel` \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c `start_x` \u0438 `start_y`. ## \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438- **\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f**: \u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0434\u043b\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u0440\u0438 \u0432\u044b\u0445\u043e\u0434\u0435 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u044d\u043a\u0440\u0430\u043d\u0430, \u0447\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.- **\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c**: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0431\u0435\u0437\u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.- **\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438**: \u0424\u0430\u0439\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 `fontdef.h` (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430), `display.h` (\u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0438 \u0431\u0443\u0444\u0435\u0440\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439) \u0438 `image.h` (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f).<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0421\u0430\u043c\u043c\u0430\u0440\u0438 \u0434\u043b\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0438 \u043c\u043e\u0434\u0443\u043b\u044f SPI \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DMA<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"markdown\"># \u0421\u0430\u043c\u043c\u0430\u0440\u0438: display.c\u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043f\u043b\u0435\u044f LCD12864\/ER3805\/ST7565R \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 STM32. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 DMA \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u044e, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u044f\u0434\u0440\u043e \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b.## \u041e\u0431\u0449\u0438\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SPI. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438, \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0432\u043e\u0439\u043d\u0443\u044e \u0431\u0443\u0444\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044e (`display_buffer` \u0438 `last_display_buffer`):*   **`display_buffer`**: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0438\u0441\u0443\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b (\u043b\u0438\u043d\u0438\u0438, \u0441\u0442\u0440\u043e\u043a, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f).*   **`last_display_buffer`**: \u0411\u0443\u0444\u0435\u0440 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043a\u0430\u0434\u0440\u0430. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u0441\u0442\u0440\u043e\u043a\u0438) \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 (`differential update`), \u0447\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\ufffd\ufffd\u0443.\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f `Display_Update()`, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u044e.## \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 DMADMA (Direct Memory Access) \u2014 \u044d\u0442\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0439\u043d\u044b\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, SPI) \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u043c\u0438\u043d\u0443\u044f CPU. \u042d\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0432\u0441\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 (1024 \u0431\u0430\u0439\u0442\u0430) \u043f\u043e SPI \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u043f\u0440\u043e\u0441\u0430 (polling) \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u044f\u0434\u0440\u043e.### 1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DMA (\u0432 `main.c`)\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DMA \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 `SPI1_DMA_Init()`, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 `main()` *\u0434\u043e* \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u044f (`Display_Init()`).*   **\u041a\u0430\u043d\u0430\u043b\u044b DMA**: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043a\u0430\u043d\u0430\u043b\u0430 DMA1:    *   `DMA1_Channel2` \u2014 \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 SPI (`SPI1_RX`).    *   `DMA1_Channel3` \u2014 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e SPI (`SPI1_TX`).*   **\u0411\u0443\u0444\u0435\u0440\u044b**: \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u0431\u0443\u0444\u0435\u0440\u044b \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:    *   `SPI1_TxBuffer[1024]` \u2014 \u0431\u0443\u0444\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.    *   `SPI1_RxBuffer[1024]` \u2014 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0438\u0435\u043c\u0430 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0442 \u0434\u0438\u0441\u043f\u043b\u0435\u044f, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0438\u043b\u0438 \u043a\u0430\u043a \"dummy\" \u0431\u0443\u0444\u0435\u0440).*   **\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043a\u0430\u043d\u0430\u043b\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (DMA1_Channel3)**:    *   `DMA_PeripheralBaseAddr`: \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 SPI (`&amp;(SPI1-&gt;DR)`).    *   `DMA_MemoryBaseAddr`: \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.    *   `DMA_DIR`: \u041d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 `DMA_DIR_PeripheralDST` (\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044e).    *   `DMA_BufferSize`: \u0420\u0430\u0437\u043c\u0435\u0440 \u0431\u0443\u0444\u0435\u0440\u0430 (1024 \u0431\u0430\u0439\u0442\u0430).    *   `DMA_MemoryInc`: \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e (`DMA_MemoryInc_Enable`), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0431\u0443\u0444\u0435\u0440.    *   `DMA_PeripheralInc`: \u0423\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e (`DMA_PeripheralInc_Disable`), \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 SPI.    *   `DMA_Mode`: \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 `DMA_Mode_Normal`, \u0447\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.    *   `DMA_Priority`: \u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 `High`.*   **\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 DMA \u0434\u043b\u044f SPI**: \u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u044b DMA \u0434\u043b\u044f SPI:    *   `SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE)` \u2014 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 DMA \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.*   **\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439**: \u0412\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0442 DMA \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (`DMA_IT_TC`), \u0447\u0442\u043e\u0431\u044b CPU \u043c\u043e\u0433 \u0443\u0437\u043d\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d\u0430.### 2. \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c DMA\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043f\u043b\u0435\u044f (\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u0437 `Display_Update()`) \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432:1.  **\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 (Polling)**: \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f (\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446) \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434. \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u043f\u0440\u043e\u0441\u0430 (\u0431\u0435\u0437 DMA), \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.2.  **\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f DMA-\u043f\u0435\u0440\u0435\u0441\u044b\u043b\u043a\u0438 (DMA)**: \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f `SPI1_DMA_Transfer()`. \u041e\u043d\u0430:    *   \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b\u044b DMA.    *   \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 (`txData`) \u043a\u0430\u043a \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.    *   \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (128 \u0431\u0430\u0439\u0442 \u2014 \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u0438\u0441\u043f\u043b\u0435\u044f).    *   \u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0444\u043b\u0430\u0433\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438.    *   \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b\u044b DMA (\u0441\u043d\u0430\u0447\u0430\u043b\u0430 `DMA1_Channel2`, \u0437\u0430\u0442\u0435\u043c `DMA1_Channel3`).        \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438: DMA-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0431\u0430\u0439\u0442 \u0438\u0437 `display_buffer` \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 `SPI1-&gt;DR`. SPI \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u043f\u043e \u0448\u0438\u043d\u0435. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 CPU.3.  **\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f (\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0430)**: \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f `SPI1_DMA_WaitForTransfer()`. \u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0446\u0438\u043a\u043b \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430 `SPI1_TransferComplete`, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f `DMA1_Channel3_IRQHandler()` \u043f\u0440\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 `SPI_I2S_FLAG_BSY` \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 SPI, \u0447\u0442\u043e\u0431\u044b \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u0438\u0442 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043a\u0438\u043d\u0443\u043b \u0432\u044b\u0432\u043e\u0434 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.### 3. \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0438\u0433\u0440\u0430\u044e\u0442 \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u0440\u043e\u043b\u044c \u0432 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 DMA \u0438 SPI:*   **`DMA1_Channel3_IRQHandler()`**: \u042d\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442, \u043a\u043e\u0433\u0434\u0430 DMA \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0443 \u0432\u0441\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0432 `CNDTR`. \u0412 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 `SPI1_TransferComplete = 1`, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 `SPI1_DMA_WaitForTransfer()` \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u043b\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0446\u0438\u043a\u043b\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f.*   **`DMA1_Channel2_IRQHandler()`**: \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u0438\u0435\u043c\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 DMA). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0444\u043b\u0430\u0433.*   **\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0432 `SPI1_DMA_Init()`**: \u041f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u043d\u0430\u043b\u043e\u0432 DMA1 Channel2 \u0438 Channel3 \u044f\u0432\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 `NVIC_EnableIRQ(DMA1_Channel2_IRQn)` \u0438 `NVIC_EnableIRQ(DMA1_Channel3_IRQn)`.\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f DMA \u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u043d\u044b\u043c SPI-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0430\u044f CPU \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430, \u043c\u043e\u0442\u043e\u0440\u0430 \u0438\u043b\u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043a\u0430\u0434\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435:<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/464\/de3\/d8f\/464de3d8f491966873f0f913fb6c77e3.png\" width=\"323\" height=\"58\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/464\/de3\/d8f\/464de3d8f491966873f0f913fb6c77e3.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/464\/de3\/d8f\/464de3d8f491966873f0f913fb6c77e3.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0418\u0418 \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 QEMU, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0432\u043a\u043b\u044e\u0447\u0430\u044f assertion, \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0441\u0442\u0435\u043a\u0430, \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u0435\u043a\u0446\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 DMA, \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438 \u0438 \u0434\u0440. <\/p>\n<p>\u042f\u0437\u044b\u043a Markdown, \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 \u0432 \u0440\u0435\u0439\u0442\u0438\u043d\u0433\u0430\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0443\u0436\u0435 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0443\u0449\u0435\u043c. \u0422\u0430\u043a\u0436\u0435, \u0432\u0430\u0436\u043d\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 MCP, \u043f\u0440\u043e\u043c\u043f\u0442-\u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0438, \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0438\u043b\u043b\u044b, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u044d\u043c\u0431\u0435\u0434\u0434\u0435\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u044b \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u043d\u0435\u0439 \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u043e\u043c. <\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1037042\/\">https:\/\/habr.com\/ru\/articles\/1037042\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u0443\u0431\u0440\u0438\u043a\u0430 \u043f\u044f\u0442\u043d\u0438\u0447\u043d\u043e\u0435.\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u0432\u0441\u043a\u0438\u0434\u043a\u0443 \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435. \u0411\u0443\u0434\u044c \u0442\u043e 3D \u043f\u0440\u0438\u043d\u0442\u0435\u0440, \u0438\u043b\u0438 \u0442\u043e \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043a\u043b\u0435\u0438\u0442\u044c. \u041d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439, \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0440\u0435\u043c\u043e\u043d\u0442\u043e\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u043e\u0441\u0442\u044c \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u043e\u0441\u0446\u0438\u043b\u043b\u043e\u0433\u0440\u0430\u0444\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043b\u0438\u0432 \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u043d\u043e\u0439. \u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0441\u043a\u043e\u0442\u0447\u0430 \u0438 \u0441\u0438\u043d\u0435\u0439 \u0438\u0437\u043e\u043b\u0435\u043d\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.  \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043a\u0440\u0443\u0436\u043a\u0430 \u043a\u0440\u043e\u0439\u043a\u0438 \u0438 \u0448\u0438\u0442\u044c\u044f \u043b\u0438\u0448\u0451\u043d \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u0440\u043e\u0434\u0430 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u043e\u0432 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u0432 \u043f\u043e\u0434\u0430\u0440\u043e\u0447\u043d\u0443\u044e \u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043a\u0443 \u0434\u043b\u044f \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 VsCode + CortexM3 MD + JTAG + \u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0432 \u0430\u0432\u0442\u043e\u0431\u0443\u0441\u0435, \u043f\u043e\u0435\u0437\u0434\u0435 \u0438\u043b\u0438 \u0441\u0430\u043c\u043e\u043b\u0451\u0442\u0435.  \u041a\u0430\u043a \u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u043f\u0435\u0447\u0430\u0442\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c Cortex M3 Medium Density \u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u043c lcd 12864, \u0434\u0440\u0430\u0439\u0432\u0435\u0440 \u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f tmc2209, \u044d\u043d\u043a\u043e\u0434\u0435\u0440 mt6701, JTAG &#8212; \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0445 \u043f\u043b\u0430\u0442, \u0438, \u043a\u0430\u043a \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0434\u043b\u044f \u0438\u0445 \u043c\u043e\u043d\u0442\u0430\u0436\u0430.\u041f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0447\u0435\u043b\u043d\u043e\u043a \u0434\u043b\u044f \u043d\u0430\u043c\u043e\u0442\u043a\u0438 \u043a\u043e\u043b\u0435\u0446\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b: \u043f\u0435\u0447\u0430\u0442\u043d\u044b\u0435 \u043f\u043b\u0430\u0442\u044b \u0438 \u043a\u0430\u043f\u0440\u043e\u043d\u043e\u0432\u0430\u044f \u043d\u0438\u0442\u043a\u0430 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043d\u043e\u0439 \u0443\u043f\u0430\u043a\u043e\u0432\u043a\u0438, \u0433\u0434\u0435-\u0442\u043e 0.5 \u043c\u043c \u0434\u0438\u0430\u043c\u0435\u0442\u0440, \u0442\u043e\u043b\u0441\u0442\u044b\u0439 \u043f\u043e\u043b\u0438\u044d\u0442\u0438\u043b\u0435\u043d\u043e\u0432\u044b\u0439 \u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u043f\u0440\u043e\u043f\u0438\u043b\u0435\u043d\u043e\u0432\u044b\u0439\/\u043f\u043e\u043b\u0438\u0441\u0442\u0438\u0440\u043e\u043b\u043e\u0432\u044b\u0439 (?) \u0431\u0435\u043b\u044b\u0439 \u043f\u043e\u0440\u043e\u043b\u043e\u043d, \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0439\u043d\u044b\u0439 \u0442\u043e\u043b\u0449\u0438\u043d\u043e\u0439 3-4 \u0441\u043c. \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0438\u0434 \u043f\u043b\u0430\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0442\u0430\u0436\u0430 &#8212; \u043e\u043d\u0438 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439, \u0442\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0434\u043b\u044f \u043f\u043b\u0430\u0441\u0442\u0438\u043a\u043e\u0432\u044b\u0445 \u043e\u0442\u0433\u0438\u0431\u0430\u0435\u043c\u044b\u0445 \u0444\u0438\u043a\u0441\u0430\u0442\u043e\u0440\u043e\u0432-\u0437\u0430\u0449\u0451\u043b\u043e\u043a  \u041f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u043d\u0442\u0430\u0436\u0430. \u041d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0449\u0435: \u043f\u0440\u043e\u0434\u0435\u0432\u0430\u0435\u043c \u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u0438 \u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c \u043f\u0440\u043e\u0442\u044b\u043a\u0430\u0435\u043c \u043f\u043e\u0440\u043e\u043b\u043e\u043d.\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 1 &#8212; \u043f\u0440\u043e\u0434\u0435\u0442\u044c \u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u0440\u043e\u043b\u043e\u043d \u0414\u0430\u043b\u0435\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0445\u043e\u0434\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u043f\u0435\u0442\u043b\u044e \u0438\u043b\u0438 \u043f\u0440\u043e\u0434\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451 \u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c, \u0432\u0441\u0451 \u0447\u0442\u043e \u043f\u043e\u043f\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434 \u0440\u0443\u043a\u0443, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0435\u0437\u0438\u0441\u0442\u043e\u0440.\u0422\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f 2 &#8212; \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u043f\u0435\u0442\u043b\u0438 \u0414\u0430\u043b\u0435\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043c\u043e\u043d\u0442\u0430\u0436\u0443\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e\u0414\u0440\u0430\u0439\u0432\u0435\u0440 \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043c\u043f\u0444\u0438\u0440\u043e\u0432\u0430\u043d\u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u043c\u043e\u043d\u0442\u0430\u0436 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0435\u0447\u0430\u0442\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b, \u043e\u043d\u0430 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u0439, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0451 \u043a\u0440\u0435\u043f\u0438\u043c \u043a\u0430\u043a \u0445\u043e\u043c\u0443\u0442\u043e\u043c\u041f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0443 \u0432 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u043e\u0447\u043a\u0430\u0445\u041d\u0443 \u0438 \u043a\u0430\u043a \u0436\u0435 \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e UART. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043b\u0430\u0442\u043a\u0443 \u0441 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u043e\u0439 FTDI. \u041d\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043c\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u0435\u043b\u0430\u0435\u043c 3D-\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e. \u041f\u0440\u044f\u0447\u0435\u043c \u0442\u0435\u0441\u0442\u0435\u0440 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430 \u0432 \u043a\u0430\u0440\u043c\u0430\u043d, \u0432\u044b\u0440\u0435\u0437\u0430\u043d\u043d\u044b\u0439 \u043a\u0430\u043d\u0446\u0435\u043b\u044f\u0440\u0441\u043a\u0438\u043c \u043d\u043e\u0436\u043e\u043c.3D-\u043c\u043e\u043d\u0442\u0430\u0436\u0414\u043b\u044f \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u043a\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0442\u044c\u044e, \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c USB, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c. \u041f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0430 \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 RX-TX \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0432\u0430\u0439\u0431 \u0441\u043a\u0432\u043e\u0437\u044c \u043c\u043e\u043d\u0442\u0430\u0436\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c \u0414\u043b\u044f \u043c\u043e\u043d\u0442\u0430\u0436\u0430 \u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0440\u0441\u0442\u0438\u044f, \u0447\u0443\u0442\u044c \u0431\u043b\u0438\u0436\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u043c \u0435\u0433\u043e, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043e\u043d\u0442\u0430\u0436 \u0441 \u043d\u0430\u0442\u044f\u0436\u0435\u043d\u0438\u0435\u043c\u0428\u0430\u0433\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u043e\u0442\u0430\u043d \u043a \u0434\u0435\u043c\u043f\u0444\u0435\u0440\u0443\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0423\u0437\u0435\u043b\u043a\u0438 \u0438 \u043f\u0435\u0442\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0434\u043b\u044f \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043a\u0440\u0435\u043f\u0451\u0436\u043d\u044b\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e AI \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441 0-\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u0440\u0438\u043b\u0438\u0447\u043d\u0443\u044e Embedded-\u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0431\u044b \u0441\u0430\u043c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430 \u0421 \u0438\u043b\u0438 \u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0432\u044b\u043c\u0443\u0447\u0438\u0432\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0439\u0442 \u0438\u043b\u0438 \u0442\u0430\u043a\u0442. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0437\u0430\u0433\u0440\u043e\u043c\u043e\u0436\u0434\u0430\u0442\u044c, \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u043d\u0430\u0431\u043e\u0440\u0430\u043c \u0432\u0430\u0439\u0431\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 md-\u0441\u0430\u043c\u043c\u0430\u0440\u0438 \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. MD-\u0441\u0430\u043c\u043c\u0430\u0440\u0438 \u044d\u0442\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043a\u0438\u043b\u043b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c +- \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0441 \u043d\u0430\u043f\u0438\u043b\u044c\u043d\u0438\u043a\u043e\u043c.\u041f\u043e\u0438\u0441\u043a \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445 \u043c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0445 \u0448\u0440\u0438\u0444\u0442\u043e\u0432# \u0421\u0430\u043c\u043c\u0430\u0440\u0438: \u0441\u043a\u0440\u0438\u043f\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0435\u0432\u044c\u044e \u0448\u0440\u0438\u0444\u0442\u043e\u0432## \u041a\u0440\u0430\u0442\u043a\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u0441\u0435 \u043c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b \u0438 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0435\u0434\u0438\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (PNG) \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0438\u0445 \u0438\u043c\u0451\u043d \u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.## \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043a\u0440\u0438\u043f\u04421. **\u041f\u043e\u0438\u0441\u043a \u0448\u0440\u0438\u0444\u0442\u043e\u0432**:   * \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0443\u0442\u0438\u043b\u0438\u0442\u0430 `fc-list`.   * \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043d\u043e\u0448\u0438\u0440\u0438\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u044b (`spacing=100`).2. **\u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445**:   * \u041f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f.   * \u0423\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u044b.   * \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e `basename` \u043e\u0442\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u043d\u0438\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u2014 \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432.3. **\u0420\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433**:   * \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0440\u0438\u0444\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ImageMagick \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 `\u0418\u043c\u044f\u0424\u0430\u0439\u043b\u0430: abcdefghij`.4. **\u0421\u0431\u043e\u0440\u043a\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f**:   * \u0412\u0441\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438.   * \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d PNG\u2011\u0444\u0430\u0439\u043b.## \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438### \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438* `fontconfig` (\u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b `fc-list`).* `ImageMagick` (\u0434\u043b\u044f \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f).  * \u0421\u043a\u0440\u0438\u043f\u0442 \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 ImageMagick: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 `magick` \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0440\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 `convert`.### \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435* `OUTPUT_FILE` \u2014 \u0438\u043c\u044f \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: `monospace_filenames.png`).* `FONT_SIZE` \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: 32).* `PREVIEW_TEXT` \u2014 \u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: `abcdefghij`).#!\/bin\/bash# ConfigurationOUTPUT_FILE=&#187;monospace_filenames.png&#187;FONT_SIZE=32PREVIEW_TEXT=&#187;abcdefghij&#187;# Compatibility check for ImageMagickCOMMAND=$(command -v magick || command -v convert)if [ -z &#171;$COMMAND&#187; ]; then    echo &#171;Error: ImageMagick is not installed.&#187;    exit 1fiecho &#171;Generating preview using filenames&#8230;&#187;# 1. Fetch file paths for monospace fonts# 2. Sort to remove duplicates# 3. Use basename to extract just the filename (e.g., &#8216;UbuntuMono-R.ttf&#8217;)fc-list :spacing=100 -f &#171;%{file}\\n&#187; | sort -u | while read -r path; do    if [ -f &#171;$path&#187; ]; then        # Get just the filename from the full path        fname=$(basename &#171;$path&#187;)        $COMMAND -background white \\                 -fill black \\                 -font &#171;$path&#187; \\                 -pointsize &#171;$FONT_SIZE&#187; \\                 label:&#187;$fname: $PREVIEW_TEXT&#187; miff:-    fidone | $COMMAND &#8212; -append &#171;$OUTPUT_FILE&#187;echo &#171;Done! Preview saved to: $OUTPUT_FILE&#187;\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0447\u0442\u043e \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c\u041f\u0438\u0448\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 C-\u0444\u0430\u0439\u043b \u0441 \u0431\u0438\u0442\u043c\u0430\u043f\u043e\u043c. \u0420\u0435\u043c\u0430\u0440\u043a\u0430. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0431\u044b\u043b\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043e\u0442 \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0435\u043d\u0434\u0435\u0440 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0438\u0437\u044b\u0441\u043a\u0430\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c h-\u0444\u0430\u0439\u043b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043f\u0430\u0434\u0434\u0438\u043d\u0433 \u0434\u043b\u044f \u0431\u0443\u043a\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, g, \u0443, \u0446 \u0438\u0442\u0434, \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0438\u0436\u043d\u0435\u0439 \u043b\u0438\u043d\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0435 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f. \u041f\u0440\u043e\u043c\u043f\u0442\u044b \u0434\u043b\u044f \u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0430 \u0434\u0435\u043b\u0430\u043b \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430 \u043d\u0451\u043c \u0431\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u0434\u043e\u0432\u0430\u044f \u0431\u0430\u0437\u0430 \u0438 \u043f\u043e \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438\u0434\u0451\u0442 \u0447\u0443\u0442\u043e\u0447\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u0441 \u0430\u043d\u0433\u043b. \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c .c \u0438 .h\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u043e\u0432:# \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0448\u0440\u0438\u0444\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Python \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u0435\u0432. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430:* `display_fonts.c` \u2014 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 C;* `fontdef.h` \u2014 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439;* `font_preview.png` \u2014 PNG\u2011\u043f\u0440\u0435\u0432\u044c\u044e \u0441\u0435\u0442\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.## \u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438### \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0448\u0440\u0438\u0444\u0442\u0430 \u0438 \u0441\u0435\u0442\u043a\u0438* **`FONT_PATH`** \u2014 \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0448\u0440\u0438\u0444\u0442\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e `cour.ttf`).* **`FONT_SIZE`** = $12$ \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 \u043f\u0443\u043d\u043a\u0442\u0430\u0445.* **`WIDTH`** = $6$, **`HEIGHT`** = $12$ \u2014 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438 \u0434\u043b\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u0445 (\u0448\u0438\u0440\u0438\u043d\u0430\u00a0\u00d7\u00a0\u0432\u044b\u0441\u043e\u0442\u0430).* **`FIRST_CHAR`** = `ord(&#8216; &#8216;)` ($32$) \u2014 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 ASCII\u2011\u043a\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.* **`LAST_CHAR`** = `ord(&#8216;}&#8217;)` ($125$) \u2014 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 ASCII\u2011\u043a\u043e\u0434 \u0441\u0438\u043c\u0432\u043e\u043b\u0430.* **`COLS`** = $16$ \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u0441\u0435\u0442\u043a\u0435 \u043f\u0440\u0435\u0432\u044c\u044e PNG.### \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u0438\u043f\u043e\u0433\u0440\u0430\u0444\u0438\u043a\u0438* **`V_ALIGN`** = `&#187;BOTTOM&#187;` \u2014 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f: `&#187;TOP&#187;`, `&#187;CENTER&#187;` \u0438\u043b\u0438 `&#187;BOTTOM&#187;`.* **`USE_DUAL_BBOX`** = `True` \u2014 \u0444\u043b\u0430\u0433 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0447\u043d\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0441\u043e\u043a (`True`) \u0438\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a \u0434\u0432\u0438\u0436\u043a\u0430 \u0448\u0440\u0438\u0444\u0442\u0430 (`False`).* **`NON_DESCENDER_OFFSET`** = $-2$ \u2014 \u0441\u0434\u0432\u0438\u0433 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2014 \u0432\u043d\u0438\u0437, \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u2014 \u0432\u0432\u0435\u0440\u0445).* **`DESCENDER_RELATIVE_OFFSET`** = $-1$ \u2014 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u043d\u0438\u0436\u043d\u0438\u043c\u0438 \u0432\u044b\u043d\u043e\u0441\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abg\u00bb, \u00abp\u00bb).* **`DESCENDER_CHARS`** \u2014 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u0432\u044b\u043d\u043e\u0441\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0438\u0436\u0435 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438: `set(&#171;gjpqy,;Q&#187;)`.### \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 (\u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0446\u0438\u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u044f)* **`FLIP_HORIZONTAL`** = `False` \u2014 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438 (\u0435\u0441\u043b\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e).* **`FLIP_VERTICAL`** = `False` \u2014 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 (\u0435\u0441\u043b\u0438 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437).### \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0435\u0432\u044c\u044e* **`APPLY_FLIPS_TO_PREVIEW`** = `False` \u2014 \u0444\u043b\u0430\u0433 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0439 \u043a \u043f\u0440\u0435\u0432\u044c\u044e:    * `True` \u2014 \u043f\u0440\u0435\u0432\u044c\u044e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0437\u0435\u0440\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0438\u0441\u043f\u043b\u0435\u044f;    * `False` \u2014 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430.## \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043a\u0440\u0438\u043f\u0442\u04301. **\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0448\u0440\u0438\u0444\u0442\u0430.** \u041f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0440\u0438\u0444\u0442 \u0438\u0437 `FONT_PATH`. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u0451\u0442\u0441\u044f \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0448\u0440\u0438\u0444\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.2. **\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432.** \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 `FIRST_CHAR` \u0434\u043e `LAST_CHAR`.3. **\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0442\u043b\u0430\u0441\u0430 PNG.** \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (`&#8217;1&#8217;` mode) \u0441 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e `COLS`, `WIDTH` \u0438 `HEIGHT`.4. **\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430:**    * \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430;    * \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 bounding box (\u0441 \u0443\u0447\u0451\u0442\u043e\u043c `USE_DUAL_BBOX`);    * \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 (`V_ALIGN`) \u0438 \u0438\u043d\u0434\u0438\u0432\u0438\u0434\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 (`NON_DESCENDER_OFFSET`, `DESCENDER_RELATIVE_OFFSET`);    * \u0440\u0438\u0441\u0443\u0435\u0442 \u0441\u0438\u043c\u0432\u043e\u043b \u0441 \u0442\u043e\u0447\u043d\u044b\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c;    * \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044e (`FLIP_HORIZONTAL`, `FLIP_VERTICAL`) \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u043f\u0440\u0435\u0432\u044c\u044e.5. **\u0423\u043f\u0430\u043a\u043e\u0432\u043a\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.** \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0430\u0439\u0442\u043e\u0432, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e (\u043f\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c).6. **\u0424\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 C\u2011\u0444\u0430\u0439\u043b\u0430.** \u0417\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0440\u0438\u0444\u0442\u0430 \u0432 `display_fonts.c` \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432 `uint8_t`.7. **\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.** \u0421\u043e\u0437\u0434\u0430\u0451\u0442 `fontdef.h` \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e (\u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u0444\u043b\u0430\u0433\u0438 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0442.\u00a0\u0434.).8. **\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0432\u044c\u044e.** \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442 \u0430\u0442\u043b\u0430\u0441 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0435\u0433\u043e \u043a\u0430\u043a `font_preview.png` \u0434\u043b\u044f \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f.## \u0412\u044b\u0445\u043e\u0434\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b* **`display_fonts.c`**    * \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 `fontCRC` \u0441 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432;    * \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 `0xHH`.* **`fontdef.h`**    * \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438;    * \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u044b (`CRCFONT_WIDTH`, `CRCFONT_HEIGHT`), \u043a\u043e\u0434\u044b \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (`CRCFONT_FIRSTCHAR`, `CRCFONT_LASTCHAR`), \u0444\u043b\u0430\u0433\u0438 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 (`CRCFONT_VALIGN_BOTTOM`, `CRCFONT_VFLIP`, `CRCFONT_HFLIP`).* **`font_preview.png`**    * \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0435\u0432\u044c\u044e \u0441\u0435\u0442\u043a\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432;    * \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 $4$\u00a0\u0440\u0430\u0437\u0430 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430;    * \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u044f, \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u0448\u0440\u0438\u0444\u0442\u0430.\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 python-\u0432\u044b\u0432\u043e\u0434import mathfrom PIL &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-480302","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=480302"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/480302\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=480302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=480302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=480302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}