1、为什么可以把 TFTLCD 当成 SRAM 设备用
2、具体数据线的改变,导致能够使用
1、任何 LCD,使用流程都可以简单的用以上流程图表示。其中硬复位和初始化序列,只需要执行一次即可。而画点流程就是:设置坐标→写 GRAM 指令→写入颜色数据,然后在 LCD 上面,我们就可以看到对应的点显示我们写入的颜色了。读点流程为:设置坐标→读 GRAM 指令→读取颜色数据,这样就可以获取到对应点的颜色数据了。
2、实际操作
视频
1、显示器介绍
2、LCD屏幕介绍
3、OLED
1、显示器基本参数
2、显示器的接口技术
1、用的是正点原子提供的3.5寸TFTLCD驱动芯片用的是NT35310,电阻触摸屏。分辨率480×320,集成的触摸屏接口是SPI的;采用 RGB565 格式存储颜色数据,即16位颜色深度(我感觉16位数据并口,意思就是16位颜色)
2、16位8080并口(通过FSMC模拟实现),数据线:
STM32F4 的 FSMC 支持 8/16/32 位数据宽度,我们这里用到的 LCD 是 16 位宽度的,所以在设置的时候,选择 16 位宽就 OK 了
配置背光PB15 上电默认输出高电平
//LCD重要参数集
typedef struct
{
uint16_t width; //LCD 宽度
uint16_t height; //LCD 高度d
uint16_t id; //LCD ID
uint8_t dir; //横屏还是竖屏控制:0,竖屏;1,横屏。
uint16_t wramcmd; //开始写gram指令
uint16_t setxcmd; //设置x坐标指令
uint16_t setycmd; //设置y坐标指令
}LcdDevArg;
/************************ 基本参数与寄存器 *************************************/
//管理LCD重要参数
//默认为竖屏 就宽度和高度设置的不同
LcdDevArg lcddev={
//参数
.dir=0, //竖屏/横屏
.width=320,
.height=480,
//命令
.wramcmd=0X2C,//开始写gram指令
.setxcmd=0X2A,//设置x坐标指令
.setycmd=0X2B,//y坐标命令
};
//读写函数
void LCD_WR_REG(volatile uint16_t regval);//写命令
uint16_t LCD_RD_DATA(void); //读数据
void LCD_WR_DATA(volatile uint16_t data); //写数据
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue);//先写寄存器再写值
数据命令操作原理
//LCD地址结构体
typedef struct
{
volatile uint16_t LCD_REG;//0 命令
volatile uint16_t LCD_RAM;//1 数据
} LCD_TypeDef;
/*
1、 用的是第4块,地址范围为0x6800 0000——6BFF FFFF
2、我们把FSMC的A6地址线与 数据/命令 相连接 当A6为高电平时,数据线[15:0]被理解为数据
反正当A6为低电平时 被理解为命令
3、因此当我们需要写数据时,则使第6位地址为1;写命令时为0
4、7E:0111 1110 此时第六位为1数据,但是由于STM32内部会右移一位对齐,则右移后第六位为0
5、因此原地址为0 加1后就为数据了
*/
#define LCD_BASE ((uint32_t)(0x6C000000 | 0x0000007E))
#define LCD ((LCD_TypeDef *) LCD_BASE)
实际操作:
//写寄存器
//regval:寄存器值
void LCD_WR_REG(volatile uint16_t regval)
{
regval=regval; //使用-O2优化的时候,必须插入的延时
LCD->LCD_REG=regval;//写入要写的寄存器序号
}
//读LCD数据
//返回值:读到的值 通常用在发送完寄存器 后读取返回的值,他返回的值是需要我们读的
uint16_t LCD_RD_DATA(void)
{
volatile uint16_t ram; //防止被优化
ram=LCD->LCD_RAM; //这里相当于 读一个内存地址(可以看成读一个变量 自动会生成读时序)
return ram;
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(volatile uint16_t data)
{
data=data; //使用-O2优化的时候,必须插入的延时
LCD->LCD_RAM=data;
}
//写寄存器 针对某个寄存器写值,先写寄存器序号,然后写入数据
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
{
LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号
LCD->LCD_RAM = LCD_RegValue;//写入数据
}
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);//设置光标位置 用于读点
void opt_delay(uint8_t i);
//实际操作函数
void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint32_t color);//快速画点
uint32_t LCD_ReadPoint(uint16_t x,uint16_t y);//读点
/************************ 读点与画点函数 *************************************/
//快速画点
//x,y:坐标
//color:颜色
void LCD_Fast_DrawPoint(uint16_t x,uint16_t y,uint32_t color)
{
//设置坐标
LCD_WR_REG(lcddev.setxcmd);
LCD_WR_DATA(x>>8);LCD_WR_DATA(x&0XFF);
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(y>>8);LCD_WR_DATA(y&0XFF);
//写点颜色
LCD->LCD_REG=lcddev.wramcmd;
LCD->LCD_RAM=color;
}
//当mdk -O1时间优化时需要设置
//延时i
void opt_delay(uint8_t i)
{
while(i--);
}
//设置光标位置(对RGB屏无效)
//Xpos:横坐标
//Ypos:纵坐标
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
LCD_WR_REG(lcddev.setxcmd); //发送设置x坐标命令
LCD_WR_DATA(Xpos>>8);LCD_WR_DATA(Xpos&0XFF); //先发送高8位 后发送低8位
LCD_WR_REG(lcddev.setycmd);
LCD_WR_DATA(Ypos>>8);LCD_WR_DATA(Ypos&0XFF);
}
//读取个某点的颜色值
//x,y:坐标
//返回值:此点的颜色
uint32_t LCD_ReadPoint(uint16_t x,uint16_t y)
{
uint16_t r=0,g=0,b=0