您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > LCD12864液晶的使用
大海橡树百度空间液晶的使用大海橡树原创LCD12864分为两种,带字库和不带字库的,个人比较喜欢不带字库的,因为显示汉字的时候可以选择自己喜欢的字体,而带字库的液晶,只能显示GB2312的宋体,当然了,也可以显示其他的字体,不过不是液晶本身字库中带的了,而是用图片的形式显示。本讲由于内容较多,故分两篇进行讲解,本人水平有限,难免有错误之处,还望大家批评改正!�无字库型LCD12864首先介绍下不带字库的LCD12864,现就以Proteus中的LCD12864为例进行讲解,Proteus中AMPIRE128*64,如下图所示,该液晶驱动器为KS0108,我在网上搜了好就都没找到它的datasheet,不过我们可以找到类似的芯片的手册,它的控制逻辑和HD61202是类似的,我们可以网上下载它的datasheet进行参考。引脚功能:CS11CS22GND3VCC4V05RS6R/W7E8DB09DB110DB211DB312DB413DB514DB615DB716RST17-Vout18LCD1AMPIRE128X64大海橡树百度空间与带字库液晶不同,此块液晶中含有两个液晶驱动器,一块驱动器控制64*64个点,左右显示,这就是为什么AMPIRE128*64引脚有CS1和CS2的原因。学习液晶主要看的它的指令系统,再次先说明一下“页”的概念,此液晶有8页,一页有8行。68/8=8;如下图所示。再介绍一下其他的几个重要指令:指令一、行设置命令RWRSDB7DB6DB5DB4DB3DB2DB1DB00011XXXXXX由此可见其显示的其实行为0xC0,有规律的改变起始行号,可以实现滚屏的效果指令二、页(page)设置指令RWRSDB7DB6DB5DB4DB3DB2DB1DB00010111XXX起始页为0xB8显示的RAM共64行,分为8页,每页有8行,刚才在上面已经讲过。指令三、列(Yaddress)地址设置指令RWRSDB7DB6DB5DB4DB3DB2DB1DB00001XXXXXX第一列为0x40一直到0x7F共64列,因为此液晶有128列,所以有两块驱动芯片驱动。指令四、读状态指令RWRSDB7DB6DB5DB4DB3DB2DB1DB010Busy0ON/OFFRESET0000Busy:为1内部忙,不能对液晶进行操作。0--工作正常。ON/OFF:1------显示关闭;0------显示打开RESET:1-----复位状态;0------正常。说明在Busy和RESET状态时,除读状态指令外,其他任何指令均不会对驱动器产生作用。其他的读数据和写数据和LCD1602是一样的,由于篇幅有限这里就不赘述了。不懂的可以参看下液晶手册。另外要说明的就是CS1和CS2的作用(两者都是低电平有效)大海橡树百度空间和CS2CS2CS2CS2的屏幕选择说明CS1CS1CS1CS1CS2CS2CS2CS2选屏00000000全屏00001111左半屏11110000右半屏11111111不选注:CS1CS1CS1CS1和CS2CS2CS2CS2均为低电平有效一、显示汉字由于这块液晶补带字库我们就要自己编写字库,编写字库的软件还是Zimo21,LCD1602显示自定义字符的时候用的也是它。不过在取模之前我们要进行一些设定,根据此液晶显示显示的原理,设置如下:(若不是这样,取模的数据将不是我们想要的,将会出现乱码!)在此我选择楷体小四号字体,效果如下图所示:(小四号字体大小为16*16大小)大海橡树百度空间下面是程序代码:/**********程序:LCD12664液晶显示原理内容:显示汉字学习板:Proteus仿真图液晶:AMPIRE128X64(无字库)软件:keiluVision3作者:大海橡树整理日期:2010-12-02**********/#includeAT89X52.h#includeintrins.h#includeZK.h//中文字库#defineucharunsignedchar#defineuintunsignedint#defineLCD_databusP0//LCD8位数据口ucharnum;sbitRS=P2^2;//RS为0命令;1数据sbitRW=P2^1;//RW为1--写;0--读sbitEN=P2^0;//使能端sbitCS1=P2^4;//片选1低电平有效,控制左半屏sbitCS2=P2^3;//片选1低电平有效,控制右半屏voiddelay(uinti){while(--i);}voidRead_busy()//读“忙”函数-----数据线的最高位DB71则busy{P0=0x00;RS=0;RW=1;EN=1;while(P0&0x80);EN=0;}voidwrite_LCD_command(ucharvalue){Read_busy();//每次读写都要忙判断RS=0;//选择命令RW=0;//读操作LCD_databus=value;EN=1;//EN由1----0锁存有效数据_nop_();_nop_();EN=0;}voidwrite_LCD_data(ucharvalue)//写数据函数{Read_busy();RS=1;//选择数据RW=0;LCD_databus=value;EN=1;//EN由1----0锁存有效数据_nop_();_nop_();EN=0;}voidSet_page(ucharpage)//设置“页”LCD12864共8页,一页是8行点阵点{page=0xb8|page;//页的首地址为0xB8write_LCD_command(page);}voidSet_line(ucharstartline)//设置显示的起始行{startline=0xC0|startline;//起始行地址为0xC0write_LCD_command(startline);//设置从哪行开始:共0--63;一般从0行开始显示}voidSet_column(ucharcolumn)//设置显示的列{column=column&0x3f;//列的最大值为64column=0x40|column;//列的首地大海橡树百度空间址为0x40write_LCD_command(column);//列位置}voidSetOnOff(ucharonoff)//显示开关函数:0x3E是关显示,0x3F是开显示{onoff=0x3e|onoff;//0011111x,onoff只能为0或者1write_LCD_command(onoff);}voidSelectScreen(ucharscreen)//选屏{switch(screen){case0:CS1=0;CS2=0;break;//全屏case1:CS1=0;CS2=1;break;//左半屏case2:CS1=1;CS2=0;break;//右半屏default:break;}}voidClearScreen(ucharscreen)//清屏{uchari,j;SelectScreen(screen);for(i=0;i8;i++)//控制页数0-7,共8页{Set_page(i);Set_column(0);for(j=0;j64;j++)//控制列数0-63,共64列{write_LCD_data(0x00);//写入0,地址指针自加1}}}voidInitLCD()//LCD的初始化{Read_busy();SelectScreen(0);SetOnOff(0);//关显示SelectScreen(0);SetOnOff(1);//开显示SelectScreen(0);ClearScreen(0);//清屏Set_line(0);//开始行:0}voidDisplay(ucharss,ucharpage,ucharcolumn,uchar*p)//显示汉字{uchari;SelectScreen(ss);Set_page(page);//写上半页Set_column(column);//控制列for(i=0;i16;i++)//控制16列的数据输出{write_LCD_data(p[i]);//汉字的上半部分}Set_page(page+1);//写下半页Set_column(column);//控制列for(i=0;i16;i++)//控制16列的数据输出{write_LCD_data(p[i+16]);//汉字的下半部分}}voidmain(){InitLCD();//初始化ClearScreen(0);//清屏Set_line(0);//显示开始行Display(1,0,2*16,huan);//欢Display(1,0,3*16,ying);//迎Display(2,0,0*16,fang);//访Display(2,0,1*16,wen);//问Display(1,2,0*16,da);//大Display(1,2,1*16,hai);//海Display(1,2,2*16,xiang);//橡Display(1,2,3*16,shu);//树Display(2,2,0*16,bai);//百Display(2,2,1*16,du);//度Display(2,2,2*16,kong);//空Display(2,2,3*16,jian);//间While(1);}大海橡树百度空间}上面说了,我们可以通过改变页的地址的变化实现LCD滚屏的效果,大家可以试一下,很简单!如果单片机容量够的话,可以做个电子书,呵呵!显示汉字部分就介绍到这里,那么显示汉字会了,显示一张图片就简单了!接下来介绍怎样显示图片!二、显示图片显示图片和显示汉字的原理是一样的,只不过是大小的问题!现在我们就以一张128*64分辨率的图片进行取模。取模图片:现在我们主要看一下显示图片的函数:大海橡树百度空间(uchara[][64])//显示图形的左边部分{uchari,j;for(j=0;j8;j++){SelectScreen(1);Set_page(j);Set_column(0);for(i=0;i64;i++)//显示左屏{write_LCD_data(a[2*j][i]);//每隔一行取一次数组中的数据}SelectScreen(2);Set_page(j);Set_column(0);for(i=0;i64;i++)//显示右屏{write_LCD_data(a[2*j+1][i]);//每隔一行取一次数组中的数据}}}取出图片的数据是二维数组形式!注意,液晶是先显示左半屏,再显示右半屏,但是取数组中的元素是逐个往下取出的,所以是对于一个半屏而言,每隔一行取数组中的元素,而隔去的那一行是另一个半屏要取的数据!这一点一定要注意。还有一点要补充的就是,这个取模软件只能识别BMP和ICO格式的单色图片,如果我们选择的图片不是128*64大小的话,可以通过软件将其改成128*64大小的,如果我们直接用软件取模的话,显示的会是乱码,解决办法是我们可以通过windows自带的画图工具,什么也不做修改,将大小设置好的图片另存为BMP单色文件就行了,然后再用取模软件取模就OK了,=^_^=!算了,给大家截个图大海橡树百度空间如果大家不想这么麻
本文标题:LCD12864液晶的使用
链接地址:https://www.777doc.com/doc-5008357 .html