LCD12864原理与应用(源程序+原理图+proteus仿真).pdf

上传人:l*** 文档编号:74133911 上传时间:2023-02-24 格式:PDF 页数:15 大小:649.50KB
返回 下载 相关 举报
LCD12864原理与应用(源程序+原理图+proteus仿真).pdf_第1页
第1页 / 共15页
LCD12864原理与应用(源程序+原理图+proteus仿真).pdf_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《LCD12864原理与应用(源程序+原理图+proteus仿真).pdf》由会员分享,可在线阅读,更多相关《LCD12864原理与应用(源程序+原理图+proteus仿真).pdf(15页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、LCD12864 原理与应用 1、LCD12864 简介:LCD12864 分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示 GB2312 字体,当然也可以显示其他的字体,不过是用图片的形式显示。下面介绍不带字库的 LCD12864,以 Proteus 中的 AMPIRE12864 为例,如下图所示,它的液晶驱动器为 KS0108。引脚功能:引脚符号 状态 引脚名称#功能 CS1,CS2 输入 芯片片选端,都是低电平有效 CS1=0 开左屏幕,CS1=1 关左屏幕 CS2=0 开右屏幕,CS2=1 关右屏幕 RS 输入。数据/命令选择

2、信号 RS=1为数据操作,RS=0 为写指令或读状态 RW 输入 读写选择信号 R/W=1 为读选通,R/W=0 为写选通 E/输入 读写使能信号 在 E 下降沿,数据被锁存(写)入液晶,在 E高电平期间,数据被读出 DB0DB7 三态 数据总线 数据或指令的传送通道 。RST 输入 复位信号,低电平时复位 复位时,关闭液晶显示,使显示起始行为 0,可以跟单片机的复位引脚 RST 相连,也可以直接接 VCC,使之不起作用 V0#液晶显示器驱动电压-Vout-10V LCD 驱动负电压 与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制 64*64 个点,分为左右两个屏幕显示,总共

3、为 128*64 个点(即有 12864 个点)。这就是为什么AMPIRE128*64 有 CS1 和 CS2 两个片选端的原因。此液晶有 8 页,一页有 8 行点阵点,左右各 64 列,共 128 列。如下图所示:2、LCD12864 中的几条重要指令】(一)行(line)设置命令:由此可见显示的起始行地址为 0XC0,共 64 行,有规律地改变起始行号,可以实现滚屏效果。(二)页(page)设置指令:起始页地址为 0XB8,因为液晶有 64 行点,分为 8 页,每页就有 8 行点。(三)列(column)地址设置指令 !每块驱动器的列地址都是从 0X40 到 0X7F,共 64 列,所以此

4、液晶共有 128 列点。(四)读状态指令 !3、用 LCD12864 显示汉字(一)由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址,LCD1602 显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在下载到关于字模提取原理文档)字体选择默认的“宋体,常规,小四号”,小四号为 16*16 大小,如下图所示:LCD12864 与单片机的连接如下图所示:C 程序如下:#include#include#defi

5、ne uchar unsigned char#define uint unsigned int/下面是“欢迎访问伊人憔悴百度空间”点阵数据,一个汉字有32 字节数据组成 unsigned char code huan=/欢,0 x04,0 x24,0 x44,0 x84,0 x64,0 x9C,0 x40,0 x30,0 x0F,0 xC8,0 x08,0 x08,0 x28,0 x18,0 x00,0 x00,0 x10,0 x08,0 x06,0 x01,0 x82,0 x4C,0 x20,0 x18,0 x06,0 x01,0 x06,0 x18,0 x20,0 x40,0 x80,0

6、x00 ;unsigned char code ying=/迎 0 x40,0 x40,0 x42,0 xCC,0 x00,0 x00,0 xFC,0 x04,0 x02,0 x00,0 xFC,0 x04,0 x04,0 xFC,0 x00,0 x00,0 x00,0 x40,0 x20,0 x1F,0 x20,0 x40,0 x4F,0 x44,0 x42,0 x40,0 x7F,0 x42,0 x44,0 x43,0 x40,0 x00!;unsigned char code fang=/访 0 x40,0 x40,0 x42,0 xCC,0 x00,0 x08,0 x08,0 xF8,

7、0 x89,0 x8E,0 x88,0 x88,0 x88,0 x08,0 x08,0 x00,0 x00,0 x00,0 x00,0 x3F,0 x90,0 x48,0 x30,0 x0F,0 x00,0 x40,0 x80,0 x40,0 x3F,0 x00,0 x00,0 x00 ;unsigned char code wen=/问 0 x00,0 xF8,0 x01,0 x02,0 x00,0 xE2,0 x22,0 x22,0 x22,0 xE2,0 x02,0 x02,0 x02,0 xFE,0 x00,0 x00,0 x00,0 xFF,0 x00,0 x00,0 x00,0 x

8、1F,0 x08,0 x08,0 x08,0 x1F,0 x00,0 x40,0 x80,0 x7F,0 x00,0 x00 ;unsigned char code yi=/伊 0 x00,0 x80,0 x60,0 xF8,0 x07,0 x20,0 x22,0 x22,0 xFE,0 x22,0 x22,0 x22,0 xFE,0 x20,0 x20,0 x00,0 x01,0 x00,0 x00,0 xFF,0 x00,0 x80,0 x42,0 x32,0 x0F,0 x02,0 x02,0 x02,0 x07,0 x00,0 x00,0 x00 ;?unsigned char cod

9、e ren=/人 0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 xC0,0 x3F,0 xC0,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x00,0 x80,0 x40,0 x20,0 x10,0 x0C,0 x03,0 x00,0 x00,0 x00,0 x03,0 x0C,0 x10,0 x20,0 x40,0 x80,0 x00 ;unsigned char code qiao=/憔 0 xE0,0 x00,0 xFF,0 x10,0 x20,0 x10,0 xFC,0 x27,0 x24,0 x25,0 xFE,0 x24

10、,0 x24,0 x24,0 x04,0 x00,0 x01,0 x00,0 xFF,0 x00,0 x80,0 x60,0 x1F,0 x29,0 xC9,0 x09,0 x2F,0 xC9,0 x09,0 x29,0 xC8,0 x00;unsigned char code cui=/悴 0 x80,0 x70,0 x00,0 xFF,0 x08,0 x90,0 x44,0 x34,0 x45,0 x86,0 x44,0 x34,0 x44,0 x84,0 x00,0 x00,0 x00,0 x00,0 x00,0 xFF,0 x00,0 x04,0 x04,0 x04,0 x04,0 x

11、FE,0 x04,0 x04,0 x04,0 x04,0 x04,0 x00 ;unsigned char code bai=/百 0 x02,0 x02,0 xE2,0 x22,0 x22,0 x32,0 x2A,0 x26,0 x22,0 x22,0 x22,0 x22,0 xE2,0 x02,0 x02,0 x00,0 x00,0 x00,0 xFF,0 x42,0 x42,0 x42,0 x42,0 x42,0 x42,0 x42,0 x42,0 x42,0 xFF,0 x00,0 x00,0 x00 ;unsigned char code du=/度 0 x00,0 x00,0 xF

12、C,0 x24,0 x24,0 x24,0 xFC,0 x25,0 x26,0 x24,0 xFC,0 x24,0 x24,0 x24,0 x04,0 x00,0 x40,0 x30,0 x8F,0 x80,0 x84,0 x4C,0 x55,0 x25,0 x25,0 x25,0 x55,0 x4C,0 x80,0 x80,0 x80,0 x00*;unsigned char code kong=/空 0 x10,0 x0C,0 x44,0 x24,0 x14,0 x04,0 x05,0 x06,0 x04,0 x04,0 x14,0 x24,0 x44,0 x14,0 x0C,0 x00,

13、0 x00,0 x40,0 x40,0 x41,0 x41,0 x41,0 x41,0 x7F,0 x41,0 x41,0 x41,0 x41,0 x40,0 x40,0 x00,0 x00 ;unsigned char code jian=/间 ;0 x00,0 xF8,0 x01,0 x06,0 x00,0 xF0,0 x12,0 x12,0 x12,0 xF2,0 x02,0 x02,0 x02,0 xFE,0 x00,0 x00,0 x00,0 xFF,0 x00,0 x00,0 x00,0 x1F,0 x11,0 x11,0 x11,0 x1F,0 x00,0 x40,0 x80,0

14、 x7F,0 x00,0 x00 ;sbit CS1=P20;/片选 1,低电平有效,CS1=0 开左屏幕,CS1=1 关左屏幕 sbit CS2=P21;/片选 2,低电平有效,CS2=0 开右屏幕,CS2=1 关右屏幕 sbit RS=P22;/数据,指令选择信号,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结

15、果为真则一直执行空操作,也就是说 P0&0X80 为 0 则结束循环 EN=0;void wcmd(uchar cmd)busy();/每次写入指令或数据之前都进行忙检测 RS=0;RW=0;P0=cmd;EN=1;_nop_();_nop_();/在 EN 下降沿写入数据和指令 EN=0;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)/设置页,12

16、864LCD 共有 8 页,每页有 8 行点阵点。page=0 xb8|page;/首页地址为 0XB8 wcmd(page);/page 取值范围为 07,表示第 1 到 8 页 void set_line(uchar line)/设置显示的起始行,共有 063 行,一般从 0 行开始显示 line=0 xc0|line;/起始行地址 0XC0 wcmd(line);/line 取值范围为 063,表示第 1 到 64 行 ;void set_column(uchar column)/设置显示的列/column=column&0 x3f;/列的最大值为 0X3F,即 64 column=0

17、x40|column;/列的首地址为 0X40,wcmd(column);/column的取值范围为 063,共 64 列 void set_onoff(uchar onoff)/设置显示开关,onoff 取值为 0 或 1 onoff|=0 x3e;/0X3E 是关显示,0X3F 是开显示 wcmd(onoff);/所以若 onoff 为 0,则表示关显示,onoff 为 1,则表示开显示 void select_screen(uchar screen)/选屏,screen 取值范围为 0,1,2 switch(screen)case 0:CS1=0;CS2=0;break;/全屏 case

18、 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);/设置列,每页都从第 1 列开始,共 64 列 for(j=0;j64;j+)/控制列数 063,共 64 列【wdata(0 x00);/写入 0,列地址指针会自动加 1 void init()

19、/LCD 初始化 busy();/忙检测 select_screen(0);/选屏,全屏 set_onoff(0);/关显示 select_screen(0);/选屏,全屏!set_onoff(1);/开显示 select_screen(0);/选屏,全屏 clear_screen(0);/清屏 set_line(0);/起始行:0 void show(uchar screen,uchar page,uchar column,uchar*p)/显示一个汉字,一个汉字有 32 字节数据 uchar i;/screen 表示选择屏幕,page 表示页,column 表示列,*p 表示汉字的数组 s

20、elect_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()init();/LCD 初始化 clear_screen(0);/清屏 set_line(0);/显示开始行/1 表示左屏显示,0 表示从

21、 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 页开始显示/0*16 表示从第 0 列开始显示(即第一个汉字的位置)s

22、how(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);/空 show(2,2,3*

23、16,jian);/间 while(1);4、用 LCD12864 显示汉字(二)电路图如下图所示:C 程序如下:#include#include#define uchar unsigned char#define uint unsigned int#define screen_on 0 x3f /设置屏幕开关显示,0 x3f 表示开显示#define screen_off 0 x3e /0 x3e 表示关显示#define line 0 xC0 /首行地址为 0XC0)#define page 0 xb8 /首页地址为 0XB8#define col 0 x40 /首列地址为 0X40 sb

24、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 -*/0 x00,0 x08,0 x88,0 x48,0 x28,0 x18,0 x0F,0 xE8,0 x08,0 x08,0 x08,0 x08,0 x08,0 x08,0 x00,0 x00,0 x0

25、0,0 x20,0 x11,0 x09,0 x05,0 x41,0 x81,0 x7F,0 x01,0 x01,0 x05,0 x09,0 x11,0 x20,0 x00,0 x00;uchar code hua=/*-文字:华 -*/*-宋体 12;此字体下对应的点阵为:宽 x 高=16x16 -*/0 x20,0 x10,0 x08,0 xFC,0 x03,0 x20,0 x20,0 x10,0 x7F,0 x88,0 x88,0 x84,0 x82,0 xE0,0 x00,0 x00,0 x04,0 x04,0 x04,0 x05,0 x04,0 x04,0 x04,0 xFF,0 x0

26、4,0 x04,0 x04,0 x04,0 x04,0 x04,0 x04,0 x00;uchar code li=/*-文字:理 -*/*-宋体 12;此字体下对应的点阵为:宽 x 高=16x16 -*/0 x04,0 x84,0 x84,0 xFC,0 x84,0 x84,0 x00,0 xFE,0 x92,0 x92,0 xFE,0 x92,0 x92,0 xFE,0 x00,0 x00,0 x20,0 x60,0 x20,0 x1F,0 x10,0 x10,0 x40,0 x44,0 x44,0 x44,0 x7F,0 x44,0 x44,0 x44,0 x40,0 x00;uchar

27、 code gong=/*-文字:工 -*/*-宋体 12;此字体下对应的点阵为:宽 x 高=16x16 -*/0 x00,0 x04,0 x04,0 x04,0 x04,0 x04,0 x04,0 xFC,0 x04,0 x04,0 x04,0 x04,0 x04,0 x04,0 x00,0 x00,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x3F,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x00;*uchar code da=/*-文字:大 -*/*-宋体 12;此字体下对应的点阵为:宽 x 高=1

28、6x16 -*/0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 xFF,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x20,0 x00,0 x80,0 x80,0 x40,0 x20,0 x10,0 x0C,0 x03,0 x00,0 x03,0 x0C,0 x10,0 x20,0 x40,0 x80,0 x80,0 x00;uchar code xue=/*-文字:学 -*/*-宋体 12;此字体下对应的点阵为:宽 x 高=16x16 -*/0 x40,0 x30,0 x11,0 x96,0 x90,0 x90,0 x9

29、1,0 x96,0 x90,0 x90,0 x98,0 x14,0 x13,0 x50,0 x30,0 x00,0 x04,0 x04,0 x04,0 x04,0 x04,0 x44,0 x84,0 x7E,0 x06,0 x05,0 x04,0 x04,0 x04,0 x04,0 x04,0 x00;void busy()/状态检查,LCD 是否忙 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

30、_();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()/初始化 LCD)delay(100);CS1=1;/刚开始关闭两屏 CS2=1;delay(100);wcmd(screen_off);/关屏幕显示,0X3E 表示关显示,0X3F 表示开显示 wcmd(page);/设置页地址,首页地址为 0XB8 wcmd(line);/设置行地址,共有 64 行,首行地址为 0

31、XC0 wcmd(col);/设置列地址,半屏共有 64 列,首列地址为 0X40 wcmd(screen_on);/设置屏幕开显示 void clr()/清除 LCD 内存程序 uchar j,i;CS1=0;/左、右屏均开显示 CS2=0;for(i=0;i8;i+)/控制页数 0-7,共 8 页 wcmd(page+i);/每页每页进行写 wcmd(col);/控制列数 0-63,共 64 列,列地址会自动加 1 for(j=0;j64;j+)/整屏最多可写 32 个中文文字或 64 个 ASCII 字符 wdata(0 x00);/*函数功能:指定位置显示汉字 16*16 程序 p 代

32、表页,colum 表示列,*hzk 表示汉字点阵数据,是一维数组*/void show(uchar p,uchar column,uchar code*hzk)uchar i,j;for(i=0;i2;i+)/写一个汉字需要 2 页 wcmd(page+p+i);/首页地址为 0 xb8 wcmd(col+column);/首列地址为 0X40,列地址会自动加 1,两页对应相同的列 for(j=0;j16;j+)wdata(hzk16*i+j);/j=0 表示第 0 行的数据,j=1 表示第 1 行的数据 void main()init();/初始化 LCD clr();/清除 LCD 内存程

33、序 CS1=0;/左屏开显示 CS2=1;/右屏关显示 show(0,1*16,dong);/显示“东”,从第 0 页,第 16 列(即左屏第 2 个汉字位置)开始显示 show(0,2*16,hua);/显示“华 show(0,3*16,li);/显示”理“CS1=1;/左屏关显示 CS2=0;/右屏开显示 show(0,0*16,gong);/显示”工“,从第 0 页,第 0 列(即右屏第 1 个汉字位置)开始显示 show(0,1*16,da);/显示”大“show(0,2*16,xue);/显示”学“while(1);5、百度空间 上述 zimo21 软件,proteus 原理图及源程序下载地址:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁