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 好好研究一下清屏函数:

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

他的本质就是往显存里边写数据,列地址好说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。

参考资料:朱老师物联网大讲堂教程

最新文章

  1. Java获得键盘输入的两种方法
  2. Word密码破解工具字典攻击用来干什么的
  3. cell 的复用机制
  4. Android中的Context
  5. SQL Server XML转Table
  6. oracle中删除表中某字段出现重复的信息 保留其中一条
  7. VS的工程链接优化的问题
  8. Matcher类:(转)
  9. Mybatis bug修正
  10. 五毛的cocos2d-x学习笔记08-动画
  11. php如何判断用户是从指定页面跳转进来的
  12. schemaeasyui实例:SSh结合Easyui实现Datagrid的分页显示
  13. UVALive 4992 Jungle Outpost(半平面交)
  14. CountDownLatch与CyclicBarrier
  15. window7 x64 vs2015 如何编译 libqr 二维码生成库?
  16. Game Engine Architecture 7
  17. python 操作 MD5
  18. docker:版本变更
  19. Linux系统解析域名的先后顺序【转帖】
  20. DX9 DirectX 索引缓存(IndexBuffer) 代码

热门文章

  1. (一)MYSQL ERROR 2003 (HY000): Can&#39;t connect to MySQL server on &#39;192.168.10.210&#39; (111) 解决方法
  2. shell条件判断if中的-a到-z的意思
  3. CentOS 7安装指南
  4. zabbix3.4 监控mysql 数据库连接数
  5. EBGP在非直连网络时,需要配置ebgp的最大跳数,否则无法建立非直连的EBGP邻居
  6. AOP中使用Aspectj对接口访问权限进行访问控制
  7. DataReader的使用
  8. Python 日志模块logging
  9. c/c++ 多线程 std::call_once
  10. js 学习之路5:使用js在网页中添加水印