ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:28.54KB ,
资源ID:13963367      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13963367.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(整理菜鸟学习lcd编程的起步.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

整理菜鸟学习lcd编程的起步.docx

1、整理菜鸟学习lcd编程的起步(6)环境影响评价结论的科学性。(6)评价结论。首先再次声明我是菜鸟,我写出来的目的是给没有接触过lcd的朋友看得,我本人水平有限,错误在所难免,欢迎指出 之所以产生写这个东西的想法,是因为趁着寒假这段时间看了看学习板的源程序,在看lcd的时候很不顺利,花了五个晚上才看完(白天偷懒了_!,毕竟在春节嘛)。联想起还有很多水平和我差不多甚至可能还低一点的菜鸟,就觉得有义务把五个晚上的学习心得写出来,顺便也给自己整理整理思路,嘿嘿。 这个心得是针对学习板上的lcd驱动芯片SSD181X系列写的,当然思想应该是相通的。其实是我没有用过其他系列lcd(众人呕吐ing)。 首先

2、你要去网上下载一个SSD181X系列的PDF文件,这种文件网上到处都是,偶就不多说了。刚开始需要借用51论坛电子白菜大虾的文章作为总领,因为偶比较懒,不想写这么多拉(不要飞鸡蛋)当然还是有部分内容增加的拉。 我介绍的这个是MOTO的手机屏,大小为96*54(96列54行)。不过这个小小的LCD屏也是很不错的。对比度可调,而且还有背光:)具体驱动器是:SSD1815,是黑白点阵驱动芯片,最多支持132个SEG和64个COM,还有一个ICON(功能设置)行。说起SEG,COM,也许很多人没接触过,其实玻璃屏的LCD都是使用SEG,COM的扫描来驱动的,为使需要点亮的内容呈显示状态,须将交流驱动电压

3、加在LCD的段电极与公共电极之间。原理涉及物理化学问题,这里就不多说,只打个比喻:一个井字,是两行两列组成的,共有四个交点,其实就好比是2个SEG,2个COM,要驱动一个固定的点,要相应的一条COM和一条SEG都有效如果要几个点亮,几个点灭,就需要用到扫描的原理,还记得行列键盘的原理吗?其实它的驱动原理就差不多了:) 上面说的它支持132个SEG,64个COM,所以它支持最多132*64个点的LCD。但实际上如果我们的LCD没有那么多个点话,就需要在上电的时候对1815进行初始化,指定COM和SEG的数目,还有BIAS数,说到BIAS,唉,又是个专业问题了,LCD的驱动波形由几级电平组成,为防

4、止对比度不均匀,在不点亮象素对应的电极上仍加有一定电压,这对降低点亮象素产生的交叉干扰和防止对比度不均匀很重要。LCD中非点亮象素(非选点)的电压有效值与点亮象素(选择点)电压有效值之比(1/n)称为偏压比。确实比较难以理解,你可以这样看:BIAS是电平强度,和COM有关的东西。以上这些都要在LCD上电的时候初始化好,才能正确地显示图文。 1815还自带显示RAM,英文是GraphicDisplayDataRam就是图象显示数据存储器,简称GDRAM。对于现在很多现成的LCM屏来说,控制芯片都带有了GDRAM的,大小就和他的最大显示点数相当。 我估计你看到现在还是一头雾水,呵呵,没关系,当初我

5、看的时候也是一头雾水,看到后面你就会明白他们的原理了。 接着是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在高的

6、时候锁存。 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,

7、1为读0为写,而8080总线是两只脚RD,WR,其中的某个脚为低就对应响应功能。根据这个逻辑关系,我们很容易就猜想到为什么6800的R/W脚可以直接接上8080的WR了。 这些都是垫场的开场白拉。接下来我就以丁丁编写的1815的使用程序,来介绍使用1815驱动lcd的详细步骤。 为了让大家能够理解清楚,我绝对按照分段的形式,一段一段解释。当然由于本菜鸟水平有限,如果解释错误还请大家不吝赐教。开始的程序我会讲的很细,后面的我就讲个大概了,只要理解了这个过程就不难了。 注意哦,这个程序是来自51单片机世界,作者版主丁丁(聂小猛),未经允许,不得抄袭作为商业用途。 /* #defineucharun

8、signedchar #defineuintunsignedint #defineulongunsignedlong #include #include #includestudy.h #defineLCMDXBYTE0xAf00/液晶数据口 #defineLCMCXBYTE0xAb00/液晶命令口 #defineLCD_DOT_X98/lcd的宽点数 #defineLCD_DOT_Y54/lcd的高点数 #defineLCD_MAX_X11/每行字符,(LCD_MAX_X+1)*8点 #defineLCD_MAX_Y5/共多少行,(LCD_MAX_Y+1)*8点 */ 如果你写过单片机程序,

9、就会知道任何程序的初始化阶段都是这么些步骤,定义再定义,最后是某些功能的初始化函数。这些就是刚开始的声明定义过程。前面的几个define,include我就不多说了,如果你连这个都看不懂,只能先去补习补习c语言了。 #defineLCMDXBYTE0xAf00和#defineLCMCXBYTE0xAb00两句是用来定义外部总线接口地址的。0xAf00用来传递数据,0xAb00用来传递命令,之前说过,是传输命令还是数据主要是取决于A10的,上面两个地址对应的A10其实就是0xaf00-A10=1,0xab00-A10=0。照电子白菜大虾的话说,地址的取值只要确保在A000AFFF之间就可以了,所

10、以以下定义一样能正确驱动LCD: #defineLCMDXBYTE0xA400/液晶数据口 #defineLCMCXBYTE0xA000/液晶命令口 虽然地址不同了,但对A10的作用依然不变。 接下来的两句则是用LCD_DOT_X来表示lcd的宽点数,LCD_DOT_Y表示高点数。想象坐标轴,呵呵,是不是好理解了?这就说明我们现在用的lcd是LCD_DOT_X宽LCD_DOT_Y高的。 最后两句则是告诉我们,这个lcd可以显示5行,每行11个字符。这些参数都是可以根据lcd不同而变化的。 /* structcursortype ucharx; uchary; ; structcursortyp

11、ecursor; voidwridata(ucharch) LCMD=ch; voidwricmd(ucharch) LCMC=ch; */ 这几句也都属于初始化步骤。首先structcursortype这个结构体是用来定义光标的,光标在屏幕上当然可以用x和y两个值表示,这样我们到时候用cursor.x或者cursor.y确定光标位置就方便多了。 Wridata和wricmd两个函数则是写数据和写命令功能。仔细看,LCMD就是液晶数据口,LCMC就是液晶命令口,我们对他们进行的操作实际上就是对0xAf00或0xA000地址进行操作。例如我们用wridata(0x33),也就是说我们把0x33这

12、个数据通过0xAf00这个外部总线接口地址送到SSD181X中。由于是0xAf00的地址,A10必然为1,控制器就知道此时你要传递的是数据拉怎么样?很方便吧。 voidlight(ucharn) LCMC=0x81; LCMC=n; 把这个程序单独列出来是因为想讲讲程序如何传递能够作用的有效参数。首先这是一个调节lcd亮度(其实更加严格得说是对比度)的函数。我们看到他用的LCMC,说明此时我们是发送程序给lcd,让他知道我们要调整亮度了。那么究竟传递什么东西,控制器才能知道我们的意图呢?不用担心,pdf上会告诉你按什么格式发送指令给控制器才有效。这是SSD181Xpdf上面的格式之一: 为了方

13、便我只截取其中一个功能设置来进行说明。最左边的数字表示你发送的命令必须是这样的格式,中间的英文表示该格式命令所起的作用,右边的文字表示这些XXXX,也就是不确定数字的值该如何选取才能获得我们想要的效果。 就以这个方框为例吧,首先我们看中间这个小方框,它告诉我们这条指令的作用是设置对比度寄存器,也就是说我们可以通过对该寄存器的修改来实现调节对比度得调整。那么具体如何调整呢?我们再来看看最左边的方框,这个内容告诉我们,我们需要用LCMC发送两个字节数据,其中一个字节是固定的10000001就是0x81,第二个字节则是自己决定。怎么决定呢?再看看第三个小方框吧。如果你e文好,马上就能看懂它的意思。如

14、果你e文不好嘿嘿,建议金山词霸!(倒,谁扔的香蕉皮?!) 这里的意思就是说,对比度分为64个等级,这样XXXXXX6位二进制数就可以表示完,那么我们需要用哪个等级就设置哪个数,比如现在我们需要等级n的对比度,因此程序中出现了LCMC=n。这个n哪里来的?voidlight(ucharn),嘿嘿,主函数传递进来的。 呵呵,现在明白命令是怎么传送的了吧?一会儿还有例子,如果不明白不要慌张。 (三)环境影响评价的原则建设项目所处环境的敏感性质和敏感程度是确定建设项目环境影响评价类别的重要依据,环境影响评价文件应当就该项目对环境的影响做重点分析。/* voidcls(ucharch) uchari,j

15、; for(j=0x0;j wricmd(0xb0+j);/setpage/1011xxxx wricmd(0x10);/setcolumnmsb wricmd(0x0);/setcolumnlsb wricmd(0xe0);/setmodify-readmode for(i=0;i4); wricmd(0xe0); for(i=0;i4); wricmd(0xe0); for(;i16;i+)/写下半个字符 wridata(hzdatai); wricmd(0xee); */ 要理解这段程序,必须先知道点阵表示的含义。我们知道,字母和汉字是按字模位信息显示的,那如何得到汉字的字模信息呢?难道

16、要我们自己去做?NO。DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的,前一个16表示列,后一个十六表示行。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。 这段程序是用来在当前光标位置显示一个612点阵的ASC码字符的。其实标准的ASC码字符应该是816点阵区域表示,这也就是为什么我们常说“一个汉字占据两个字符位”的原因。Ch表示的是asc字符的值。首先说明一点,一个ASC字符分两部分显示,也就是说,把分

17、为上下两个“半ASC码字符”。汉字同样应该如此显示。当然这只是我们目前介绍的这个lcd的特性。如果你使用的是别的种类,千万不要生搬硬套,一定要仔细阅读说明书。 再回头看程序。首先就是一堆定义,无符号整形数addr表示的是点阵在flash中的物理位置,表示ASC码字符1的字符点阵占据的物理位置是015。为什么?你看,16*8点阵区域,一个点用1bit表示,0就是灭,1就是亮,那么总共128bit,是不是就是16byte?同理,字符2是1630,以此类推。所以addr=16*ch。比如我传递进来的ch是4,则addr为64。而hzdata这个数组是用来存储读出的数据的。Xdot表示的是横向点位置,在下面我们可以知道它的计算公式是cursor.x*8,就是光标横坐标值乘以8。由于之前我们将光标设置在左上角,所以cursor.x为0,因此此时横向点位置也为0。如果我们已经显示了一个ASC字符,此时的cursor.x就应该为1,那么xdot就应该为8:这应该很好理解,从点阵区域的大小我们可以知道一个ASC码字符从横坐标上看占用的是8个点(07),下一个ASC码字符当然应该从8开始拉。 接下来是readeprom(addr,hzdata,16)这个函数。什么意思呢?由于它是属于另外一个.c文件,

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2