NT35310 - LCD显示屏

NT35310 - LCD显示屏

芯片介绍\引脚介绍

NT35310 是一个低功耗、26 万色、单芯片的 TFT-LCD 控制器/驱动器,分辨率 480*320,它有一个 345600 字节的显示 RAM 和一整套控制功能。NT35310 支持数字接口(MDDI),MIPI 接口,RGB 接口,8 / 9 / 16 / 18 位8080 接口。可以实现指定的窗口区域可以有选择地更新,以便可以显示运动图像。同时也可以独立显示静止的图像区域。

8080时序

8080 总线又叫Intel(英特尔开发)总线。它控制线有四根,RD 写使能, WR 读使能, ALE 地址锁存, CS 片选。

详细介绍见协议使用笔记8080总线篇。

此处采用模拟8080时序作为介绍,该时序可由硬件FSMC模拟得,读写速度远优于模拟时序,关于FSMC相关介绍及使用,请参照STM32f10x开发笔记FSMC篇。

写时序

在这里插入图片描述

  • CS:片选线,数据传输时,片选拉低
  • WR:写数据/命令线,写数据时将WR拉低
  • RS:数据/命令线,高为数据,低为命令
  • D[0:15]:16位数据线
  • RD:读数据线,写时将RD拉高
读时序

在这里插入图片描述

同上介绍

初始化流程

初始化GPIO -> 延时100ms -> 发送初始化序列 (手册提供)

控制指令介绍

注意!!!:指令和参数均为16位,但除0x2C后发送的颜色数据外,均只使用低八位。

读取ID指令

  • 0xD3

可通过该指令可获取LCD屏的出厂ID,可用于分辨屏幕。发送该指令后,可接收自屏幕发送来的32bit数据。

存储访问控制指令

  • 0x36

该指令为存储访问控制指令,可以控制 ILI9341 存储器的读写方向,简单的说,就是在连续写 GRAM 的时候,可以控制 GRAM 指针的增长方向,从而控制显示方式(读 GRAM 也是一样)[呈现效果]

其发送的参数中 D7 D6 和 D5 位分别表示 MY MX 和 MV,通过这三个位可以控制指针增长方向。详细如下:

MYMXMV呈现效果
000从左到右,从上到下
100从左到右,从下到上
010从右到左,从上到下
110从右到左,从下到上
001从上到下,从左到右
011从上到下,从右到左
101从下到上,从左到右
111从下到上,从右到左

列地址设置指令

  • 0x2A

    该指令是列地址设置指令,在从左到右,从上到下的扫描方式(默认)下,该指令用于设置横坐标(x 坐标),在其它方式下可自行推导。

    通常我们不对扫描方式进行更改,使用默认扫描方式。

    该指令共有四个参数,前两个参数(SC)代表坐标x的起始坐标的高、低位,后两个参数(EC)代表坐标x的结束坐标的高、低位。为了节约时间,如果使用中已对x长度做要求,可以不发送后两个参数。

    注意:SC 必须小于等于 EC,且 0≤SC/EC≤239。

行地址设置指令

  • 0x2B

该指令是行地址设置指令,在从左到右,从上到下的扫描方式(默认)下,该指令用于设置横坐标(y 坐标),在其它方式下可自行推导。

参数介绍类比于上。

注意:SP 必须小于等于 EP,且 0≤SP/EP≤319。

写数据指令

  • 0x2C

该指令是写 GRAM 指令,在发送该指令之后,我们便可以往 LCD 的 GRAM 里面写入颜色数据了,该指令支持连续写 ,地址自动递增,直到到达该行结尾或预设的EC值时进行换行。

在收到指令 0X2C 之后,数据有效位宽变为 16 位,我们可以连续写入 LCD GRAM 值,而 GRAM 的地址将根据 MY/MX/MV 设置的扫描方向进行自增。例如:假设设置的是从左到右,从上到下的扫描方式,那么设置好起始坐标(通过 SC,SP 设置)后,每写入一个颜色值,GRAM 地址将会自动自增 1(SC++),如果碰到 EC,则回到 SC,同时 SP++,一直到坐标:EC,EP 结束,其间无需再次设置的坐标,从而大大提高写入速度。

读数据指令

  • 0x2E

颜色读取指令,用于读取相应坐标颜色值,可连续读,地址自增。

其收到的数据格式如下:

在这里插入图片描述

其中第一次收到的数据dummy为无效数据,可直接丢弃,第二第三次收到的数据中已含有全部的RGB565信息,可仅接收前三个参数,后两个参数可以不接收。

代码示例

变量介绍

LCD_DAT_OUT(n,state)   //LCD并行数据输出 n为0~15,state 为0或1
LCD_DAT_IN(n)		  //LCD并行数据输入 n为0~15
    
#define LCD_CS     	  //片选
#define LCD_WR     	  //写
#define LCD_BL     	  //背光
#define LCD_RS     	  //信号、数据线
#define LCD_RD     	  //读
    
#define NT35310_WR_REG(data)   //写命令
#define NT35310_WR_DAT(data)   //写数据

写双字

//写双字,8080总线16位数据
//写数据和写命令仅为RS线高低不同,此处为未添加RS线的通用函数,可自行封装函数
void NT35310_Write_DoubleByte(u16 tData)
{   
    u8 i;
    LCD_RD = 1;			//写时序中将读线拉高
    LCD_CS = 0;			//片选选中

    LCD_WR = 0;			//写,低电平有效

    for(i = 0;i < 16;i++) //循环写入
    {
        if((tData & (1 << i))?1:0) LCD_DAT_OUT(i,1);
        else LCD_DAT_OUT(i,0);
    }
    
    LCD_WR = 1;		    //重新拉高,取消写

    LCD_CS = 1;			//取消片选
}

读双字

//读双字,8080总线16位数据
u16 NT35310_Read_DoubleByte(void)
{
    u8 i;
    u16 rData = 0;

    LCD_WR = 1;			//读数据时将写拉高
    LCD_CS = 0;			//片选选中

    LCD_RD = 0;			//读拉低,低电平有效

    for(i = 0;i < 16;i++)	//读取数据
    {
        if(LCD_DAT_IN(i)) rData++;
        rData <<= 1;
    }
    
    LCD_RD = 1;			//取消读

    LCD_CS = 1;			//取消片选

    return rData;		//返回数据
}

设置读写坐标

//仅设置开始坐标
void LCD_Set_Start_PageRow_CMD(u16 x,u16 y)
{ 
    NT35310_WR_REG(0x2A);		//设置x坐标指令
    NT35310_WR_DAT(x >> 8);		//x起始坐标高八位,下为低八位
    NT35310_WR_DAT(x);

    NT35310_WR_REG(0x2B);		//设置y坐标指令
    NT35310_WR_DAT(y >> 8);		//y起始坐标高八位,下为低八位
    NT35310_WR_DAT(y);
	
}

//设置开始结束坐标
void LCD_SetStartEnd_PageRow_CMD(u16 x_s,u16 y_s,u16 x_e,u16 y_e)
{
    NT35310_WR_REG(0x2A);
    NT35310_WR_DAT(x_s >> 8);
    NT35310_WR_DAT(x_s);
    NT35310_WR_DAT(x_e >> 8);	//设置x结束坐标,同上
    NT35310_WR_DAT(x_e);

    NT35310_WR_REG(0x2B);
    NT35310_WR_DAT(y_s >> 8);
    NT35310_WR_DAT(y_s);
    NT35310_WR_DAT(y_e >> 8);	//设置y结束坐标,同上
    NT35310_WR_DAT(y_e);
}

画点函数

void LCD_DrawPoint(u16 x,u16 y,u16 color)
{
    LCD_NT35310_OUTPUT_Init();
    if((x > LCD_WIDTH) || (y > LCD_HIGHT)) return;
    LCD_Set_Start_PageRow_CMD(x,y);
    NT35310_WR_REG(0x2C);
    NT35310_WR_DAT(color);		//颜色值,16位
}

//有该函数后便有无限可能,由读者自行发挥(●'◡'●)
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正点原子NT35310LCD屏幕接口初始化一般涉及到以下几个步骤: 1. 确定屏幕的参数:包括分辨率、像素格式、时序等信息。 2. 配置控制器:根据屏幕的参数,配置控制器的时序、位宽、极性等参数,以确保控制器能够正确地驱动屏幕。 3. 初始化屏幕:对屏幕进行初始化,包括清屏、设置像素格式等操作。 4. 启动显示:将控制器的输出信号发送到屏幕上,开始显示图像。 下面是一个基于STM32F407芯片和正点原子NT35310LCD屏幕的接口初始化示例代码(使用的是8位位宽,RGB565像素格式): ```c #define LCD_WIDTH 480 #define LCD_HEIGHT 800 void LCD_Init(void) { /* 配置GPIO */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE); GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource4, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource5, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_LTDC); GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_LTDC); GPIO_InitTypeDef GPIO_InitStructure; /* PB8-PB15 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOB, &GPIO_InitStructure); /* PC6-PC7 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_Init(GPIOC, &GPIO_InitStructure); /* PD3-PD6 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6; GPIO_Init(GPIOD, &GPIO_InitStructure); /* PE4-PE15 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure); /* 配置LTDC时钟 */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_LTDC, ENABLE); /* 配置LTDC控制器参数 */ LTDC_InitTypeDef LTDC_InitStruct; LTDC_InitStruct.LTDC_HorizontalSync = 41; LTDC_InitStruct.LTDC_VerticalSync = 10; LTDC_InitStruct.LTDC_AccumulatedHBP = 13; LTDC_InitStruct.LTDC_AccumulatedVBP = 2; LTDC_InitStruct.LTDC_AccumulatedActiveW = 493; LTDC_InitStruct.LTDC_AccumulatedActiveH = 802; LTDC_InitStruct.LTDC_TotalWidth = 524; LTDC_InitStruct.LTDC_TotalHeigh = 804; LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC; LTDC_Init(&LTDC_InitStruct); /* 配置LTDC层参数 */ LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct; LTDC_Layer_InitStruct.LTDC_HorizontalStart = 0; LTDC_Layer_InitStruct.LTDC_HorizontalStop = LCD_WIDTH - 1; LTDC_Layer_InitStruct.LTDC_VerticalStart = 0; LTDC_Layer_InitStruct.LTDC_VerticalStop = LCD_HEIGHT - 1; LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565; LTDC_Layer_InitStruct.LTDC_BlendingFactor1 = LTDC_BlendingFactor1_CA; LTDC_Layer_InitStruct.LTDC_BlendingFactor2 = LTDC_BlendingFactor2_CA; LTDC_Layer_InitStruct.LTDC_HorizontalPrediv = 1; LTDC_Layer_InitStruct.LTDC_VerticalPrediv = 1; LTDC_Layer_InitStruct.LTDC_Backcolor.Blue = 0; LTDC_Layer_InitStruct.LTDC_Backcolor.Green = 0; LTDC_Layer_InitStruct.LTDC_Backcolor.Red = 0; LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255; LTDC_Layer_InitStruct.LTDC_CFBStartAdress = (uint32_t)0xD0000000; LTDC_Layer_InitStruct.LTDC_CFBLineLength = (LCD_WIDTH * 2); LTDC_Layer_InitStruct.LTDC_CFBPitch = LCD_WIDTH * 2; LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_HEIGHT; LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct); /* 设置背景色 */ LTDC_SetBackgroundColor(LTDC_BLACK); /* 使能LTDC */ LTDC_Cmd(ENABLE); /* 使能LCD显示 */ LTDC_LayerCmd(LTDC_Layer1, ENABLE); LTDC_ReloadConfig(LTDC_IMReload); } ``` 需要注意的是,这只是一个示例代码,实际情况下还需要根据具体的硬件平台和屏幕参数进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值