实验原理
TFT-LCD 是薄膜晶体管液晶显示器英文 thin film transistor-liquid crystal display 字头的缩写。
TFT-LCD 技术是微电子技术与液晶显示器技术巧妙结合的一种技术。人们利用在 si 上进行微电子精细加工的技术,移植到在大面积玻璃上进行 tft 阵列的加工,再将该阵列基板与另一片带彩色滤色膜的基板,利用与业已成熟的 lcd 技术,形成一个液晶盒相结合,再经过后工序如偏光片贴覆等过程,最后形成液晶显示器。
大家知道 crt 的工作原理是通电后灯丝发热,阴极被激发,发射出电子流,电子流受到带有高电压的内部金属层的加速,经过透镜聚焦形成极细的电子束,打在荧光屏上,使荧光粉发光。和 crt 的原理完全不同,lcd 需要来自背后的光源,当光束通过这层液晶时,液晶体会并排或呈不规则扭转形状,所以液晶更像是一个个闸门,选择光线穿透与否,我们才能在屏幕看到深浅不一,错落有致的图像。
目前主流的液晶显示器都是薄膜晶体管 lcd(tftlcd),是由原有的液晶显示技术发展扩展而来的。tft 液晶为每个像素都设有一个半导体开关,以此做到完全的单独的控制一个像素点,液晶材料被夹在 tft 玻璃层和颜色过滤层之间,通过改变刺激液晶的电压值就可以控制最后出现的光线强度与色彩。
一般情况下液晶是透明的,除非施加电压。加压后,一部分会发生变化,变得不透明。液晶的这个转换速度通常很慢(后面会有详细描述)。在 1992 年,emi 宣布发明了一种新的液晶显示技术铁电液晶 flcd(ferroelectriclcds)。铁电液晶的优点是响应速度快,可达微秒级。而且无需更改电压也可以保持当前的状态,也就是更省电,这对于笔记本电脑,pda 等便携设备而言是非常有意义的。flcd 的优点众多,但目前市场上的产品却很少,因为 flcd 对于震动非常敏感,很容易损伤晶体,但将来一定会有所改进。
虽然铁电液晶 flcd 的将来还是个未知数,但它还拥有高对比度和超大可视角度等优点,对市场上主流的 tft 会造成一定的冲击。
在正常的工作温度下,flcd 的反应时间只有 70us!这么短的时间几乎可以忽略了。
推动 TFT-LCD 迅速的发展的一个很重要的因素就是它有以下主要应用特点:
(1)使用特性好:低压应用,低驱动电压,固体化使用安全性和可靠性提高;平板化,又轻薄,节省了大量原材料和使用空间;低功耗,它的功耗约为 crt 显示器的十分之一,反射式 TFT-LCD 甚至只有 crt的百分之一左右,节省了大量的能源;TFT-LCD 产品还有规格型号、尺寸系列化,品种多样,使用方便灵活、维修、更新、升级容易,使用寿命长等许多特点。显示范围覆盖了从 1 英寸至 40 英寸范围内的所有显示器的应用范围以及投影大平面,是全尺寸显示终端;显示质量从最简单的单色字符图形到高分辨率,高彩色保真度,高亮度,高对比度,高响应速度的各种规格型号的视频显示器;显示方式有直视型,投影型、透视式,也有反射式。
(2)环保特性好:无辐射、无闪烁,对使用者的健康无损害。特别是 TFT-LCD 电子书刊的出现,将把人类带入无纸办公、无纸印刷时代,引发人类学习、传播和记栽文明方式的革命。
(3)适用范围宽,从-20℃到+50℃的温度范围内都可以正常使用,经过温度加固处理的 TFT-LCD 低温工作温度可达到零下 80℃。既可作为移动终端显示,台式终端显示,又可以作大屏幕投影电视,是性能优良的全尺寸视频显示终端。
(4)制造技术的自动化程度高,大规模工业化生产特性好。TFT-LCD 产业技术成熟,大规模生产的成品率达到 90%以上。
(5)TFT-LCD 易于集成化和更新换代,是大规模半导体集成电路技术和光源技术的完美结合,继续发展潜力很大。目前有非晶、多晶和单晶硅 TFT-LCD,将来会有其它材料的 tft,既有玻璃基板的又有塑料基板。
实验步骤
①新建工程
②选择单片机芯片
③选择SWD下载调试模式
④选择外部晶振时钟源
⑤配置时钟树
⑥配置GPIO。配置PA15、PB3、PB5、PB6为上拉输出模式
⑦配置工程名称、工程路径和IDE软件(MDK5)
⑧工程软件生成配置
⑨生成STM32工程
编写程序
3.1在main.c文件中,添加LCD测试程序,如下所示
/* USER CODE BEGIN 2 */
Lcd_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint16_t time = 500;
Lcd_Clear(RED);
HAL_Delay(time);
Lcd_Clear(BLUE);
HAL_Delay(time);
Lcd_Clear(GREEN);
HAL_Delay(time);
Lcd_Clear(WHITE);
HAL_Delay(time);
Lcd_Clear(BLACK);
HAL_Delay(time);
Lcd_Clear(YELLOW);
HAL_Delay(time);
Lcd_Clear(CYAN);
HAL_Delay(time);
Lcd_Clear(BRIGHT_RED);
HAL_Delay(time);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
还需要自己操作寄存器来封装函数,编写lcd.h和lcd.c
lcd.h
#ifndef __LCD_H
#define __LCD_H
#include "stdint.h"
#include "main.h"
#define RED 0xf800
#define GREEN 0x07e0
#define BLUE 0x001f
#define WHITE 0xffff
#define BLACK 0x0000
#define YELLOW 0xFFE0
#define CYAN 0x07ff
#define BRIGHT_RED 0xf810
#define GRAY0 0xEF7D //»ÒÉ«0 3165 00110 001011 00101
#define GRAY1 0x8410 //»ÒÉ«1 00000 000000 00000
#define GRAY2 0x4208 //»ÒÉ«2 1111111111011111
#define X_MAX_PIXEL 128
#define Y_MAX_PIXEL 128
//LCDµÄSPIÒý½ÅµÄ¶¨Òå
#define LCD_CTRL_PORT GPIOB //¶¨ÒåTFTÊý¾Ý¶Ë¿Ú
#define LCD_LED LCD_Pin //LCD±³¹â--->>TFT --BL
#define LCD_RS MISO_Pin //MISO--->>TFT --RS/DC
#define LCD_SDA MOSI_Pin //MOSI--->>TFT --SDA/DIN
#define LCD_SCL SCLK_Pin //SCK--->>TFT --SCL/SCK
#define LCD_CS_PORT CSS_GPIO_Port
#define LCD_CS CSS_Pin //MCU_PB11--->>TFT --CS/CE
//Òº¾§¿ØÖÆ¿ÚÖÃ1²Ù×÷Óï¾äºê¶¨Òå
#define LCD_CS_SET LCD_CS_PORT->BSRR=LCD_CS
#define LCD_RS_SET LCD_CTRL_PORT->BSRR=LCD_RS
#define LCD_SDA_SET LCD_CTRL_PORT->BSRR=LCD_SDA
#define LCD_SCL_SET LCD_CTRL_PORT->BSRR=LCD_SCL
#define LCD_LED_SET LCD_CTRL_PORT->BSRR=LCD_LED
//Òº¾§¿ØÖÆ¿ÚÖÃ0²Ù×÷Óï¾äºê¶¨Òå
#define LCD_CS_CLR LCD_CS_PORT->BRR=LCD_CS
#define LCD_RS_CLR LCD_CTRL_PORT->BRR=LCD_RS
#define LCD_SDA_CLR LCD_CTRL_PORT->BRR=LCD_SDA
#define LCD_SCL_CLR LCD_CTRL_PORT->BRR=LCD_SCL
#define LCD_LED_CLR LCD_CTRL_PORT->BRR=LCD_LED
void LCD_GPIO_Init(void);
void Lcd_WriteIndex(uint8_t Index);
void Lcd_WriteData(uint8_t Data);
void Lcd_WriteReg(uint8_t Index,uint8_t Data);
uint16_t Lcd_ReadReg(uint8_t LCD_Reg);
void Lcd_Reset(void);
void Lcd_Init(void);
void Lcd_Clear(uint16_t Color);
void Lcd_SetXY(uint16_t x,uint16_t y);
void Gui_DrawPoint(uint16_t x,uint16_t y,uint16_t Data);
unsigned int Lcd_ReadPoint(uint16_t x,uint16_t y);
void Lcd_SetRegion(uint16_t x_start,uint16_t y_start,uint16_t x_end,uint16_t y_end);
void LCD_WriteData_16Bit(uint16_t Data);
void showimage(const unsigned char *p);
void Lcd_ReadID(void);
void showimage_farsight(const unsigned char *p);
void Gui_DrawFont_GBK16(uint16_t x, uint16_t y, uint16_t fc, uint16_t bc, uint8_t *s);
#endif
lcd.c
#include "gpio.h"
#include "stdint.h"
#include "lcd.h"
#include "lcd_font.h"
#include <string.h>
//static uint8_t lcd_send_data = 0;
//extern void HalLcd_HW_WaitUs(uint16 i);
/*
* Initialize LCD Service
*/
void HalLcdInit(void);
//LCD Init For 1.44Inch LCD Panel with ST7735R.
void Lcd_Init(void)
{
HAL_Delay(10);
//¿ªLCD±³¹â
HAL_GPIO_WritePin(LCD_GPIO_Port, LCD_Pin, GPIO_PIN_SET);
Lcd_WriteIndex(0x11);
HAL_Delay(3);//Sleep exit HAL_Delay(10);
Lcd_WriteIndex(0x11);
// HAL_Delay(1000);
// HAL_Delay(1000);
// HAL_Delay(1000);
HAL_Delay(5);
Lcd_WriteIndex(0x36);
HAL_Delay(5);
Lcd_WriteIndex(0x36);//MX, MY, RGB mode
HAL_Delay(5);
Lcd_WriteData(0xC8);
HAL_Delay(5);
Lcd_WriteData(0xC8);
HAL_Delay(5);
Lcd_WriteIndex(0x3A);
HAL_Delay(5);
Lcd_WriteIndex(0x3A);//65k mode
HAL_Delay(5);
Lcd_WriteData(0x05);
HAL_Delay(5);
Lcd_WriteData(0x05);
HAL_Delay(20);
Lcd_WriteIndex(0x29);
HAL_Delay(5);
Lcd_WriteIndex(0x29);//Display on//ÓÐÎÊÌâ
}
//
///*
// * Write a string to the LCD
// */
//
//void HalLcdWriteString ( char *str, uint8 option);
//
///*
// * Write a value to the LCD
// */
//extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option);
//
///*
// * Write a value to the LCD
// */
//extern void HalLcdWriteScreen( char *line1, char *line2 );
//
///*
// * Write a string followed by a value to the LCD
// */
//extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format, uint8 line );
//
///*
// * Write a string followed by 2 values to the LCD
// */
//extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line );
//
///*
// * Write a percentage bar to the LCD
// */
//extern void HalLcdDisplayPercentBar( char *title, uint8 value );
//
//extern void Gui_DrawFont_GBK16(uint16 x, uint16 y, uint16 fc, uint16 bc, uint8 *s);
//void Line_Dsp_single_colour(unsigned int x_start,unsigned int y_start,unsigned int x_end,unsigned int y_end,unsigned int color);
//void dsp_single_colour(int color);
void Delay_ms(int time)
{
int i,j;
for(i=0; i<time*10; i++)
{
for(j=0; j<100; j++)
{
}
}
}
void SPI_WriteData(uint8_t Data)
{
unsigned char i;
for(i=8; i>0;