历史上的今天
今天是:2024年09月10日(星期二)
2019年09月10日 | 正点原子LCD-TFT原理讲解与配置介绍
2019-09-10 来源:eefocus







初始化序列由厂家提供,直接向厂家要







对于这个指令9341的描述是错误的
FSMC的简介



TFTLCD没有地址线没有地址线,而把RS连接到A0-A15其中的任意一根线。当地址线来用,这样就可以吧TFTLCD当成一个SROM来用了。


HADDR不可以直接配置,而是固定死的,我们只能选择不能修改
当bank1接的是16位宽的存储器的时候要右移一位对齐。

这其中NBL是用不到的。A只用到了一个,最重要的还是看最下面这个D信号的时序,它对应我们的ILI9341的读写时序。

FSMC_BCRx 这个寄存器,x代表1-4,对应我们的前面的第一个区到第四个区。


上图中如果单片机是STM32F4那么DATAST就不需要加1,而对于ADDSET[3:0]F1 F4都需要加1
.
.
---------------------------------------------LCD液晶显示实验讲解----------------------------


-------------------- -----------------------------1.硬件连接这里不多讲了-----------------------------------------------------------------
--------------------------------------------------2.LCD&LCDdev结构体讲解 下面这个结构体 lcd.h里面定义的-----------------------------

上面这个结构体在LCD.h里面 RS为1命令 为0的时候是数据
这部分是将lcd-base强制转化为lcd-typedef这样的机构体指针。最终我们要用的就是这个lcd了。

有7个参数 这样一个结构体就很方便的管理LCD相关的结构体
//设置lcd显示方向
//dir:0,竖屏 1,横屏,
void LCD_Display_Dir(u8 dir)
{
if(dir==0) //竖屏
{
lcddev.dir=0; //竖屏
lcddev.width=240;
lcddev.height=320;
if(lcddev.id==0X9341||lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
if(lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.width=320;
lcddev.height=480;
}
}else if(lcddev.id==0x5510)
{
lcddev.wramcmd=0X2C00;
lcddev.setxcmd=0X2A00;
lcddev.setycmd=0X2B00;
lcddev.width=480;
lcddev.height=800;
}else if(lcddev.id==0X1963)
{
lcddev.wramcmd=0X2C; //设置写入GROM的指令
lcddev.setxcmd=0X2B; //设置写x坐标指令
lcddev.setycmd=0X2A; //设置写y坐标指令
lcddev.width=480; //设置宽度480
lcddev.height=800; //设置高度800
}else
{
lcddev.wramcmd=0X22;
lcddev.setxcmd=0X20;
lcddev.setycmd=0X21;
}
}else //横屏
{
lcddev.dir=1; //横屏
lcddev.width=320;
lcddev.height=240;
if(lcddev.id==0X9341||lcddev.id==0X5310)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2A;
lcddev.setycmd=0X2B;
}else if(lcddev.id==0X6804)
{
lcddev.wramcmd=0X2C;
lcddev.setxcmd=0X2B;
lcddev.setycmd=0X2A;
}else if(lcddev.id==0x5510)
{
lcddev.wramcmd=0X2C00;
lcddev.setxcmd=0X2A00;
lcddev.setycmd=0X2B00;
lcddev.width=800;
lcddev.height=480;
}else if(lcddev.id==0X1963)
{
lcddev.wramcmd=0X2C; //设置写入GROM的指令
lcddev.setxcmd=0X2A; //设置写x坐标指令
lcddev.setycmd=0X2B; //设置写y坐标指令
lcddev.width=800; //设置宽度800
lcddev.height=480; //设置宽度480
{
lcddev.wramcmd=0X22;
lcddev.setxcmd=0X21;
lcddev.setycmd=0X20;
}
if(lcddev.id==0X6804||lcddev.id==0X5310)
{
lcddev.width=480;
lcddev.height=320;
}
}
LCD_Scan_Dir(DFT_SCAN_DIR); //默认扫描方向
}
-------------------------------------------------------3 7个底层接口函数--------------------------------------------------------

写寄存器值函数+写数据函数=写寄存器内容函数
5.读寄存器内容函数,发送寄存器地址,读取的数据返回给调用函数。
6开始写GRAM函数
7写GROM函数,开始写一些颜色值进去

这样一个函数就完成了写寄存器操作,因为有FSMC会自动完成
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{
data=data; //使用-O2优化的时候,必须插入的延时
LCD->LCD_RAM=data;
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
vu16 ram; //防止被优化
ram=LCD->LCD_RAM;
return ram;
}
//读寄存器
//LCD_Reg:寄存器地址
//返回值:读到的数据
u16 LCD_ReadReg(u16 LCD_Reg)
{
LCD_WR_REG(LCD_Reg); //写入要读的寄存器序号
delay_us(5);
return LCD_RD_DATA(); //返回读到的值
}
//写寄存器内容函数
//LCD_Reg:寄存器地址
//LCD_RegValue:要写入的数据
void LCD_WriteReg(u16 LCD_Reg,u16 LCD_RegValue)
{
LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号
LCD->LCD_RAM = LCD_RegValue;//写入数据
}
//开始写GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG=lcddev.wramcmd;
}
------------------------------------------------4 LCD初始化函数讲解---------------------------------------------------------------------------

初始化完GPIO后就要对FSMC 进行配置,
对应这些寄存器对FSMC进行初始化设置。

对FSMC进行读写时序的初始化,就是上面的这段代码,对应的寄存器是下面这两个寄存器。


接下来要配置的一个结构体

-----------------------------------------5坐标设置函数-----------------------------------------------------------------------
setxcmd指令 作用:设置x坐标
x的高8位
x的低8位
setycmd
y坐标的高8位
y坐标的低8位

-------------------------------------------6 LCD画点函数-----------------------------------------------------------------------------

快速画点函数

------------------------------------7 LCD读点函数-----------------------------------------------
x y是读取的点的坐标,返回值是这个点的颜色。
读出来的是RGB565的格式。

----------------------------------------8 LCD字符显示函数 ------------------------------------------------------
叠加方式 保持底色 非叠加方式
没有底色,这里 减空格 是因为是从空格开始取模的。
csize是一个字节点阵集所对应的字节数。
csize 这个句话得到一个字符点阵集的字节数。 其中 size=12 、16、24四种值。
下一句num是字符的偏移量,假如我们要显示!,那么此时num就是2 又因为 “-”(减号)的mun是0,所以, “!” 的mun是1·
颜色由POINT_color


上述的字模数组在上面的 font.h里面。
生成上面的字符码可以用PCtoLCD2002
在LIENTEK后输入 要生成的字符,然后点击 生成字模,就可以自动生成上面的字符码了。
根据下面这个来进行取模设置。 输出方式是从上到下从坐到右
ASCII的字符 高度=宽度的一倍 例如:asc2_2412[95][36] 就是竖向的(字符高为24)那么字符宽就=12。那么这个字符共有3x8=24 也会是高度占3个字节,宽度=24/2=12 高度的字节数x宽度=3x12=36个字节。95代表这个数组中有95个字符。
生成是最高位在上,一直减到最低位。这样字节1的8位都有效, 字节2只有高4位有效,字节3 的8位都有效,字节4也只有高4位有效。这样以此类推。
看上面的字符数组 行坐标表示 一个 字符



--------------------------------------------------例程测试----------------------------------------------------------


史海拾趣
|
LCD1602,大概介绍下 1602采用标准的16脚接口,其中: 第1脚:VSS为地电源 第2脚:VDD接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通 ...… 查看全部问答> |
|
来活跃下气氛 ,HOHO 本文针对超高频无源RFID 标签芯片的设计,给出了一些关键电路的设计考虑。文章从UHF RFID标签的基本组成结构入手,先介绍了四种电源恢复电路结构,以及在标准CMOS 工艺下制作肖特基二极管来组成倍压电路的解决方案。然后针对 ...… 查看全部问答> |
|
请问如何实现将抓取的图片通过GPRS模块(mc39i)进行无线传输 拨号上网的功能已经实现了 操作系统是linux,最后要移植到arm-linux上去 不知怎么编程能才能实现两端的文件发送和接受这种功能 哪位做过该方面的麻烦不吝赐教下,说一下思路或流程 最好详细点,谢谢… 查看全部问答> |
|
Visual studio 2005上的wince5.0嵌入式开发,高手们进来看看啊 Visual studio 2005上的wince5.0嵌入式开发,就是在PDA上播放个语音文件, [System.Runtime.InteropServices.DllImport(\"winmm.dll\")] public static extern long PlaySound(String lpszNam ...… 查看全部问答> |
|
手头有一块S3C2410的开发板 我想移植UCOS系统 现在已完成的工作: 板子的VIVI已烧写好 UCOS系统代码也已用ADS编译通过 那么接下来该怎么做呢? 该如何把UCOS移植到板子上? 我编写了一个LED的测试实验,该如何一上 ...… 查看全部问答> |




