LCD学习

Posted 947033916-fwh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LCD学习相关的知识,希望对你有一定的参考价值。

LCD简介
(1)显示器,常见显示器
(2)LCD(Liquid Crystal Display),液晶显示器,原理介绍
(3)LCD应用领域
(4)LED OLED
1.17.1.2、电子显示器的原理
(1)像素(分辨率)
(2)显存,用来做显示的内存
(3)字模
(4)字库
(5)控制器和驱动器
(6)软件+硬件实现功能

1.17.1.3 1602显示屏

简介:为什么叫1602(16*2显示器显示2排,每排16个字符)。能显示的字符数为 32。此时32不是像素,像素可能是 5*7,我们编程时只需要把相应的字符的的ascii码,送给液晶驱动器(软件做到这里就可以了),控制器就会自动将此字符的字模与字库相对应。发给驱动器去驱动LCD显示。

1.17.3.2原理图和接线引脚 

(1)引脚分为:数据线(8位(bit0-bit7)) + 控制接口 (3根(W/R、RS、E))+背光VO+电源地

并行接口: 相比之前的SPI、IIC是串行接口。他每次只能传输一个 bit位,每一个SCL 传输一位(分时传送)。但是并行接口(8位)一次传输 8位数据。相比较代价较大。

数据手册:

LCM (LCD 模组) 我们只是和LCD的控制器打交道(HD44780芯片)

主要技术参数、接口信号 :RS(命令/数据)W/R(写/读选择端)E(使能端)

截屏的功能就是读显示屏的数据。

3.RAM地址映射图

这个就是我们说的是 显存  80个字节。总共有2*40。但是我们显示时只用了 16 * 2 个内存。 

技术分享图片

譬如我要显示 一个 大写字母 A,我们需要把 大写字母A的字模放到这个显存中去,但是这个芯片本身是带字库的,我们只需要给他索引值,那么他是如何查找的呢?就是靠ASCII码,我只需要把 ‘A‘的ascii码,写入到显存中去。就显示了。编程本身是挺简单的。

指令说明: 

 技术分享图片 

00001000             0x08               // 关闭光标

需要写在任意位置需要改变 写入显存的地址才能在改变后的位置显示。

技术分享图片

 

 手册上的严格时序:

 技术分享图片 

杜绝显示屏刚开始时,显示屏上显示杂乱的东西。

1.17.712864显示屏:

(1)128p*64p  (注意不是字符而是pixel)和1602不一样。

(2)本身是没有字库的,需要自己制作字模给LCD12864内部的控制器。

(3)可以显示文字和图片

1.17.7.2原理图和数据手册和接线

原理图注意转接板的引脚对应

数据手册分两个(lcd12864模组 和 它的内部的控制器(芯片ST7565p) ),

 lcd12864模组 数据手册里面并没有与编程有关的内容。除过interface description( chip脚 一 一对应 (从原理图 到 转接板 到 12864模组的数据手册chip脚) 这里稍有繁杂)抓住关键点。

技术分享图片

编程接口: 

(2)控制总线+数据总线

(3)控制总线的定义

 数据接口(p0)+ 控制总线(RS(1命令/0 数据)+CS(片选-低电平有效)+RD(读控制线-低电平有效)+RW(写控制线-低电平有效) +reset肯定是拉低的)  (根据interface description)

学习方法:遇到坎的时候从容易到难我们一下是受不了,

(1)学习方法:数据书册是查的,找准数据书册关键信息点,用来查而不是挨个看。

(2)数据手册对照官方示例代码来参照对比

(3)要结合各部分原理图、各部分书册、示例代码来综合分析   (有时某一份资料会出错)

(4)必要时要记笔记 /*********************************************************功力就是这么来的*************************************************/  牢记

但是在两份数据手册中均没有找到时序图,所以只能猜测 根据  interface description 来大致根据经验先大致猜测,然后再各根据代码,来具体分析。

在参考示例代码的时候:先看底层时序代码:写命令和写数据    区别只是在 RS 的不同。

 

void LcdSt7565_WriteCmd(cmd)
{
	LCD12864_CS = 0;	   //chip select,打开片选
	LCD12864_RD = 1;	   //disable read,读失能	
	LCD12864_RS = 0;       //select command,选择命令     // 这里和我们之前在interface description 分析的不一样。无语。。。。。。
LCD12864_RW = 0; //select write,选择写模式 _nop_(); _nop_(); DATA_PORT = cmd; //put command,放置命令 _nop_(); _nop_(); LCD12864_RW = 1; //command writing ,写入命令 }

 

  1.17.9 ST7565 的指令集 

      1.17.9.1 高层时序分析

(1)指令式交互系统:ST7567芯片内部事先规定了各种指令,cpu只要发送特定的指令达到特定的功能。这就是指令式交互系统。根据指令表具体看。

(2)指令表是关键(非常普遍)ST7565很具有代表性。

1.17.9.2 指令系统学习方法:

 (1)沿着数据手册顺序分析。

   (2)沿着示例代码按需分析                  两种方法综合来看,先大致沿着看手册(简单的),在结合示例代码具体看。

     查指令表 :(1) display on    0xAF  / display off       0xAE

1.17.9.3先顺序分析简单的指令 : 

          (2)2号指令:显示行号设置 (display start line set)

      01000000+0-0x3F   即就是 0x40+(0 - 63)(也就是64行)

     (3)3号指令: 页地址设置 (page address set)10110000+( 0 - 7)0xB0+(0-7); 设置page address ( 0-7 64个纵向像素点分为8份)    具体参考 figure 4 

     (4)4号指令:  列地址设置 (Column adress set)  0001 bit7-bit4 +   0000+bit3-bit0  <bit7-bit0 (00000000 -10000011)   (0-131) > 

    设置Column address 一个完整的指令事发两次 (1.先发高位 0001 bit7-bit4  2. 后发低位 0000  bit3-bit 0)。

     (5)status read 详细看看每一位代表的意思: 

          

     (6) 设置ADC      

           0XA0   normal

           0xA1    reverse

1.17.9.4 以代码为纲领来分析

       (1)  void Lcd12864_Init()

        {

         时序(reset、)、硬件特性参数(对比度、亮度)、显示参数(起始行、ADC(0-127 / 4-131)、 )

        }

        自己对某个参数特性不清楚,可以对着代码,来修改某个参数来实际看看效果。<比如 像素全开 >

1.17.9.5 好好研究一下清屏函数: 

 

 1 void Lcd12864_ClearScreen(void)
 2 {
 3     uchar i, j;
 4 
 5     for(i=0; i<8; i++)
 6     {
 7         //--表格第3个命令,设置Y的坐标--//
 8         //--Y轴有64个,一个坐标8位,也就是有8个坐标--//
 9         //所以一般我们使用的也就是从0xB0到0x07,就够了--//    
10         LcdSt7565_WriteCmd(0xB0+i); 
11 
12         //--表格第4个命令,设置X坐标--//
13         //--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--// 131(0x83)这里应该是 0x18 0x03吧 
14         //--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--// 128(0x80)-----0x18  0x00 
15         //--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--//
16         //--我们的X坐标从0x10,0x00开始---//
17         LcdSt7565_WriteCmd(0x10); 
18         LcdSt7565_WriteCmd(0x04);                               
19         
20         //--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//
21         for(j=0; j<128; j++)
22         {
23             LcdSt7565_WriteData(0xf0);  //如果设置背景为白色时,清屏选择0XFF
24         }
25     }
26 }

 

 

 

   他的本质就是往显存里边写数据,列地址好说0-128 但是行(64行)它分为8个列地址(每一个bit代表8行像素点(bit0-bit7)),如果初始化的时候背景是白的,那么写入数据的时候就应该写入0xff,显示的是128*64个点阵黑色的。如果初始化的时候设置背景是黑的,那么则无需写入数据(0x00)。具体可以参考这幅表:

技术分享图片

 1.17.14.2、LCD12864显示文字

  (1)字模

  (2)像素&显存

  (3)显示函数:将字模丢到正确的显存中去

1.17.14.3、字模的获取 

     (1)芯片自带字库(输入ascii即可)

     (2)网上下载字库

     (3)字模生成软件自助生成。

    代码实战自己写一个显示函数,

遗留问题:

(1)初始化和字模不匹配,字显示是反的。

(2)初始化不对,造成x坐标是从右往左的。解决。

将选择方向的命令改为 0xA0,对应的的 坐标也要改变。

17.17.15.1 超过8*8的字符如何显示?

(1)常见汉字字模大小是 16*16(32字节的数据(32*8=16*16))。也就是说每一个bit代表一个像素,把他分解成 两个8*16(上下来分),横向显示。纵向设置 page address (8 bit),显示上一半。page address 加一,显示下一半,横向显示。这样一个字就显示出来了。注意要和取模软件一一对应。

一个像素点代表一个bit。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 













以上是关于LCD学习的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习: LCD驱动

LCD学习

Android Qcom lcd display 学习

树莓派1602lcd实验

STM32 FSMC学习笔记+补充(LCD的FSMC配置)

LCD学习