菜鸟学习lcd编程的起步【转】

首先再次声明我是菜鸟,我写出来的目的是给没有接触过lcd的朋友看得,我本人水平有限,错误在所难免,欢迎指出    


之所 以产生写这个东西的想法,是因为趁着寒假这段时间看了看学习板的源程序,在看lcd的时候很不顺利,花了五个晚上才看完(白天偷懒了^_^!,毕竟在春节 嘛)。联想起还有很多水平和我差不多甚至可能还低一点的菜鸟,就觉得有义务把五个晚上的学习心得写出来,顺便也给自己整理整理思路,嘿嘿。

这个心得是针对学习板上的lcd 驱动芯片SSD181X系列写的,当然思想应该是相通的。其实是我没有用过其他系列lcd(众人呕吐ing……)。

首先你要去网上下载一个SSD181X系列的PDF文件,这种文件网上到处都是,偶就不多说了。刚开始需要借用51论坛电子白菜大虾的文章作为总领,因为偶比较懒,不想写这么多拉~~~(不要飞鸡蛋……)当然还是有部分内容增加的拉。

我 介绍的这个是MOTO的手机屏,大小为96*54(96列54行)。不过这个小小的LCD屏也是很不错的。对比度可调,而且还有背光:)具体驱动器是: SSD1815,是黑白点阵驱动芯片,最多支持132个SEG和64个COM,还有一个ICON(功能设置)行。说起SEG,COM,也许很多人没接触 过,其实玻璃屏的LCD都是使用SEG,COM的扫描来驱动的,为使需要点亮的内容呈显示状态,须将交流驱动电压加在LCD的段电极与公共电极之间。原理 涉及物理化学问题,这里就不多说,只打个比喻:一个‘井’字,是两行两列组成的,共有四个交点,其实就好比是2个SEG,2个COM,要驱动一个固定的 点,要相应的一条COM和一条SEG都有效如果要几个点亮,几个点灭,就需要用到扫描的原理,还记得行列键盘的原理吗?其实它的驱动原理就差不多了:)
     上面说的它支持132个SEG,64个COM,所以它支持最多132*64个点的LCD。但实际上如果我们的LCD没有那么多个点话,就 需要在上电的时候对1815进行初始化,指定COM和SEG的数目,还有BIAS数,说到BIAS,唉,又是个专业问题了,LCD的驱动波形由几级电平组 成,为防止对比度不均匀,在不点亮象素对应的电极上仍加有一定电压,这对降低点亮象素产生 的交叉干扰和防止对比度不均匀很重要。LCD中非点亮象素(非 选点)的电压有效值与点亮象素(选择点)电压有效值之比(1/n)称为偏压比。确实比较难以理解,你可以这样看:BIAS是电平强度,和COM有关的东 西。以上这些都要在LCD上电的时候初始化好,才能正确地显示图文。
     1815还自带显示RAM,英文是Graphic Display Data Ram就是图象显示数据存储器,简称GDRAM。对于现在很多现成的LCM屏来说,控制芯片都带有了GDRAM的,大小就和他的最大显示点数相当。

我估计你看到现在还是一头雾水,呵呵,没关系,当初我看的时候也是一头雾水,看到后面你就会明白他们的原理了。
     接着是1815的接口问题了,它支持8080,6800,I2C总线。8080,就是和我们51一样的总线,有CS,WR,RD,然后是数据地址线; 6800又叫摩托罗拉总线,有R/W,E,然后是地址数据线;I2C总线,呵呵,当然就是I2C总线咯,还用说么?

由于这个是摩托罗拉的LCD屏,出厂的时候已经配置为6800总线了,所以我们不能用正常的51总线来驱动,但实际上6800是可以兼容8080总线的,先等我介绍下这个总线吧:
     R/W脚:读写脚,为1的时候是读,0的时候是写。
     E脚:使能脚,功能如同51总线的CS,也是低有效的,但数据D0-D7在高的时候锁存。
     D/C脚,这个是数据,命令选择脚,1的时候代表总线传输的是数据(不论是读还是写),0的时候代表总线传输命令(不论是读还是写)。
     D0-D7:理所当然的数据脚咯。

驱动原理很简单,在E为低的时候对R/W脚输入读写信号,读就是1,写就是0;然后选择你读写的是数据还是命令,D/C脚1为数据,0为命令;最后就是数据脚的数据了。
     以上原理,用单片机IO做是很简单的事情,不过使用IO的缺点就是不能复用,浪费了很多的资源,所以在学习板上是使用总线驱动LCD的。之前说了,某些6800总线是可以用8080总线模拟的,而这个LCD就是可以使用8080总线的了。

6800总线读写控制只需要1只脚R/W,1为读0为写,而8080总线是两只脚RD,WR,其中的某个脚为低就对应响应功能。根据这个逻辑关系,我们很容易就猜想到为什么6800的R/W脚可以直接接上8080的WR了。

这些都是垫场的开场白拉。接下来我就以丁丁编写的1815的使用程序,来介绍使用1815驱动lcd的详细步骤。



为了让大家能够理解清楚,我绝对按照分段的形式,一段一段解释。当然由于本菜鸟水平有限,如果解释错误还请大家不吝赐教。开始的程序我会讲的很细,后面的我就讲个大概了,只要理解了这个过程就不难了。

注意哦,这个程序是来自"51单片机世界",作者版主丁丁(聂小猛),未经允许,不得抄袭作为商业用途。



/*****************************************

#define uchar unsigned char

#define uint   unsigned int

#define ulong unsigned long

#include

#include

#include "study.h"



#define LCMD        XBYTE[0xAf00]            // 液晶数据口

#define LCMC        XBYTE[0xAb00]            // 液晶命令口

#define   LCD_DOT_X 98 // lcd 的宽点数

#define   LCD_DOT_Y 54 //lcd 的高点数

#define LCD_MAX_X 11 //每行字符, ( LCD_MAX_X +1 ) * 8 点

#define LCD_MAX_Y 5 //共多少行,( LCD_MAX_Y +1 ) * 8   点

********************************************/



如果你写过单片机程序,就会知道任何程序的初始化阶段都是这么些步骤,定义再定义,最后是某些功能的初始化函数。这些就是刚开始的声明定义过程。前面的几个define,include我就不多说了,如果你连这个都看不懂,只能先去补习补习c语言了。

#define LCMD        XBYTE [0xAf00]和#define LCMC XBYTE[0xAb00]两句是用来定义外部总线接口地址的。0xAf00用来传递数据,0xAb00用 来传递命令,之前说过,是传输命令还是数据主要是取决于A10的,上面两个地址对应的A10其实就是0xaf00->A10=1,0xab00- >A10=0。照电子白菜大虾的话说,地址的取值只要确保在A000~AFFF 之间就可以了,所以以下定义一样能正确驱动LCD:
     #define LCMD XBYTE[0xA400] // 液晶数据口
     #define LCMC XBYTE[0xA000] // 液晶命令口
     虽然地址不同了,但对A10的作用依然不变。

接下来的两句则是用LCD_DOT_X来表示lcd 的宽点数,LCD_DOT_Y表示高点数。想象坐标轴,呵呵,是不是好理解了?这就说明我们现在用的lcd是LCD_DOT_X宽LCD_DOT_Y高的。

最后两句则是告诉我们,这个lcd可以显示5行,每行11个字符。这些参数都是可以根据lcd不同而变化的。

<
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值