12864应用实际Word格式文档下载.docx
- 文档编号:21674269
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:27
- 大小:552.72KB
12864应用实际Word格式文档下载.docx
《12864应用实际Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《12864应用实际Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
CS1 片选择号,低电平时选择前64列
16。
CS2 片选择号,低电平时选择后64列
17。
RET 复位信号,低电平有效。
18。
VEE 输出-15v电源给V0提供驱动电源
19。
A 背光电源LED正极
20。
K 背光电源LED负极
具体电路图如下:
制做如下:
接口说明:
装上12864
具体的电路还是两个电阻。
一个背光限流电阻。
一个液晶驱动电压调节电阻。
背光电阻还是任何时候在19、20脚与电源之间串上个100欧电位器接上电源。
调节电位器到合适亮度。
具体值最好是到调试完程序能够正常显示后再将阻值确定换成固定电阻。
液晶驱动电压的调整在数据线、电源线接好的前提下是在Vee(-15v)和地之间接一个电位器。
中间接V0,通过调节电位器来调节V0上的电压。
当V0上为-15V时为全暗(液晶显示为全黑)。
当V0为0V时为全亮。
调节电位器使屏幕从全暗刚好变到亮时,便可进行程序的调试。
待屏幕显示正常后,进行对比度的细调,然后测量这两边的阻值在地和V0之间、V0和Vee之间换成两个固定电阻焊上就好了。
注意在V0的电压是在一个很小的范围有效。
我的就是在-2.2——-2.5这个范围。
仔细调节V0和地之间的电阻使V0上的电压在2.3V。
更换为固定电阻后的装配图:
下面说说具体的驱动:
先来了解一下LCD12864的内部控制结构:
见图
可以看出12864屏是分为左、右两块控制的。
所有对屏幕的操作要受片选CS1、CS2来控制。
我们再来看一看对屏幕操作数据与屏幕点阵的排布关系:
见下图。
从上图可以看出数据按字节在屏幕上是竖向排列的。
上方为低位,下方为高位。
因此在横向上(也就是Y)就一共是128列数据。
分为CS1和CS2两个64列来写入。
在竖方向上(也就是X)一字节数据显示8个点,竖向64个点分为8个字节,称做8页(X=0-7)。
了解这些后我们就知道要满屏显示一张图就要从y=0…127、X=0…7一共写128×
8=1024个字节的数据。
同样在AT89S51中存一张图就要1024个字节的空间。
好!
下面我们来了解对LCD12864进行操作的一些指令。
下面对上图的指作解释:
1.显示开关控制(DISPLAYON/OFF)
D=1:
开显示(DISPLAYON)
意即显示器可以进行各种显示操作
D=0:
关显示(DISPLAYOFF)意即不能对显示器进行各种显示操作
2.设置显示起始行(DISPLAYSTARTLINE)
前面在Z地址计数器一节已经描述了显示起始行是由Z地址计数器控制的。
A5~A0
6位地址自动送入Z地址计数器,起始行的地址可以是0~63的任意一行。
例如:
选择A5~A0是62,则起始行与DDRAM行的对应关系如下:
DDRAM行:
6263
0
1
2
3·
·
2829
屏幕显示行:
3
4
5
6·
3132
3.设置页地址(SETPAGE“XADDRESS”)
所谓页地址就是DDRAM的行地址,8行为一页,模块共64行即8页,A2~A0表示0~7页。
读写数据对地址没有影响,页地址由本指令或RST信号改变复位后页地址为0。
页地址与DDRAM的对应关系见DDRAM地址表。
4.设置Y地址(SETYADDRESS)
此指令的作用是将A5~A0送入Y地址计数器,作为DDRAM的Y地址指针。
在对DDRAM进行读写操作后,Y地址指针自动加1,指向下一个DDRAM单元。
5.读状态(STATUSREAD)
当R/W=1
D/I=0时,在E信号为“H”的作用下,状态分别输出到数据总线(DB7~DB0)的相应位。
BF:
前面已叙述过(见BF标志位一节)。
ON/OFF:
表示DFF触发器的状态(见DFF触发器一节)。
RST:
RST=1表示内部正在初始化,此时组件不接受任何指令和数据。
6.写显示数据(WRITEDISPLAYDATE)
D7~D0为显示数据,此指令把D7~D0写入相应的DDRAM单元,Y地址指针自动加1。
7.读显示数据(READDISPLAYDATE)
此指令把DDRAM的内容D7~D0读到数据总线DB7~DB0,Y地址指针自动加1。
再帖一下接口时序图
1.写操作时序
2.读操作时序
时序参数表:
又帖了这么多指令呀时序图什么的,看了就头晕。
我也和你一样不爱看这些枯燥的东西。
下面实际写些程序让屏幕亮起来。
运行:
不要走开哦!
我会不断补全的。
。
7.自制单片机之七……LCD12864的驱动之源代码
今天将LCD12864的源代码发上来。
//LCD12864
//**********************************************************
//连线表:
CPU=89C51
SysClock=12MHz
*
//RS=P1.0
R/W=P1.1
E=P1.2
CS1=P1.3
CS2=P1.4
//DB0-DB7=P0.0-P0.7
/Reset=InBoard
//**********************************************************
#include<
reg52.h>
stdlib.h>
intrins.h>
stdio.h>
math.h>
#defineucharunsignedchar
#defineuintunsignedint
/********************引脚定义********************/
#defineDataPortP3
//LCD128*64I/O信号管脚
sbit
RS=P2^0;
//数据指令
RW=P2^1;
//读写
E
=P2^2;
//使能
CSL=P2^3;
//左片选
CSR=P2^4;
//右片选
ucharPage;
//页地址
ucharCol;
//列地址
ucharcodeBMP1[];
//一幅图
ucharcodeHZK_12[];
//12×
12阵点字模
ucharcodeASC_5x7[];
//5×
7阵点字模
ucharstr[4];
/********************函数定义*******************/
voidBusyL(void);
//左屏检测忙
voidBusyR(void);
//右屏检测忙
voidCheckBusy(void);
//读取忙信号
voidDelay(uintMS);
//延时
voidLocatexy(void);
//将屏幕横向0-12纵向0-7转换成左、右屏的的X、Y
voidWriteCommandL(ucharCommandByte);
//向左屏写入指令
voidWriteCommandR(ucharCommandByte);
//向右屏写入指令
ucharReadData(void);
//读数据
voidWriteData(ucharDataByte);
//写数据
voidLcmClear(void);
//清屏
voidLcmInit(void);
//初始化
voidLcmPutBMP(uchar*puts);
//显示一幅图
voidLcmReverseBMP(void);
//将整屏反显
voidLcmPutHZ_12(ucharx,uchary,ucharHZcode);
//在屏幕上任意点显示一个12×
12汉字
uchar*uchartostr(unsignedcharunm);
//将值转成字符串
voidLcmPutAsc(ucharasc);
//显示一个5×
7的ASC字符
voidLcmPutstr(ucharrow,uchary,uchar*str);
//在设定位置显示字符串
voidLcmPutpoint(ucharro,ucharlie,ucharcolour);
//在设定位置显示一个点
/***************************/
/*检查Busy
*/
voidBusyL(void)
{
CSL=1;
CSR=0;
CheckBusy();
}
voidBusyR(void)
CSL=0;
CSR=1;
voidCheckBusy(void)
RS=0;
//指令
RW=1;
DataPort=0xFF;
//输出0xff以便读取正确
E=1;
_nop_();
while(0);
//DataPort&
0x80);
//StatusReadBit7=BUSY 这地方有点问题,用了while(//DataPort&
0x80)后就一直读不到0了,陷入死循环。
当用while(0) 时反而能正常工作,不知道有没有人能解释
E=0;
/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置
voidLocatexy(void)
ucharx,y;
switch(Col&
0xc0)
/*col.and.0xC0
{
/*条件分支执行
case0:
{BusyL();
break;
}/*左区*/
case0x40:
{BusyR();
}/*右区*/
}
x=Col&
0x3F|0x40;
/*col.and.0x3f.or.SetYAddress*/
y=Page&
0x07|0xB8;
/*row.and.0x07.or.setPage
/*waittingforenable*/
RW=0;
//写
DataPort=y;
//设置页面地址
DataPort=x;
//设置列地址
/*写指令
voidWriteCommandL(ucharCommandByte)
BusyL();
DataPort=CommandByte;
voidWriteCommandR(ucharCommandByte)
BusyR();
/*读数据
ucharReadData(void)
ucharDataByte;
Locatexy();
/*坐标定位,返回时保留分区状态不变
RS=1;
/*数据输出*/
/*读入*/
DataPort=0xFF;
/*读入到LCM*/
DataByte=DataPort;
/*数据读出到数据口P1*/
returnDataByte;
/*写数据
voidWriteData(ucharDataByte)
/*写输出*/
DataPort=DataByte;
/*数据输出到数据口*/
/*写入到LCM*/
voidLcmClear(void)
Page=0;
Col=0;
for(Page=0;
Page<
8;
Page++)
for(Col=0;
Col<
128;
Col++)
WriteData(0);
voidLcmInit(void)
Delay(200);
//等待复位
WriteCommandL(0x3f);
//开显示
WriteCommandR(0x3f);
WriteCommandL(0xc0);
//设置起始地址=0
WriteCommandR(0xc0);
LcmClear();
Page=0;
}
voidLcmPutBMP(uchar*puts)
uintX=0;
{
WriteData(puts[X]);
X++;
voidLcmReverseBMP(void)
uchartemp;
temp=ReadData();
//空读一次
temp=~temp;
WriteData(temp);
voidLcmPutHZ_12(ucharx,uchary,ucharHZcode)
{
ucharoffset,Rd,Wt,m,tmp,i;
uintn;
if(x<
117&
y<
53)
Page=(y&
0x38)>
>
3;
Col=x;
n=0x18*HZcode;
offset=y&
0x07;
if(offset<
5)
for(i=12;
i>
0;
i--)
{
Rd=ReadData();
m=HZK_12[n];
Wt=Rd&
(0xff>
(8-offset))|(m<
<
offset);
WriteData(Wt);
Page++;
n++;
tmp=m;
Wt=tmp>
(8-offset)|(m<
offset)|(Rd&
(0xff<
(offset+4)));
Col++;
Page--;
else
Wt=m>
(8-offset)|(Rd&
(offset-4)));
Page=Page-2;
//恢复位置
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 12864 应用 实际
![提示](https://static.bdocx.com/images/bang_tan.gif)