SSD1283A рдкрд░ STM32 рдХреЗ рд╕рд╛рде рдЯреНрд░рд╛рдВрд╕рдлрд╝реНрд▓реЗрдХреНрдЯрд┐рд╡ TFT рдбрд┐рд╕реНрдкреНрд▓реЗ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ

рдкрд░рд┐рдЪрдп


рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЙрдбрд▓ рдХреЛ H016IT01 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд▓реЗрдХреНрдЯрд┐рд╡ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдЬреНрдЬреНрд╡рд▓ рд╕реВрд░рдЬ рдХреЗ рдиреАрдЪреЗ рднреА рдЙрд╕ рдкрд░ рдЫрд╡рд┐ рджрд┐рдЦрд╛рдИ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рдпрд╣ рднреА рдкреНрд░рд╕рд┐рджреНрдз рдЪреАрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд╕рд╛рде рд▓рдЧрднрдЧ рдПрдХрдорд╛рддреНрд░ рдЙрдкрд▓рдмреНрдз рдореЙрдбрд▓ рд╣реИред

рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ SSD1283A рдирд┐рдпрдВрддреНрд░рдХ (рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд░реВрд╕реА рдФрд░ рдкрд╢реНрдЪрд┐рдореА рджреЛрдиреЛрдВ рдХреНрд╖реЗрддреНрд░реЛрдВ) рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдФрд░ рдореИрдВрдиреЗ рдХрд╣реАрдВ рднреА рдПрдХ рдЧрд╛рдЗрдб рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдПрдХ рдбреЗрдЯрд╢реАрдЯ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдЙрдкрдпреЛрдЧреА рд╣реИред

рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рд╕рддреНрдп рдирд╣реАрдВ рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХрд╛ рдЕрдкрдирд╛ рдЕрдиреБрднрд╡ рджреЗрддрд╛ рд╣реВрдВред рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╕рд░рд▓ рд╣реИ - рдЙрди рд╕рднреА рдХреА рдорджрдж рдХрд░рдирд╛ рдЬреЛ рдЗрд╕ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред

рдЫрд╡рд┐

рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ 8 рдкрд┐рди рд╣реИрдВ:

1) рдЬреАрдПрдирдбреА
2) рд╡реАрд╕реАрд╕реА - 5 рдпрд╛ 3.3 рд╡реА
3) рд╕реАрдПрд╕ - рдПрд╕рдкреАрдЖрдИ рдЪрд┐рдк рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ
4) RST - "0" - рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, "1" - рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред
5) A0 / DC - рдбреЗрдЯрд╛ рдХрдорд╛рдВрдб ("0" - рдХрдорд╛рдВрдб, "1" - рдбреЗрдЯрд╛)
6) рдПрд╕рдбреАрдП - рдПрд╕рдкреАрдЖрдИ рдореЛрд╕реА
7) рдПрд╕рд╕реАрдХреЗ - рдПрд╕рдкреАрдЖрдИ рдПрд╕рд╕реАрдХреЗ
8) рдПрд▓рдИрдбреА - рдмреИрдХрд▓рд╛рдЗрдЯ рдЖрдЙрдЯрдкреБрдЯ, рд╡реАрд╕реАрд╕реА рдХреА рддрд░рд╣, 3.3 рд╕реЗ 5 рд╡реА рддрдХ

рдЖрдкрдХреЛ SPI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, stm32f407 рдкрд░ рдбрд┐рд╕реНрдХрд╡рд░реА рдмреЛрд░реНрдб рдореБрдЭреЗ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдПрд╕рдкреАрдЖрдИ


рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ SPI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SSD1283A рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреА, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЙрдбрд▓ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЙрдирдХрд╛ рдПрд╕рдкреАрдЖрдИ рднреА рд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдПрд╕рдбреАрдП рдбреЗрдЯрд╛ рд▓рд╛рдЗрди рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ MOSI рд▓рд╛рдЗрди рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдбреЗрдЯрд╛рд╢реАрдЯ рд╣рдореЗрдВ рдмрддрд╛ рд░рд╣реА рд╣реИред

рдЫрд╡рд┐

рдкрд╣рд▓реЗ рд╣рдо SPI рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо SPI1 рдФрд░ GPIO рдкрд░ рд╣рдорд▓рд╛ рдХрд░реЗрдВрдЧреЗ, SDA рдФрд░ SCK рдХреЗ рдкреИрд░реЛрдВ рдХреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ (рдореИрдВрдиреЗ MISO рднреА рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ)ред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рдореЛрдб рдХреЛ рдПрдХ рдпреВрдирд┐рдбрд╛рдпрд░реЗрдХреНрд╢рдирд▓ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдорд╛рд╕реНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

BIT_BAND_PER(RCC->AHB1ENR ,RCC_AHB1ENR_GPIOAEN) = true; if(SPI_NUM::_1 == spi) { /*!<-------------Enable spi clocking--------------->!*/ BIT_BAND_PER(RCC->APB2ENR, RCC_APB2ENR_SPI1EN) = true; /*!<----PA5 - SCK, PA6 - MISO, PA7 - MOSI---->!*/ GPIOA->MODER |= (GPIO_MODER_MODE5_1 | GPIO_MODER_MODE6_1 | GPIO_MODER_MODE7_1); GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEED5_1 | GPIO_OSPEEDR_OSPEED7_1); GPIOA->AFR[0] |= (GPIO_AFRL_AFSEL5_0 | GPIO_AFRL_AFSEL5_2 | GPIO_AFRL_AFSEL6_0 | GPIO_AFRL_AFSEL6_2 | GPIO_AFRL_AFSEL7_0 | GPIO_AFRL_AFSEL7_2); /*!<-----customize SPI------>!*/ SPI1->CR1 |= (SPI_CR1_BIDIMODE | SPI_CR1_BIDIOE | SPI_CR1_SSM | SPI_CR1_SSI /*| SPI_CR1_DFF*/ | SPI_CR1_MSTR); BIT_BAND_PER(SPI1->CR1 ,SPI_CR1_SPE) = true; } 


рдлрд┐рд░ рд╣рдо SPI рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдЗрдЯ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 void stm32f407_spi::stm32f407_spi_send(uint8_t data) { SPI1->DR = data; while((SPI1->SR & SPI_SR_BSY)) continue; } 

рдПрд╕рдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрд╕ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЙрдЪреНрдЪрддрдо рд╕рдВрднрд╡ рдЧрддрд┐ рд╕реЗ рдбреЗрдЯрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдФрд░ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рджрд░реНрд╢рди


рдЕрдм рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рднреЗрдЬреЗрдВред рдПрдХ рдХрдорд╛рдВрдб рдореЗрдВ 3 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдПрдХ рдмрд╛рдЗрдЯ рдХрдорд╛рдВрдб рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рджреЛ рдбреЗрдЯрд╛ рд╣реЛрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдП рдмрд╛рдЗрдЯ рдХреЛ "0" рдкрд░ рднреЗрдЬрддреЗ рд╕рдордп рдкрд┐рди рдП 0 рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП "1" рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ RST, A0 рдФрд░ CS рдкрд┐рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХрд┐рдПред

 enum class DC : uint8_t { COMMAND, DATA }; #pragma inline=forced inline void tft_lcd_rst(bool rst) {BIT_BAND_PER(GPIOA->ODR , GPIO_ODR_OD2) = rst;} #pragma inline=forced inline void tft_lcd_dc(DC dc) {BIT_BAND_PER(GPIOA->ODR , GPIO_ODR_OD3) = static_cast<bool>(dc);} #pragma inline=forced inline void tft_lcd_cs(bool cs) {BIT_BAND_PER(GPIOA->ODR , GPIO_ODR_OD4) = cs;} 


рдлрд┐рд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 void tft_lcd::tft_lcd_send(uint8_t addr, uint16_t data) { this->tft_lcd_dc(DC::COMMAND); stm32f407_spi_send(addr); this->tft_lcd_dc(DC::DATA); stm32f407_spi_send(static_cast<uint8_t>(data >> 8)); stm32f407_spi_send(static_cast<uint8_t>(data)); } 

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЗрд╕ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП arduino рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЬрд╛рд╕реВрд╕реА рдХреА рд╣реИ:

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХрдорд╛рдВрдб
 static constexpr uint8_t TFT_DELAY = 0xFF; static constexpr t_tft_regs tft_regs[]= { { 0x10, 0x2F8E }, { 0x11, 0x000C }, { 0x07, 0x0021 }, { 0x28, 0x0006 }, { 0x28, 0x0005 }, { 0x27, 0x057F }, { 0x29, 0x89A1 }, { 0x00, 0x0001 }, { TFT_DELAY, 100 }, { 0x29, 0x80B0 }, { TFT_DELAY, 30 }, { 0x29, 0xFFFE }, { 0x07, 0x0223 }, { TFT_DELAY, 30 }, { 0x07, 0x0233 }, { 0x01, 0x2183 }, { 0x03, 0x6830 }, { 0x2F, 0xFFFF }, { 0x2C, 0x8000 }, { 0x27, 0x0570 }, { 0x02, 0x0300 }, { 0x0B, 0x580C }, { 0x12, 0x0609 }, { 0x13, 0x3100 }, }; 


рдЬрд╣рд╛рдВ TFT_DELAY рдХрд╛ рдорддрд▓рдм рд╣реИ рд╕рд╛рдзрд╛рд░рдг рдиреАрдВрдж рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд░рд╛рд╢рд┐ред рдпрджрд┐ рдЖрдк рдбреЗрдЯрд╛рд╢реАрдЯ рдореЗрдВ рддрд▓реНрд▓реАрди рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреБрдЫ рдкрддреЗ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдбреЗрдЯрд╛ рдЕрдЬреАрдм рд▓рдЧреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдкрддреЗ рдЖрд░рдХреНрд╖рд┐рдд рдмрд┐рдЯреНрд╕ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВред

рд╕реАрдПрд╕ рдХреЛ "0" рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рд╕реНрдкреНрд▓реЗ (рдкрд┐рди RST) рдХреЛ рд░рд┐рдмреВрдЯ рдХрд░реЗрдВ, рдФрд░ рдХрдорд╛рдВрдбреНрд╕ рдЯреЗрдмрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдПрдВред

  tft_lcd_rst(false); delay(5, mS); tft_lcd_rst(true); delay(200, mS); this->tft_lcd_cs(false); delay(5, mS); /*!<--------Init display---------->!*/ for(uint8_t i = 0; i < sizeof(tft_regs)/sizeof(tft_regs[0]) ;i++) { (TFT_DELAY != tft_regs[i].address) ? (this->tft_lcd_send(tft_regs[i].address, tft_regs[i].value)): (delay(tft_regs[i].value, mS)); } delay(5, mS); this->tft_lcd_cs(true); 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЫрд╡рд┐ рдХреЛ рдЫрд╡рд┐ рдХреЛ рд╕рдлреЗрдж рд╕реЗ рдЧреНрд░реЗ рд░рдВрдЧ рдЯреЗрд▓реАрд╡рд┐рдЬрди рд╣рд╕реНрддрдХреНрд╖реЗрдк рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЫрд╡рд┐

рдПрдХ рдЖрдпрдд рдмрдирд╛рдПрдБ


SSD1283A рдирд┐рдпрдВрддреНрд░рдХ рдЖрдкрдХреЛ рдЖрдпрддреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП 4 рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 0x44 рдХрдорд╛рдВрдб рдореЗрдВ рдХреНрд░рдорд╢рдГ рдЙрдЪреНрдЪ рдФрд░ рдирд┐рдореНрди рдбреЗрдЯрд╛ рдмрд╛рдЗрдЯ рдореЗрдВ abscissa рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдЕрдВрдд рдФрд░ рдЖрдпрдд рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИред рдСрд░реНрдбрд┐рдиреЗрдЯ рдЕрдХреНрд╖ рдХреЗ рд▓рд┐рдП 0x45 рдХрдорд╛рдВрдб рд╕рдорд╛рди рд╣реИред 0x21 рдХрдорд╛рдВрдб рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд╛ рд╕рдордиреНрд╡рдп рд╣реЛрддрд╛ рд╣реИ, рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯ рдореЗрдВ y рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрдо рдмрд╛рдЗрдЯ рдореЗрдВред 0x22 рдХрдорд╛рдВрдб рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдЖрдпрдд рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рд╕реНрдкреНрд▓реЗ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рднреА рд╣реЛрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдореЗрдВ 130x130 рдХрд╛ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд░реНрдЪреБрдЕрд▓ рдХреЛрдСрд░реНрдбрд┐рдиреЗрдЯ рдЧреНрд░рд┐рдб рдореЗрдВ 132x132 рдХреЗ рдЖрдпрд╛рдо рд╣реИрдВ, рдФрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдмрд┐рдВрджреБ 2x2 рд╕реЗ рдЧрд┐рдирдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо 20 рд╕реЗ 20 рддрдХ рдПрдХ рдХрд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмрд┐рдВрджреБ рд╕реНрдерд┐рддрд┐ (30, 45) рдкрд░ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

0x44 0x3320 (30 + 20 + 2-1, 30 + 2)
0x45 0x422F (45 + 20 + 2-1, 45 + 2)
0x21 0x2F20
0x22 0x0000, рдФрд░ рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ 400 (20 * 20) рдмрд╛рд░ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рддрдм рдЖрдпрдд рдбреНрд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ (рдмрд╢рд░реНрддреЗ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 2 рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЪреБрдХреЗ рд╣реЛрдВ):

 void tft_lcd::draw_rect(const t_rect& rec) { this->tft_lcd_send(0x44, ((rec.x1 - 1) << 8) | rec.x0); this->tft_lcd_send(0x45, ((rec.y1 - 1) << 8) | rec.y0); this->tft_lcd_send(0x21, (rec.y0 << 8) | rec.x0); for(uint16_t i = 0; i < ((rec.x1 - rec.x0) * (rec.y1 - rec.y0)); i++) { this->tft_lcd_send(0x22, rec.col); } } 

рдПрдХ рдЖрдпрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕рдХреЗ рдХреЛрдиреЛрдВ рдФрд░ рд░рдВрдЧ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдХреЛ рдЧреБрд▓рд╛рдмреА рд░рдВрдЧ рд╕реЗ рднрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

 t_rect rect = {0x02, 0x02, 0x84, 0x84, static_cast<uint16_t>(COLOUR::MAGENTA)}; this->draw_rect(rect); 

рдкрд░рд┐рдгрд╛рдо:

рдЫрд╡рд┐

рдЕрдХреНрд╖рд░реЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдбреНрд░рд╛ рдХрд░реЗрдВ


рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдВред

рдЕрдХреНрд╖рд░реЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рд╕рд╛рд░рдгрд┐рдпрд╛рдБ
 namespace rect_coord_lit { const t_rect_coord comma[] = {{0, 20, 5, 25}, {3, 25, 5, 28}}; const t_rect_coord dot[] = {{0, 20, 5, 25}}; const t_rect_coord space[] = {{0, 0, 0, 0}}; const t_rect_coord _0[] = {{0, 0, 15, 5},{0, 5, 5, 25},{5, 20, 15, 25},{10, 5, 15, 20}}; const t_rect_coord _1[] = {{10, 0, 15, 25}}; const t_rect_coord _2[] = {{0, 0, 15, 5},{10, 5, 15, 15},{0, 10, 10, 15},{0, 15, 5, 25},{5, 20, 15, 25}}; const t_rect_coord _3[] = {{0, 0, 15, 5},{10, 5, 15, 25},{0, 10, 10, 15},{0, 20, 10, 25}}; const t_rect_coord _4[] = {{0, 0, 5, 15},{5, 10, 10, 15},{10, 0, 15, 25}}; const t_rect_coord _5[] = {{0, 0, 15, 5},{0, 5, 5, 15},{0, 10, 15, 15},{10, 15, 15, 25},{0, 20, 10, 25}}; const t_rect_coord _6[] = {{0, 0, 15, 5},{0, 5, 5, 25},{5, 10, 10, 15},{5, 20, 10, 25},{10, 10, 15, 25}}; const t_rect_coord _7[] = {{0, 0, 15, 5},{10, 5, 15, 25}}; const t_rect_coord _8[] = {{0, 0, 15, 5},{0, 5, 5, 25},{5, 20, 15, 25},{10, 5, 15, 20},{5, 10, 10, 15}}; const t_rect_coord _9[] = {{0, 0, 15, 5},{0, 5, 5, 15},{0, 20, 15, 25},{10, 5, 15, 20},{5, 10, 10, 15}}; const t_rect_coord a[] = {{0, 10, 5, 25},{5, 5, 10, 10},{5, 15, 10, 20},{10, 10, 15, 25}}; const t_rect_coord b[] = {{0, 0, 5, 25},{5, 10, 15, 15},{10, 15, 15, 20},{5, 20, 15, 25}}; const t_rect_coord c[] = {{0, 5, 15, 10},{0, 10, 5, 20},{0, 20, 15, 25}}; const t_rect_coord d[] = {{0, 10, 10, 15},{0, 15, 5, 20},{0, 20, 10, 25}, {10, 0, 15, 25}}; const t_rect_coord e[] = {{0, 5, 15, 8}, {0, 12, 15, 15}, {0, 8, 5, 25}, {10, 8, 15, 12}, {5, 20, 15, 25}}; const t_rect_coord f[] = {{5, 5, 10, 25},{5, 0, 15, 5},{0, 10, 15, 15}}; const t_rect_coord g[] = {{0, 5, 5, 20}, {5, 5, 10, 10}, {5, 15, 10, 20}, {10, 5, 15, 30}, {0, 25, 10, 30}}; const t_rect_coord h[] = {{0, 0, 5, 25},{5, 10, 15, 15},{10, 15, 15, 25}}; const t_rect_coord i[] = {{5, 3, 10, 8},{5, 10, 10, 25}}; const t_rect_coord j[] = {{5, 3, 10, 8},{5, 10, 10, 30}, {0, 25, 5, 30}}; const t_rect_coord k[] = {{0, 0, 5, 25},{5, 15, 10, 20}, {10, 10, 15, 15}, {10, 20 , 15, 25}}; const t_rect_coord l[] = {{5, 0, 10, 25}}; const t_rect_coord m[] = {{0, 10, 4, 25},{7, 10, 10, 25}, {13, 10, 17,25}, {0, 5 , 12, 10}}; const t_rect_coord n[] = {{0, 10, 5, 25},{10, 10, 15, 25}, {0, 5 , 10, 10}}; const t_rect_coord o[] = {{0, 5, 5, 25}, {10, 5, 15, 25}, {5, 5, 10, 10}, {5, 20, 10, 25}}; const t_rect_coord p[] = {{0, 5, 5, 30}, {5, 5, 15, 10}, {5, 15, 15, 20}, {10, 10, 15, 15}}; const t_rect_coord q[] = {{0, 5, 5, 20}, {5, 5, 15, 10}, {5, 15, 15, 20}, {10, 10, 15, 30}}; const t_rect_coord r[] = {{0, 10, 5, 25},{5, 5, 15, 10}}; const t_rect_coord s[] = {{3, 5, 15, 10}, {0, 8, 5, 13}, {3, 13, 12, 17}, {10, 17, 15, 22}, {0, 20, 12, 25}}; const t_rect_coord t[] = {{5, 0, 10, 25},{0, 5, 15, 10},{10, 20, 15, 25}}; const t_rect_coord u[] = {{0, 5, 5, 25},{10, 5, 15, 25},{5, 20, 10, 25}}; const t_rect_coord v[] = {{0, 5, 5, 15}, {10, 5, 15, 15}, {1, 15, 6, 20}, {9, 15, 14, 20}, {5, 20, 10, 25}}; const t_rect_coord w[] = {{0, 5, 4, 20},{7, 5, 10, 20}, {13, 5, 17, 20}, {4, 20 , 7, 25}, {10, 20 , 13, 25}}; const t_rect_coord x[] = {{0, 5, 5, 10},{10, 5, 15, 10}, {0, 20, 5, 25}, {10, 20 , 15, 25}, {5, 10 , 10, 20}}; const t_rect_coord y[] = {{0, 5, 5, 20}, {5, 15, 10, 20}, {10, 5, 15, 30}, {0, 25, 10, 30}}; const t_rect_coord z[] = {{0, 5, 15, 10}, {10, 10, 15, 13}, {5, 12, 10, 18}, {0, 17, 5, 20}, {0, 20, 15, 25}}; } 


рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдПрдВ рдЬрд╣рд╛рдВ рд╣рдо рдЪрд░рд┐рддреНрд░ рдХреЛ рд╕реНрд╡рдпрдВ (рдЕрд╕рд┐рд╕реА рдореЗрдВ) рд╕рд╣рд╕рдВрдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдЖрдпрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ:

рд╕рдордиреНрд╡рд┐рдд рд╕реВрдЪрдХ рддрд╛рд▓рд┐рдХрд╛
 typedef struct { char lit; uint8_t size; const t_rect_coord *rec_coord; }t_rect_coord_table; #define LITERAL_COORD(x) sizeof(x)/ sizeof(x[0]), x const t_rect_coord_table rect_coord_table[] = { {',', LITERAL_COORD(rect_coord_lit::comma)}, {'.', LITERAL_COORD(rect_coord_lit::dot)}, {'.', LITERAL_COORD(rect_coord_lit::dot)}, {' ', LITERAL_COORD(rect_coord_lit::space)}, {'0', LITERAL_COORD(rect_coord_lit::_0)}, {'1', LITERAL_COORD(rect_coord_lit::_1)}, {'2', LITERAL_COORD(rect_coord_lit::_2)}, {'3', LITERAL_COORD(rect_coord_lit::_3)}, {'4', LITERAL_COORD(rect_coord_lit::_4)}, {'5', LITERAL_COORD(rect_coord_lit::_5)}, {'6', LITERAL_COORD(rect_coord_lit::_6)}, {'7', LITERAL_COORD(rect_coord_lit::_7)}, {'8', LITERAL_COORD(rect_coord_lit::_8)}, {'9', LITERAL_COORD(rect_coord_lit::_9)}, {'a', LITERAL_COORD(rect_coord_lit::a)}, {'b', LITERAL_COORD(rect_coord_lit::b)}, {'c', LITERAL_COORD(rect_coord_lit::c)}, {'d', LITERAL_COORD(rect_coord_lit::d)}, {'e', LITERAL_COORD(rect_coord_lit::e)}, {'f', LITERAL_COORD(rect_coord_lit::f)}, {'g', LITERAL_COORD(rect_coord_lit::g)}, {'h', LITERAL_COORD(rect_coord_lit::h)}, {'i', LITERAL_COORD(rect_coord_lit::i)}, {'j', LITERAL_COORD(rect_coord_lit::j)}, {'k', LITERAL_COORD(rect_coord_lit::k)}, {'l', LITERAL_COORD(rect_coord_lit::l)}, {'m', LITERAL_COORD(rect_coord_lit::m)}, {'n', LITERAL_COORD(rect_coord_lit::n)}, {'o', LITERAL_COORD(rect_coord_lit::o)}, {'p', LITERAL_COORD(rect_coord_lit::p)}, {'q', LITERAL_COORD(rect_coord_lit::q)}, {'r', LITERAL_COORD(rect_coord_lit::r)}, {'s', LITERAL_COORD(rect_coord_lit::s)}, {'t', LITERAL_COORD(rect_coord_lit::t)}, {'u', LITERAL_COORD(rect_coord_lit::u)}, {'v', LITERAL_COORD(rect_coord_lit::v)}, {'w', LITERAL_COORD(rect_coord_lit::w)}, {'x', LITERAL_COORD(rect_coord_lit::x)}, {'y', LITERAL_COORD(rect_coord_lit::y)}, {'z', LITERAL_COORD(rect_coord_lit::z)} }; 


рддрдм рдПрдХ рд╡рд░реНрдг рдХреЗ рдбреНрд░рд╛рдЗрдВрдЧ рдХрд╛рд░реНрдп рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

 void tft_lcd::draw_lit(char ch, const t_rect_coord *rect_coord, uint16_t colour, uint16_t x0, uint16_t y0, uint8_t size) { t_rect rec = {0}; rec.col = colour; uint8_t ctr = size; uint8_t i = 0; while(ctr--) { rec.x0 = x0 + rect_coord[i].x0; rec.y0 = y0 + rect_coord[i].y0; rec.x1 = x0 + rect_coord[i].x1; rec.y1 = y0 + rect_coord[i].y1; i++; this->draw_rect(rec); } } void tft_lcd::draw_char(char ch, uint16_t colour, uint16_t x0, uint16_t y0) { x0 += 2; y0 +=2; for(const auto &field : rect_coord_table) { if(field.lit == ch) { draw_lit(ch, field.rec_coord, colour, x0, y0, field.size); } } } 

Draw_char рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдХ рд▓реВрдк рдХреЗ рд▓рд┐рдП рд╕рдордиреНрд╡рдп рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреАрдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдореИрдЪ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдорд┐рд▓рд╛рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ рдХреЛ draw_lit рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рджрд┐рдП рдЧрдП рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдЖрдпрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИред

рд░реЗрдЦрд╛ рдЪрд┐рддреНрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 void tft_lcd::draw_string(char *ch, COLOUR colour, uint16_t x0, uint16_t y0) { while(*ch) { this->draw_char(*ch, static_cast<uint16_t>(colour), x0, y0); x0+= 20; ch++; } } 

рдЕрдм рдпрд╣ рд▓рд╛рдЗрди, рдЗрд╕рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рд░рдВрдЧ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдирдП рдЕрдХреНрд╖рд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 this->draw_string("123456", COLOUR::GREEN, 5, 0); this->draw_string("habr,.", COLOUR::WHITE, 5, 30); this->draw_string("abcdef", COLOUR::RED, 5, 60); this->draw_string("stwxyz", COLOUR::YELLOW, 5, 90); 

рдЫрд╡рд┐

рдЗрд╕ рдореЛрдб рдореЗрдВ, рдбрд┐рд╕реНрдкреНрд▓реЗ рддреЗрдЬ рд╣реИ, рдЖрдВрдЦ рдбреНрд░рд╛рдЗрдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рд╕рднреА рдЗрдЪреНрдЫреБрдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреВрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рд▓рд┐рдВрдХ рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

Source: https://habr.com/ru/post/hi482610/


All Articles