数码之家

 找回密码
 立即注册
搜索
查看: 3065|回复: 12

[C51] STC8H8K64U使用硬件SPI驱动TFT屏幕

[复制链接]
头像被屏蔽
发表于 2023-5-4 13:27:03 | 显示全部楼层 |阅读模式
1.简单分享一下,电路连接和测试图如下,附件有开源的范例。



2.STC的开天斧、屠龙刀实验板后一直在做各种功能的测试,最近得闲分享一点新手的实验心得以供新手参考,
这次用STC8H8K64U的开天斧实验板的硬件SPI接口驱动三线SPI的ILI9481串口TFT480*320-3.5"屏成功后也分享到这里,也是保留一点资料在这里,高手可以无视。


这个串口TFT屏的所谓三线SPI即缺少指令/数据(D/CX或RS)线的9bit数据宽度的SPI总线的TFT屏,屏内MCU接口芯片为ILI9481,内定为RGB666-18bit颜色模式,总线时序如下:



用到这个异类的屏时、我真心的希望STC单片机能再接再厉更上层楼做出1-16位任意设置的硬件SPI接口,使STC51单片机打破各种神话。
观察上述时序图可以得到下述特征:
1.时钟空闲时为高电平。
2.时钟下降沿(前沿驱动)与数据变化起始点对齐,时钟的上升沿处于数据的稳定区域(后沿采样)。
3.数据或指令的字节宽度为1+8=9bit。
4.先发送高位数据。
上述图片恰好与STC数据手册19.5给出的最后一幅参考图片一致:



根据以上的特征,可以配置STC单片机SPI主机模式的控制寄存器SPCTL=1101 11xx,后两位的xx用于设置时钟频率,单片机的硬件SPI通讯的配置真的很简单,只要配置好了寄存器SPCTL就可以使用了,而对于STC8单片机还可以切换不同的端口作为通讯引脚,此时只要配置寄存器P_SW1即可,这款单片机的SPI应用真是没得说。
最后需要说明的是对于8位数据的硬件SPI总线是无法真的发送9位数据的,只能通过两次发送8位数据的模式来发送9位数据,其效率是有折扣的,但这并不影响刷屏速度,因为串口TFT屏本身就不适合过高的速度,另外,对于ILI9481的三线SPI模式而言,手册中给出的数据宽度为9-16bit,也就是说虽然我们分两次为屏幕的显存送人了16bit数据但这是被允许的并不影响正常的显示,具体描述如下:
Each byte is either nine or sixteen write cycles in length. If the optional D/CX signal is used a byte is eight  我不懂英语但用百度翻译的结果为:每个字节的长度为九个或十六个写入周期。如果使用可选的D/CX信号,则字节为8

下面给出STC8H硬件SPI相关代码:
//使用STC8H单片机SPI通道2(开天斧三.1实验板的J8接口)
sbit reset     =P2^0;
sbit cs        =P2^1;
sbit scl       =P2^5;
sbit sda       =P2^3;
//====硬件SPI初始化函数=========================
//SPCTL=0xDC,0xDD,0xDE,0xDF;分别对应1/4,1/8,1/16,1/2分频
void spi_init()
{
    P_SW1|=1<<2;         //使用SPI通道2时需要切换引脚
    SPDAT = 0;                 //清空数据寄存器
    SPSTAT = 0xC0;         //清除所有标志(共两个)
    SPCTL = 0xDF;        //忽略SS-使能SPI-高位先行-主机模式-时钟空闲时为高、上升沿(第二个边沿)采样
}
//====硬件SPI发送一个字节函数==============
//查询方式
void SPI_WriteByte(unsigned char temp)
{
    SPDAT = temp;                        //待发送数据存入数据寄存器
    while(!(SPSTAT & 0x80));//等待传输完成SPIF=0
    SPSTAT = 0xC0;                        //传输完成后置SPIF=1、WCOL=1清除标志
}
//==============LCD写指令函数======================
void write_command(uchar comd)
{
cs=0;
    SPI_WriteByte(comd>>1);                //发送DC加数据的前7位
    SPI_WriteByte(comd<<7);                //发送数据的最低位
    cs=1;
}
//===============LCD写数据函数==================
void write_data(uchar dat)
{
    cs=0;
    SPI_WriteByte((dat>>1)|(0x80));                //发送DC加数据的前7位
    SPI_WriteByte(dat<<7);                                //发送数据的最低位
    cs=1;
}

如果屏幕可以设定为RGB565-16bit颜色数据模式的话,只要有了上述底层代码就可以点亮屏幕了,但对于我手里这个RGB666-18bit颜色数据模式的屏幕还需要有一个颜色数据写入的函数,首先看看手册中给出的颜色数据格式:



以下为代码:

//====写18位颜色数据函数===============
//18bpp Frame Memory Write模式、RGB三色各6位数据写入3个8位寄存器中、高位对齐忽略低2位
//RGB565-16位色值经过对R、B插值变成RGB666-18位色值后分别写入显存
void LCD_WR_DATA(u16 da)
{
    write_data(((da>>8)&0xf8)|0x04);  //将R值移动到低8位、取出5位色值再插入1位色值
    write_data((da>>3)&0xFC);   //将G值移动到低8位、取出6位色值
    write_data((da<<3)|0x04);   //将B值移动到高位对齐、再插入1位色值
}

至此,三线SPI这点事儿就全部说清了,请高手指正!






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2023-5-4 16:05:47 | 显示全部楼层
嗯嗯,不错的
回复 支持 反对

使用道具 举报

发表于 2023-5-4 16:36:24 来自手机浏览器 | 显示全部楼层
有没有ST7735S的库
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-5 09:02:37 | 显示全部楼层
  TFT彩屏SPI驱动编程——基于STC32G12K128的SPI_DMA功能的例程分享:
  Spi接口的接线,分四线制和三线制,据说SPI协议没有确定的文字规定,只有实事的实现方案,而行业内的现状则是众说纷纭,我大概把它们分为两类,一类是按实际用了几条线实现传输,一类是按信号传递格式来划分。具体到屏显驱动来讲,凡是接口有独立的数据/命令(RS.DC.A0等叫法都有)接线的,属于我们适用的范围,具体用了几条线,我数学不好,就不去数了。这不是说没有数据/命令选择线的不能用,反而是那种可能更有用这种驱动模式的需要,但我手里没有这样的屏,对不熟悉,没验证的东西,就不去评论了。
    SPI接口的TFT彩屏在mcu工程里是常见的。其优点是接线方便,占用IO        口少,色彩丰富。缺点是速度会慢些,一方面是因为彩屏显示需要的数据量大,单色屏一个字节可以包涵8个点的显示信息,而彩屏一个点就需要二个字节的信息。另一方面是它属于串口传输,并口传输一次可以送出816位信息,而串口一次只能送出一位信息,信息量大加传输慢,就成了SPI接口彩屏的一个短板。特别是在屏的显示点数多时,尤其明显。
   记得DMA技术刚问世时是用在PC机上,当时经销商把它当卖点,用户则花钱买功能。只要花了钱,就能用上这个功能了。
但在mcu领域有些不同,DMA技术不仅需要芯片功能上支持,还需要技术人员愿意去用。一些学成的技术人员因为工作忙,面对的问题又能用传统手段解决,使用DMA的动力就不足了。而新人由于感觉这东西有些难弄,也不愿用。
   本文说的TFT彩屏SPI驱动的编程,是基于DMA功能的SPI彩屏驱动程序,因为SPI接口慢,所以使用DMA的意义更大。由于STC32G12K128芯片具有DAM功能,所以就以这个芯片为依托,写了一组SPI接口的驱动程序,这个模式的程序,能加快刷屏速率,很大地提高芯片的工作效率。
下面先看一下SPI接口驱动中最基本的函数,数据传送函数。分别是软件模拟SPI传送,硬件SPI数据传送和基于SPI_DMA的数据传送函数
  第一个:软件模拟SPI数据传送函数
void transfer_data(unsigned int data1)//需要传送命令时加DC=0
{
char i;
CS=0;
for(i=0;i<8;i++)
{
SCL=0;//sclk=0;
//delay(4);
if((data1&0x80)==0) SDA=0;//sid=1;
else SDA=1;//sid=0;
SCL=1;//sclk=1;
data1=data1<<=1;
// delay(4);
}
// CS=1;
}
第二个:硬件SPI数据传送函数
void transfer_data(unsigned int data1)//需要传送命令时加DC=0
{
CS=0;
SPSTAT=0xc0;
SPDAT=data1;
while(!SPIF);//等待发送完成
}
第三个:基于SPI_DMA的数据传送函数
void transfer_data(unsigned int dat1)
        {
CS=0;
DMASPI_initial();//这一句不是必须的,为了保险,我喜欢加上这一句
        *(unsigned char *)(0x10000)=dat1;//待传送数据送专用缓存区,就是buffer1
        DMA_SPI_CR=0xc1;//开始执行,采用主机模式,并清空FIFO
while(!(DMA_SPI_STA&0x01));
}
   显然,软件模拟SPI传送函数比较麻烦,速度也慢很多,但它的优点是对mcu硬件依赖少,基本可以在任何IO口实现,所以屏的卖家愿意用它写的测试驱动。
硬件SPI的数据传送函数就很给力了。与SPI_DMA的数据传送比,写入数据后自动开始传送,而后者写入数据与启动传送是两个语句,并且硬件SPI也是外设接口,就是说它运行时有相对的独立性,对mcu的依赖较少,所以很棒,而基于SPI_DMA的数据传送函数,语句多了,而且还要有专门缓冲区配合,在单个数据传送上,不如硬件SPI的传送函数便捷。
    需要说明,基于DMASPI接口彩屏驱动,必须使用(开启)硬件SPI功能。这是前提条件。
在具体的应用中,传送函数用硬件SPI的和用SPI_DAM的都可以,但既然硬件SPI的传送函数很好用了,SPI_DMA的传送函数写出来更多是象征性的了。表示可行,但不表示必须用。SPI_DMA的长项在批量数据传送上。
     这里说了半天一是介绍一下情况,二是表明两个函数的兼容性:
基于SPI_DMA数据传送函数的程序,使用硬件SPI传送函数都可以顺畅运行
反过来
基于硬件SPI数据传送函数的程序,在SPI_DMA传送函数下不一定能运行
原因是缓冲区可能出问题。也可以说话程序写的不够好。我尽量采用SPI_DMA做依托写函数,运行时使用硬件SPI支持。
    下面是图像显示函数,这是SPI_DMA技术的强项。
void SPI_DMA_DISP(unsigned int x,unsigned int y,unsigned int x_width,unsigned int y_height,unsigned int total_num,unsigned int once_num,unsigned char *p,unsigned char *Q)
{
unsigned int ii,jj;
unsigned long kee;
unsigned char *kkee;
kkee=Q;//保存入口地址,方便指针复位时使用
lcd_address(x,y,x_width-1,y_height-1);//通知屏幕需要刷图的位置,这个指令要尽量往前放,因为其中用到数据传送,会影响传送参数的设置。
kee=(unsigned long)(Q);//取缓冲区首地址的值,也就是打算发送给屏幕的数据源地址的值(缓冲区首地址是1:0000H。所以习惯用long类型变量)
DMA_SPI_TXAH=(kee)>>8;//把源地值高位赋给地址寄存器
DMA_SPI_TXAL=kee;//在xdata的起始地址01:0002H
DMA_SPI_AMTH=(once_num-1)>>8;
DMA_SPI_AMT=(once_num-1);
for(ii=0;ii<(total_num/once_num);ii++)//total_num/once_num必须是个整数,否则要做处理
{
for(jj=0;jj<once_num;jj++)//把要送屏的数据写入指定的缓冲数组
{
*Q=*p;//传送图像数据,p指向code区的图像数组,Q指向缓冲区buffer2
p++;
Q++;
}
        Q=kkee;//传送一轮后,缓冲区指针复位。
        //把缓冲区的数据送到屏上显示               
        DMA_SPI_STA=0;//清中断标志位及错误标志位
        DMA_SPI_CR=0xc1;//开始执行,采用主机模式,并清空FIFO        while(!(DMA_SPI_STA&0x01));//等待吧。这时可以做其它事,比如去读一个AD值,
}
DMASPI_initial();//这是多余的指令,原想加了它可以省去数据传送函数中的初始化
}
    程序的思路是设置了两个指针,一个指向存放图像信息数组的头文件*p;一个指向缓冲区存放临时数据*Q。后者也是向屏输出图像信息的源地址。缓冲区必须设在xdata区。由于空间限制,要分几次才能传输完总数据。所以设置了总数据量和每次数据量这两个参数。运行时先把数据送到缓冲区,再启动SPI_DMA功能,把数据送屏显示。完成一组再进行第二组。直到全部传送完。
程序的优点是启动SPI_DMA后,mcu基本处于空闲状态,可以去做其它事了,传送由外设自己管理,你只要不去干涉它用到的资源就好(相关总线,特别是缓冲区)也就是说在它完成任务前,不要下达与屏显有关的指令。下一个SPI_DMA指令,也要在前面的确定执行完后才能下达。
这个程序特点是每传送完一轮,缓冲区指针Q都要复位一次,而p不需要,因为缓冲区是重复使用的。
    这个程序能给mcu节省多少时间?我没测量过,只是用delay();函数看了一下,要用多大的参数值,能保证SPI_DMA完成任务。就是使用延时函数替代程序中的等待查询指令。看看需要多少延时能替代那个等待。
void delay(unsigned int ms)
{
int j,k;
for(j=0;j<ms;j++)
for(k=0;k<60;k++);
}
   结果在delay(11111)时,图像完全不显示(说明传送过程被完全打乱了),在delay(33333)时显示基本正常了。我认为,这就是SPI_DMA节省出来的时间,而且是一轮传送节省的时间。120x120的图像用了五轮传送。
接下来是字模显示函数。
先贴一个使用普通字模数组的字模显示函数:
void word16x32_bydma_spi(unsigned int x,unsigned int y,unsigned char segin,int font_color,int back_color,char *Q)
{
unsigned char column=0;
unsigned char tm=0,temp;
unsigned long kee;
char *point;
char *kkee;
kkee=Q;//这是保留缓冲区指针初值      
point=digit_code[segin];//把要显示的数字(segin)转换成对应的字模地址point
//先把字模数据转换成屏显所用数据存到缓冲区,因为写入缓冲区是并行处理,且没有其它操作。所以比写屏快很多
for(column=0;column<64;column++)//字节数循环,逐个字节进行转换
{
temp=*point;//*point是原字模数据指针,取出原字模数值
//把字节信息换算成屏需要的数据,送到缓冲区
for(tm=0;tm<8;tm++)
{
if(temp&0x01)//注意这是低位先出模式,如果与字模不符,可以考虑改为高位先出模式
{
*Q=(font_color>>8);//Q是缓冲区指针
Q++;
*Q=(font_color);
Q++;
}
else
{
*Q=(back_color>>8);
Q++;         
*Q=(back_color);
Q++;
}
temp>>=1;
}
  point++;
}
//开始刷屏,因为由DMA_SPI操作,基本不需要占用mcu时间。
lcd_address(x,y,x+15,y+31);      
kee=(unsigned int)(kkee);//取缓冲区首地址的值,也就是打算发送给屏幕的数据源地址的值
DMA_SPI_TXAH=(kee)>>8;//把源地值高位赋给地址寄存器
DMA_SPI_TXAL=kee;//地址是xdata的起始地址
DMA_SPI_AMTH=3;//0x03,表示的传送总数据量是3ffh+1,也就是1024
DMA_SPI_AMT=255;//0xff
Q=kkee;//缓冲区指针复位
DMA_SPI_STA=0;//清中断标志位及错误标志位
DMA_SPI_CR=0xc1;//开始执行,采用主机模式,并清空FIFO,这句明显要跟着程序走的
while(!(DMA_SPI_STA&0x01));//等待吧。这时可以做其它事
DMASPI_initial();//
}
   字模显示函数的编写思路是,字模数组放在code区的头文件数组中。使用时查到需要字模,读取后转换成屏显需要的数据,再存到缓冲区。然后开启SPI_DMA刷到屏幕上。读取和转换程序与其它人写的程序一样,照抄的。区别就是转换完后不是直接送屏显示,而是送到了缓冲区,再由SPI_DMA统一送屏。SPI_DMA刷屏则与前面的图像显示一样。这个函数的优点是不需要专门制作字模,过去的字模软件可以直接用(脸红的说一句,我没用过硬件字库)。
既然用了SPI_DMA,就会考虑能不能最大限度的发挥其作用,于是写了一个SPI_DMA专用的字模显示程序。由于没有准备字模,又写了一个专用字模数据的生成函数。生成专用字模后,放在缓冲区,就可以由专用显示函数使用了。
void matrix_produce8x16(unsigned int font_color,unsigned int back_color)
{
char *Q;
unsigned char *point;
unsigned char column;
unsigned char temp,tm;
Q=&buffer3[0][0];//缓冲指针指向数字字模专用缓冲区buffer3
point=&number0_9_8x16[0][0];//8x16数字字模数组
for(column=0;column<160;column++)//字节数循环,逐个字节进行转换
{
temp=*point;//*point是原字模数据指针,取出原字模数值
//把字节信息换算成屏需要的数据,送到缓冲区
for(tm=0;tm<8;tm++)
{
if(temp&0x01)//注意这是低位先出模式,如果与字模不符,可以考虑改为高位先出模式
{
*Q=(back_color>>8);//Q是缓冲区指针
Q++;
*Q=(back_color);
Q++;
}
else
{
*Q=(font_color>>8);
Q++;         
*Q=(font_color);
Q++;
}
temp>>=1;
}
point++;
}
DMASPI_initial();//
}
   专用字模显示函数其实就是把普通字模全部转换成显示所用的字模数据,放在缓冲区专用位置,供需要时读取使用,由于缓冲区空间有限,只能供占空间不大,需要频繁调用的字模采用。例程中是把0-9这十个8x16的数字转换进去了。屏幕上很小的那个字就是用它显示的。
下面是专用字模调用程序
void word8x16_bydma_spi(unsigned int x,unsigned int y,unsigned char segin)
{
unsigned long kee;
lcd_address(x,y,x+7,y+15);      
kee=(unsigned long)(&buffer3[segin][0]);//取缓冲区首地址的值,也就是打算发送给屏幕的数据源地址的值
DMA_SPI_TXAH=(kee)>>8;//把源地值高位赋给地址寄存器
DMA_SPI_TXAL=kee;//地址是xdata中对应数字的起始地址
DMA_SPI_AMTH=0;//0x00,表示的传送总数据量是ffh+1,也就是256
DMA_SPI_AMT=255;//0xff
DMA_SPI_STA=0;//清中断标志位及错误标志位
DMA_SPI_CR=0xc1;//开始执行,采用主机模式,并清空FIFO
while(!(DMA_SPI_STA&0x01));//等待吧。这时可以做其它事,                DMASPI_initial();//冗余指令
}
    这程序不仅形式上简洁多了,速度也快,特别是极少使用mcur
有了图像和字符显示,缺少的就是曲线了。橫平竖直的线太容易,不想写了。曲线由于个人水平原因,没找到能提高效率的思路,只好作罢。
使用SPI_DMA技术,最大的不同在于要规划和使用缓冲区。就是xdata区的那些空间,
我为了做验证,在例程中设了三个数组,做为缓冲区;buffer1两个字节,作用是占位,在整个程序中没有出现调用它的指令,占位的意思是不让其它函数使用这个空间,留给数据传输函数专用,(其实这样做是没必要的,只是验证实验中期望把数据传输函数效率做到最高,才给它留了一个最佳缓冲地址)c251内存空间是自动安排的,不占位的话其它程序可能会来使用,使整个程序乱序。数据传送函数使用buffer1时的语句是:
        *(unsigned char *)(0x10000)=dat1;//待传送数据送专用缓存区,就是buffer1
这样做是因为buffer1要占住位置,只能设置在mai.c程序的模块里,而我采用模块化编程,数据传送函数是在驱动模块中的。这时不方便用数组名buffer1访问。
    第二个数组buffer2用了5600字节用来临时存放传送的图像数据,其实实际使用时临时数据是5760字节,超过了安排的缓冲区,也就是侵占了后面的空间,例程中用做开机图像传送时,后面的缓冲区还没使用,所以侵占一下也没什么。但如果后面的用上了。侵占就导致后面的数据错误。这也是使用指针的优点。
第三个数组是buffer3,安排了2560字节,用来放108x16数字的显示数据,每个占256字节。使显示速度达到最快。实际应用中如果有需要频繁刷屏的字符,可以采用这种模式处理。
       Buffer3定义的是一个二维数组,写入数据时只当一维数组,按顺序写,但读出时按二维读。编程方便许多。
例程中常规字模显示函数用了buffer3做缓冲区,这会影响专用字模显示功能的使用,实际上常规字模显示应该使用buffer2,但技术原因有不方便之处,做为实验使用,就保留了这个失误,这样常规显示和专用字模显示只能保留一个了(因为它们的缓冲区设重复了)
在例程中有开启高速高级SPI的语句(在mcu设置函数mcu_initial.c里)
CLKSEL &= ~0x80; //默认选择 PLL 96M 作为 PLL 的输出时钟
USBCLK |= 0x20; //PLL 输入时钟 2 分频 ,因为stc-isp设定频率为24M
USBCLK |= 0x80; //使能 PLL 倍频
delay(222);//等待PLL锁频
CLKSEL &= ~0x40; //默认 HSPWM/HSSPI 选择主时钟为时钟源
HSCLKDIV = 0; //HSPWM/HSSPI 时钟源不分频
可以屏蔽掉,看一下对比效果。
    例程验证时使用的是STC32G12K128DIP40芯片,焊了一个小洞洞板。
        FTF彩屏使用的是128x128分辨率。0.85吋,我手里大点的屏都是并口的。
    调试中使用了STC-USB LINK1D硬件仿真器,个头不大,但很给力。让我这个第一次玩DMA的人能清楚地看到问题出在哪里,程序卡在哪里。对症处理,节约了N多时间。
   程序主要内容和编程思路已经说完了。完整的程序放在附件中可以下载查看。欢迎指导,欢迎吐槽。
分享这个程序的目的是希望使用mcu芯片的朋友们能更好的使用DMA功能,更多地发挥出它的应有效能。也为初学的朋友们提供一个实例借鉴。mcu技术的发展越来越复杂,例程对学习者的作用是不能低估的。


Q1.jpg (561.15 KB, 下载次数: 0)


Q2.jpg (314.3 KB, 下载次数: 0)


Q3.jpg (290.59 KB, 下载次数: 0)




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-25 17:02:17 | 显示全部楼层
疯狂的兔子来了 发表于 2023-5-5 09:02
本主题由 管理团队 于 2023-2-5 17:56 添加图章 原创
Q1.jpg (561.15 KB, 下载次数: 0)

学习了,正好手头有个1.8寸的ST7735S的屏。有时间拿来实验一下。
回复 支持 反对

使用道具 举报

发表于 2023-5-26 13:54:26 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2023-5-27 16:27:03 | 显示全部楼层
现在有很多芯片使用不标准的通信接口(就像这样的很接近SPI但是某些地方不同),不太方便
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-29 11:40:16 | 显示全部楼层
tomyluo 发表于 2023-5-27 16:27
现在有很多芯片使用不标准的通信接口(就像这样的很接近SPI但是某些地方不同),不太方便 ...

那就选STC32G12K28,带标准的SPI接口的芯片。
回复 支持 反对

使用道具 举报

发表于 2023-5-29 15:27:21 来自手机浏览器 | 显示全部楼层
疯狂的兔子来了 发表于 2023-5-29 11:40
那就选STC32G12K28,带标准的SPI接口的芯片。

MCU的SPI接口是标准的,但是其他芯片的接口不一定是标准SPI,说的是其他芯片(比如屏幕驱动芯片)
回复 支持 反对

使用道具 举报

发表于 2023-7-14 19:22:39 | 显示全部楼层
发现新大陆了,之前STC驱动液晶屏一直用的软SPI,觉得还可以接受,后面试了下硬SPI,我勒个去,那刷新速度真是杠杠的,软SPI如拖拉机,硬SPI如跑车,哈哈哈
回复 支持 反对

使用道具 举报

发表于 2023-7-16 10:13:38 | 显示全部楼层
本帖最后由 xueyeteng 于 2023-7-16 10:20 编辑
kpj001 发表于 2023-5-4 16:36
有没有ST7735S的库

附件这个就是中景园提供的ST7735S的例程。也可以到下述连接去下载。我就是用它练的TFT驱动。


参考网址:https://www.iotword.com/10361.html


下载链接:https://pan.baidu.com/s/10G6apA8plumMz1A8FLoGhg 提取码:1111



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2023-7-16 12:05:19 | 显示全部楼层
市售的带34针接口的4寸屏,实际使用大都要安放在仪器面板位置。现在MCU很便宜,我的系统使用两个STC8芯片。一块专门用于驱动液晶屏,所有显示任务交其处理。与主MCU之间采用串口通讯。主机将要执行的任务命令通过串口发来。制作一块PCB安装有34针的插座和MCU转接板插座。采用16位数据端口。主机程序和液晶屏程序由各自的MCU担任。显示速度快,编程相对也简单。安装也很便利。
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-7-17 12:00:13 | 显示全部楼层
2023/7/18宣讲会,  周二下午,14: 00 ~ 17:00 ,腾讯会议号:885-5858-2739
精度13位,STC真12位ADC过采样到16位分辨率,梁工主讲
STC32位8051开源【示波器 | 频谱分析仪】宣讲会
=============================================
2023/7/19暑期免费培训班,  周三下午,14: 00 ~ 16:00 ,腾讯会议号:885-5858-2739
《STC最新8051单片机原理及应用》,全球直播教学活动正式开始
==基于自带硬件USB仿真的STC8H8K64U实验箱V9.6,中英双语答疑
==山东大学,陈桂友教授亲自主讲,STC创始人主持授课,正统权威
暑期《单片机原理免费培训班》来啦!陈桂友教授主讲!19号正式开课!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 01:46 , Processed in 0.187200 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表