Cortex-M0+ TFT-LCD编程(spi)

本文介绍了TFT-LCD显示器的工作原理和特性,强调了其在低压、低功耗、环保等方面的优势。实验步骤包括新建工程、配置STM32芯片、设置GPIO和时钟,并在main.c中编写LCD测试程序。通过烧录程序,LCD将显示颜色刷新效果。
摘要由CSDN通过智能技术生成
  1. 实验原理

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,既有玻璃基板的又有塑料基板。

  1. 实验步骤

①新建工程

②选择单片机芯片

③选择SWD下载调试模式

④选择外部晶振时钟源

⑤配置时钟树

⑥配置GPIO。配置PA15、PB3、PB5、PB6为上拉输出模式

⑦配置工程名称、工程路径和IDE软件(MDK5)

⑧工程软件生成配置

⑨生成STM32工程

  1. 编写程序

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; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小徐的记事本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值