【NXP-MCXA153】TFT驱动移植

news2024/9/23 12:33:28

介绍

GC9A01是一款1.28寸的圆形TFT显示屏模块,分辨率为240x240,支持三种颜色格式:RGB444、RGB565、RGB666,本次实验将在NXP-MCXA153开发板上移植TFT LCD驱动

移植流程

① 绑定TFT LCD上面的GPIO,如SCL_PIN、SDA_PIN、RES_PIN、DC_PIN、CS_PIN,实现GPIO初始化接口:LCD_GPIO_Init

② 根据LCD的读写时序编写bus数据传送接口、命令/数据发送接口等:LCD_Writ_Bus、LCD_WR_DATA、LCD_WR_REG

③ 时序TFT LCD的初始化接口:LCD_Init

④ 对绘图接口进行再一步封装:LCD_Fill、LCD_DrawPoint、Draw_Circle、LCD_ShowChinese、LCD_ShowPicture

引脚配置

GC9A01模块和开发板连接配置如下

引脚GPIO功能
SCL_PINP1_1时钟引脚
SDA_PINP1_0MOSI,数据引脚
RES_PINP3_30复位引脚
DC_PINP3_1数据命令引脚
CS_PINP1_3片选引脚

驱动文件

lcd_init.h

定义LCD初始化相关的接口

#ifndef __LCD_INIT_H
#define __LCD_INIT_H

#include "drv_pin.h"

typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned int u32;

#define USE_HORIZONTAL 0 
#define USE_HARDWARE_SPI 0
#define LCD_W 240
#define LCD_H 240

#define SCL_PIN     ((1*32)+1)
#define SDA_PIN     ((1*32)+0)
#define RES_PIN     ((3*32)+30)
#define DC_PIN      ((3*32)+1)
#define CS_PIN      ((1*32)+3)

#define LCD_SCLK_Clr() rt_pin_write(SCL_PIN, PIN_LOW)
#define LCD_SCLK_Set() rt_pin_write(SCL_PIN, PIN_HIGH)

#define LCD_MOSI_Clr() rt_pin_write(SDA_PIN, PIN_LOW)
#define LCD_MOSI_Set() rt_pin_write(SDA_PIN, PIN_HIGH)

#define LCD_RES_Clr()  rt_pin_write(RES_PIN, PIN_LOW)
#define LCD_RES_Set()  rt_pin_write(RES_PIN, PIN_HIGH)

#define LCD_DC_Clr()   rt_pin_write(DC_PIN, PIN_LOW)
#define LCD_DC_Set()   rt_pin_write(DC_PIN, PIN_HIGH)

#define LCD_CS_Clr()   rt_pin_write(CS_PIN, PIN_LOW)
#define LCD_CS_Set()   rt_pin_write(CS_PIN, PIN_HIGH)

#define LCD_BLK_Clr()  {}
#define LCD_BLK_Set()  {}

void LCD_GPIO_Init(void);
void LCD_Writ_Bus(u8 dat);
void LCD_WR_DATA8(u8 dat);
void LCD_WR_DATA(u16 dat);
void LCD_WR_REG(u8 dat);
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2);
void LCD_Init(void);

#endif

lcd_init.c

LCD初始化相关的接口实现

#include "lcd_init.h"
#include <rtthread.h>
#include <board.h>
#include <drv_spi.h>

static struct rt_spi_device *spi_device;

#define SPI_BUS_NAME   "spi0"
#define SPI_DEV_NAME   "spi00"

void LCD_GPIO_Init(void)
{
    // init gpios
    rt_base_t cs = 1*32+3;
    rt_pin_mode(cs, PIN_MODE_OUTPUT);
    rt_pin_mode(DC_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(RES_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(SDA_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(SCL_PIN, PIN_MODE_OUTPUT);
	
#if USE_HARDWARE_SPI
    rt_hw_spi_device_attach(SPI_BUS_NAME, SPI_DEV_NAME, cs);

    struct rt_spi_configuration cfg;

    spi_device = (struct rt_spi_device *)rt_device_find(SPI_DEV_NAME);
    if (!spi_device)
    {
        rt_kprintf("can't find %s device!\n", SPI_BUS_NAME);
    }

    cfg.data_width = 8;
    cfg.mode = RT_SPI_MASTER | RT_SPI_MODE_0 | RT_SPI_MSB;
    cfg.max_hz = 12* 1000 * 1000; /* 500K */
    rt_spi_configure(spi_device, &cfg);
#endif
}

void LCD_Writ_Bus(u8 dat) 
{	
#if 0
    rt_uint8_t recv_buf[1];
    rt_spi_transfer(spi_device, &dat, recv_buf, 1);
#else
	u8 i;
	LCD_CS_Clr();
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_Clr();
		if(dat&0x80)
		{
		   LCD_MOSI_Set();
		}
		else
		{
		   LCD_MOSI_Clr();
		}
		LCD_SCLK_Set();
		dat<<=1;
	}	
	LCD_CS_Set();
#endif
}

void LCD_WR_DATA8(u8 dat)
{
	LCD_Writ_Bus(dat);
}

void LCD_WR_DATA(u16 dat)
{
	LCD_Writ_Bus(dat>>8);
	LCD_Writ_Bus(dat);
}

void LCD_WR_REG(u8 dat)
{
	LCD_DC_Clr();
	LCD_Writ_Bus(dat);
	LCD_DC_Set();
}

void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
		LCD_WR_REG(0x2a);
		LCD_WR_DATA(x1);
		LCD_WR_DATA(x2);
		LCD_WR_REG(0x2b);
		LCD_WR_DATA(y1);
		LCD_WR_DATA(y2);
		LCD_WR_REG(0x2c);
}

void LCD_Init(void)
{
	LCD_GPIO_Init();
	LCD_RES_Clr();
	rt_thread_mdelay(100);
	LCD_RES_Set();
	rt_thread_mdelay(100);
	
	LCD_BLK_Set();
  	rt_thread_mdelay(100);
	
	LCD_WR_REG(0xEF);
	LCD_WR_REG(0xEB);
	LCD_WR_DATA8(0x14); 
  	LCD_WR_REG(0xFE);			 
	LCD_WR_REG(0xEF); 
	LCD_WR_REG(0xEB);	
	LCD_WR_DATA8(0x14); 
	LCD_WR_REG(0x84);			
	LCD_WR_DATA8(0x40); 
	LCD_WR_REG(0x85);			
	LCD_WR_DATA8(0xFF); 
	LCD_WR_REG(0x86);			
	LCD_WR_DATA8(0xFF); 
	LCD_WR_REG(0x87);			
	LCD_WR_DATA8(0xFF);
	LCD_WR_REG(0x88);			
	LCD_WR_DATA8(0x0A);
	LCD_WR_REG(0x89);			
	LCD_WR_DATA8(0x21); 
	LCD_WR_REG(0x8A);			
	LCD_WR_DATA8(0x00); 
	LCD_WR_REG(0x8B);			
	LCD_WR_DATA8(0x80); 
	LCD_WR_REG(0x8C);			
	LCD_WR_DATA8(0x01); 
	LCD_WR_REG(0x8D);			
	LCD_WR_DATA8(0x01); 
	LCD_WR_REG(0x8E);			
	LCD_WR_DATA8(0xFF); 
	LCD_WR_REG(0x8F);			
	LCD_WR_DATA8(0xFF); 
	LCD_WR_REG(0xB6);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x20);

	LCD_WR_REG(0x36);
	if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x08);
	else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC8);
	else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x68);
	else LCD_WR_DATA8(0xA8);

	LCD_WR_REG(0x3A);			
	LCD_WR_DATA8(0x05);
	LCD_WR_REG(0x90);			
	LCD_WR_DATA8(0x08);
	LCD_WR_DATA8(0x08);
	LCD_WR_DATA8(0x08);
	LCD_WR_DATA8(0x08); 

	LCD_WR_REG(0xBD);			
	LCD_WR_DATA8(0x06);
	
	LCD_WR_REG(0xBC);			
	LCD_WR_DATA8(0x00);	

	LCD_WR_REG(0xFF);			
	LCD_WR_DATA8(0x60);
	LCD_WR_DATA8(0x01);
	LCD_WR_DATA8(0x04);

	LCD_WR_REG(0xC3);			
	LCD_WR_DATA8(0x13);
	LCD_WR_REG(0xC4);			
	LCD_WR_DATA8(0x13);

	LCD_WR_REG(0xC9);			
	LCD_WR_DATA8(0x22);

	LCD_WR_REG(0xBE);			
	LCD_WR_DATA8(0x11); 

	LCD_WR_REG(0xE1);			
	LCD_WR_DATA8(0x10);
	LCD_WR_DATA8(0x0E);

	LCD_WR_REG(0xDF);			
	LCD_WR_DATA8(0x21);
	LCD_WR_DATA8(0x0c);
	LCD_WR_DATA8(0x02);

	LCD_WR_REG(0xF0);   
	LCD_WR_DATA8(0x45);
	LCD_WR_DATA8(0x09);
	LCD_WR_DATA8(0x08);
	LCD_WR_DATA8(0x08);
	LCD_WR_DATA8(0x26);
 	LCD_WR_DATA8(0x2A);

 	LCD_WR_REG(0xF1);    
 	LCD_WR_DATA8(0x43);
 	LCD_WR_DATA8(0x70);
 	LCD_WR_DATA8(0x72);
 	LCD_WR_DATA8(0x36);
 	LCD_WR_DATA8(0x37);  
 	LCD_WR_DATA8(0x6F);


 	LCD_WR_REG(0xF2);   
 	LCD_WR_DATA8(0x45);
 	LCD_WR_DATA8(0x09);
 	LCD_WR_DATA8(0x08);
 	LCD_WR_DATA8(0x08);
 	LCD_WR_DATA8(0x26);
 	LCD_WR_DATA8(0x2A);

 	LCD_WR_REG(0xF3);   
 	LCD_WR_DATA8(0x43);
 	LCD_WR_DATA8(0x70);
 	LCD_WR_DATA8(0x72);
 	LCD_WR_DATA8(0x36);
 	LCD_WR_DATA8(0x37); 
 	LCD_WR_DATA8(0x6F);

	LCD_WR_REG(0xED);	
	LCD_WR_DATA8(0x1B); 
	LCD_WR_DATA8(0x0B); 

	LCD_WR_REG(0xAE);			
	LCD_WR_DATA8(0x77);
	
	LCD_WR_REG(0xCD);			
	LCD_WR_DATA8(0x63);		


	LCD_WR_REG(0x70);			
	LCD_WR_DATA8(0x07);
	LCD_WR_DATA8(0x07);
	LCD_WR_DATA8(0x04);
	LCD_WR_DATA8(0x0E); 
	LCD_WR_DATA8(0x0F); 
	LCD_WR_DATA8(0x09);
	LCD_WR_DATA8(0x07);
	LCD_WR_DATA8(0x08);
	LCD_WR_DATA8(0x03);

	LCD_WR_REG(0xE8);			
	LCD_WR_DATA8(0x34);

	LCD_WR_REG(0x62);			
	LCD_WR_DATA8(0x18);
	LCD_WR_DATA8(0x0D);
	LCD_WR_DATA8(0x71);
	LCD_WR_DATA8(0xED);
	LCD_WR_DATA8(0x70); 
	LCD_WR_DATA8(0x70);
	LCD_WR_DATA8(0x18);
	LCD_WR_DATA8(0x0F);
	LCD_WR_DATA8(0x71);
	LCD_WR_DATA8(0xEF);
	LCD_WR_DATA8(0x70); 
	LCD_WR_DATA8(0x70);

	LCD_WR_REG(0x63);			
	LCD_WR_DATA8(0x18);
	LCD_WR_DATA8(0x11);
	LCD_WR_DATA8(0x71);
	LCD_WR_DATA8(0xF1);
	LCD_WR_DATA8(0x70); 
	LCD_WR_DATA8(0x70);
	LCD_WR_DATA8(0x18);
	LCD_WR_DATA8(0x13);
	LCD_WR_DATA8(0x71);
	LCD_WR_DATA8(0xF3);
	LCD_WR_DATA8(0x70); 
	LCD_WR_DATA8(0x70);

	LCD_WR_REG(0x64);			
	LCD_WR_DATA8(0x28);
	LCD_WR_DATA8(0x29);
	LCD_WR_DATA8(0xF1);
	LCD_WR_DATA8(0x01);
	LCD_WR_DATA8(0xF1);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x07);

	LCD_WR_REG(0x66);			
	LCD_WR_DATA8(0x3C);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0xCD);
	LCD_WR_DATA8(0x67);
	LCD_WR_DATA8(0x45);
	LCD_WR_DATA8(0x45);
	LCD_WR_DATA8(0x10);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x00);

	LCD_WR_REG(0x67);			
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x3C);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x00);
	LCD_WR_DATA8(0x01);
	LCD_WR_DATA8(0x54);
	LCD_WR_DATA8(0x10);
	LCD_WR_DATA8(0x32);
	LCD_WR_DATA8(0x98);

	LCD_WR_REG(0x74);			
	LCD_WR_DATA8(0x10);	
	LCD_WR_DATA8(0x85);	
	LCD_WR_DATA8(0x80);
	LCD_WR_DATA8(0x00); 
	LCD_WR_DATA8(0x00); 
	LCD_WR_DATA8(0x4E);
	LCD_WR_DATA8(0x00);					
	
  	LCD_WR_REG(0x98);			
	LCD_WR_DATA8(0x3e);
	LCD_WR_DATA8(0x07);

	LCD_WR_REG(0x35);	
	LCD_WR_REG(0x21);

	LCD_WR_REG(0x11);
	rt_thread_mdelay(120);
	LCD_WR_REG(0x29);
	rt_thread_mdelay(20);
} 

lcd.h

绘图接口声明

#ifndef __LCD_H
#define __LCD_H

typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned int u32;

void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);//Ö¸¶¨ÇøÓòÌî³äÑÕÉ«
void LCD_DrawPoint(u16 x,u16 y,u16 color);//ÔÚÖ¸¶¨Î»Öû­Ò»¸öµã
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);//ÔÚÖ¸¶¨Î»Öû­Ò»ÌõÏß
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);//ÔÚÖ¸¶¨Î»Öû­Ò»¸ö¾ØÐÎ
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);//ÔÚÖ¸¶¨Î»Öû­Ò»¸öÔ²

void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾºº×Ö´®
void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾµ¥¸ö12x12ºº×Ö
void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾµ¥¸ö16x16ºº×Ö
void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾµ¥¸ö24x24ºº×Ö
void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾµ¥¸ö32x32ºº×Ö

void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾһ¸ö×Ö·û
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode);//ÏÔʾ×Ö·û´®
u32 mypow(u8 m,u8 n);//ÇóÃÝ
void LCD_ShowIntNum(u16 x,u16 y,u16 num,u8 len,u16 fc,u16 bc,u8 sizey);//ÏÔʾÕûÊý±äÁ¿
void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey);//ÏÔʾÁ½Î»Ð¡Êý±äÁ¿

void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[]);//ÏÔʾͼƬ


//»­±ÊÑÕÉ«
#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	//dzÀ¶É«  
#define GRAYBLUE       	 0X5458 //»ÒÀ¶É«
#define LIGHTGREEN     	 0X841F //dzÂÌÉ«
#define LGRAY 			     0XC618 //dz»ÒÉ«(PANNEL),´°Ìå±³¾°É«
#define LGRAYBLUE        0XA651 //dz»ÒÀ¶É«(Öмä²ãÑÕÉ«)
#define LBBLUE           0X2B12 //dz×ØÀ¶É«(Ñ¡ÔñÌõÄ¿µÄ·´É«)

#endif

lcd.c

绘图接口实现

#include "lcd.h"
#include "lcd_init.h"
#include "lcdfont.h"

void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color)
{          
	u16 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);
		}
	} 					  	    
}

void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
	LCD_Address_Set(x,y,x,y);
	LCD_WR_DATA(color);
} 

void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color)
{
	u16 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++)
	{
		LCD_DrawPoint(uRow,uCol,color);
		xerr+=delta_x;
		yerr+=delta_y;
		if(xerr>distance)
		{
			xerr-=distance;
			uRow+=incx;
		}
		if(yerr>distance)
		{
			yerr-=distance;
			uCol+=incy;
		}
	}
}

void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color)
{
	LCD_DrawLine(x1,y1,x2,y1,color);
	LCD_DrawLine(x1,y1,x1,y2,color);
	LCD_DrawLine(x1,y2,x2,y2,color);
	LCD_DrawLine(x2,y1,x2,y2,color);
}

void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color)
{
	int a,b;
	a=0;b=r;	  
	while(a<=b)
	{
		LCD_DrawPoint(x0-b,y0-a,color);             //3           
		LCD_DrawPoint(x0+b,y0-a,color);             //0           
		LCD_DrawPoint(x0-a,y0+b,color);             //1                
		LCD_DrawPoint(x0-a,y0-b,color);             //2             
		LCD_DrawPoint(x0+b,y0+a,color);             //4               
		LCD_DrawPoint(x0+a,y0-b,color);             //5
		LCD_DrawPoint(x0+a,y0+b,color);             //6 
		LCD_DrawPoint(x0-b,y0+a,color);             //7
		a++;
		if((a*a+b*b)>(r*r))
		{
			b--;
		}
	}
}

void LCD_ShowChinese(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	while(*s!=0)
	{
		if(sizey==12) LCD_ShowChinese12x12(x,y,s,fc,bc,sizey,mode);
		else if(sizey==16) LCD_ShowChinese16x16(x,y,s,fc,bc,sizey,mode);
		else if(sizey==24) LCD_ShowChinese24x24(x,y,s,fc,bc,sizey,mode);
		else if(sizey==32) LCD_ShowChinese32x32(x,y,s,fc,bc,sizey,mode);
		else return;
		s+=2;
		x+=sizey;
	}
}

void LCD_ShowChinese12x12(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;
	u16 TypefaceNum;
	u16 x0=x;
	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	                         
	HZnum=sizeof(tfont12)/sizeof(typFNT_GB12);	
	for(k=0;k<HZnum;k++) 
	{
		if((tfont12[k].Index[0]==*(s))&&(tfont12[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)
					{
						if(tfont12[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else
					{
						if(tfont12[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue;  
	}
} 

void LCD_ShowChinese16x16(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;
	u16 TypefaceNum;
	u16 x0=x;
  	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	HZnum=sizeof(tfont16)/sizeof(typFNT_GB16);	
	for(k=0;k<HZnum;k++) 
	{
		if ((tfont16[k].Index[0]==*(s))&&(tfont16[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)
					{
						if(tfont16[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else
					{
						if(tfont16[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue;  
	}
} 

void LCD_ShowChinese24x24(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;
	u16 TypefaceNum;
	u16 x0=x;
	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	HZnum=sizeof(tfont24)/sizeof(typFNT_GB24);	
	for(k=0;k<HZnum;k++) 
	{
		if ((tfont24[k].Index[0]==*(s))&&(tfont24[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)
					{
						if(tfont24[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else
					{
						if(tfont24[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue; 
	}
} 

void LCD_ShowChinese32x32(u16 x,u16 y,u8 *s,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 i,j,m=0;
	u16 k;
	u16 HZnum;
	u16 TypefaceNum;
	u16 x0=x;
	TypefaceNum=(sizey/8+((sizey%8)?1:0))*sizey;
	HZnum=sizeof(tfont32)/sizeof(typFNT_GB32);
	for(k=0;k<HZnum;k++) 
	{
		if ((tfont32[k].Index[0]==*(s))&&(tfont32[k].Index[1]==*(s+1)))
		{ 	
			LCD_Address_Set(x,y,x+sizey-1,y+sizey-1);
			for(i=0;i<TypefaceNum;i++)
			{
				for(j=0;j<8;j++)
				{	
					if(!mode)
					{
						if(tfont32[k].Msk[i]&(0x01<<j))LCD_WR_DATA(fc);
						else LCD_WR_DATA(bc);
						m++;
						if(m%sizey==0)
						{
							m=0;
							break;
						}
					}
					else
					{
						if(tfont32[k].Msk[i]&(0x01<<j))	LCD_DrawPoint(x,y,fc);
						x++;
						if((x-x0)==sizey)
						{
							x=x0;
							y++;
							break;
						}
					}
				}
			}
		}				  	
		continue; 
	}
}

void LCD_ShowChar(u16 x,u16 y,u8 num,u16 fc,u16 bc,u8 sizey,u8 mode)
{
	u8 temp,sizex,t,m=0;
	u16 i,TypefaceNum;
	u16 x0=x;
	sizex=sizey/2;
	TypefaceNum=(sizex/8+((sizex%8)?1:0))*sizey;
	num=num-' ';   
	LCD_Address_Set(x,y,x+sizex-1,y+sizey-1);  
	for(i=0;i<TypefaceNum;i++)
	{ 
		if(sizey==12)temp=ascii_1206[num][i];		  
		else if(sizey==16)temp=ascii_1608[num][i];		
		else if(sizey==24)temp=ascii_2412[num][i];	
		else if(sizey==32)temp=ascii_3216[num][i];		
		else return;
		for(t=0;t<8;t++)
		{
			if(!mode)
			{
				if(temp&(0x01<<t))LCD_WR_DATA(fc);
				else LCD_WR_DATA(bc);
				m++;
				if(m%sizex==0)
				{
					m=0;
					break;
				}
			}
			else
			{
				if(temp&(0x01<<t))LCD_DrawPoint(x,y,fc);
				x++;
				if((x-x0)==sizex)
				{
					x=x0;
					y++;
					break;
				}
			}
		}
	}   	 	  
}

void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 fc,u16 bc,u8 sizey,u8 mode)
{         
	while(*p!='\0')
	{       
		LCD_ShowChar(x,y,*p,fc,bc,sizey,mode);
		x+=sizey/2;
		p++;
	}  
}

u32 mypow(u8 m,u8 n)
{
	u32 result=1;	 
	while(n--)result*=m;
	return result;
}

void LCD_ShowIntNum(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)
			{
				LCD_ShowChar(x+t*sizex,y,' ',fc,bc,sizey,0);
				continue;
			}else enshow=1; 
		 	 
		}
	 	LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
	}
} 

void LCD_ShowFloatNum1(u16 x,u16 y,float num,u8 len,u16 fc,u16 bc,u8 sizey)
{         	
	u8 t,temp,sizex;
	u16 num1;
	sizex=sizey/2;
	num1=num*100;
	for(t=0;t<len;t++)
	{
		temp=(num1/mypow(10,len-t-1))%10;
		if(t==(len-2))
		{
			LCD_ShowChar(x+(len-2)*sizex,y,'.',fc,bc,sizey,0);
			t++;
			len+=1;
		}
	 	LCD_ShowChar(x+t*sizex,y,temp+48,fc,bc,sizey,0);
	}
}

void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
	u16 i,j;
	u32 k=0;
	LCD_Address_Set(x,y,x+length-1,y+width-1);
	for(i=0;i<length;i++)
	{
		for(j=0;j<width;j++)
		{
			LCD_WR_DATA8(pic[k*2]);
			LCD_WR_DATA8(pic[k*2+1]);
			k++;
		}
	}			
}

测试用例

LCD显示圆形波纹动画

#include <rtthread.h>
#include <rtdevice.h>
#include "stdlib.h"
#include "lcd.h"
#include "lcd_init.h"
#include "pic.h"

int main(void)
{
    int j = 0;

    LCD_Init();

    LCD_Fill(0, 0, 240, 240, BLACK);

    while(1) {
        for(int i = 0; i < 240; i += 10) {
            Draw_Circle(120, 120, i, 400 * j);
        }
        if(j++ > 65536 / 400) {
            j = 0;
        }

        rt_thread_mdelay(1);
    }

    return 0;
}

实验效果

在这里插入图片描述

参考

GC9A01 1.28寸圆形TFT: GC9A01 1.28寸圆形TFT (gitee.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java - File、IO流

File类 File是java.io.包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以是文件、文件夹&#xff09; File类只能对文件本身进行操作&#xff0c;不能读写文件里面存储的数据。 创建File类的对象&#xff1a; //创建file对象//1.具体…

House of Roman / malloc_printerr间接调用malloc函数执行malloc_hook

文章目录 House of Roman介绍&#xff1a;原理&#xff1a;例子&#xff1a;思路&#xff1a;分析&#xff1a;利用&#xff1a; House of Roman 介绍&#xff1a; House of Roman 这个技巧说简单点其实就是 fastbin attack 和 Unsortbin attack 结合的一个小 trick。该技术用…

python-字符串操作(赛氪OJ)

[题目描述] 给定长度为 n 的只有小写字母的字符串 s &#xff0c;进行 m 次操作&#xff0c;每次将 [l,r] 范围内所有 c1 字符改成 c2 &#xff0c;输出操作完的字符串。输入格式&#xff1a; 第一行两个数 n , m &#xff0c; 第二行一个字符串 s &#xff0c; 之后 m 行&…

Ubuntu修改命令提示符格式PS1

命令提示符组成 通过Xshell进入Ubuntu的默认提示符是这样的 rootDESKTOP:~# root: 当前登录用户DESKTOP&#xff1a;主机名~: 当前目录名&#xff08;即用户主目录&#xff09;#&#xff1a;超级用户权限(root用户显示)$: 普通用户权限(非root用户显示) 修改命令提示符 step1…

linux 环境下 配置jenkins前端服务

前期准备 如果没有&#xff0c;需要安装插件 <b>HH:mm:ss</b> <b>HH:mm:ss.S</b> $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS! 连接服务器的密码 测试 前端部署 需要安装nodejs的插件 执行脚本 node -v npm install rm -rf ./dist…

未解决:不同类型的数据用memcpy然后打印(printf)出问题

引子&#xff1a; 本来是搜memcpy在拷贝两个数组时两数组下标类型不同的问题&#xff0c;即&#xff0c;若一个数组是很长&#xff0c;其下标用long型&#xff0c;要将此数组的一小段拷贝到另一个数组中&#xff0c;这另一个数组的下标只需要用int型&#xff0c;不确定会不会出…

C++高性能编程:ZeroMQ vs Fast-DDS发布-订阅模式下性能对比与分析

文章目录 0. 引言1. 目标&#xff1a;ZeroMQ与Fast-DDS性能对比2. ZeroMQ vs Fast-DDS - 延迟基准测试2.1 一对一发布-订阅延迟2.2 一对多发布-订阅延迟 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试4. 方法论5. 结论6. 参考 0. 引言 高要求的分布式系统催生了对轻量级且高性能中间…

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分&#xff0c;利用摄像机对图像进行采集&#xff0c;从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情&#xff0c;人们生活秩序被严重打乱。跟普通流感…

前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

1.问题描述 当我们进入页面时的菜单导航栏是默认选中的状态如图 点击博客园效果如图 问题1&#xff1a; 但是当我们点击页面上方返回按钮时&#xff0c;导航栏选中状态没有改变 分析问题1&#xff1a; 这个问题是因为页面改变后页面里面存储的菜单导航栏的is-active属性没有改…

WIFI 密码

要破解 WIFI 密码&#xff0c;首先要抓到 WIFI 的握手包&#xff0c;要想得到 WIFI 的握手包&#xff0c;就需要在监听时刚好有设备连接了该 WIFI&#xff0c;但这就需要运气加成&#xff0c;因此可以我们可以主动将该 WIFI 的设备踢下去&#xff0c;一般设备就会自动连接该 WI…

机器学习:逻辑回归算法实现鸢尾花预测和银行数据处理

1、鸢尾花预测 1、特征选择 2、对特征处理 trainpd.read_excel("鸢尾花训练数据.xlsx") testpd.read_excel("鸢尾花测试数据.xlsx") x_traintrain[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]] y_tr…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

C2M商业模式分析与运营平台建设解决方案(一)

C2M&#xff08;Customer to Manufacturer&#xff09;商业模式通过直接将消费者需求与生产商对接&#xff0c;极大提升了生产效率和市场响应速度&#xff0c;本文将探讨如何通过构建高效的运营平台&#xff0c;利用大数据分析、人工智能算法及灵活的供应链管理&#xff0c;优化…

四川汇昌联信做拼多多电商怎么样?

近年来&#xff0c;拼多多凭借其独特的社交电商模式迅速崛起&#xff0c;成为国内领先的电商平台之一。四川汇昌联信作为一家专注于电商领域的企业&#xff0c;涉足拼多多平台无疑是顺应市场趋势的明智之举。那么&#xff0c;四川汇昌联信在拼多多平台上的表现如何呢? 一、产品…

推荐国产跨平台、轻量级的文本编辑器 Notepad-- v2.18

Notepad-- 是使用C编写的轻量级文本编辑器, 简称ndd, 可以支持Window/Mac/Linux操作系统平台。 我们的目标&#xff1a;完成文本编辑类软件的国产可替代&#xff0c;重点在国产Uos/Linux系统、Mac 系统上发展。 对比其它竞品Notepad类软件而言&#xff0c;我们的优势是可以跨…

【unix高级编程系列】信号

引言 以前对信号的理解&#xff0c;仅仅停留在main函数入口注册几个异常信号&#xff08;SIGPIPE、SIGSEGV、SIGFPE&#xff09;处理函数。当捕获到异常时&#xff0c;将进程的堆栈进行打印&#xff0c;方便排查、定位问题。这一类问题我认为是利用linux系统的异常信号机制&am…

系统架构师选择题知识点笔记

系统架构师复习笔记 选择题知识点 分布数据库特性 分片透明性&#xff1a;指用户或应用程序不需要知道逻辑上访问的表具体是怎么分块存储的&#xff1b;复制透明性&#xff1a;指采用复制技术的分布方法&#xff0c;用户不需要知道数据是复制到哪些节点上&#xff1b;逻辑透…

AI绘画网站爆款推荐,人人都是艺术家!

嗨&#xff0c;小伙伴们&#xff0c;最近AI 绘画简直是火出了新高度&#xff01;网上那么多 AI 绘图站&#xff0c;你或许已经眼花缭乱。但悄悄告诉你&#xff0c;有些站点只能照搬照片&#xff0c;却不让你天马行空地改造&#xff0c;想找一个既聪明又有创意的 AI 画家&#x…

Nginx详解配置实例及企业高性能web服务器

目录 企业高性能web服务器 一.Web 服务基础介绍 1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache 经典的 Web 服务端 1.2.1.1 Apache prefork 模型 1.2.1.2 Apache worker 模型 1.2.1.3 Apache event模型 1.2.2 Nginx-高性能的 Web 服务端 1.2.3服务端 I/O 流…

循环图神经网络教程2——循环图神经网络

介绍 循环图神经网络&#xff08;Recurrent Graph Neural Network&#xff0c;RGNN&#xff09;。在标准神经网络中&#xff0c;连续的学习权重层用于从输入张量中逐步提取更高级别的特征。在用于计算机视觉的神经网络中&#xff0c;低级特征(如短直线和曲线)的存在是由较早的…