LCD12864原理与应用(源程序+原理图+proteus仿真)
廿四、ATmega16驱动12864液晶(LGM12641或AMPIRE128X64,KS0108驱动芯片)

/*********hanzi2b.h ******************************************************* 宋体,常规,小四,纵向取模,字节倒序 *************************************************************************/ //宋体,常规,小四,纵向取模,字节倒序 unsigned char hang1[]={ /*-- 文字: 中 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0x00,0xFC,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00, 0x00,0x00,0x07,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x07,0x00,0x00,0x00, /*-- 文字: 国 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x00,0xFE,0x02,0x0A,0x8A,0x8A,0x8A,0xFA,0x8A,0x8A,0x8A,0x0A,0x02,0xFE,0x00,0x00, 0x00,0xFF,0x40,0x48,0x48,0x48,0x48,0x4F,0x48,0x49,0x4E,0x48,0x40,0xFF,0x00,0x00, /*-- 文字: 重 --*/ /*-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 --*/ 0x08,0x08,0x0A,0xEA,0xAA,0xAA,0xAA,0xFF,0xA9,0xA9,0xA9,0xE9,0x08,0x08,0x08,0x00,
12864点阵型液晶显示屏的工作原理

12864点阵型液晶显示屏的工作原理12864点阵型液晶显示屏的基本原理与使用方法转自点阵LCD的显示原理在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。
对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。
而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。
而剩下的低128位则留给英文字符使用,即英文的内码。
那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:图1 “A”字模图而中文的“你”在字模中的记载却如图2所示:图2 “你”字模图12864点阵型LCD简介12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128×64全点阵液晶显示器组成。
可完成图形显示,也可以显示8×4个(16×16点阵)汉字。
管脚号管脚名称LEVER 管脚功能描述1 VSS 0 电源地2 VDD +5.0V 电源电压3 V0 - 液晶显示器驱动电压4 D/I(RS) H/L D/I=“H”,表示DB7∽DB0为显示数据D/I=“L”,表示DB7∽DB0为显示指令数据5 R/W H/L R/W=“H”,E=“H”数据被读到DB7∽DB0R/W=“L”,E=“H→L”数据被写到IR或DR 6 E H/L R/W=“L”,E信号下降沿锁存DB7∽DB0R/W=“H”,E=“H”DDRA M数据读到DB7∽DB07 DB0 H/L 数据线8 DB1 H/L 数据线9 DB2 H/L 数据线10 DB3 H/L 数据线11 DB4 H/L 数据线12 DB5 H/L 数据线13 DB6 H/L 数据线14 DB7 H/L 数据线15 CS1 H/L H:选择芯片(右半屏)信号16 CS2 H/L H:选择芯片(左半屏)信号17 RET H/L 复位信号,低电平复位18 VOUT -10V LCD驱动负电压19 LED+ - LED背光板电源20 LED- - LED背光板电源表1:12864LCD的引脚说明在使用12864LCD前先必须了解以下功能器件才能进行编程。
12864点阵型液晶显示屏的基本原理与使用方法(很详细)

0
0
1
1
1
0
0
1
1
X
X
X
0
0
1
0
1
1
1
0
0
0
1
X
X
X
1
0 BUSY 0 ON/OFF RST 0
0
1
写数据
1
1
读数据
DB2 1 X X X 0
DB1 1 X X X 0
DB0 1/0
X X X 0
表 2:12864LCD 指令表
各功能指令分别介绍如下。
显示开/关指令
R/WRS 00
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 00111111/0
设置了页地址和列地址,就唯一确定了显示 RAM 中的一个单元,这样 MPU 就可以
用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
R/WRS 10
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0 BUSY0ON/OFFREST0000
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
图 2 “你”字模图
12864 点阵型 LCD 简介
12864 是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及 128×64 全点阵液晶显示器组成。 可完成图形显示,也可以显示 8×4 个(16×16 点阵)汉字。
管脚号 1 2 3 4
管脚名称 VSS VDD V0
D/I(RS)
LEVER 0
12864LCD 的指令系统及时序
该类液晶显示模块(即 KS0108B 及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指 令表如表 2 所示:
AMPIRE12864在protues仿真中的应用(c语言)

这是我花了三天时间不断的用“黑盒法”试出来的调试结果,还发现这个程序在GDM12864,GXM12864)等LCD中均可以使用,因此我推断,对于大多数的128*64的LCD 这个程序应该都能使用,在protues中的仿真图一直上传不上来,请见谅,下面是程序:#include<reg51.h>#define uchar unsigned char#define lcd P1#include <reg51.h>sbit cs1 = P2^3; //换位了cs1和cs2sbit cs2 = P2^4;sbit rw = P2^1;sbit rs = P2^2;sbit e= P2^0;sbit busy=ACC^7; //按列取,且字符是倒着的,第二排是第一排的,uchar codehuan[32]={0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28, 0x18,0x08,0x00,0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20, 0x00};uchar codeying[32]={0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04, 0xFC,0x00,0x00,0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40, 0x00,};uchar codeguang[32]={0x00,0x40,0x42,0x44,0x5C,0xC8,0x40,0x7F,0x40,0xC0,0x50,0x4E,0x44 ,0x60,0x40,0x00,0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78, 0x00};uchar codelin[32]={0x00,0xF8,0x00,0x00,0xFE,0x40,0x30,0x8F,0x0A,0x08,0x18,0x68,0x08,0 x88,0x08,0x00,0x00,0x1F,0x00,0x00,0x7F,0x00,0x00,0x7F,0x21,0x21,0x3F,0x21,0x21,0x7F,0x01, 0x00};void lcd_mwcode(uchar i) //输入控制字,{rw=1;rs=0;lcd=0;e=1;do{ACC=lcd; //是否忙e=0; }while(busy);rw=0;lcd=i;e=1;e=0;}void lcd_mwdata(uchar i) //输入数据,{rw=1;rs=0;lcd=0;e=1;do{ACC=lcd;e=0;}while(busy);rw=0;rs=1;lcd=i;e=1;e=0;}void setpos(uchar row , uchar col){ //选择行,列, lcd_mwcode(0xb8+row);lcd_mwcode(0x40+col);}void lcd_init(void) //初始化{lcd_mwcode(0xc0);lcd_mwcode(0x3f);}void disp1(uchar code *hz) //显示汉字上半区,{uchar i;for(i=0;i<16;i++)lcd_mwdata(*(hz+i));}void disp2(uchar code *hz) //显示汉字下半区,{uchar i;for(i=16;i<32;i++)lcd_mwdata(*(hz+i));}void select(uchar x){ switch(x){ case 1:cs1=0;cs2=1;break; //左屏,case 2:cs1=1;cs2=0;break; //右屏,default :cs2=0;cs2=0;}}void main(){lcd_init(); //初始化select(1); //选择左屏setpos(0,16);disp1(&huan);disp1(&ying);setpos(1,16); //下一页disp2(&huan);disp2(&ying);select(2); //选择右屏setpos(2,5);disp1(&guang);disp1(&lin);setpos(3,5); //下一页disp2(&guang);disp2(&lin);}。
lcd12864的显示原理

lcd12864的显示原理
LCD12864是一种基于液晶技术的显示器件,具有128x64个像素点的显示区域。
它采用液晶分子在电场作用下改变排列方式从而实现显示的原理。
LCD12864由若干个液晶单元组成,每个液晶单元由两片平行的电极层之间夹着的液晶分子组成。
在电场作用下,液晶分子会改变排列方式,从而使光的传播方式发生改变。
在LCD12864的背光光源照射下,背光光束通过液晶单元后,会受到液晶分子排列的影响,进而改变光束的方向和光强度。
LCD12864的液晶分子排列方式分为两种:平行排列和垂直排列。
当平行排列的液晶分子受到电场作用时,光束可以通过液晶单元,这时显示区域会出现明亮;而当垂直排列的液晶分子受到电场作用时,光束无法通过液晶单元,这时显示区域会出现暗淡。
通过在液晶单元两侧施加不同的电压,可以控制液晶分子的排列方式。
通过在液晶单元上加上适当的驱动电压,LCD12864可以实现对每个像素点的控制,从而显示出各种图像和文字。
为了控制LCD12864的显示,需要使用专门的驱动电路和微控制器。
通过驱动电路的控制,可以向LCD12864发送相应的电压信号,从而控制液晶分子的排列方式,实现显示的效果。
总结来说,LCD12864的显示原理利用液晶分子在电场作用下
改变排列方式来实现光的传播和屏幕显示,通过驱动电路和控制器来控制电压信号,从而控制液晶分子的排列方式,实现显示区域的明暗变化,从而显示出图像和文字。
十、ATmega16驱动12864液晶(LCD12864A,ST7290驱动芯片)

截至 7.7 sp2,Proteus 里面还没有 ST7290 驱动的 12864 液晶元件。 在此感谢 hameyou 制作了 LCD12864A.dll 这个仿真模型,这个模型在 7.7 sp2 里面才能打开。 下载地址:/bbs/thread-30752-1-1.html
12
Write_Data(*(pt++)); //地址自动加一 }
/************delay_Accurate.h******************************************** 毫秒级精确延时(ICC AVR)
*************************************************************************/
MCU2LCD_Data = dat; LCD_ENABLE; NOP(); LCD_DISABLE; } /******************************************* 函数名称:LCD12864_Init 功 能:初始化液晶模块 参 数:无 返回值 :无 ********************************************/ void LCD12864_Init(void) { LCD_CMDOut; //液晶控制端口设置为输出 //LCD_PSB_H;//并行模式
/******************************************* 函数名称:Write_Cmd 功 能:向液晶中写控制命令 参 数:cmd--控制命令 返回值 :无 ********************************************/ void Write_Cmd(uchar cmd) {
LCD12864详解

12864液晶一、概述带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64,内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。
可以显示8×4行16×16点阵的汉字.也可完成图形显示.低电压低功耗是其又一显著特点。
由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。
基本特性:低电源电压(VDD:+3.0--+5.5V)显示分辨率:128×64点内置汉字字库,提供8192个16×16点阵汉字(简繁体可选)内置 128个16×8点阵字符2MHZ时钟频率显示方式:STN、半透、正显驱动方式:1/32DUTY,1/5BIAS视角方向:6点背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10通讯方式:串行、并口可选内置DC-DC转换电路,无需外加负压无需片选信号,简化软件设计工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃模块接口说明:*注释1:如在实际应用中仅使用串口通讯模式,可将PSB接固定低电平,也可以将模块上的J8和“GND”用焊锡短接。
*注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。
*注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。
2.2并行接口管脚号管脚名称电平管脚功能描述1 VSS 0V 电源地2 VCC 3.0+5V 电源正3 V0 - 对比度(亮度)调整4RS(CS)H/LRS=“H”,表示DB7——DB0为显示数据RS=“L”,表示DB7——DB0为显示指令数据5R/W(SID) H/L R/W=“H”,E=“H”,数据被读到DB7——DB0R/W=“L”,E=“H→L”, DB7——DB0的数据被写到IR或DR6 E(SCLK) H/L 使能信号7 DB0 H/L 三态数据线8 DB1 H/L 三态数据线9 DB2 H/L 三态数据线10 DB3 H/L 三态数据线11 DB4 H/L 三态数据线12 DB5 H/L 三态数据线13 DB6 H/L 三态数据线14 DB7 H/L 三态数据线15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1)16 NC - 空脚17 /RESET H/L 复位端,低电平有效(见注释2)18 VOUT - LCD驱动电压输出端19 A VDD 背光源正端(+5V)(见注释3)20 K VSS 背光源负端(见注释3)*注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。
LCD 1602,12864 编程与PROTEUS仿真

第九章LCD显示本章主要介绍LCD1602,12864.9.1 LCD1602#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define port P0 //DB0~DB7数据口sbit e=P2^2;//使能sbit rw=P2^1;//读写sbit rs=P2^0;//数据/命令sbit busy=P0^7;//检测忙//延时void delay(uint n){uint i;for(;n>0;n--)for(i=200;i>0;i--);}//判断是否忙void check(){rs=0;rw=1; //读e=1;port=0x00;e=1;while(busy);e=0;}//写指令void send(uchar command){check();rs=0; //指令rw=0; //写e=0;port=command;e=1;_nop_();_nop_();e=0; //写入指令}//写数据void write(uchar dat){check();rs=1; //数据rw=0;port=dat;e=1;_nop_();_nop_();e=0;}//光标位置void pos(uint p){send(p|0x80);//第一行第一个0x80;}void init(){send(0x38); // 8位数据,双列,5*7字形delay(1);send(0x0c); //开0x08关delay(1);send(0x06);//地址增加一delay(1);send(0x01);//清屏delay(1);}void main(){int i=0,j=0;uchar num[]="abcdefghijklmnop";uchar string[]="abcdefghijklmnop";init();delay(10);pos(0);delay(1); //或者用i=0; //此步不能省。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
LCD12864原理与应用 1、LCD12864简介: LCD12864分为两种,带字库的和不带字库的,不带字库的液晶显示汉字的时候可以选择自己喜欢的字体。而带字库的液晶,只能显示GB2312字体,当然也可以显示其他的字体,不过是用图片的形式显示。
下面介绍不带字库的LCD12864,以Proteus中的AMPIRE128×64为例,如下图所示,它
的液晶驱动器为KS0108。 引脚功能: 引脚符号 状态 引脚名称 功能 , 输入 芯片片选端,都是低电平有效 CS1=0开左屏幕,CS1=1关左屏幕 CS2=0开右屏幕,CS2=1关右屏幕 RS 输入 数据/命令选择信号 RS=1为数据操作,RS=0为写指令或读状态
RW 输入 读写选择信号 R/W=1为读选通,R/W=0为写选通
E 输入 读写使能信号 在E下降沿,数据被锁存(写)入液晶,在E
高电平期间,数据被读出
DB0—DB7 三态 数据总线 数据或指令的传送通道 输入 复位信号,低电平时复位 复位时,关闭液晶显示,使显示起始行为0, 可以跟单片机的复位引脚RST相连,也可以直接接VCC,使之不起作用 V0 液晶显示器驱动电压
-Vout -10V LCD驱动负电压
与带字库的液晶不同,此块液晶含有两个液晶驱动器,每块驱动器都控制64*64个点,分为左右两个屏幕显示,总共为128*64个点(即有128×64个点)。这就是为什么AMPIRE128*64有CS1和CS2两个片选端的原因。此液晶有8页,一页有8行点阵点,左右各64列,共128列。如下图所示:
2、LCD12864中的几条重要指令 (一)行(line)设置命令:
由此可见显示的起始行地址为0XC0,共64行,有规律地改变起始行号,可以实现滚屏效果。 (二)页(page)设置指令:
起始页地址为0XB8,因为液晶有64行点,分为8页,每页就有8行点。 (三)列(column)地址设置指令 每块驱动器的列地址都是从0X40到0X7F,共64列,所以此液晶共有128列点。 (四)读状态指令
3、用LCD12864显示汉字(一) 由于这块液晶不带字库,我们就要自己编写字库,编写字库所用的字模提取软件为Zimo21(软件下载地址luoyong199092.qjwm./),LCD1602显示自定义字符的时候也是用它。在取模之前我们要进行一些设定,根据此液晶的显示原理,设置为“纵向取模,字节倒序”,如下图所示:(若不是这样,则取模得到的数据不是我们想要的,将会出现乱码,同样可以在luoyong199092.qjwm./下载到关于字模提取原理文档) 字体选择默认的“宋体,常规,小四号”,小四号为16*16大小,如下图所示: LCD12864与单片机的连接如下图所示: C程序如下: #include #include #define uchar unsigned char #define uint 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,0xFC,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,0x3F,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,0x20,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[]= //憔 { 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,0x04,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,0x26,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,0x00,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=P2^0;//片选1,低电平有效,CS1=0开左屏幕,CS1=1关左屏幕 sbit CS2=P2^1;//片选2,低电平有效,CS2=0开右屏幕,CS2=1关右屏幕 sbit RS=P2^2;//数据,指令选择信号,RS=1为数据操作,RS=0为写指令或读状态(一般为读忙标志) sbit RW=P2^3;//读写选择信号,RW=1为读选通,RW=0为写选通 sbit EN=P2^4;//读写使能信号 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;