Не жалко. Принцип прост. Есть два массива-картинки. Из каждого массива берутся соответствующие цвета-пиксели (двухбайтное число). Далее из них извлекаются компоненты цвета - R,G,B. Преобразуются в компоненты общего пикселя (для двух картинок с учётом прозрачности) по формуле:
Формула объединения C1 = (R1,G1,B1)и C2 = (R2,G2,B2)в новый цвет C3 , где C2 накладывается поверх C1 с непрозрачностью p, обычно равна R3= (1-p)*R1 + p*R2, G3=(1-p)*G1 + p*G2, B3=(1-p)*B1 + p*B2 ).
Затем вновь “сливаются” в два байта - новый цвет пикселя и выводятся на дисплей. p - прозрачность, от 0.00 до 1.00. Вариант кода:
//вывод картинок на дисплеи
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>
#include "ris_0.h"//файл хранения массивов
#define TFT_CS 5 //не используется по назначению
#define TFT_RST 13 // (RES)
#define TFT_DC 12 // (RS)
#define TFT_CS1 4 // выводы для коммутации дисплеев
#define TFT_CS2 26
#define TFT_CS3 25
#define TFT_CS4 17
// TFT_SCL 18
// TFT_SDA 23
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);//
#define TFT_SCLK 18 // set these to be whatever pins you like!
#define TFT_MOSI 32 // set these to be whatever pins you like!
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);//
const byte z=0;//определяет вид используемых цифр
long Y=0;//
void setup() {
pinMode(TFT_CS1, OUTPUT);
pinMode(TFT_CS2, OUTPUT);
pinMode(TFT_CS3, OUTPUT);
pinMode(TFT_CS4, OUTPUT);
digitalWrite(TFT_CS1,LOW);
digitalWrite(TFT_CS2,LOW);
digitalWrite(TFT_CS3,LOW);
digitalWrite(TFT_CS4,LOW);
tft.initR(INITR_BLACKTAB);
tft.setRotation(2);
tft.fillScreen(tft.Color565(0,0,0));
digitalWrite(TFT_CS1,LOW);drawFoto(0,0,ris_1,ris_0,128,160,0.0);digitalWrite(TFT_CS1,HIGH);
digitalWrite(TFT_CS2,LOW);drawFoto(0,0,ris_1,ris_0,128,160,0.33);digitalWrite(TFT_CS2,HIGH);
digitalWrite(TFT_CS3,LOW);drawFoto(0,0,ris_1,ris_0,128,160,0.66);digitalWrite(TFT_CS3,HIGH);
digitalWrite(TFT_CS4,LOW);drawFoto(0,0,ris_1,ris_0,128,160,1.0);digitalWrite(TFT_CS4,HIGH);
}
void loop() {
}
//////////////////////////////////////////
void drawFoto(int x,int y, const uint8_t *bitmap_1,const uint8_t *bitmap_2,int w,int h,float p) {//функция вывода фотокартинки
if(x<0||x+w>128||y<0||y+h>160){return;}
tft.setAddrWindow(x,y,x+w-1,y+h-1);
SPI.beginTransaction(SPISettings(40000000, MSBFIRST, SPI_MODE0));
digitalWrite(TFT_DC, HIGH);
digitalWrite(TFT_CS, LOW);
for(int j=0; j<h; j++) {
for(int i=0; i<2*w; i=i+2) {
//
int cvet_1=256*bitmap_1[i+1+j*2*w]+bitmap_1[i+j*2*w];
int cvet_2=256*bitmap_2[i+1+j*2*w]+bitmap_2[i+j*2*w];
int R_1=cvet_1/2048;int G_1=(cvet_1%2048)/32;int B_1=cvet_1%32;int R_2=cvet_2/2048;int G_2=(cvet_2%2048)/32;int B_2=cvet_2%32;
R_1=(1.00-p)*R_1 + p*R_2; G_1=(1.00-p)*G_1 + p*G_2; B_1=(1.00-p)*B_1 + p*B_2;
cvet_1=R_1*2048+G_1*32+B_1;//R=0-31,G=0-63,B=0-31
//
SPI.transfer(cvet_1/256);SPI.transfer(cvet_1%256);
}
}
digitalWrite(TFT_CS, HIGH);
SPI.endTransaction();
///
}
//////////////////////