前两星期刚学了1.44寸TFT彩屏,总结一下,不好勿喷,欢迎交流。
先附上效果图
中文测试
图片测试
以上就是两张测试图了,由于STM32F013内存较小,加了图片的*.hex文件还挺大的,就没有弄英文字母和数字的显示测试了,但是在代码中会展示出来。
1.44寸彩屏的基础资料
实物图
尺寸图
引脚接口定义
在彩屏引脚上都有引脚标识,所以很容易知道各个管脚的用途,TFT彩屏工作电压为3.3V,虽然可能接5V也可以使用,但对液晶不好,所以1引脚最好还是接3.3V。
2引脚为GND,直接接地就好了。
3引脚SDI为屏模块的SPI数据输入引脚,与STM32芯片IO口相接即可,本程序接的是C6;
4引脚SCL为屏模块的SPI时钟信号输入引脚,与STM32芯片IO口相接即可,本程序接的是C7;
5引脚CS为屏模块的SPI片选信号输入引脚,与STM32芯片IO口相接即可,本程序接的是C8;
6引脚RST为屏模块复位输入引脚,与STM32芯片IO口相接即可,本程序接的是C9;
7引脚为屏模块命令 /数据 信号输入选择引脚,与STM32芯片IO口相接即可,本程序接的是C10;
部分程序
main.c 主程序拷贝了部分,具体见附件
#include "stm32f10x.h"
#include "lcd.h"
#include "led.h"
#include "delay.h"
int main(void)
{
tft_pin_init();
lcd_init();
led_init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_1);
Font_Test();
//delay_ms(3500);
//Display_Desc();
delay_ms(2000);
showimage1(gImage_tp1);
delay_ms(3000);
//Display_ASCII8X16(10,50,"I love you");
//delay_ms(1000);
}
}
LCD.C主程序拷贝了部分,具体见附件
LCD设置初始化
//向SPI总线传输一个8位数据
void SPI_WriteData(uchar Data)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
if(Data&0x80)
sda=1; //输出数据
else sda=0;
scl=0;
scl=1;
Data<<=1;
}
}
//向液晶屏写一个8位指令
void Lcd_WriteIndex(uchar Data)
{
cs=0;
rs=0;
SPI_WriteData(Data);
cs=1;
}
//向液晶屏写一个8位数据
void Lcd_WriteData(uchar Data)
{
unsigned char i=0;
cs=0;
rs=1;
SPI_WriteData(Data);
cs=1;
}
//向液晶屏写一个16位数据
void LCD_WriteData_16Bit(unsigned int Data)
{
unsigned char i=0;
cs=0;
rs=1;
SPI_WriteData(Data>>8); //写入高8位数据
SPI_WriteData(Data); //写入低8位数据
cs=1;
}
void Reset()
{
reset=0;
delay_ms(100);
reset=1;
delay_ms(100);
}
//
//液晶屏初始化 for S6D02A1
void lcd_initial()
{ Reset();//Reset before LCD Init.
//LCD Init For 1.44Inch LCD Panel with ST7735R.
Lcd_WriteIndex(0x11);//Sleep exit
delay_ms (120);
//ST7735R Frame Rate
Lcd_WriteIndex(0xB1);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB2);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB3);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteData(0x01);
Lcd_WriteData(0x2C);
Lcd_WriteData(0x2D);
Lcd_WriteIndex(0xB4); //Column inversion
Lcd_WriteData(0x07);
//ST7735R Power Sequence
Lcd_WriteIndex(0xC0);
Lcd_WriteData(0xA2);
Lcd_WriteData(0x02);
Lcd_WriteData(0x84);
Lcd_WriteIndex(0xC1);
Lcd_WriteData(0xC5);
Lcd_WriteIndex(0xC2);
Lcd_WriteData(0x0A);
Lcd_WriteData(0x00);
Lcd_WriteIndex(0xC3);
Lcd_WriteData(0x8A);
Lcd_WriteData(0x2A);
Lcd_WriteIndex(0xC4);
Lcd_WriteData(0x8A);
Lcd_WriteData(0xEE);
Lcd_WriteIndex(0xC5); //VCOM
Lcd_WriteData(0x0E);
Lcd_WriteIndex(0x36); //MX, MY, RGB mode
#ifdef USE_LANDSCAPE
Lcd_WriteData(0xA8); //竖屏C8 横屏08 A8
#else
Lcd_WriteData(0xC8); //竖屏C8 横屏08 A8
#endif
//ST7735R Gamma Sequence
Lcd_WriteIndex(0xe0);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1a);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x18);
Lcd_WriteData(0x2f);
Lcd_WriteData(0x28);
Lcd_WriteData(0x20);
Lcd_WriteData(0x22);
Lcd_WriteData(0x1f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x23);
Lcd_WriteData(0x37);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x02);
Lcd_WriteData(0x10);
Lcd_WriteIndex(0xe1);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x1b);
Lcd_WriteData(0x0f);
Lcd_WriteData(0x17);
Lcd_WriteData(0x33);
Lcd_WriteData(0x2c);
Lcd_WriteData(0x29);
Lcd_WriteData(0x2e);
Lcd_WriteData(0x30);
Lcd_WriteData(0x30);
Lcd_WriteData(0x39);
Lcd_WriteData(0x3f);
Lcd_WriteData(0x00);
Lcd_WriteData(0x07);
Lcd_WriteData(0x03);
Lcd_WriteData(0x10);
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00+2);
Lcd_WriteData(0x00);
Lcd_WriteData(0x80+2);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(0x00+3);
Lcd_WriteData(0x00);
Lcd_WriteData(0x80+3);
Lcd_WriteIndex(0xF0); //Enable test command
Lcd_WriteData(0x01);
Lcd_WriteIndex(0xF6); //Disable ram power save mode
Lcd_WriteData(0x00);
Lcd_WriteIndex(0x3A); //65k mode
Lcd_WriteData(0x05);
Lcd_WriteIndex(0x29);//Display on
}
/*************************************************
函数名:LCD_Set_Region
功能:设置lcd显示区域,在此区域写点数据自动换行
入口参数:xy起点和终点
返回值:无
*************************************************/
void Lcd_SetRegion(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end)
{
#ifdef USE_LANDSCAPE//使用横屏模式
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(x_start+3);
Lcd_WriteData(0x00);
Lcd_WriteData(x_end+3);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y_start+2);
Lcd_WriteData(0x00);
Lcd_WriteData(y_end+2);
#else//竖屏模式
Lcd_WriteIndex(0x2a);
Lcd_WriteData(0x00);
Lcd_WriteData(x_start+2);
Lcd_WriteData(0x00);
Lcd_WriteData(x_end+2);
Lcd_WriteIndex(0x2b);
Lcd_WriteData(0x00);
Lcd_WriteData(y_start+3);
Lcd_WriteData(0x00);
Lcd_WriteData(y_end+3);
#endif
Lcd_WriteIndex(0x2c);
}
彩屏管脚初始化
void tft_pin_init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
中文显示函数
void Fast_DrawFont_GBK16(uint x, uint y, uint fc, uint bc, uchar *s)
{
unsigned char i,j;
unsigned short k;
uint HZnum;
HZnum=sizeof(hz16)/sizeof(typFNT_GBK16);
while(*s)
{
if((*s) >= 128)
{
for (k=0;k<HZnum;k++)
{
if ((hz16[k].Index[0]==*(s))&&(hz16[k].Index[1]==*(s+1)))
{ Lcd_SetRegion(x,y,x+16-1,y+16-1);
for(i=0;i<16*2;i++)
{
for(j=0;j<8;j++)
{
if(hz16[k].Msk[i]&(0x80>>j)) LCD_WriteData_16Bit(fc);
else
{
if (fc!=bc) LCD_WriteData_16Bit(bc);
}
}
}
}
}
s+=2;x+=16;
}
else
s+=1;
}
}
英文数字显示函数
void Display_ASCII8X16(uint x0,uint y0,uchar *s)
{
int i,j,k,x,y,xx;
unsigned char qm;
long int ulOffset;
char ywbuf[32],temp[2];
for(i = 0; i<strlen((char*)s);i++)
{
if(((unsigned char)(*(s+i))) >= 161)
{
temp[0] = *(s+i);
temp[1] = '\0';
return;
}
else
{
qm = *(s+i);
ulOffset = (long int)(qm) * 16;
for (j = 0; j < 16; j ++)
{
ywbuf[j]=Zk_ASCII8X16[ulOffset+j];
}
for(y = 0;y < 16;y++)
{
for(x=0;x<8;x++)
{
k=x % 8;
if(ywbuf[y]&(0x80 >> k))
{
xx=x0+x+i*8;
PutPixel(xx,y+y0,RED);
}
}
}
}
}
}
图片显示函数
void showimage1(const unsigned char *p)
{
int i;
unsigned char picH,picL;
dsp_single_colour(WHITE); //??
Lcd_SetRegion(0,0,127,127);
for(i=0;i<128*128;i++)
{
picL=*(p+i*2); //??????
picH=*(p+i*2+1);
LCD_WriteData_16Bit(picH<<8|picL);
}
}
刷屏函数
void dsp_single_colour(int color)
{
uchar i,j;
Lcd_SetRegion(0,0,128-1,128-1);
for (i=0;i<128;i++)
for (j=0;j<128;j++)
LCD_WriteData_16Bit(color);
}
完整程序链接https://download.csdn.net/download/life_yangzi/10409239
欢迎各位下载学习,有不懂之处可以下方留言与我沟通,欢迎骚扰