LCD12232液晶显示实验Word下载.docx
《LCD12232液晶显示实验Word下载.docx》由会员分享,可在线阅读,更多相关《LCD12232液晶显示实验Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
2、RES,复位信号。
这个大家都知道,一般应用中直接接到高平就行了;
3、E1,E2为控制器选择线,高电平时为选中;
4、R/W=0时为写选通,R/W=1时为读选通,一般我们只是向液晶发送数据,不读液晶内部的数据,所以该脚可以直接接地(低电平);
5、A0=1时表示所发的数据是显示数据,A0=0时表示所发数据是指令(Instruction);
6、DB0~DB7为数据线;
7、LED-,LED+为背光灯电源,一个接正,一个接地就行。
17.2.1、DM12232B型液晶的读写时序
DM12232B型液晶的读写时序如图2所示,
应用中主要有两种读写时序:
写指令和写数据,分别描述如下:
写指令:
E选通—A0=0—读写使能(直接接地就不用设置了)—数据的发送—状态释放
写数据
E选通—A0=1—读写使能(直接接地就不用设置了)—数据的发送—状态释放
图1DM12232B型液晶的管脚排列及说明
图2DM12232B型液晶的读写时序
17.2.3、DM12232B型液晶的指令介绍
DM12232B型液晶的指令如表1所示
表1DM12232B型液晶的指令
表1(续)DM12232B型液晶的指令
17.2.4、DM12232B型液晶的原理图
DM12232B型液晶的原理图如图3所示
17.2.5、DM12232B型液晶的地址表
DM12232B型液晶的地址表如图4所示
图3DM12232B型液晶的原理图
图4DM12232B型液晶的地址表
10.1.3、电路和连接
图5所示为DM12232B型液晶与单片机之间进行并口通讯的典型接法
本实例是在LT_Mini_M16学习板的基础上做的扩展实验,具体连线如下。
引脚连接
mculcd引脚说明
VccVDD电源电压
GNDVSS电源地
偏压信号,接可调电阻VEE(VLCD)LCD外接驱动负电压
PA1RES复位信号(低电平有效),低电平复位
PA6E1读写使能信号1
PA7E2读写使能信号2
PA5R/W读写选择信号
PA4A0H-显示数据。
。
L-显示指令数据(指令数据选择)
PB0DB0数据线
PB1DB1
PB2DB2
PB3DB3
PB4DB4
PB5DB5
PB6DB6
PB7DB7
VccVLED+LED(+5V)或EL背光源
GNDVLED-LED(0V)或EL背光源
图512232B液晶与单片机的一种接口图
17.4、程序设计
1、程序功能
程序的功能是使用单片机控制12232B液晶显示字符,程序比较简单,直接看程序就能明白原理了。
2函数说明
本程序多个功能函数,分别是:
●DM12232B液晶处理相关函数:
externvoidLCDPort_Init(void);
//液晶端口初始化
externvoidLCD_Init(void);
//LCD初始化
externvoidWriteCommand(unsignedcharchip_select,unsignedcharcmd);
//写命令
externvoidWriteData(unsignedcharchip_select,unsignedchardata);
//写数据
externvoidclear_lcd(void);
//清屏
externvoidtex_Write(unsignedchar*pt);
//写字符
externvoidWriteCharacter(unsignedchar*pt);
//写汉字
externvoidDrawing_Map(unsignedchar*pt);
//绘图
●延时相关函数:
voidDelayus(unsignedintlus);
//us延时函数
voidDelayms(unsignedintlms);
//ms延时函数
由于WINAVR自带函数库中的延时函数使用起来很不方便,并且晶振频率不同,延时时间也有区别,所以本实例中自己写了两个延时函数。
3、使用WINAVR开发环境,使用的是外部12M的晶振,所以需要将makefile文件中的时钟频率修改为12M。
另外在程序烧录到单片机的时候,熔丝位也要选择为外部12M晶振(注意是晶振,不是外部振荡器,一定不要选择错了,否则会导致单片机不能再烧写程序)。
4、程序代码
由于本程序代码比较长,所以在此只列出与控制液晶DM12232B相关的部分代码,完整程序放在附件中
//端口初始化
voidLCDPort_Init()
{
//LCD数据端口设置
PORTB=0xff;
//
DDRB=0xFF;
//配置端口PB全部为输出口,LCD数据端口
//LCD控制端口设置
SET_RES;
SET_A0;
SET_RW;
SET_E1;
SET_E2;
DDRA=0xff;
Delayms(15);
}
//LCD初始化
voidLCD_Init()
{
WriteCommand(0x01,0xe2);
//rest复位
WriteCommand(0x02,0xe2);
//WriteCommand(0x01,0xae);
//closedisplay关显示
//WriteCommand(0x02,0xae);
//WriteCommand(0x01,0xa4);
//staticdriver关静态驱动
//WriteCommand(0x02,0xa4);
WriteCommand(0x01,0xa9);
//duty1/32占空比1/32
WriteCommand(0x02,0xa9);
//WriteCommand(0x01,0xa0);
//clockwiseoutputADC选择,顺时针还是逆时针读取RAM数据
//WriteCommand(0x02,0xa0);
//WriteCommand(0x01,0xee);
//end关闭读修改写,无论读或写操作后,列地址都加1
//WriteCommand(0x02,0xee);
//WriteCommand(0x01,0x00);
//行地址设置,设置显示RAM的行地址(Y地址)
//WriteCommand(0x02,0x00);
//WriteCommand(0x01,0xc0);
//显示起始行设置。
指定显示器从显示RAM中的那一行开始显示
//数据,(起始行=0)
//WriteCommand(0x02,0xc0);
WriteCommand(0x01,0xaf);
//openddisplay开显示
WriteCommand(0x02,0xaf);
//LCD写指令,
voidWriteCommand(unsignedcharchip_select,unsignedcharcmd)
{
if(chip_select&
1)//判断对左页还是右页的操作
{
SET_E1;
//如果是左页,E1使能
}
elseif(chip_select&
2)//
SET_E2;
//右页,E2使能
CLR_A0;
//A0=0写命令
CLR_RW;
//RW=0写操作
PORTB=cmd;
//写命令数据到数据端口
1)//
CLR_E1;
//关闭左右页使能
CLR_E2;
//
voidWriteData(unsignedcharchip_select,unsignedchardata)
1)//判断左右页
//A0=1,写数据
//RW=0,写操作
PORTB=data;
//写数据到数据端口
//结束使能
voidclear_lcd(void)
unsignedchara,b,c;
for(a=0xb8;
a<
0xbc;
a++)//清屏0-3页,指令分别是b8,b9,ba,bb(X地址)
b=0;
WriteCommand(0x01,a);
//左,第0页开始
WriteCommand(0x02,a);
//右,第0页开始
WriteCommand(0x02,b);
//右,第0行开始(Y地址)
WriteCommand(0x01,b);
//左,第0行开始
for(c=0;
c<
61;
c++)//总共122列,左右各61列
{
WriteData(0x01,0x00);
//左,每列均填充0
WriteData(0x02,0x00);
//右,每列均填充0
}
//写字符
voidtex_Write(unsignedchar*pt)
unsignedchara,b;
if(SEL_E1)//左选中?
{
WriteCommand(0x01,0xb8);
//页设置,第0页(X地址)
WriteCommand(0x01,Add1);
//第0行开始(Y)地址
for(a=8;
16;
a++)//
{
WriteData(0x01,*(pt+a));
//上半部分8-16,总高度16,
WriteCommand(0x01,0xb9);
//第一页
for(b=0;
b<
8;
b++)//
WriteData(0x01,*(pt+b));
//下半部分
elseif(SEL_E1==0)//若为0,写右半边
WriteCommand(0x02,0xb8);
WriteCommand(0x02,Add1);
WriteData(0x02,*(pt+a));
WriteCommand(0x02,0xb9);
WriteData(0x02,*(pt+b));
if((Add1+8)<
61)
Add1+=8;
//如果不超过61列列地址+8
else//
Add1=0;
//超过61列,则列地址置0,写右半边
for(a=12;
a++)//一个字符占8列,所以在61列之后还要写4列
for(b=4;
WriteData(0x02,*(pt+b));
Add1+=4;
SEL_E1=0;
//写汉字
voidWriteCharacter(unsignedchar*pt)
if(SEL_E2)//
WriteCommand(0x01,0xba);
WriteCommand(0x01,Add2);
for(a=16;
a<
32;
WriteData(0x01,*(pt+a));
WriteCommand(0x01,0xbb);
for(b=0;
b<
16;
WriteData(0x01,*(pt+b));
elseif(SEL_E2==0)//
WriteCommand(0x02,0xba);
WriteCommand(0x02,Add2);
WriteData(0x02,*(pt+a));
WriteCommand(0x02,0xbb);
WriteData(0x02,*(pt+b));
if((Add2+16)<
61)
Add2+=16;
else
Add2=0;
for(a=29;
a++)
WriteData(0x02,*(pt+a));
//一个汉字16列,写完61列之后还要写3列
for(b=13;
b++)
WriteData(0x02,*(pt+b));
Add2+=3;
SEL_E2=0;
voidDrawing_Map(unsignedchar*pt)
unsignedcharhalf,seg,page;
unsignedcharflag=1;
for(page=0xb8;
page<
page++)
for(half=0;
half<
2;
half++)
flag=!
flag;
if(flag)
{
WriteCommand(0x02,page);
WriteCommand(0x02,0x00);
}
else
WriteCommand(0x01,page);
WriteCommand(0x01,0x00);
for(seg=0;
seg<
seg++)
if(flag)
{
WriteData(0x02,*pt++);
}
else
WriteData(0x01,*pt++);
}