ST7735STFT屏幕的驱动
原文链接:https://www.yourcee.com/newsinfo/2928391.html
ST7735S 是 262K 彩色图形型 TFT-LCD 的单芯片控制器/驱动程序。它由396条源线和162门线驱动电路组成。该芯片能够直接连接到外部微处理器,并接受串行外围接口 (SPI)、8 位/9 位/16 位/18 位并行接口。显示数据可以存储在 132 x 162 x 18 位的片上显示数据 RAM 中。它可以在没有外部操作时钟时执行显示数据 RAM 读写操作,以最大限度地降低功耗。此外,由于驱动液晶所需的集成电源电路,因此可以制造出组件较少的显示系统。
下方这款为 1.44寸 TFT彩屏,驱动IC使用ST7735S芯片,液晶驱动IC的SPI接口已经引出带板子外侧,以便使用杜邦线连接,为不想焊接的伙伴非常友好,此次驱动所使用的MCU为增强型51单片机STC12系列的MCU,如下图所示:

| PIN | Parameter |
|---|---|
| VCC | 5V/3.3V电源接入 |
| GND | 接地 |
| CS | 液晶屏片选信号,低电平使能 |
| RESET | 液晶屏复位信号,低电平复位 |
| A0 | 液晶屏寄存器/数据选择信号,高电平:寄存器,低电平:数据 |
| SDA | SPI总线写数据信号 |
| SCK | SPI总线时钟信号 |
| LED | 背光控制,高电平点亮,如无需控制则接3.3V常亮 |
流程框架如下

上图中我们可以看到如果想要软重启液晶屏的话,可以直接看我圈中的那一行,D/CX为0,意思就是需要选择写入命令,个人建议写SPI代码的时候传输数据代码选择高位在前,这样就可以直接使用HEX那一栏的数据,即直接使用MCU_write_TFT_Byte(0x01)即可,即可完成软重启。

上图中的三个命令2A,2B.2C,分别为配置地址选择区域和填色命令,在选择好地址写入对应的数据函数即可完成屏幕的取地址和填色处理。
初始化代码,取自屏幕官方文档配置的驱动。
*配置好屏幕退出睡眠模式,配置帧速率等操作,如果有需求进行屏幕镜像的可以去参考文档中的36命令那里着重看下*
void TFT_init()
{
TFT_BL=0;//背光关闭
TFT_RESET=0;
TFT_delay500ms();
TFT_RESET=1;
TFT_delay500ms();
MCU_write_TFT_Byte(0x11,TFT_COMMAND);//睡眠退出
TFT_delay500ms();
//ST7735R 帧速率
MCU_write_TFT_Byte(0xB1,TFT_COMMAND);
MCU_write_TFT_Byte(0x01,TFT_DATA);
MCU_write_TFT_Byte(0x2C,TFT_DATA);
MCU_write_TFT_Byte(0x2D,TFT_DATA);
MCU_write_TFT_Byte(0xB2,TFT_COMMAND);
MCU_write_TFT_Byte(0x01,TFT_DATA);
MCU_write_TFT_Byte(0x2C,TFT_DATA);
MCU_write_TFT_Byte(0x2D,TFT_DATA);
MCU_write_TFT_Byte(0xB3,TFT_COMMAND);
MCU_write_TFT_Byte(0x01,TFT_DATA);
MCU_write_TFT_Byte(0x2C,TFT_DATA);
MCU_write_TFT_Byte(0x2D,TFT_DATA);
MCU_write_TFT_Byte(0x01,TFT_DATA);
MCU_write_TFT_Byte(0x2C,TFT_DATA);
MCU_write_TFT_Byte(0x2D,TFT_DATA);
MCU_write_TFT_Byte(0xB4,TFT_COMMAND);//列反转
MCU_write_TFT_Byte(0x07,TFT_DATA);
//ST7735R Power Sequence
MCU_write_TFT_Byte(0xC0,TFT_COMMAND);
MCU_write_TFT_Byte(0xA2,TFT_DATA);
MCU_write_TFT_Byte(0x02,TFT_DATA);
MCU_write_TFT_Byte(0x84,TFT_DATA);
MCU_write_TFT_Byte(0xC1,TFT_COMMAND);
MCU_write_TFT_Byte(0xC5,TFT_DATA);
MCU_write_TFT_Byte(0xC2,TFT_COMMAND);
MCU_write_TFT_Byte(0x0A,TFT_DATA);
MCU_write_TFT_Byte(0x00,TFT_DATA);
MCU_write_TFT_Byte(0xC3,TFT_COMMAND);
MCU_write_TFT_Byte(0x8A,TFT_DATA);
MCU_write_TFT_Byte(0x2A,TFT_DATA);
MCU_write_TFT_Byte(0xC4,TFT_COMMAND);
MCU_write_TFT_Byte(0x8A,TFT_DATA);
MCU_write_TFT_Byte(0xEE,TFT_DATA);
MCU_write_TFT_Byte(0xC5,TFT_COMMAND);//VCOM
MCU_write_TFT_Byte(0x0E,TFT_DATA);
MCU_write_TFT_Byte(0x36,TFT_COMMAND);//MX,MY,RGB mode
switch (DISPLAY_DIRECTION)//显示的方向(竖屏:0,横屏:1,竖屏旋转180度:2,横屏旋转180度:3)
{
case 0: MCU_write_TFT_Byte(0xC8,TFT_DATA);break;//竖屏
case 1: MCU_write_TFT_Byte(0xA8,TFT_DATA);break;//横屏
case 2: MCU_write_TFT_Byte(0x08,TFT_DATA);break;//竖屏翻转180度
default : MCU_write_TFT_Byte(0x68,TFT_DATA);break;//横屏翻转180度
}
//ST7735R Gamma Sequence
MCU_write_TFT_Byte(0xE0,TFT_COMMAND);
MCU_write_TFT_Byte(0x0F,TFT_DATA);
MCU_write_TFT_Byte(0x1A,TFT_DATA);
MCU_write_TFT_Byte(0x0F,TFT_DATA);
MCU_write_TFT_Byte(0x18,TFT_DATA);
MCU_write_TFT_Byte(0x2F,TFT_DATA);
MCU_write_TFT_Byte(0x28,TFT_DATA);
MCU_write_TFT_Byte(0x20,TFT_DATA);
MCU_write_TFT_Byte(0x22,TFT_DATA);
MCU_write_TFT_Byte(0x1F,TFT_DATA);
MCU_write_TFT_Byte(0x1B,TFT_DATA);
MCU_write_TFT_Byte(0x23,TFT_DATA);
MCU_write_TFT_Byte(0x37,TFT_DATA);
MCU_write_TFT_Byte(0x00,TFT_DATA);
MCU_write_TFT_Byte(0x07,TFT_DATA);
MCU_write_TFT_Byte(0x02,TFT_DATA);
MCU_write_TFT_Byte(0x10,TFT_DATA);
MCU_write_TFT_Byte(0xE1,TFT_COMMAND);
MCU_write_TFT_Byte(0x0F,TFT_DATA);
MCU_write_TFT_Byte(0x1B,TFT_DATA);
MCU_write_TFT_Byte(0x0F,TFT_DATA);
MCU_write_TFT_Byte(0x17,TFT_DATA);
MCU_write_TFT_Byte(0x33,TFT_DATA);
MCU_write_TFT_Byte(0x2C,TFT_DATA);
MCU_write_TFT_Byte(0x29,TFT_DATA);
MCU_write_TFT_Byte(0x2E,TFT_DATA);
MCU_write_TFT_Byte(0x30,TFT_DATA);
MCU_write_TFT_Byte(0x30,TFT_DATA);
MCU_write_TFT_Byte(0x39,TFT_DATA);
MCU_write_TFT_Byte(0x3F,TFT_DATA);
MCU_write_TFT_Byte(0x00,TFT_DATA);
MCU_write_TFT_Byte(0x07,TFT_DATA);
MCU_write_TFT_Byte(0x03,TFT_DATA);
MCU_write_TFT_Byte(0x10,TFT_DATA);
MCU_write_TFT_Byte(0xF0,TFT_COMMAND);//启动测试命令
MCU_write_TFT_Byte(0x01,TFT_DATA);
MCU_write_TFT_Byte(0xF6,TFT_COMMAND);//禁用ram省电模式
MCU_write_TFT_Byte(0x00,TFT_DATA);
MCU_write_TFT_Byte(0x3A,TFT_COMMAND);//65k mode
MCU_write_TFT_Byte(0x05,TFT_DATA);
MCU_write_TFT_Byte(0x29,TFT_COMMAND);//开启显示
//设置显示区域(行起始,行终止,列起始,列终止)
TFT_set_region(0,127,0,127);
TFT_clear(BLACK);//清屏(屏幕为黑色)
TFT_BL=1;//背光开启
}

关键初始化框架给出,方便直接配置使用,部分功能函数可在下方留言邮箱获取,上线发送,长期发布类似文章,欢迎关注,欢迎随时留言。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。问题1)我想知道rubyonrails是否有功能类似于primefaces的gem。我问的原因是如果您使用primefaces(http://www.primefaces.org/showcase-labs/ui/home.jsf),开发人员无需担心javascript或jquery的东西。据我所知,JSF是一个规范,基于规范的各种可用实现,prim
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
我使用的是最新版本的Chrome(32.0.1700.107)和Chrome驱动程序(V2.8)。但是当我在Ruby中使用以下代码运行示例测试时:require'selenium-webdriver'WAIT=Selenium::WebDriver::Wait.new(timeout:100)$driver=Selenium::WebDriver.for:chrome$driver.manage.window.maximize$driver.navigate.to'https://www.google.co.in'defapps_hoverele_hover=$driver.find_
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易
如果我在功能规范中调用url_for,它会返回一个以http://www.example.com/开头的绝对URL.Capybara会很乐意尝试加载该站点上的页面,但这与我的应用程序无关。以下是重现该问题的最少步骤:从这个Gemfile开始:source'https://rubygems.org'gem"sqlite3"gem"jquery-rails"gem"draper"gem"rails",'4.1.0'gem"therubyracer"gem"uglifier"gem"rspec-rails"gem"capybara"gem"poltergeist"gem"launchy"运行
在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,
我一直在做一些研究,我想我已经知道答案了,但我想知道是否有任何方法可以在不使用javascript或依赖CSS3媒体的情况下获得设备的屏幕尺寸和像素密度查询。本质上,我正在研究如何获取屏幕分辨率和像素密度,以便服务器可以决定在URI请求中为服务器提供哪个图像。到目前为止,我还没有发现任何证据表明这是可能的,但我想嘿,为什么不问问呢? 最佳答案 我不完全同意上面的正确答案。实际上,这个答案在很多情况下都是正确的……但理论上并非如此。通常向Web服务器发出的请求包含一个User-Agent字段,从理论上讲,该字段可用于识别有关设备屏幕分
我有一个适用于事件/监听器模型的应用程序。发布了几种不同类型的数据(事件),然后许多不同的事情可能需要也可能不需要对该数据(监听器)采取行动。监听器的发生没有特定的顺序,每个监听器将决定是否需要对事件采取行动。Rails应用程序有哪些工具可以完成此任务?我希望自己不必这样做(尽管我可以。这没什么大不了的。)编辑:观察者模式可能是更好的选择 最佳答案 查看EventMachine.它是一个非常流行的Ruby事件处理库。它看起来相当不错,而且很多其他库似乎都在利用它(Cramp)。这是一个很好的介绍:http://rubylearnin
什么是最优雅的做法'string'=>['s','st','str','stri','strin','string']我一直在想一个类轮,但我不能完全做到。欢迎任何解决方案,谢谢。 最佳答案 这个怎么样?s='string'res=s.length.times.map{|len|s[0..len]}res#=>["s","st","str","stri","strin","string"] 关于ruby-'string'到['s','st','str','stri','strin','s