数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 10925|回复: 13

[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 来自手机浏览器 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-5 09:02:37 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-25 17:02:17 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2023-5-26 13:54:26 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2023-5-27 16:27:03 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-5-29 11:40:16 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2023-5-29 15:27:21 来自手机浏览器 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2023-7-14 19:22:39 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2023-7-16 10:13:38 | 显示全部楼层
游客请登录后查看回复内容

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2023-7-16 12:05:19 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

头像被屏蔽
 楼主| 发表于 2023-7-17 12:00:13 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

发表于 2025-3-10 17:38:18 | 显示全部楼层
游客请登录后查看回复内容
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-12-12 08:35 , Processed in 0.109200 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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