一、引言

年关将近,今日周末来分享一下,使用硬件SPI方式驱动LCD彩屏,其实前段时间尝试使用GPIO口去模拟SPI通信,驱屏失败了,然后转而硬件方式驱动。该屏是基于ST7735S方案的,屏尺寸为1.77寸,分辨率128*160。得捷电子商城上购屏链接:AFL128160A0-1.77N12NTM-ANO

二、硬件接口

在这里插入图片描述

根据产品手册,可知PA5可复用成SPI1的SCLK,PA7可复用成MOSI。
在这里插入图片描述

TFT-LCD屏的管脚定义
在这里插入图片描述

MM32F5260开发板与TFT-LCD屏的管脚连接对应关系:
在这里插入图片描述

三、实物连接

在这里插入图片描述

四、参考源码

main.c

/* Files include */
#include "platform.h"
#include "gpio_led_toggle.h"
#include "main.h"
#include "lcd.h"

int main(void)
{
    PLATFORM_Init();
    GPIO_LED_Toggle_Sample();
	LCDInit();
	PLATFORM_DelayMS(200U);
	LcdFill(0,0,LCD_W,LCD_H,WHITE);
	LcdFill(0,0,LCD_W,LCD_H,LGRAY);
    while (1)
    {
		LCDTest();
    }
}

lcd.h

#ifndef __LCD_H__
#define __LCD_H__

#include "hal_conf.h"

/*-----------------LCD端口定义----------------*/
	/*
	GND      GND
	VCC      VCC  
	PA5      SCL 
	PA7      SDA 
	PA1      RES(复位)
	PA3      DC(命令数据选择) 
	PA4      CS(片选)       
	PA2      BLK(背光)        
	*/
	
#define SPI_FLASH_CS_H() 	 SPI_CSInternalSelected(SPI1, DISABLE)
#define SPI_FLASH_CS_L() 	 SPI_CSInternalSelected(SPI1, ENABLE)

#define LCD_DC_LOW()       GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_RESET)
#define LCD_DC_HIGH()      GPIO_WriteBit(GPIOA, GPIO_Pin_3, Bit_SET)

#define LCD_RES_LOW()      GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET)
#define LCD_RES_HIGH()     GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET)

#define USE_HORIZONTAL 1  //设置横屏或者竖屏显示 0或1为竖屏 2或3为横屏

#if USE_HORIZONTAL==0||USE_HORIZONTAL==1
	#define LCD_W 128  //0x80
	#define LCD_H 160  //0xA0
#else
	#define LCD_W 160
	#define LCD_H 128
#endif

//画笔颜色
#define WHITE         	 	0xFFFF
#define BLACK         	 	0x0000	  
#define BLUE           	 	0x001F  
#define BRED             	0XF81F
#define GRED 			 	0XFFE0
#define GBLUE			 	0X07FF
#define RED           	 	0xF800
#define MAGENTA       	 	0xF81F
#define GREEN         	 	0x07E0
#define CYAN          	 	0x7FFF
#define YELLOW        	 	0xFFE0
#define BROWN 			 	0XBC40	 //棕色
#define BRRED 			 	0XFC07	 //棕红色
#define GRAY  			 	0X8430	 //灰色
#define DARKBLUE      	 	0X01CF   //深蓝色
#define LIGHTBLUE      	 	0X7D7C	 //浅蓝色  
#define GRAYBLUE       	 	0X5458	 //灰蓝色
#define LIGHTGREEN     	 	0X841F	 //浅绿色
#define LGRAY 			 	0XC618	 //浅灰色(PANNEL),窗体背景色
#define LGRAYBLUE        	0XA651	 //浅灰蓝色(中间层颜色)
#define LBBLUE           	0X2B12	 //浅棕蓝色(选择条目的反色)

void LCDInit(void);
void LCDTest(void);

#endif

lcd.c

#include "lcdfont.h"
#include "lcd.h"
#include "main.h"
#include "stdint.h"
#include "image.h"

void LCD_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
    SPI_InitTypeDef  SPI_InitStruct;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    SPI_StructInit(&SPI_InitStruct);
    SPI_InitStruct.SPI_Mode      = SPI_Mode_Master;
    SPI_InitStruct.SPI_DataSize  = SPI_DataSize_8b;
    SPI_InitStruct.SPI_DataWidth = 8;
    SPI_InitStruct.SPI_CPOL      = SPI_CPOL_Low;
    SPI_InitStruct.SPI_CPHA      = SPI_CPHA_1Edge;
    SPI_InitStruct.SPI_NSS       = SPI_NSS_Soft;
    SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_InitStruct.SPI_FirstBit  = SPI_FirstBit_MSB;
    SPI_Init(SPI1, &SPI_InitStruct);

    SPI_BiDirectionalLineConfig(SPI1, SPI_Enable_RX);
    SPI_BiDirectionalLineConfig(SPI1, SPI_Enable_TX);

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_5);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_5);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 ;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_StructInit(&GPIO_InitStruct);
    GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_6;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
    GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

	SPI_Cmd(SPI1, ENABLE);
	GPIO_StructInit(&GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	GPIO_WriteBit(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3, Bit_SET);
}

/******************************************************************************
函数说明:LCD串行数据写入函数
入口数据:dat  要写入的串行数据
返回值:  无
******************************************************************************/
void LCD_Writ_Bus(uint8_t dat) 
{	
  SPI_SendData(SPI1, dat);
  while (RESET == SPI_GetFlagStatus(SPI1, SPI_FLAG_TXEPT))
	{
	}	
}

/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值:  无
******************************************************************************/
void LCD_WR_DATA8(uint8_t dat)
{
	SPI_FLASH_CS_L();
	LCD_DC_HIGH();//写数据
	LCD_Writ_Bus(dat);
	SPI_FLASH_CS_H();
}

/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值:  无
******************************************************************************/
void LCD_WR_DATA(uint16_t dat)
{
	SPI_FLASH_CS_L();
	LCD_DC_HIGH();//写数据
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
	SPI_FLASH_CS_H();
}

/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值:  无
******************************************************************************/
void LCD_WR_REG(uint8_t  dat)
{
	SPI_FLASH_CS_L();
	LCD_DC_LOW();//写命令
	LCD_Writ_Bus(dat);
	LCD_DC_HIGH();//写数据
	SPI_FLASH_CS_H();
}

/******************************************************************************
函数说明:设置起始和结束地址
入口数据:x1,x2 设置列的起始和结束地址
		  y1,y2 设置行的起始和结束地址
返回值:  无
******************************************************************************/
void LCD_Address_Set(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2)
{
	if(USE_HORIZONTAL==0)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+2);
		LCD_WR_DATA(x2+2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+1);
		LCD_WR_DATA(y2+1);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==1)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+2);
		LCD_WR_DATA(x2+2);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+1);
		LCD_WR_DATA(y2+1);
		LCD_WR_REG(0x2c);//储存器写
	}
	else if(USE_HORIZONTAL==2)
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+1);
		LCD_WR_DATA(x2+1);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+2);
		LCD_WR_DATA(y2+2);
		LCD_WR_REG(0x2c);//储存器写
	}
	else
	{
		LCD_WR_REG(0x2a);//列地址设置
		LCD_WR_DATA(x1+1);
		LCD_WR_DATA(x2+1);
		LCD_WR_REG(0x2b);//行地址设置
		LCD_WR_DATA(y1+2);
		LCD_WR_DATA(y2+2);
		LCD_WR_REG(0x2c);//储存器写
	}
}

/******************************************************************************
函数说明:LCD初始化,包含硬件IO
入口数据:无
返回值:  无
******************************************************************************/
void LCDInit(void)
{
	LCD_Init();//初始化GPIO
	
	LCD_RES_LOW();//复位
	PLATFORM_DelayMS(100);
	LCD_RES_HIGH();
	PLATFORM_DelayMS(100);

	LCD_WR_REG(0x11); //Sleep out 
	PLATFORM_DelayMS(120);              //Delay 120ms 
	//------------------------------------ST7735S Frame Rate-----------------------------------------// 
	LCD_WR_REG(0xB1); 
	LCD_WR_DATA8(0x05); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_REG(0xB2); 
	LCD_WR_DATA8(0x05);
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_REG(0xB3); 
	LCD_WR_DATA8(0x05); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x05); 
	LCD_WR_DATA8(0x3C); 
	LCD_WR_DATA8(0x3C); 
	//------------------------------------End ST7735S Frame Rate---------------------------------// 
	LCD_WR_REG(0xB4); //Dot inversion 
	LCD_WR_DATA8(0x03); 
	//------------------------------------ST7735S Power Sequence---------------------------------// 
	LCD_WR_REG(0xC0); 
	LCD_WR_DATA8(0x28); 
	LCD_WR_DATA8(0x08); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_REG(0xC1); 
	LCD_WR_DATA8(0XC0); 
	LCD_WR_REG(0xC2); 
	LCD_WR_DATA8(0x0D); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_REG(0xC3); 
	LCD_WR_DATA8(0x8D); 
	LCD_WR_DATA8(0x2A); 
	LCD_WR_REG(0xC4); 
	LCD_WR_DATA8(0x8D); 
	LCD_WR_DATA8(0xEE); 
	//---------------------------------End ST7735S Power Sequence-------------------------------------// 
	LCD_WR_REG(0xC5); //VCOM 
	LCD_WR_DATA8(0x1A); 
	LCD_WR_REG(0x36); //MX, MY, RGB mode 
	
	if(USE_HORIZONTAL==0)
		LCD_WR_DATA8(0x00);
	else if(USE_HORIZONTAL==1)
		LCD_WR_DATA8(0xC0);
	else if(USE_HORIZONTAL==2)
		LCD_WR_DATA8(0x70);
	else 
		LCD_WR_DATA8(0xA0); 
	//------------------------------------ST7735S Gamma Sequence---------------------------------// 
	LCD_WR_REG(0xE0); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_DATA8(0x22); 
	LCD_WR_DATA8(0x07); 
	LCD_WR_DATA8(0x0A); 
	LCD_WR_DATA8(0x2E); 
	LCD_WR_DATA8(0x30); 
	LCD_WR_DATA8(0x25); 
	LCD_WR_DATA8(0x2A); 
	LCD_WR_DATA8(0x28); 
	LCD_WR_DATA8(0x26); 
	LCD_WR_DATA8(0x2E); 
	LCD_WR_DATA8(0x3A); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_DATA8(0x01); 
	LCD_WR_DATA8(0x03); 
	LCD_WR_DATA8(0x13); 
	LCD_WR_REG(0xE1); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_DATA8(0x16); 
	LCD_WR_DATA8(0x06); 
	LCD_WR_DATA8(0x0D); 
	LCD_WR_DATA8(0x2D); 
	LCD_WR_DATA8(0x26); 
	LCD_WR_DATA8(0x23); 
	LCD_WR_DATA8(0x27); 
	LCD_WR_DATA8(0x27); 
	LCD_WR_DATA8(0x25); 
	LCD_WR_DATA8(0x2D); 
	LCD_WR_DATA8(0x3B); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_DATA8(0x01); 
	LCD_WR_DATA8(0x04); 
	LCD_WR_DATA8(0x13); 
	//------------------------------------End ST7735S Gamma Sequence-----------------------------// 
	LCD_WR_REG(0x3A); //65k mode 
	LCD_WR_DATA8(0x05); 
	LCD_WR_REG(0x29); //Display on 
} 

/******************************************************************************
函数说明:在指定区域填充颜色
入口数据:xsta,ysta   起始坐标
		  xend,yend   终止坐标
		  color       要填充的颜色
返回值:  无
******************************************************************************/
void LcdFill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color)
{          
	uint16_t i,j; 
	
	LCD_Address_Set(xsta,ysta,xend-1,yend-1);//设置显示范围
	
	for(i=ysta;i<yend;i++)
	{													   	 	
		for(j=xsta;j<xend;j++)
		{
			LCD_WR_DATA(color);
		}
	} 					  	    
}

/******************************************************************************
函数说明:在指定位置画点
入口数据:x,y 画点坐标
		  color 点的颜色
返回值:  无
******************************************************************************/
void LcdDrawPoint(uint16_t x,uint16_t y,uint16_t color)
{
	LCD_Address_Set(x,y,x,y);//设置光标位置 
	LCD_WR_DATA(color);
} 

/******************************************************************************
函数说明:画线
入口数据:x1,y1   起始坐标
		  x2,y2   终止坐标
		  color   线的颜色
返回值:  无
******************************************************************************/
void LcdDrawLine(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color)
{
	uint16_t t; 
	int xerr=0,yerr=0,delta_x,delta_y,distance;
	int incx,incy,uRow,uCol;
	
	delta_x=x2-x1; //计算坐标增量 
	delta_y=y2-y1;
	uRow=x1;//画线起点坐标
	uCol=y1;
	if(delta_x>0)incx=1; //设置单步方向 
	else if (delta_x==0)incx=0;//垂直线 
	else {incx=-1;delta_x=-delta_x;}
	if(delta_y>0)incy=1;
	else if (delta_y==0)incy=0;//水平线 
	else {incy=-1;delta_y=-delta_y;}
	if(delta_x>delta_y)distance=delta_x; //选取基本增量坐标轴 
	else distance=delta_y;
	
	for(t=0;t<distance+1;t++)
	{
		LcdDrawPoint(uRow,uCol,color);//画点
		xerr+=delta_x;
		yerr+=delta_y;
		if(xerr>distance)
		{
			xerr-=distance;
			uRow+=incx;
		}
		if(yerr>distance)
		{
			yerr-=distance;
			uCol+=incy;
		}
	}
}

/******************************************************************************
函数说明:画矩形
入口数据:x1,y1   起始坐标
		  x2,y2   终止坐标
		  color   矩形的颜色
返回值:  无
******************************************************************************/
void LcdDrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color)
{
	LcdDrawLine(x1,y1,x2,y1,color);
	LcdDrawLine(x1,y1,x1,y2,color);
	LcdDrawLine(x1,y2,x2,y2,color);
	LcdDrawLine(x2,y1,x2,y2,color);
}

/******************************************************************************
函数说明:画圆
入口数据:x0,y0   圆心坐标
		  r       半径
		  color   圆的颜色
返回值:  无
******************************************************************************/
void LcdDrawCircle(uint16_t x0,uint16_t y0,uint8_t r,uint16_t color)
{
	int a,b;
	
	a=0;b=r;	  
	while(a<=b)
	{
		LcdDrawPoint(x0-b,y0-a,color);             //3           
		LcdDrawPoint(x0+b,y0-a,color);             //0           
		LcdDrawPoint(x0-a,y0+b,color);             //1           
		LcdDrawPoint(x0-a,y0-b,color);             //2           
		LcdDrawPoint(x0+b,y0+a,color);             //4           
		LcdDrawPoint(x0+a,y0-b,color);             //5
		LcdDrawPoint(x0+a,y0+b,color);             //6 
		LcdDrawPoint(x0-b,y0+a,color);             //7
		a++;
		if((a*a+b*b)>(r*r))//判断要画的点是否过远
		{
			b--;
		}
	}
}

/******************************************************************************
函数说明:显示单个字符
入口数据:x,y显示坐标
		  ch 要显示的字符
		  fc 字的颜色
		  bc 字的背景色
		  csize 字号
返回值:  无
******************************************************************************/
void LcdShowChar(uint16_t x,uint16_t y,uint8_t ch,uint16_t fc,uint16_t bc,uint8_t csize)
{
	const unsigned char  *temp;
	uint8_t i,j,k;
	uint16_t x0=x,y0=y;
	uint8_t row=0,column=0;
	
	row=(csize/8+((csize%8)?1:0));  //计算行
	column=csize/2;                 //列
	ch=ch-' ';                      //得到偏移后的值
		
	switch(csize)
	{
		case 12:temp=Ascii_6x12[ch]; break;
		case 16:temp=Ascii_8x16[ch]; break;
		case 24:temp=Ascii_12x24[ch]; break;
		case 32:temp=Ascii_16x32[ch]; break;
		default: temp=Ascii_6x12[ch]; break;
	}
	
	//显示要与取模方式保持一致
	for(i=0;i<row;i++)
	{
		for(j=0;j<column;j++)
		{ 
			for(k=0;k<8;k++)
			{
				if((*temp)&(0x01<<k))
				{
					LcdDrawPoint(x,y,fc);//画一个点,字体色
				}
				else
				{
					LcdDrawPoint(x,y,bc);//画一个点,背景色
				}
				y++;
			}
			y=y0;
			x++;
			temp++;
		}
		x=x0;
		y0+=8;
		y=y0;
	}
}

/******************************************************************************
函数说明:显示字符串
入口数据:x,y显示坐标
		  *p 要显示的字符串
		  fc 字的颜色
		  bc 字的背景色
		  csize 字号
返回值:  无
******************************************************************************/
void LcdShowString(uint16_t x,uint16_t y,const char *p,uint16_t fc,uint16_t bc,uint8_t csize)
{         
	while(*p!='\0')
	{       
		LcdShowChar(x,y,*p,fc,bc,csize);
		x+=csize/2;
		p++;
	}  
}

/******************************************************************************
函数说明:显示汉字字符
入口数据:x,y显示坐标
		  index 汉字字符索引
		  fc 字的颜色
		  bc 字的背景色
返回值:  无
******************************************************************************/
void LcdShow16x16Hz(uint32_t x, uint32_t y, uint8_t index, uint16_t fc, uint16_t bc)	
{  
	const char *temp=Hzk[index]; //获取字体数据在数组中的起始位置 
	uint8_t y0=y,x0=x;
	uint8_t i,j,k;
	uint8_t row=0,column=0;

	row=16/8;
	column=16;
	
	//显示要与取模方式保持一致
	for(i=0;i<row;i++)
	{
		for(j=0;j<column;j++)
		{
			for( k=0;k<8;k++)
			{ 	
				if(*temp&(0x01<<k))
				{
					LcdDrawPoint(x,y,fc);//画一个点,字体色
				}
				else
				{
					LcdDrawPoint(x,y,bc);//画一个点,背景色
				}
				y++;
			}
			temp++;
			x++;
			y=y0;
		}
		x=x0;
		y0+=8;
		y=y0;
	}
}	

/******************************************************************************
      函数说明:显示数字
      入口数据:m底数,n指数
      返回值:  无
******************************************************************************/
u32 mypow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;
	return result;
}

/******************************************************************************
      函数说明:显示整数变量
      入口数据:x,y显示坐标
                num 要显示整数变量
                len 要显示的位数
                fc 字的颜色
                bc 字的背景色
                sizey 字号
      返回值:  无
******************************************************************************/
void LcdShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey)
{         	
	u8 t,temp;
	u8 enshow=0;
	u8 sizex=sizey/2;
	for(t=0;t<len;t++)
	{
		temp=(num/mypow(10,len-t-1))%10;
		if(enshow==0&&t<(len-1))
		{
			if(temp==0)
			{
				LcdShowChar(x+t*sizex,y,' ',fc,bc,sizey);
				continue;
			}else enshow=1; 
		 	 
		}
	 	LcdShowChar(x+t*sizex,y,temp+48,fc,bc,sizey);
	}
} 

/******************************************************************************
函数说明:显示图片
入口数据:x,y显示坐标
		  width   图片宽度
		  height  图片高度
		  image   图片数据
返回值:  无
******************************************************************************/
void LcdShowImage(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *image) 
{  	
	uint16_t colorData=0;
	uint32_t cnt=0;
	uint16_t i,j;
	x=x-4;
	y=y-1;
 	for( i=0; i<height; i++)                // 一行一行地显示
	{
 		LCD_Address_Set(x, y+i, x+width, y+height);  // 重新设置光标位置 
		for( j=0; j<width; j++)             // 一行中,从左到事,逐个像素处理
		{		    
		    colorData=(image[cnt*2+1]<<8) | image[cnt*2]; 
		    LCD_WR_DATA(colorData);              // 写入16位颜色数据 
			cnt++;	
		}
	}	  
}

/******************************************************************************
函数说明:LCD测试主函数
入口数据:无
返回值:  无
******************************************************************************/
void LCDTest(void)
{
	LcdFill(0,0,LCD_W,LCD_H,LGRAY);
	LcdShowIntNum(8,10,2025,4,BLUE,GREEN,16);
	LcdShow16x16Hz(40,10,0, BLUE,GREEN);
	LcdShow16x16Hz(56,10,1, BLUE,GREEN);
	LcdShow16x16Hz(72,10,2, BLUE,GREEN);
	LcdShow16x16Hz(88,10,3, BLUE,GREEN);
	LcdShow16x16Hz(104,10,4,BLUE,GREEN);
	LcdShow16x16Hz(8,30,5,  BLUE,GREEN);
	LcdShow16x16Hz(24,30,6, BLUE,GREEN);
	LcdShowString(40,30," ",BLUE,GREEN,16);
	LcdShowString(44,30,"MM32F5260",BLUE, GREEN,16);
	LcdShow16x16Hz(8,50,7,  BLUE,GREEN);
	LcdShow16x16Hz(24,50,8, BLUE,GREEN);
	LcdShow16x16Hz(40,50,9, BLUE,GREEN);
	LcdShow16x16Hz(8,70,10, WHITE,RED);
	LcdShowString(24,70,":",WHITE,RED,16);
	LcdShow16x16Hz(40,86,11, WHITE,RED);
	LcdShow16x16Hz(56,86,12, WHITE,RED);
	LcdShow16x16Hz(72,86,13, WHITE,RED);
	LcdShow16x16Hz(88,86,14, WHITE,RED);
	LcdShow16x16Hz(40,102,15,WHITE,RED);
	LcdShow16x16Hz(56,102,16, WHITE,RED);
	LcdShow16x16Hz(72,102,17, WHITE,RED);
	LcdShow16x16Hz(88,102,18, WHITE,RED);
	LcdShow16x16Hz(40,118,19,WHITE,RED);
	LcdShow16x16Hz(56,118,20, WHITE,RED);
	LcdShow16x16Hz(72,118,21, WHITE,RED);
	LcdShow16x16Hz(88,118,22, WHITE,RED);
	LcdShowString(43,140,"2025-01-10",WHITE,RED,16);
	PLATFORM_DelayMS(600);
	LcdFill(0,0,LCD_W,LCD_H,LGRAY);
	PLATFORM_DelayMS(50);
	LcdShowImage(0,0, 128, 160, gImage_1); 
	PLATFORM_DelayMS(800);
}

五、显示效果

这里屏中的中文字符显示需要使用“PCtoLCD2002”工具来生成C代码。画图使用“Img2Lcd”工具来导出数组数据。
使用“Img2Lcd”工具,导入画好的16位真彩bmp图片,具体设置如下,导入则是一个C数组,直接调用即可完成画图。
在这里插入图片描述

编译下载,运行效果如下面视频所示,其中字符显示内容如下:
在这里插入图片描述

画图显示内容如下:
在这里插入图片描述

刷图效果非常流畅,肉眼感觉上驱屏效果,硬件方式比软件模拟好多啦。

https://www.youku.com/video/XNjQ1NzU1MDIwMA==

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐