LCD12864原理与应用(源程序+原理图+proteus仿真)_第1页
LCD12864原理与应用(源程序+原理图+proteus仿真)_第2页
LCD12864原理与应用(源程序+原理图+proteus仿真)_第3页
LCD12864原理与应用(源程序+原理图+proteus仿真)_第4页
LCD12864原理与应用(源程序+原理图+proteus仿真)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.lcd12864原理与应用 1、lcd12864简介: lcd12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示gb2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。 下面介绍不带字库的lcd12864,以proteus中的ampire12864为例,如下图所示,它的液晶驱动器为ks0108。引脚功能:引脚符号状态引脚名称功能cs1,cs2输入芯片片选端,都是低电平有效cs1=0开左屏幕,cs1=1关左屏幕cs2=0开右屏幕,cs2=1关右屏幕rs输入数据/命令选择信号rs=1为数据操作,rs=0为写指令或读状

2、态rw输入读写选择信号r/w=1为读选通,r/w=0为写选通e输入读写使能信号在e下降沿,数据被锁存(写)入液晶,在e高电平期间,数据被读出 db0db7三态数据总线数据或指令的传送通道rst输入复位信号,低电平时复位复位时,关闭液晶显示,使显示起始行为0,可以跟单片机的复位引脚rst相连,也可以直接接vcc,使之不起作用v0液晶显示器驱动电压-vout-10vlcd驱动负电压 与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有12864个点)。这就是为什么ampire128*64有cs1和cs2两个片选端的原因。

3、此液晶有8页,一页有8行点阵点,左右各64列,共128列。如下图所示:精品.2、lcd12864中的几条重要指令(一)行(line)设置命令:由此可见显示的起始行地址为0xc0,共64行,有规律地改变起始行号,可以实现滚屏效果。(二)页(page)设置指令:起始页地址为0xb8,因为液晶有64行点,分为8页,每页就有8行点。(三)列(column)地址设置指令每块驱动器的列地址都是从0x40到0x7f,共64列,所以此液晶共有128列点。(四)读状态指令精品.3、用lcd12864显示汉字(一) 由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为zimo21(软件下载地址

4、/),lcd1602显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在/下载到关于字模提取原理文档)字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示:精品.lcd12864与单片机的连接如下图所示:精品.c程序如下:#include#include#define uchar unsigned char#define u

5、int unsigned int/下面是“欢迎访问伊人憔悴百度空间”点阵数据,一个汉字有32字节数据组成unsigned char code huan= / 欢0x04,0x24,0x44,0x84,0x64,0x9c,0x40,0x30,0x0f,0xc8,0x08,0x08,0x28,0x18,0x00,0x00,0x10,0x08,0x06,0x01,0x82,0x4c,0x20,0x18,0x06,0x01,0x06,0x18,0x20,0x40,0x80,0x00;unsigned char code ying= /迎0x40,0x40,0x42,0xcc,0x00,0x00,0xf

6、c,0x04,0x02,0x00,0xfc,0x04,0x04,0xfc,0x00,0x00,精品.0x00,0x40,0x20,0x1f,0x20,0x40,0x4f,0x44,0x42,0x40,0x7f,0x42,0x44,0x43,0x40,0x00;unsigned char code fang= /访0x40,0x40,0x42,0xcc,0x00,0x08,0x08,0xf8,0x89,0x8e,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x00,0x00,0x3f,0x90,0x48,0x30,0x0f,0x00,0x40,0x80,0x40,0x3

7、f,0x00,0x00,0x00;unsigned char code wen= /问0x00,0xf8,0x01,0x02,0x00,0xe2,0x22,0x22,0x22,0xe2,0x02,0x02,0x02,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x1f,0x08,0x08,0x08,0x1f,0x00,0x40,0x80,0x7f,0x00,0x00;unsigned char code yi= /伊0x00,0x80,0x60,0xf8,0x07,0x20,0x22,0x22,0xfe,0x22,0x22,0x22,0xfe,0x20,0x

8、20,0x00,0x01,0x00,0x00,0xff,0x00,0x80,0x42,0x32,0x0f,0x02,0x02,0x02,0x07,0x00,0x00,0x00;unsigned char code ren= /人0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x3f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x10,0x0c,0x03,0x00,0x00,0x00,0x03,0x0c,0x10,0x20,0x40,0x80,0x00;unsigned char code qiao= /

9、憔0xe0,0x00,0xff,0x10,0x20,0x10,0xfc,0x27,0x24,0x25,0xfe,0x24,0x24,0x24,0x04,0x00,0x01,0x00,0xff,0x00,0x80,0x60,0x1f,0x29,0xc9,0x09,0x2f,0xc9,0x09,0x29,0xc8,0x00;unsigned char code cui= /悴0x80,0x70,0x00,0xff,0x08,0x90,0x44,0x34,0x45,0x86,0x44,0x34,0x44,0x84,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x04,0x0

10、4,0x04,0x04,0xfe,0x04,0x04,0x04,0x04,0x04,0x00;unsigned char code bai= /百0x02,0x02,0xe2,0x22,0x22,0x32,0x2a,0x26,0x22,0x22,0x22,0x22,0xe2,0x02,0x02,0x00,0x00,0x00,0xff,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xff,0x00,0x00,0x00;unsigned char code du= /度0x00,0x00,0xfc,0x24,0x24,0x24,0xfc,0x25,0x

11、26,0x24,0xfc,0x24,0x24,0x24,0x04,0x00,0x40,0x30,0x8f,0x80,0x84,0x4c,0x55,0x25,0x25,0x25,0x55,0x4c,0x80,0x80,0x80,0x00;unsigned char code kong= /空精品.0x10,0x0c,0x44,0x24,0x14,0x04,0x05,0x06,0x04,0x04,0x14,0x24,0x44,0x14,0x0c,0x00,0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x7f,0x41,0x41,0x41,0x41,0x40,0x40,0x

12、00,0x00;unsigned char code jian= /间0x00,0xf8,0x01,0x06,0x00,0xf0,0x12,0x12,0x12,0xf2,0x02,0x02,0x02,0xfe,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x1f,0x11,0x11,0x11,0x1f,0x00,0x40,0x80,0x7f,0x00,0x00;sbit cs1=p20;/片选1,低电平有效,cs1=0开左屏幕,cs1=1关左屏幕sbit cs2=p21;/片选2,低电平有效,cs2=0开右屏幕,cs2=1关右屏幕sbit rs=p22;/数据,指令选

13、择信号,rs=1为数据操作,rs=0为写指令或读状态(一般为读忙标志)sbit rw=p23;/读写选择信号,rw=1为读选通,rw=0为写选通sbit en=p24;/读写使能信号void busy()/忙检测函数p0=0x00; /这句不能少rs=0; rw=1;en=1;while(p0&0x80);/p0&0x80结果为真则一直执行空操作,也就是说p0&0x80为0则结束循环en=0;void wcmd(uchar cmd)busy(); /每次写入指令或数据之前都进行忙检测rs=0;rw=0;p0=cmd;en=1;_nop_();_nop_();/在en下降沿写入数据和指令en=0

14、;void wdata(uchar dat) /写命令和写数据只在rs=0或rs=1上不同,其余都相同busy();rs=1;rw=0;p0=dat;en=1;_nop_();_nop_();/在en下降沿写入数据和指令en=0;void set_page(uchar page)/设置页,12864lcd共有8页,每页有8行点阵点。page=0xb8|page; /首页地址为0xb8wcmd(page); /page取值范围为07,表示第1到8页void set_line(uchar line)/设置显示的起始行,共有063行,一般从0行开始显示line=0xc0|line; /起始行地址0x

15、c0wcmd(line);/line取值范围为063,表示第1到64行精品.void set_column(uchar column)/设置显示的列/column=column&0x3f; /列的最大值为0x3f,即64column=0x40|column; /列的首地址为0x40,wcmd(column); /column的取值范围为063,共64列void set_onoff(uchar onoff)/设置显示开关,onoff取值为0或1onoff|=0x3e;/0x3e是关显示,0x3f是开显示wcmd(onoff);/所以若onoff为0,则表示关显示,onoff为1,则表示开显示vo

16、id select_screen(uchar screen)/选屏,screen取值范围为0,1,2switch(screen)case 0:cs1=0;cs2=0;break; /全屏case 1:cs1=0;cs2=1;break; /左半屏case 2:cs1=1;cs2=0;break; /右半屏default:break;void clear_screen(uchar screen)/清屏uchar i,j;select_screen(screen);/先选屏for(i=0;i8;i+)/控制页数07,共8页set_page(i);/设置页set_column(0); /设置列,每页

17、都从第1列开始,共64列for(j=0;j64;j+)/控制列数063,共64列wdata(0x00);/写入0,列地址指针会自动加1 void init()/lcd初始化busy(); /忙检测select_screen(0);/选屏,全屏set_onoff(0);/关显示select_screen(0); /选屏,全屏set_onoff(1); /开显示select_screen(0); /选屏,全屏clear_screen(0); /清屏set_line(0); /起始行:0void show(uchar screen,uchar page,uchar column,uchar *p)/

18、显示一个汉字,一个汉字有32字节数据 uchar i;/screen表示选择屏幕,page表示页,column表示列,*p表示汉字的数组select_screen(screen); /选屏set_page(page); /设置页,写上半页set_column(column);/设置列for(i=0;i16;i+) /控制16列的数据输出精品.wdata(pi); /汉字的上半部分set_page(page+1); /写下半页set_column(column);/控制列for(i=0;i16;i+) /控制16列的数据输出wdata(pi+16); /汉字的下半部分void main()ini

19、t(); /lcd初始化clear_screen(0); /清屏set_line(0); /显示开始行/1表示左屏显示,0表示从0页开始显示。因为一页只有8行点,/而显示一个汉字需要16行点(整屏有64行点),所以显示一个汉字需要2页/第0页显示“欢”字的上半部分,第1页显示“欢”汉字的下半部分/2*16表示从第32列开始显示,前面空出031列(即2个字的位置)show(1,0,2*16,huan);/欢/1表示左屏显示,0表示从0页开始显示/3*16表示从第48列开始显示,前面空出0477列(即3个汉字的位置)show(1,0,3*16,ying);/迎/2表示右屏显示,0表示从0页开始显示

20、/0*16表示从第0列开始显示(即第一个汉字的位置)show(2,0,0*16,fang);/访/1*16表示从第16列开始显示,前面空出015列(即一个汉字的位置)show(2,0,1*16,wen); /问/左屏开,从第3页(共8页)第0列开始显示,即第3,4页显示”伊人憔悴百度空间“几个字show(1,2,0*16,yi); /伊show(1,2,1*16,ren); /人show(1,2,2*16,qiao); /憔show(1,2,3*16,cui); /悴show(2,2,0*16,bai); /百show(2,2,1*16,du); /度show(2,2,2*16,kong);

21、/空show(2,2,3*16,jian); /间while(1);4、用lcd12864显示汉字(二)电路图如下图所示:精品.c程序如下:#include #include#define uchar unsigned char#define uint unsigned int#define screen_on 0x3f /设置屏幕开关显示,0x3f表示开显示#define screen_off 0x3e /0x3e表示关显示#define line 0xc0 /首行地址为0xc0#define page 0xb8 /首页地址为0xb8#define col 0x40 /首列地址为0x40sb

22、it cs1=p20 ; /*片选1*/sbit cs2=p21 ; /*片选2*/sbit rs=p22 ; /*数据/指令 选择*/精品.sbit rw=p23 ; /*读/写 选择*/sbit en=p24 ; /*读/写 使能*/void delay(uint t) while(-t);uchar code dong= /*- 文字: 东 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x00,0x08,0x88,0x48,0x28,0x18,0x0f,0xe8,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x20

23、,0x11,0x09,0x05,0x41,0x81,0x7f,0x01,0x01,0x05,0x09,0x11,0x20,0x00,0x00;uchar code hua= /*- 文字: 华 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x20,0x10,0x08,0xfc,0x03,0x20,0x20,0x10,0x7f,0x88,0x88,0x84,0x82,0xe0,0x00,0x00,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0xff,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00;uchar c

24、ode li=/*- 文字: 理 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x04,0x84,0x84,0xfc,0x84,0x84,0x00,0xfe,0x92,0x92,0xfe,0x92,0x92,0xfe,0x00,0x00,0x20,0x60,0x20,0x1f,0x10,0x10,0x40,0x44,0x44,0x44,0x7f,0x44,0x44,0x44,0x40,0x00;uchar code gong=/*- 文字: 工 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x00,0x04,0x04,0x04,0x04,

25、0x04,0x04,0xfc,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x3f,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00;uchar code da=/*- 文字: 大 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xff,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x80,0x80,0x40,0x20,0x10,

26、0x0c,0x03,0x00,0x03,0x0c,0x10,0x20,0x40,0x80,0x80,0x00;uchar code xue=/*- 文字: 学 -*/*- 宋体12; 此字体下对应的点阵为:宽x高=16x16 -*/0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,精品.0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7e,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00;void busy()/状态检查,lcd是

27、否忙p0=0x00;rs=0;rw=1;en=1;while(p0&0x80);en=0; void wcmd(uchar cmd) /写命令函数 busy();/检测lcd是否忙rs=0;rw=0;p0=cmd;en=1;_nop_();_nop_();en=0;void wdata(uchar dat)/写数据函数与写命令函数只在rs=1或rs=0上不同,其余都相同 busy();/检测lcd是否忙rs=1;rw=0;p0=dat;en=1;_nop_();_nop_();en=0;void init()/初始化lcddelay(100);cs1=1;/刚开始关闭两屏cs2=1;delay(100);wcmd(screen_off);/关屏幕显示,0x3e表示关显示,0x3f表示开显示wcmd(page);/设置页地址,首页地址为0xb8wcmd(line);/设置行地址,共有64行,首行地址为0xc0wcmd(col); /设置列地址,半屏共有64列,首列地

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论