相信很多人都驱动过 12864屏幕,对于串行的驱动来说主要有5根主要信号线:DATA数据、CLK时钟、A0寄存器选择、RST复位、CS片选,其中主要用到的为DATA、CLK、A0(A0:也就是你要写入的是控制命令还是数据),CS可以常为低(就是一直使能它),RST在开机瞬间拉低10ms后保持高电平。复位屏幕后,发送控制指令初始化,再依次写入数据,屏幕即可点亮,大部分LCD或OLED串行屏幕均可按此类方法驱动,下面对LCD屏幕驱动初步分析。
这个是我拆的U盾:
打开外壳后第一件事就是找那3.3V稳压管或芯片,放在放大镜下折腾了半个多小时最终还是没找到。沿着导线走,发现那EEPROM芯片也是统一电源,最后导线越来越细,最终接到主芯片19脚。
取下LCD屏后画的电路图:
上图是通过逻辑分析仪读取各端口数据得来的,具体方法如下:用逻辑分析仪分别接到LCD的6-10脚(未知的5根线),打开USBee Suite软件并开启捕捉,此时再将U盾通电,得到如下图形:
上图左侧写出了各为什么数据线,各线是各有特点的:
1.CLK线时8个一起很均匀的脉冲(上升沿),看到变化次数最多且8个在一起的就是时钟了。
2.RST是一个复位用的,一般低电平复位有效,因此大部分时间是处于高电平的(仅在开机时出现短暂低电平);
3.CS是使能控制,就是片选,一般低电平有效(表示正在工作中);
那么A0与DATA呢?DATA只在CLK变化时(就是那8个连续均匀脉冲间)有变化,而A0是在CLK停止时变化(就是两个连续的8个CLK脉冲之间,也就是CLK暂时停止的间隙那),如下图,可见
A0=0表示写入控制指令,B0表示写入第0行(共有8行,每行又分8子小行,后面有画图表示),B1表示写入第1行,10 及00 表示第0列,最后一个00,实则无意义,例如要写入第20列(16进制为0x14)则要发送 11 04 (16进制的,0x表示16进制数),即把0x14的高4位1加上0x10,低四位则去掉高四位后即可。
其实驱动串行LCD,主要
第一找对线:主要是DATA、CLK、A0三根,CS可直接接地,RST脚可以仿照STC51单片机复位电路,加个上拉电阻,再接一个合适电容到GND,这样上电瞬间为低,之后就会恢复高电平。
第二:写好初始化代码,也就是A0=0,发送初始控制指令给LCD,每8个CLK传送一字节DATA,DATA在CLK由低变为高之前设置好,例如要传送0x90,第一个CLK上升沿(由低电平变为高电平)之前需把DATA变位高,第二个CLK上升沿之前变为低·····。
第三:就是要变黑的点,就是绘出要显示的东西。
第一点按照他们各自规律很容易找到(示波器也行)。
第二、这个初始化指令在没有LCD技术手册时,部分指令还是无法翻译,比如本次拆的这个初始化依次发送了:0xE2 0xA2 0xA0 0xC8 0xA4 0xA6 0x24 0x81 0x20 0xF8 0x00 0x2C 0x2E 0x2F 0x40 0xAF. 下面列出常用的部分控制指令:
0xB0~B7 表示写入第几页(分了8大行):
0x1?为写入列数的高四位,0x0?为写入列数的低四位,如上图要在第2页第2列写入0x91,则步骤:先将A0=0,发送 0xB2 0x10 0x02 ,再将A0=1,发送0x91即可。也就是先设置要写的坐标,再发送数值。
0x81 0x??:0x81表示要设置对比度,后面那个字节表示1-256个等级对比度
0xA6:表示正常显示;0xA7表示逆显示
0xAE表示显示关闭;0xAF:开启显示
0x26:水平向右滚动显示;0x27:水平向左滚动显示。之后还要发送6字节数据:第一字节为00,第二字节:0x00--0x07,定义要滚动页开始的地址;第三字节:设置时间,0x00-0x07;第四字节:0x00-0x07,定义要滚动的页的结束地址,即从第几页到第?页为滚动的。第5字节为00,第6字节为0xFF
0x29:垂直和向右滚动 0x2A:垂直和向左滚动,也是和0x26/0x27设置一样的。
0x2E:停止滚动显示;0x2F开始滚动显示
0x20-0x23 设置内存寻址模式,也就是会影响你写入数据的方向,会影响显示图像的方向。
其余的可参看对应的LCD技术规格书,其次不同的LCD部分控制指令会有所不同(不代表所以LCD均可按此指令信息,实在不行就用逻辑分析仪读取DATA、CLK、A0数据,并抄下。便宜的逻辑分析仪才20多,不过能读取红外等各种数据了),注意写控制指令时A0=0。
第三点就是传输数据,也就是将各点显示为深色还是为空的信息告诉LCD,此时A0=1。正常模式下,先设置好药显示的起始地址后,再依次发送n个数据给LCD,LCD会根据依次传来的数据从显示起始处依次填充下去(从左往右)。如:A0=0时发送 0xB1 0x10 0x08,再A0=1,发送0x54,0x38,0x11·····,LCD会从第1页的第8列开始依次在第1页从左往右填充对应的数值。
显示的字可以用字模提取软件提取,图片也是一样的,如下图:
关于绘制线条等,由于写入数据是一字节一字节地写入的,故一次会影响 到某页(Page)竖列的8个点,最理想的办法是在写入之前先读取此LCD寄存器的值,再将要写入的值和其相 “与 --‘|’ ”,即把要变为黑点的位置加入原有的即可,这样绘制再多也不会影响原有的图案,但工作量会大点。或者将各寄存器的值存在EEPROM内(8页,每页128个,共1024字节),先改好后再一起发送到LCD里,这样掉电也不会保持最后一次的图案。
绘制直线主要是依着X轴或Y轴找到对应Y轴或X轴的值,逐点描绘即可:
驱动这LCD本来打算用STC15F104,但为保证测试稳定就先用了一个mega8最小系统。STC这8脚单片机,不需外部电路,且引脚刚好合适(可以再接个温度传感器之类的)。但注意一点别用5V给LCD供电,我用5V单片机驱动LCD后,发现LCD微微有点变黄了,所以要么加限流电阻,要么全用3.3V的。
单片机程序及波形图见附件:
波形图需USBee Suite软件打开,其中U盾在初始化时搞了2次清屏(全部填充0),且设置地址时为4字节,如 B1 10 00 00,其实B1 10 00即可,最后一个无用。
U盾LCD屏驱动相关文章:
成功驱动农行、工行U盾屏,排线丝印TSE1G6012或FPC-QFG12864
http://bbs.mydigit.cn/read.php?tid=1425394成功驱动工行U盾12864屏,排线丝印FM92031ACT6
http://bbs.mydigit.cn/read.php?tid=1425706终于点亮了工行U盾,12864B LCD接口定义图
http://bbs.mydigit.cn/read.php?tid=1262646U盾DIY GPS万年历兼谈STC EEPROM的使用:
http://bbs.mydigit.cn/read.php?tid=1283320坛友的 农行U盾液晶屏再利用DIY(附代码)
http://bbs.mydigit.cn/read.php?tid=1268821成功驱动农行超小U盾的屏幕,排线丝印FPC14570A
http://bbs.mydigit.cn/read.php?tid=1448992坛友的 建行e路通19264点阵屏改液晶模块,顺利点亮
http://bbs.mydigit.cn/read.php?tid=1235754教大家如何点亮建行网银盾的液晶屏(附代码指令)
http://bbs.mydigit.cn/read.php?tid=1295119教大家如何点亮建行网银盾的液晶屏2.0(以代码为主)
http://bbs.mydigit.cn/read.php?tid=1448258成功驱动建行U盾19264点阵屏,但是逻辑分析仪抓的数据令人费解
http://bbs.mydigit.cn/read.php?tid=1443276在大神们的带领下,stm8s103 点亮中行U盾12864屏
http://bbs.mydigit.cn/read.php?tid=2329368分享U盾19264三平台驱动程序 51 cortex-m3 cortex-m0
http://bbs.mydigit.cn/read.php?tid=2339786折腾建行U盾12864 LCD屏,制成小型带红外遥控温度计的时钟
http://bbs.mydigit.cn/read.php?tid=2349938NUC505驱动建行E路通屏成功:
http://bbs.mydigit.cn/read.php?tid=2449341