国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

stm32驅(qū)動st7789 TFT-LCD屏幕顯示

這篇具有很好參考價值的文章主要介紹了stm32驅(qū)動st7789 TFT-LCD屏幕顯示。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言

一切程序以最后百度網(wǎng)盤鏈接的程序為準(zhǔn),可能在寫文章的時候有些地方有改動。
主控:STM32F103C8T6
1.69 TFT-LCD(st7789驅(qū)動)

一 硬件相關(guān)說明

1.1接線說明

CLK:PA4
SDA:PA5
RST:PA6
D/C:PA7
BLK:PC14
CS:PA8

1.2硬件初始化

TFT-LCD是采用SPI通信的,這里使用stm32f103c8t6的SPI1,初始化代碼如下

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     	//使能A端口時鐘
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        	//推挽輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       	//速度50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA, GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_4);
	
		//背光引腳 PC13 片選CS引腳PC14
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);                //使能GPIOC時鐘
    //配置GPIOB的工作模式和初始化
    GPIO_InitStruture.GPIO_Mode = GPIO_Mode_Out_PP;                    //推挽輸出
    GPIO_InitStruture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;            //引腳PC13 PC14 
    GPIO_InitStruture.GPIO_Speed = GPIO_Speed_50MHz;                   //速度50MHz
    GPIO_Init(GPIOC,&GPIO_InitStruture);

1.3驅(qū)動初始化

在原有的驅(qū)動基礎(chǔ)上增加了幾個宏去控制顯示方向,方便后期更改
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

1.3.1 UP方向朝上
#define DISPLAY_OVERTURN 0			
#define DISPLAY_BOTTOM_TO_TOP 0		
#define DISPLAY_RIGHT_TO_LEFT 0	

st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

1.3.2 BOTTOM朝上
#define DISPLAY_OVERTURN 0			
#define DISPLAY_BOTTOM_TO_TOP 1		
#define DISPLAY_RIGHT_TO_LEFT 1	

st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

1.3.3 RIGHT朝上
#define DISPLAY_OVERTURN 1			
#define DISPLAY_BOTTOM_TO_TOP 0		
#define DISPLAY_RIGHT_TO_LEFT 1	

st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

1.3.4 LEFT朝上
#define DISPLAY_OVERTURN 1			
#define DISPLAY_BOTTOM_TO_TOP 1		
#define DISPLAY_RIGHT_TO_LEFT 0

st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

1.3.5 驅(qū)動代碼
//st7789驅(qū)動
	TFT_SCLK_Set();			//特別注意!!
	TFT_RST_Clr();
	delay_ms(1000);
	TFT_RST_Set();
	delay_ms(1000);
    TFT_SEND_CMD(0x11); 			//Sleep Out
	delay_ms(120);               //DELAY120ms 
	 	  //-----------------------ST7789V Frame rate setting-----------------//
//************************************************
	TFT_SEND_CMD(0x3A);        //顏色數(shù)據(jù)格式RGB565 65k真彩色
	TFT_SEND_DATA(0x05);
	TFT_SEND_CMD(0xC5); 		//VCOM1
	TFT_SEND_DATA(0x1A);
/*		
	(0,0)*********240***********->
	*
	*
	*
	280           240x280
	*
	*
	*
	↓
**/
	TFT_SEND_CMD(0x36);                 // 屏幕顯示方向設(shè)置

#if DISPLAY_BOTTOM_TO_TOP
	lcd_data |= (1<<7);
#else	
	lcd_data |= (0<<7);
#endif
#if DISPLAY_RIGHT_TO_LEFT
	lcd_data |= (1<<6);
#else	
	lcd_data |= (0<<6);
#endif

#if DISPLAY_OVERTURN//不翻轉(zhuǎn)顯示
	lcd_data |= (1<<5);//翻轉(zhuǎn)顯示
#else
	lcd_data |= (0<<5);	
#endif
	TFT_SEND_DATA(lcd_data);

/*****顯示位置,注意,x和y是根據(jù)屏幕顯示方向來定的,不一定統(tǒng)一**********/
	TFT_SEND_CMD(0x2B); //設(shè)置顯示區(qū)域 x軸起始及結(jié)束坐標(biāo) 
	TFT_SEND_DATA((start_x>>8)&0xff);
	TFT_SEND_DATA(start_x&0xff);
	TFT_SEND_DATA((end_x>>8)&0xff);
	TFT_SEND_DATA(end_x&0xff);

	TFT_SEND_CMD(0x2B); //設(shè)置顯示區(qū)域 Y軸起始及結(jié)束坐標(biāo)
	TFT_SEND_DATA((start_y>>8)&0xff);
	TFT_SEND_DATA(start_y&0xff);
	TFT_SEND_DATA((end_y>>8)&0xff);
	TFT_SEND_DATA(end_y&0xff);
	
	//-------------ST7789V Frame rate setting-----------//
	TFT_SEND_CMD(0xb2);		//Porch Setting
	TFT_SEND_DATA(0x05);
	TFT_SEND_DATA(0x05);
	TFT_SEND_DATA(0x00);
	TFT_SEND_DATA(0x33);
	TFT_SEND_DATA(0x33);

	TFT_SEND_CMD(0xb7);			//Gate Control
	TFT_SEND_DATA(0x05);			//12.2v   -10.43v
	//--------------ST7789V Power setting---------------//
	TFT_SEND_CMD(0xBB);//VCOM
	TFT_SEND_DATA(0x3F);

	TFT_SEND_CMD(0xC0); //Power control
	TFT_SEND_DATA(0x2c);

	TFT_SEND_CMD(0xC2);		//VDV and VRH Command Enable
	TFT_SEND_DATA(0x01);

	TFT_SEND_CMD(0xC3);			//VRH Set
	TFT_SEND_DATA(0x0F);		//4.3+( vcom+vcom offset+vdv)

	TFT_SEND_CMD(0xC4);			//VDV Set
	TFT_SEND_DATA(0x20);				//0v

	TFT_SEND_CMD(0xC6);				//Frame Rate Control in Normal Mode
	TFT_SEND_DATA(0X01);			//111Hz

	TFT_SEND_CMD(0xd0);				//Power Control 1
	TFT_SEND_DATA(0xa4);
	TFT_SEND_DATA(0xa1);

	TFT_SEND_CMD(0xE8);				//Power Control 1
	TFT_SEND_DATA(0x03);

	TFT_SEND_CMD(0xE9);				//Equalize time control
	TFT_SEND_DATA(0x09);
	TFT_SEND_DATA(0x09);
	TFT_SEND_DATA(0x08);
	//---------------ST7789V gamma setting-------------//
	TFT_SEND_CMD(0xE0); //Set Gamma
	TFT_SEND_DATA(0xD0);
	TFT_SEND_DATA(0x05);
	TFT_SEND_DATA(0x09);
	TFT_SEND_DATA(0x09);
	TFT_SEND_DATA(0x08);
	TFT_SEND_DATA(0x14);
	TFT_SEND_DATA(0x28);
	TFT_SEND_DATA(0x33);
	TFT_SEND_DATA(0x3F);
	TFT_SEND_DATA(0x07);
	TFT_SEND_DATA(0x13);
	TFT_SEND_DATA(0x14);
	TFT_SEND_DATA(0x28);
	TFT_SEND_DATA(0x30);
	 
	TFT_SEND_CMD(0XE1); //Set Gamma
	TFT_SEND_DATA(0xD0);
	TFT_SEND_DATA(0x05);
	TFT_SEND_DATA(0x09);
	TFT_SEND_DATA(0x09);
	TFT_SEND_DATA(0x08);
	TFT_SEND_DATA(0x03);
	TFT_SEND_DATA(0x24);
	TFT_SEND_DATA(0x32);
	TFT_SEND_DATA(0x32);
	TFT_SEND_DATA(0x3B);
	TFT_SEND_DATA(0x14);
	TFT_SEND_DATA(0x13);
	TFT_SEND_DATA(0x28);
	TFT_SEND_DATA(0x2F);

	TFT_SEND_CMD(0x21); 		//反顯
   
	TFT_SEND_CMD(0x29);         //開啟顯示 

二、圖片顯示

TFT-LCD采用RGB565格式的顏色數(shù)據(jù),每個像素占用16bit,顯示圖片的方式是向TFT-LCD的GRAM寫入數(shù)據(jù),具體流程:讀取圖片的寬高->設(shè)置顯示范圍->發(fā)送寫入GRAM命令(0x2C)->寫入圖片數(shù)據(jù)->TFT-LCD顯示。
通常電腦端的BMP圖片數(shù)據(jù)是RGB888的個數(shù),需要使用工具將RGB888格式的數(shù)據(jù)轉(zhuǎn)換成RGB565格式的數(shù)據(jù)。這里我用QT寫了一個圖片轉(zhuǎn)換工具。具體細(xì)和使用方法在第四點(diǎn)。
注意:在圖片數(shù)組的前四個字節(jié)加入圖片寬高字段,方便后續(xù)讀取,不需要我們手動去設(shè)置圖片的寬高。
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

void TFT_display_image(const uint16_t *address, uint16_t startX, uint16_t startY)
{
	uint16_t image_width;//圖片寬
	uint16_t image_hight;//圖片高
	uint16_t x,y;
	image_width = address[0];
	image_hight = address[1];
	TFT_SetWindows(startX, startY, image_width, image_hight);
	for(y = 0; y < image_hight; y++)
	{
		for(x = 0; x < image_width; x++)
		{
			//發(fā)送圖片數(shù)據(jù),每次發(fā)送16位,先發(fā)高八位
			TFT_SEND_DATA(address[y*image_width + x + 2]>>8);
			TFT_SEND_DATA(address[y*image_width + x + 2]&0xff);
		}
	}	
}

三、文字顯示

3.1字體取模

使用PCtolLCD2002軟件對要顯示的字體進(jìn)行取模,字體取模方式可參照下圖進(jìn)行設(shè)置
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

3.2 將取模得到的數(shù)組復(fù)制到代碼中

st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

3.3 顯示字體函數(shù)

void TFT_display_char16_16(const uint8_t *address ,uint16_t startX,uint16_t startY,uint16_t color)
{
	unsigned int column;
	unsigned char tm=0,temp;

	TFT_SetWindows(startX, startY, 16, 16);
	
	for(column = 0; column < 32; column++)  //column loop
	{
		temp =* address;
		for(tm = 0; tm < 8; tm++)
		{
			if(temp&0x01)
			{
				TFT_SEND_DATA(color>>8);
				TFT_SEND_DATA(color);
			}
			else 
			{
				TFT_SEND_DATA(0);
				TFT_SEND_DATA(0);
			}
			temp >>= 1;
		}
		address++;
	}
}  

3.4 遇到的問題

1、在顯示文字的時候原始寫法就是如果是1就填充對應(yīng)文字的顏色,沒有數(shù)據(jù)就填充黑色(背景色),但是如果整個屏幕的背景色不是黑色的話看感覺文字背景設(shè)很突兀。
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
為了解決上一個問題在此增加了一個函數(shù)用于顯示透明的文字(其它大小展示沒有調(diào)試),使用這種方式也有一個缺點(diǎn)就是顯示速度太慢,因為是一個點(diǎn)一個點(diǎn)的刷上去

void TFT_display_char16_16_noBackColor(const uint8_t *address ,uint16_t startX,uint16_t startY,uint16_t color)
{
	unsigned int column;
	unsigned char tm=0,temp;
	unsigned int x = 0;
	unsigned int y = 0;
	for(column = 0; column < 16; column++)//顯示前16行數(shù)據(jù)
	{
		temp =* address;
		for(tm = 0; tm < 8; tm++)
		{			
			if(temp&0x01)
			{
				TFT_display_point(startX+ tm, startY+ y ,color);
				printf("cloumn:%d Y:%d\r\n",column, tm);
			}
			
			temp >>= 1;
		}
		address++;
		temp =* address;
		for(tm = 0; tm < 8; tm++)
		{			
			if(temp&0x01)
			{
				TFT_display_point(startX+ tm+8, startY+ y ,color);
			}
			
			temp >>= 1;
		}
//		if(column>0 && column%2 == 0)//如果開啟字體的高讀會壓縮到之前的一半
		y++;
		address++;
	}	
} 

顯示效果
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
可以對比下一在圖片上顯示效果,后者是不帶底色顯示問題
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

四 bmp圖片轉(zhuǎn)換軟件

我這里是使用QT自己寫的一個轉(zhuǎn)換工具,將BMP圖片轉(zhuǎn)換成C語言數(shù)組和bin文件(未驗證),此軟件占時只做一張圖片的轉(zhuǎn)換,自己可以根據(jù)自己的需求做修改。

4.1 BMP圖片

BMP圖片頭部14Byte+位部信息頭40Byte,注意:每個信息塊是從右向左計算
頭部14字節(jié)具體含義如下
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

4.2圖片頭部信息

Byte1-2
0x42:‘B’,0x4d:‘M’
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte3-6文件大小(bmp圖片總占用空間)
注意高位是高字節(jié),低位是低字節(jié),實際大小應(yīng)該是0x0313b6=201654
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte11-14
位圖數(shù)據(jù)部分相對于文件首的起始偏移,0x36=54
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

4.3位圖信息

位圖信息共占40位
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte15-18
信息頭部:通常為0x28或者0x38,0x0000 0028
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte19-22
圖像寬度0x0000 0118 = 280
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte23-26
圖像高度0x0000 00f0=240
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte27-28
保留位,值永遠(yuǎn)為0x01
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte29-30
每個像素占用的位數(shù)0x0018=24,即該圖像為RGB888格式
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte31-34
壓縮方式
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte35-38
圖像尺寸(字節(jié)數(shù),真正圖片數(shù)據(jù)不包括圖片信息的頭部)0x0003 1380=201600(Byte3-6 減去 Byte11-14)
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte39-42
水平分辨率0x0ec4 = 3780
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte43-46
垂直分辨率0x0ec4 = 3780
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte47-50
引用色彩數(shù)
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
Byte51-54
關(guān)鍵色彩數(shù)

st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

4.4 QT代碼

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "protocol.h"
#include <QDataStream>
#include <QFile>
#include <QFileDialog>
#include <QImage>
#include <QMessageBox>
#include <QPixmap>
#include <QSettings>

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}



void MainWindow::on_openImage_clicked()
{
    QString fileName;
    QSettings setting("./lastopenFile.ini", QSettings::IniFormat);
    QString lastPath = setting.value("LastFilePath").toString();
    fileName = QFileDialog::getOpenFileName(this, QString::fromLocal8Bit("選擇圖片"), lastPath, tr("Images(*.bmp)"));
    ui->imageInfoEdit->append("/*imag name:"+fileName+"*/");
    qInfo()<<"*imag name:"<< fileName<<"*";
    if(!fileName.isEmpty())
    {
        setting.setValue("LastFilePath", fileName);
        read_BMP(fileName);
    }
}

void MainWindow::read_BMP(QString fileName)
{
    QFile file(fileName);
    QFile saveFile("./image.bin");//圖片數(shù)據(jù)保存的bin文件
    saveFile.open(QIODevice::WriteOnly);//以只寫的方式打開文件
    QDataStream saveFileStream(&saveFile);//定義一個數(shù)據(jù)流
    QString showStr;
    QString bmpToCarray;
    BmpHeader header;
    Pixel bmpPixel;
    unsigned short rgb565Data = 0x0000;
    int times = 0;
    int lines = 0;
    char bmpData = 0x00;
//    unsigned char rgb888[WIDTH*3];
    if(!file.exists())
    {
        return;
    }
    file.open(QFileDevice::ReadOnly);
    file.read((char*)&header, sizeof(BmpHeader));//讀取圖片文件頭信息
    showStr.append("/*圖片寬:"+(QString("%1  ").arg(header.bmpWidth, 1, 10, QLatin1Char('0')).toUpper())+"\n");
    showStr.append("圖片高:"+(QString("%1  ").arg(header.bmpHeight, 1, 10, QLatin1Char('0')).toUpper())+"\n");
    showStr.append("每像素占用位數(shù)(bit):"+(QString("%1  ").arg(header.bmpBitCount, 1, 10, QLatin1Char('0')).toUpper())+"*/\n");
    bmpToCarray.append("#ifndef __IMAGE_H\n");
    bmpToCarray.append("#define __IMAGE_H\n#include <stdint.h>\n");
    bmpToCarray.append("const uint16_t bmp_array[] ={ ");
    /*圖像的寬高*/
    bmpToCarray.append("\n\t0x"+(QString("%1  ").arg((header.bmpWidth)&0xffff, 4, 16, QLatin1Char('0')).toUpper())+",/*width*/ ");
//    bmpToCarray.append("0x"+(QString("%1  ").arg(header.bmpWidth&0xff, 2, 10, QLatin1Char('0')).toUpper())+",  /*width*/ ");
    bmpToCarray.append("\n\t0x"+(QString("%1  ").arg((header.bmpHeight)&0xffff, 4, 16, QLatin1Char('0')).toUpper())+",/*height*/\n\t");
 //   bmpToCarray.append("0x"+(QString("%1  ").arg(header.bmpHeight&0xff, 2, 10, QLatin1Char('0')).toUpper())+", /*height*/\n\t");
    for(int i = 0; i < header.bmpHeight; i++)
    {
        file.seek((header.bmpHeight - i -1)*header.bmpWidth*3 + header.bfOffBits+((header.bmpHeight - i -1))*(4-header.bmpWidth%4));
        for(int j = 0; j < header.bmpWidth; j++)
        {
            /*注意:BMP圖片數(shù)據(jù)存儲是從左到右,從下到上存儲的!?。?/
//            file.seek(i*header.bmpWidth*3+j*sizeof(bmpPixel)+54);

            file.read((char*)&bmpPixel, sizeof(Pixel));
            rgb565Data = RGB888toRGB565(bmpPixel.red, bmpPixel.green, bmpPixel.blue);
            if(i == 0 && j == 0)
            {
                qInfo()<<"RED:0x"<<(QString("%1").arg(bmpPixel.red&0xff, 2, 16, QLatin1Char('0')).toUpper());
                qInfo()<<"GREEN:0x"<<(QString("%1").arg(bmpPixel.green&0xff, 2, 16, QLatin1Char('0')).toUpper());
                qInfo()<<"BLUE:0x"<<(QString("%1").arg(bmpPixel.blue&0xff, 2, 16, QLatin1Char('0')).toUpper());
            }
            bmpToCarray.append("0x"+(QString("%1").arg(rgb565Data&0xfFFf, 4, 16, QLatin1Char('0')).toUpper())+",  ");

            lines++;
            if(lines == 8)
            {
                bmpToCarray.append("\n\t");
                lines = 0;
            }

            saveFileStream<<(unsigned short)rgb565Data;//保存到bin文件中
          ("%1  ").arg(bmpData & 0xff, 1, 16, QLatin1Char('0')).toUpper()));
        }
    }
    bmpToCarray.append("};\n");
    bmpToCarray.append("#endif\n");
//    }
    ui->imageInfoEdit->append(showStr);
    ui->imageInfoEdit->append(bmpToCarray);
    file.close();
    saveFile.close();
}
/************************************
 *
 * RGB888格式轉(zhuǎn)換成RGB565規(guī)則
 * 取出R的高5位、G高6位、B高5位
 *
 * *********************************/
unsigned short MainWindow::RGB888toRGB565(unsigned char red, unsigned char green, unsigned char blue)
{   //RGB888轉(zhuǎn)RGB565,都是保留高幾位
    unsigned short B = (blue >> 3) & 0x001F;
    unsigned short G = ((green >> 2) << 5) & 0x07E0;
    unsigned short R = ((red >> 3) << 11) & 0xF800;
    return (unsigned short) (R | G | B);
 }

4.5 軟件使用方法

在下載的資源QT文件夾下有個tool文件夾目錄點(diǎn)進(jìn)去
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
點(diǎn)擊BMP_Transform_BIN.exe打開軟件
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
點(diǎn)擊打開圖片按鈕找到你要轉(zhuǎn)換的圖片(只能是BMP格式的)
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
然后將轉(zhuǎn)換后的圖片數(shù)據(jù)復(fù)制到keil中image.h文件夾中
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
最后運(yùn)行代碼燒錄到stm32中就可以了
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

4.6遇到的問題

圖片數(shù)據(jù),因為圖片格式為RGB888格式,即三個字節(jié)表示一個像素點(diǎn),注意:實際保存的數(shù)據(jù)不是Red、Green、Blue、而是Blue、Green、Red(小端模式,即低地址存放低位數(shù)據(jù))
如圖所示red:0x21,green:0x2a,blue:0x31
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
注意:BMP圖片數(shù)數(shù)據(jù)時從左到右,從下到上存儲的

4.7編程中遇到的坑

1、BMP圖片數(shù)據(jù)存儲是從左到右,從下到上存儲的?。?!
如下圖所示,c6 c6 d3…是bmp圖片最后一行像素信息
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
2、windows是4字節(jié)對齊,如果圖片寬度不是4字節(jié)對齊的話windows會自動補(bǔ)齊(填0x00),這樣會導(dǎo)致顯示的圖片出現(xiàn)傾斜。如下圖,圖片的寬度是50,每個像素占用3Byte,3*50=150,所以系統(tǒng)自動填充2Byte補(bǔ)齊。所以在程序中要注意這種情況,在讀數(shù)據(jù)的時候做特殊處理。
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt
所以在QT中要加以下特殊處理
st7789,STM32F103C8T6,stm32,單片機(jī),嵌入式硬件,qt

既然都看到這了,如果對你有幫助就點(diǎn)點(diǎn)贊吧

網(wǎng)盤鏈接

傳送門
提取碼:5656

如有侵權(quán),請聯(lián)系刪除?。。。。。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-589800.html

到了這里,關(guān)于stm32驅(qū)動st7789 TFT-LCD屏幕顯示的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • STM32(HAL庫)驅(qū)動(1.44寸)TFT-LCD彩屏

    STM32(HAL庫)驅(qū)動(1.44寸)TFT-LCD彩屏

    目錄 1、簡介 2、CubeMX初始化配置 2.1 基礎(chǔ)配置 2.1.1 SYS配置 ?2.1.2 RCC配置 2.2 屏幕引腳配置 2.3 項目生成 ?3、KEIL端程序整合 3.1 LCD驅(qū)動添加 3.2?函數(shù)修改 3.2.1?lcd.h修改 3.2.2 lcd_innit.h?修改 ?3.2.3 lcd.c修改 ?3.2.4?lcd_inut.c修改 ?3.3?主函數(shù)代碼 3.3.1 添加頭文件 3.3.2?LCD進(jìn)行初始化

    2024年02月03日
    瀏覽(28)
  • STM32H5開發(fā)(6)----SPI驅(qū)動TFT-LCD屏

    STM32H5開發(fā)(6)----SPI驅(qū)動TFT-LCD屏

    在嵌入式領(lǐng)域,TFT-LCD屏是最常用的顯示解決方案之一,因為它們提供了豐富的顏色和高分辨率的圖像顯示能力。STM32H5作為ST的高性能微控制器系列,具備了強(qiáng)大的處理能力和多種通信接口,非常適合于驅(qū)動TFT-LCD顯示屏,該液晶屏st7796或者ILI9488驅(qū)動芯片,這兩個屏幕都是兼容

    2024年02月05日
    瀏覽(30)
  • STM32CubeMX教程22 FSMC - 8080并行接口TFT-LCD驅(qū)動

    開發(fā)板(正點(diǎn)原子stm32f407探索者開發(fā)板V2.4) STM32CubeMX軟件(Version 6.10.0) 野火DAP仿真器 keil μVision5 IDE(MDK-Arm) ST-LINK/V2驅(qū)動 XCOM V2.6串口助手 使用STM32CubeMX軟件配置STM32F407開發(fā)板 FSMC接口驅(qū)動8080并行接口TFT-LCD顯示 ,具體為使用FSMC Bank 1-NOR/PSRAM4,片選信號為NE4(PG12),TFT-L

    2024年01月23日
    瀏覽(30)
  • 利用STM32的HAL庫驅(qū)動1.54寸 TFT屏(240*240 ST7789V)

    利用STM32的HAL庫驅(qū)動1.54寸 TFT屏(240*240 ST7789V)

    ? 項目:溫濕度表 芯片:STM32F030C6T8 液晶:華迪1.54寸 TFT屏 溫濕度傳感器:SHT30 ? ? ?主要對液晶屏官方驅(qū)動代碼進(jìn)行了增加和修改。 一、STM32CubeMX建立工程 ???????? I2C1 給SHT30, SPI給液晶屏,TIM16用于內(nèi)部基礎(chǔ)定時,TIM17給LED,USART1打印調(diào)試信息。RTC預(yù)留。 ?SPI的DMA設(shè)置?

    2023年04月08日
    瀏覽(24)
  • STM32驅(qū)動4寸ST7796S LCD-TFT屏

    STM32驅(qū)動4寸ST7796S LCD-TFT屏

    屏幕驅(qū)動芯片ST7796S最大支持320*480分辨率的屏幕,顯存GRAM達(dá)345600字節(jié),支持8/9/16/18/24位并口數(shù)據(jù)總線,還支持3/4線制SPI通信。每一個像素點(diǎn)RGB顯示的顏色可達(dá)65K/262K/16.7M鐘,像素點(diǎn)地址設(shè)置按照行列的順序進(jìn)行,遞增遞減方向由掃描方式?jīng)Q定,顯示方法按照先設(shè)置地址再設(shè)置

    2024年02月03日
    瀏覽(23)
  • STM32-基本知識梳理10-FSMC控制ST7789V-LCD液晶顯示屏

    STM32-基本知識梳理10-FSMC控制ST7789V-LCD液晶顯示屏

    一、ST7789V-LCD液晶顯示 1,一種計算機(jī)的I/O設(shè)備,即輸入輸出設(shè)備; 2,數(shù)據(jù)傳遞結(jié)構(gòu),光線的傳遞通過偏光片進(jìn)行調(diào)整,最終傳遞到濾光片上,進(jìn)而不同RGB數(shù)據(jù)點(diǎn),即像素點(diǎn); 3, LCD顯示器的關(guān)鍵參數(shù) ①像素:顯示器的像素指它成像最小的點(diǎn) ②分辨率:像素點(diǎn)的個數(shù)的乘積

    2024年02月12日
    瀏覽(21)
  • TFT-LCD屏幕顯示圖片

    TFT-LCD屏幕顯示圖片

    TFT_LCD顯示圖片時,圖片大小選擇要適配屏幕大小,如果要豎屏顯示的話,則屏幕寬x高為240x320,所以圖片也要找240x320的, 如果是橫屏顯示,則屏幕寬x高為320x240,所以圖片也要找320x240的 圖片取模軟件 —— Image2Lcd v2.9 因為本次實驗是豎屏顯示,所以先在網(wǎng)上找一張240x320的圖

    2024年02月02日
    瀏覽(34)
  • stm32 hal庫硬件spi(軟件spi)驅(qū)動1.8寸tft—lcd屏幕

    stm32 hal庫硬件spi(軟件spi)驅(qū)動1.8寸tft—lcd屏幕

    屏幕是嵌入式開發(fā)中的一個重要的部分,cdsn上有許多解釋原理的,還有很多是采用正點(diǎn)原子的屏幕來驅(qū)動的,對于剛剛?cè)腴T不久的我們可能沒有資金去購買較為昂貴的屏幕。而對于底層原理我們暫時也不必了解的那么深入,能點(diǎn)亮屏幕就是我們最大的快樂。 除了中景園的資

    2024年02月03日
    瀏覽(23)
  • STM32驅(qū)動0.96寸TFT 彩色LCD模塊顯示

    STM32驅(qū)動0.96寸TFT 彩色LCD模塊顯示

    小型的彩色LCD模塊如一款0.96寸模塊,由ST7735S驅(qū)動芯片和LCD屏幕組成。STM32通過驅(qū)動ST7735S,從而實現(xiàn)對彩色LCD的驅(qū)動。 這里將STM32通過硬件SPI驅(qū)動0.96寸TFT彩色LCD的參考代碼,移植到STM32CUBEIDE開發(fā)環(huán)境。以STM32G030F6P6為例,可以用于采用ST7735S驅(qū)動芯片的其它尺寸LCD屏幕驅(qū)動。 LC

    2024年02月16日
    瀏覽(23)
  • TFT-LCD顯示驅(qū)動系統(tǒng)架構(gòu)

    TFT-LCD顯示驅(qū)動系統(tǒng)架構(gòu)

    TFT-LCD驅(qū)動的核心是電壓和透過率的關(guān)系。驅(qū)動電壓決定子像素透過的亮度,不同的RGB子像素亮度組合形成各種顏色,不同像素上的不同顏色最后組成五彩繽紛的畫面。 伽馬調(diào)節(jié)與校正 通過V-T曲線,它是透過率和驅(qū)動電壓之間的關(guān)系曲線。V-T曲線是一種非線性響應(yīng),這種非線

    2023年04月16日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包