产品概述

单片机 tft驱动 TFT屏幕的驱动(附函数详解)

小编 2024-10-07 产品概述 23 0

TFT屏幕的驱动(附函数详解)

前几天,有位朋友问我TFT屏幕的驱动,今天,写一些出来,供大家参考。

TFT(Thin Film Transistor)即薄膜场效应晶体管,

它可以“主动地”对屏幕上的各个独立的像素进行控制,这样可以大大提高反应时间。一般TFT的反应时间比较快,约80毫秒,而且可视角度大,一般可达到130度左右,主要运用在高端产品。从而可以做到高速度、高亮度、高对比度显示屏幕信息。TFT属于有源矩阵液晶显示器,在技术上采用了“主动式矩阵”的方式来驱动,方法是利用薄膜技术所作成的电晶体电极,利用扫描的方法“主动拉”控制任意一个显示点的开与关,光源照射时先通过下偏光板向上透出,借助液晶分子传导光线,通过遮光和透光来达到显示的目的。

本文因为篇幅原因,只能讲解大概的用法,详细内容,请见文末的命令详解。

在基于Arduino的项目中,处理器频率很低。因此无法显示复杂的高清图像和高速运动。因此,全彩色TFT LCD只能用于显示简单的数据和命令。

现在大部分TFT屏幕模块都附带一个sd卡读写器和触摸屏。

.

市面上TFT LCD有很多种,使用不同的控制芯片,所以你使用的库文件必须支持屏幕的主控芯片。本次教程仅以arudino自带的TFT库为例,显示芯片7735

屏幕可以通过两种方式配置。一个是使用Arduino的硬件SPI接口。另一种方法是手动声明所有引脚。这两种方法在屏幕功能上没有区别,但是使用硬件SPI要快得多。

如果需要在TFT模块上使用SD卡,则必须使用硬件SPI。库中的所有示例都是为SPI使用的硬件编写的。

如果在Uno中使用硬件SPI,您只需要声明CS、DC和复位引脚,因为MOSI (pin 11)和SCLK (pin 13)已经定义。

安装库

Adafruit GFX:https://github.com/adafruit/Adafruit-GFX-Library

Adafruit ST7735 libraries:https://github.com/adafruit/Adafruit-ST7735-Library

默认情况,屏幕是横放的,左上角的点的坐标是0,0。如果这个点移动到屏幕的右上角,它的坐标是0,159;左下角的坐标是127,0,右下角的坐标是127,159。

可以通过调用setRotation(0)以垂直方向(也称为“竖屏”)使用屏幕。当您调用这个函数时,x轴和y轴相应地发生变化,对screen.width()或screen.height()的调用也会发生变化。

屏幕可以显示16位的颜色。红色和蓝色各有5位分辨率(32级红色和蓝色),绿色有6位分辨率(64级)。为了与其他应用程序保持一致,库以8位的值处理红、绿和蓝通道的颜色(0-255),并适当缩放颜色。

上代码

#include <TFT.h> // Hardware-specific library

#include <SPI.h>

#define CS 10

#define DC 9

#define RESET 8

TFT myScreen = TFT(CS, DC, RESET);

//在setup()中,需要用begin()启动库,然后用background()填充黑色以清除屏幕。

void setup(){

myScreen.begin();

myScreen.background(0,0,0); // clear the screen with black

delay(1000); // pause for dramatic effect

}

//在loop()中,要在屏幕上画一条线,调用line()。line()接受四个参数,开始的x和y坐标,结束的x和y坐标。要绘制一个框,使用rect()。rect()也接受四个参数:左上角的x和y坐标,然后是像素的宽度和像素的高度。在每个调用之间,使用stroke()或fill()更改颜色。stroke()将更改线条或形状周围的轮廓的颜色。fill()更改形状的内部颜色。

void loop(){

myScreen.stroke(255, 0, 0); // set the stroke color to red

myScreen.line(0, 10, myScreen.width(), 10); // draw a line across the screen

delay(1000);

myScreen.noStroke(); // don't draw a line around the next rectangle

myScreen.fill(0,255,0); // set the fill color to green

myScreen.rect(0,20,myScreen.width(),10); //draw a rectangle across the screen

delay(1000);

myScreen.fill(0,0,255); // set the fill color to blue

myScreen.stroke(255,255,255); // outline the rectangle with a white line

myScreen.rect(0,45,myScreen.width(),45); // draw a fat rectangle

delay(1000);

myScreen.background(0,0,0); // clear the screen before starting again

delay(1000);

}

//TFT库包含用于在屏幕上绘制文本的基本字体。默认情况下,字符宽5像素,高8像素。可以将字体大小更改为10x16、15x24或20x32。

在本例中,创建一个基本计数器,它将每半秒在屏幕上更新一个数字。与前面的示例一样,在setup()之前包含必要的库和变量。

#include <TFT.h> // Hardware-specific library

#include <SPI.h>

#define CS 10

#define DC 9

#define RESET 8

// pin definition for the Leonardo

// #define CS 7

// #define DC 0

// #define RESET 1

TFT myScreen = TFT(CS, DC, RESET);

// variable to keep track of the elapsed time

int counter = 0;

// char array to print time

char printout[4];

void setup(){

myScreen.begin();

myScreen.background(0,0,0); // clear the screen

myScreen.stroke(255,0,255);

// static text

myScreen.text("Running for",0,0);

myScreen.text("seconds",0,30);

// increase font size for text in loop()

myScreen.setTextSize(3);

}

在loop()中,将获得当前时间,并将该数字存储在char数组中。在每个循环结束之前,删除前面编写的文本,这样它就不会覆盖自己。

TFTvoid loop(){

// get elapsed time

counter = millis();

// convert to a string

String elapsedTime = String(counter/1000);

// add to an array

elapsedTime.toCharArray(printout,4);

// print out and erase

myScreen.stroke(255,255,255);

myScreen.text(printout,0,10);

delay(1000);

myScreen.stroke(0,0,0);

myScreen.text(printout,0,10);}

从SD卡中绘制图像

TFT库能够从SD卡上读取.bmp文件并将其显示在屏幕上。图像可以小于或大于屏幕分辨率(160x128),但是Arduino上没有用于图像操作的方法。在将图片放到SD卡上之前,应该先调整图片的大小。

在下面的示例中,名为“arduino”的位图为160x128像素。bmp”位于SD卡的根目录中。当由库读取并绘制时,图像将填满屏幕。

// include the necessary libraries

#include <SPI.h>

#include <SD.h>

#include <TFT.h> // Hardware-specific library

// pin definition for the Uno

#define SD_CS 11

#define LCD_CS 10

#define DC 9

#define RESET 8

// pin definition for the Leonardo

// #define SD_CS 8

// #define LCD_CS 7

// #define DC 0

// #define RESET 1

TFT myScreen = TFT(LCD_CS, DC, RESET);

// this variable represents the image to be drawn on screen

PImage image;

void setup() {

// initialize the serial port

Serial.begin(9600);

while (!Serial) {

// wait for serial line to be ready

// needed for the Leonardo

}

// try to access the SD card

Serial.print("Initializing SD card...");

if (!SD.begin(SD_CS)) {

Serial.println("failed!");

return;

}

Serial.println("OK!");

// initialize and clear the GLCD screen

myScreen.begin();

myScreen.background(255, 255, 255);

// load the image from the SD card

image = myScreen.loadImage("arduino.bmp");

// check if the image loaded properly

if (image.isValid() != true) {

Serial.println("error while loading arduino.bmp");

}

//write the image on screen

myScreen.image(image, 0, 0);

}

void loop(){

// nothing happening here

}

函数命令详解:https://www.arduino.cn/forum.php?mod=attachment&aid=MjIwMTZ8NWZkYTFhMzh8MTU2MTk1ODk5MXwxNTM4NjF8MjI4NDU=

下一期,我们介绍TFT屏的触控应用

OLED显示屏,行驱动电路设计,单片机AT89C51与和显示屏的硬件接线

OLEDindustry

一个有内容的公众平台!

随着科学技术与电子业技术的不断发展更迭,有机发光二极管如何简易并且有效的实现显示均匀、大面积发光、高亮度高分辨率发光、以及延长有机发光二极管寿命等当前亟需解决的问题,是我们未来要面对的技术挑战。今天小编给大家带来几个平日里做有源、无源oled显示驱动设计的例子,以供大家作为电子设计参考。

一、驱动控制SSD1303实现96x64点阵PM-OLED

本例子使用Solomon公司的OLED显示驱动电路SSD1303,结合AT89C51单片机实现驱动OLED显示屏的方法。SSD1303是一款集控制器、行驱动器和列驱动器于一体的专用于OLED显示控制驱动电路。

实验中OLED结构阳极材料,采用ITO(铟锡氧化物),阴极则使用Mg与其他稳定金属合金的办法Mg:Ag做阴极,以提高器件量子效率和稳定性,并可以在有机膜上形成稳定坚固的金属薄膜。

PM-OLED使用普通的矩阵交叉屏, OLED位于交叉排列的阳极和阴极中间,通过对阳极和阴极组合的选通,可以控制每一个OLED的点亮。

SSD1303芯片内部电路框图如下图1所示:

SSD1303芯片主要由MCU接口、命令译码器、振荡器、显示时序发生器、电压控制与电流控制、区颜色译码器、和图形显示数据存储器(GDDRAM)、行驱动和列驱动组成。这种IC的专用OLED驱动方案使OLED显示性能最佳,降低了功耗。该器件采用TCP/TAB封装。具有驱动最大132×64点阵的图形显示、提供的逻辑电源为2.4~3.5V、供给OLED屏的电源为7.0~16V、列输出的最大电流为 320μA、行输入的最大电流为45mA、低电流睡眠模式小于5μA、256级对比度控制,可编程帧频、具有几个MCU接口,如68/80并行总线和串行的周边接口、132×65bit显示缓冲器、可以垂直滚动、支持部分显示、工作温度:-40 oC~ 85 oC。

整个系统由单片机、控制驱动电路SSD1303和OLED显示屏三部分组成.SSD1303与单片机接口的引脚有:DO~D7为与单片机接口的数据总线,R/W(RW#)为读写选择信号,D/C为数据/命令选择信号,CS#为片选信号,低电平有效,E(RD#)为使能信号,RES#为复位信号。单片机采用ATMEL 公司生产的低功耗、高性能的AT89C51, AT89C51与SSD1303和显示屏的硬件接线如图2所示,P1.0、P1.1、P1.2、P1.3、P1.4分别与SSD1303的 R/W(RW#)、D/C、CS#、E(RD#)、RES#相连,P0口与SSD1303的数据总线相连。其它引脚的连线VCC接12V,VDD接 2.7V,VSS接地等。下面通过程序来控制这些引脚,从而使OLED显示需要的汉字或图形。主程序软件流程图如图3所示。

图2 单片机AT89C51与SSD1303和显示屏的硬件接线

图3 主程序软件流程图

二、台湾普诚PT6807/PT6808无源矩阵驱动方式

本案例采用ISL97702便携式产品的DC/DC直流升压电源电路,输入电压2.3~5.5V,输出电压根据负载轻重在2~30V范围内可调;OLED显示驱动采用PT6807和PT6808构建的无源矩阵驱动方式,适用于单色小尺寸OLED的显示驱动。

只所以选择ISL97702作为电源IC,需要考虑器件运行在最高效率的同时,尽可能的降低功耗并延长电池工作时间。ISL97702具有一种突发模式以及双输出电压选择功能,用以在轻载电流下保持转换器的效率和电源的节约。并且ISL97702还具有浪涌电流限制、短路保护和关机期间负载隔离等功能。ISL97702的DC/DC直流升压电源电路图,如下图所示:

基于ISL97702的DC/DC直流升压电源电路图

OLED显示屏像素点,按行、列排成矩阵,显示图像时,按行扫描或按列扫描,无源矩阵的基本结构框图,如下所示:

无源矩阵基本结构框图

其中“行”是由公共驱动器PT6807依次选通,“列”则是由列选择器PT6808根据图形要求来开通。例如,图中假如第一行只有第一个OLED导通就只有大约0.3mA,而假如第二行是所有OLLED都选通,而每一行一共有100个OLED,则其总电流大约为33mA。也就是说,其总电流是由每一行中的OLED数,就是其象素数决定。因为OLED的亮度是由其电流决定的,所以保持电流的稳定是很重要的。列驱动通常采用P沟道器件作为电流源。为保证其工作于饱和区,至少需要有2伏电压,这样其输出电流随VDS的变化将会小于1%每伏。当某一行有很多OLED导通时,它的总电流就比较大。这时在连接电极上就会有较大压降,从而使VDS降低。而这种压降又取决于显示的图形,而且是不可避免的。所以必须将电流受VDS的变化而变化的灵敏度降至最低。同时输出电流的不均匀性也受到驱动器件的不一致性的影响,这种不均匀性可以靠提高VGS工作电压和版图匹配技术来减小。

128×128点阵模块驱动接口,如下图所示:

128×128点阵模块驱动接口图

1. 行驱动电路设计

PT6807是点阵OLED图形显示系统64路行驱动器,它利用CMOS技术,提供64个移位寄存器和64路输出驱动,PT6807自己产生时钟信号用来控制PT6808列驱动器。

PT6807可以设计为主,从两种模式,为OLED驱动显示提供方便;主/从模式选择由控制脚MS来控制,在主模式下,选择MS脚为高电平,输入/输出脚DIO1,DIO2,CL2只作为输出脚来用;在从模式下,MS脚被置为低电平,输入/输出脚CL2作为输入来用,而DIO1,DIO2的状态由SHL脚来决定。

晶振电路:主模式下,可由R、C、CR端来决定时钟频率;在从模式下,晶振电路的R,C端为悬空状态,CR端接高电平。

显示占空比选择:显示占空比靠输入脚DS1,DS2的状态来决定;在主模式下根据DS1,DS2脚的设置来选择占空比,有四种占空比1/48,1/64,1/96,1/128可供选择;在从模式下,DS1,DS2脚与电源VDD相连。

移位时钟和相位选择:PCLK2用来选择移位数据是在CL2时钟信号的上升沿,还是下降沿移出;数据移位方向的选择由MS,SHL脚来控制。

2. 列驱动电路设计

PT6808是点阵OLED图形显示系统64路列驱动器,它也利用CMOS技术,并提供显示RAM、64位数据锁存、64位驱动和解码逻辑,内部显示RAM用来存储由八位微处理器传来的显示数据,它根据存储数据产生点阵OLED驱动信号,与PT6807(行驱动器)配合使用。

输入缓存用来允许和禁止PT6808,当输入输出数据和指令被执行时,CS1B和CS3必须处于工作状态,不论CS1B和CS3处于任何状态,RSTB和ADC都可以正常操作,并且内部状态不会改变。

输入寄存器用来与MPU接口,并临时存储要写入显示RAM的数据,当CS1B和CS3处于工作状态时,输入寄存器通过R/W和RS来选定,数据通过MPU被写入输入寄存器,然后写入显示RAM中,数据在E信号的下降沿被锁入,通过内部操作自动写入显示RAM中。

输出寄存器:当CS1B和CS3处于工作状态,并且R/W和RS为高电平时,输出寄存器用来临时存储显示数据RAM,也即显示数据RAM中的存储数据被锁存到输出寄存器。当CS1B和CS3处于工作状态,R/W为高,RS为低时,状态数据(忙检测)可以被读出。

为了读出显示数据RAM中的内容,需要访问读指令两次,在第一次访问中,显示数据RAM中的数据被锁存到输出寄存器中,在第二次访问中,MPU读锁存数据。这就是说,在读显示数据RAM时需要一次假读,但是,在读状态数据时不需要假读。

为了克服在工作过程中当OLED亮度较高时的自动关屏问题,在写入数据之前应该查看该项,若关屏,则将其打开,以保证OLED屏的正常工作。其中判断是否关屏,若关闭则将其自动打开子程序如下:

Rs=0; // rs为数据/指令选择脚

r_w=1; // r_w为读/写输入脚

e =1; // e为允许信号输入脚

busy = P3; // P3接数据线端口

e = 0;

if(busy&0x20==0x00) // 若为真,表示已关屏

{com=0x3f; // com为形参

wr_command(com);} // wr_command是写命令子程序

三、TFT-OLED模拟像素单元驱动/控制电路

AM-OLED驱动实现方案包括模拟和数字两种。在数字驱动方案中,每一像素与一开关相连,TFT仅作模拟开关使用,灰度级产生方法包括时间比率灰度和面积比率灰度,或者两者的结合。目前,模拟像素电路仍占主流,但在灰度级实现上,模拟技术与时间比率灰度和面积比率灰度理论相结合将会是将来的一个发展趋势。在模拟方案中,根据输入数据信号的类型不同,单元像素电路可分为电压控制型和电流控制型。

电压控制型像素电路

1.两管TFT结构

电压控制型单元像素电路以数据电压作为视频信号。最简单的电压控制型两管TFT单元像素电路如图1所示。

图1 两管TFT驱动电路

其工作原理如下:当扫描线被选中时,开关管T1开启,数据电压通过T1管对存储电容CS充电,CS的电压控制驱动管T2的漏极电流;当扫描线未被选中时,T1截止,储存在CS上的电荷继续维持T2的栅极电压,T2保持导通状态,故在整个帧周期中,OLED处于恒流控制。

其中(a),(b)被分别称为恒流源结构与源极跟随结构,前者OLED处于驱动管T2的漏端,克服了OLED开启电压的变化对T2管电流的影响;后者在工艺上更容易实现。两管电路结构的不足之处在于驱动管T2阈值电压的不一致将导致逐个显示屏的亮度的不均匀,OLED的电流和数据电压呈非线性关系,不利于灰度的调节。

2.三管TFT结构

基于第二代电流传输器原理的电压控制型像素单元电路如图2所示,虚线左边可视为外部驱动电路,右边为单元像素电路。

图2 基于第二代电流传输器原理的像素电路

在控制模式下,T2和T3开启,T1和运算放大器构成第二代电流传输器,由于运算放大器的放大倍数可以取得很大,T1管的阈值电压对电流的影响变得不敏感,此时,流经T1的电流:

IT1=Vin/Rin

并且T1管源极电压应低于OLED的开启电压,防止OLED开启。在保持模式下,T2和T3关断,存储电容Cs维持T1管的栅极电压,电流经T1进入OLED。其中放大器由COMS电路实现,所有同行像素可共用一个运算放大器。

仿真结果表明,尽管T3管存在电荷注入与时钟馈漏效应,使得OLED电流略小于控制电流;在OLED标称电流为1μA,阈值电压漂移超过5V时,控制电流、OLED电流相对误差分别为-0.18%、5.2%,成功补偿了TFT的空间不均性和不稳定性。

虽然电压控制型电路具有响应速度快的特点,但由于不能准确地调节显示的灰度,难以满足显示的需求,于是人们提出电流驱动方案。电流控制型单元像素电路是以数据电流作为视频信号的。

3管电流控制型TFT像素电路

4-TFT电流控制电流镜像素电路

目前,全球已经有多家公司在从事OLED驱动IC的研究,到目前为止,还没有完全商业化的AM-OLED的驱动IC。但NextSierra公司已推出了分别集成的TFT-OLED行列驱动NXS1008、NXS1009和控制芯片NXS1010,张志伟等人采用该系列芯片,通过MCS-51单片机的控制来驱动240×320×3点阵的TFT-OLED屏,实现了大信息量的动态图形显示。

由于液晶显示器件的配套驱动芯片功能比较完善,且价格低廉,所以将此类芯片移用于有源矩阵显示屏(AM-OLED)成为了国内外当前的研究焦点。显示驱动IC是目前TFT-OLED的薄弱环节,开发通用或者专用的驱动IC,并集成控制电路,是提高OLED在平板及显示领域竞争力的重要动力。

往期精彩回顾

OPPO的又一首次突破!屏下摄像头真的来了.......

维信诺供应AMOLED!小米屏下摄像头来啦!

OLEDindustry

↓↓ 可以畅聊到天亮的行业技术群!你要不要来?↓↓

管理员微信:OLEDindustry2

添加管理员微信 > 入群 > 尽情畅聊探讨

相关问答

单片机 控制7寸 tft 模块液晶屏,具体怎么写程序,大概思路?

第一,逻辑上是一样的,如果接的口一样,改动量会很小第二,如果没有gui的话那就需要你进行液晶屏的最底层操作,比如说初始化,画点,画线这些最基本的工作都需...

单片机 学习开发板怎么选择,哪款比较好?

初学的话,首选STC,八位机,自带例程的板子。12系列15系列或8A8K都可以。自带USB下载功能更好。TFT液晶屏一起买。进阶的话,STM32F4系列。其他要求同上。初学...

手机的LCD显示器是怎么 驱动 的?

LCD的接口有多种,分类很细。主要看LCD的驱动方式和控制方式,目前手机上的彩色LCD的连接方式一般有这么几种:MCU模式,RGB模式,SPI模式,VSYNC模式,MDDI模式...L...

什么是 单片机 ?

单片机不是执行特定逻辑功能的芯片,而是将计算机系统集成到芯片上的芯片。它等效于微型计算机。与计算机相比,单芯片计算机仅缺少I/O设备。简而言之:芯片变成...

s3c2410是 单片机 吗?

S3C2410处理器是Samsung公司基于ARM公司的ARM920T处理器核,采用FBGA封装,采用0.18um制造工艺的32位微控制器。该处理器拥有:独立的16KB指令Cache和16KB数据Ca...

单片机 的串口,怎样与电脑串口联接?-ZOL问答

一般单片机由于供电的原因,通常都是TTL的UART电平讯号,需要经过转换IC来提升电平(RS-232),电脑通常都是RS-232的讯号,因此直接把转换后的RS-232跟电脑的RS-232来...

单片机 DIY,电路与程序已经完成,还需要买什么才能做出实物?

单片机DIY最大的乐趣是除了学到相关知识外,就是亲眼看到自己的DIY作品上电后实现了想要的功能,这一刻的喜悦会让你忘记设计、调试的辛苦,反而会更加的喜欢DIY...

单片机 用oled和lcd显示有什么不同-ZOL问答

OLED多为彩屏,是点阵结构,适于显示图形,其用法和TFT彩屏类似但OLED屏一般尺寸较小,大尺寸较贵,OLED屏无背光,靠像素点的LED自发光,功耗比较低lcd分单色屏和彩...

BIOS里头显示的EC是什么东西?-ZOL问答

EC(EmbedController,嵌入式控制器)是一个16位单片机,它内部本身也有一定容量的Flash来存储EC的代码。EC在系统中的地位绝不次于南北桥,在系统开启...

哪里能买到电子元器件?

集成电路处理器(100662项)单片机(5309项)数字信号处理器/控制器(43334项)可编程逻辑(47038项)片上系统(3201项)存储器(164943项)电源管理(...

猜你喜欢