Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<p>void LCD_FillRect(short left, short top, short right, short bottom, int Color) {
int iterations = 0;
char R,G,B;
int Max;
LCD_SetBounds(left, top, right, bottom);
Max = (right+1-left) <em> (bottom+1-top);
R = Color & 0xFF;
G = Color >> 8 & 0xFF;
B = Color >> 16 & 0xFF;
if ((R == G) & (G == B)) {
WriteOneByteManyTimes(R, Max</em>3);
} else {
while (iterations < Max) {
WriteData(B);
WriteData(G);
WriteData(R);
iterations = iterations + 1;
};
};
};
void WriteOneByteManyTimes(uint8_t byte, int iterations) {
int i;
GPIOC->BSRR = (GPIO_BSRR_BR_9 | GPIO_BSRR_BS_7);
GPIOA->ODR = (byte);
for (i=0;i<iterations;i++){
GPIOC->BSRR = GPIO_BSRR_BR_8;
GPIOC->BSRR = GPIO_BSRR_BS_8;
};
GPIOC->BSRR = (GPIO_BSRR_BS_9| GPIO_BSRR_BS_8 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_6);
};
void LCD_FillRect(short left, short top, short right, short bottom, int Color) {
int iterations = 0;
char R,G,B;
int Max;
LCD_SetBounds(left, top, right, bottom);
Max = (right+1-left) * (bottom+1-top);
R = Color & 0xFF;
G = Color >> 8 & 0xFF;
B = Color >> 16 & 0xFF;
if ((R == G) & (G == B)) {
WriteOneByteManyTimes(R, Max*3);
} else {
while (iterations < Max) {
WriteData(B);
WriteData(G);
WriteData(R);
iterations = iterations + 1;
};
};
};
void WriteOneByteManyTimes(uint8_t byte, int iterations) {
int i;
GPIOC->BSRR = (GPIO_BSRR_BR_9 | GPIO_BSRR_BS_7);
GPIOA->ODR = (byte);
for (i=0;i<iterations;i++){
GPIOC->BSRR = GPIO_BSRR_BR_8;
GPIOC->BSRR = GPIO_BSRR_BS_8;
};
GPIOC->BSRR = (GPIO_BSRR_BS_9| GPIO_BSRR_BS_8 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_6);
};// Выводим каждый байт, симулируя работу шины 8080
WriteData(B);
WriteData(G);
WriteData(R);<...>
Max = (right+1-left) * (bottom+1-top);
WriteOneByteManyTimes(R, Max*3);
<...>
void WriteOneByteManyTimes(uint8_t byte, int iterations) {
int i;
GPIOC->BSRR = (GPIO_BSRR_BR_9 | GPIO_BSRR_BS_7);
GPIOA->BSRR = (GPIO_BSRR_BR_0 | GPIO_BSRR_BR_1 | GPIO_BSRR_BR_2 | GPIO_BSRR_BR_3 | GPIO_BSRR_BR_4 | GPIO_BSRR_BR_5 | GPIO_BSRR_BR_6 | GPIO_BSRR_BR_7);
GPIOA->BSRR = byte;
for (i=0;i<iterations;i++){
GPIOC->BSRR = GPIO_BSRR_BR_8;
GPIOC->BSRR = GPIO_BSRR_BS_8;
};
GPIOC->BSRR = (GPIO_BSRR_BS_9| GPIO_BSRR_BS_8 | GPIO_BSRR_BS_7 | GPIO_BSRR_BS_6);
};<...>
Max = (right+1-left) * (bottom+1-top);
WriteOneByteManyTimes(R, Max);
<...>
for (i=0;i<iterations;i++){
GPIOC->BSRR = GPIO_BSRR_BR_8;
GPIOC->BSRR = GPIO_BSRR_BS_8;
GPIOC->BSRR = GPIO_BSRR_BR_8;
GPIOC->BSRR = GPIO_BSRR_BS_8;
GPIOC->BSRR = GPIO_BSRR_BR_8;
GPIOC->BSRR = GPIO_BSRR_BS_8;
};
#define Black 0x0000 /* 0, 0, 0 */
#define Bank1_LCD_D ((uint32_t)0x60020000) //disp Data ADDR
#define Bank1_LCD_C ((uint32_t)0x60000000) //disp Reg ADDR
void clearScr(uint16_t color) {
*(__IO uint16_t *) (Bank1_LCD_C)= 0x50;
*(__IO uint16_t *) (Bank1_LCD_D)= 0;
*(__IO uint16_t *) (Bank1_LCD_C)= 0x51;
*(__IO uint16_t *) (Bank1_LCD_D)= 239;
*(__IO uint16_t *) (Bank1_LCD_C)= 0x52;
*(__IO uint16_t *) (Bank1_LCD_D)= 0;
*(__IO uint16_t *) (Bank1_LCD_C)= 0x53;
*(__IO uint16_t *) (Bank1_LCD_D)= 319;
*(__IO uint16_t *) (Bank1_LCD_C)= 32;
*(__IO uint16_t *) (Bank1_LCD_D)= 0;
*(__IO uint16_t *) (Bank1_LCD_C)= 33;
*(__IO uint16_t *) (Bank1_LCD_D)= 0;
*(__IO uint16_t *) (Bank1_LCD_C)= 34;
for(i=0;i<76800;i++) *(__IO uint16_t *) (Bank1_LCD_D)= color;
}
STM32 и LCD, быстрая заливка экрана