液晶显示广告牌的设计课程设计.docx
《液晶显示广告牌的设计课程设计.docx》由会员分享,可在线阅读,更多相关《液晶显示广告牌的设计课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
![液晶显示广告牌的设计课程设计.docx](https://file1.bdocx.com/fileroot1/2022-10/22/be64c629-05a8-4ec0-9a3e-59b980066f3d/be64c629-05a8-4ec0-9a3e-59b980066f3d1.gif)
液晶显示广告牌的设计课程设计
液晶显示广告牌的设计
1技术要求
在日常生活中,经常可见各种广告牌,本设计要求利用单片机控制液晶显示屏显示相关的信息,需完成下列任务:
(1)利用LCD显示某一条固定语句;
(2)能够通过按键对固定语句的显示方式进行修改,比如按一次按键,显示的字符少一个,一直到最后所有字符完全消失;或者按一次按键所有字符显示的位置左移一格等。
2设计方案及原理
让LCD显示固定语句在C语言环境下只需将字符串直接赋给LCD即可,让LCD显示的字符方式进行修改就得给LCD传递相关指令。
第一步利用LCD显示某一条固定语句。
LCD显示字符的时候,是一个一个字符显示,显示一个字符后,光标加一或减一表示下一个字符显示的位置。
因此显示固定语句的时候,我们可以先将固定语句存在一个字符串数组,光标操作为当写一个字符后地址指针加一。
选择好初始地址后,利用一个循环结构程序将整个字符串数组内容显示出来。
第二步让LCD显示的字符串显示方式进行修改。
鉴于LCD自身就能将字符串以不同方式的显示出来,因此我们只需将对应指令语句传递给LCD即可,通过外部按键产生中断,让LCD来响应对应指令语句。
方案流程图如图1所示。
图1程序流程图
3实现方案
3.1LM016L基本资料
3.1.1引脚说明
LM016L为字符型液晶显示器LCD,其图形符号、引脚及属性如图2所示。
引脚说明如下:
①数据线D7~D0
②控制线(有3根:
RS、RW、E)
③1根地线Vss
④一根电源线(VDD)
图2LCD图形符号和引脚
3.1.2LM016L属性及RAM地址:
LM016L的属性设置如下:
①每行的字符数为16,行数为2;
②时钟为250KHz;
③行1的字符地址为80H~8FH
④行2的字符地址为C0H~CFH
3.1.3基本操作时序
其具体时序见表1。
表1LM016L信号真值表
RS
R/W
E
功能
0
0
下降沿
写指令代码
0
1
高电平
读忙标志和AC值
1
0
下降沿
写数据
1
1
高电平
读数据
3.1.4LCD指令集
(1)清屏指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
0
1
功能:
<1>清除液晶显示器,即将DDRAM的内容全部填入“空白”的字符码20H;
<2>光标归位,即将光标撤回液晶显示屏的左上方;
<3>将地址计数器(AC)的值设为0。
(2)光标归位指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
1
*
功能:
<1>把光标撤回到显示器的左上方;
<2>把地址计数器(AC)的值设置为0;
<3>保持DDRAM的内容不变
(3)输入模式指令设置
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
1
I/D
S
功能:
设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。
其中:
I/D=1:
数据读、写操作后,AC自动增一;
I/D=0:
数据读、写操作后,AC自动减一;
S=1:
数据读、写操作,画面平移;
S=0:
数据读、写操作,画面不动。
(4)显示开关控制指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
1
D
C
B
功能:
控制显示器开/关、光标显示/关闭以及光标是否闪烁。
其中:
D表示显示开关:
D=1为开,D=0为关;
C表示光标开关:
C=1为开,C=0为关;
B表示闪烁开关;B=1为开,B=0为关。
(5)设定显示屏或光标移动方向指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
1
S/C
R/L
*
*
功能:
使光标移位或使整个显示屏幕移位。
其中:
S/C=1:
画面平移一个字符位;
S/C=0:
光标平移一个字符位;
R/L=1:
右移;
R/L=0:
左移。
(6)功能设定指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
1
DL
N
F
*
*
功能:
设定数据总线位数、显示的行数及字型。
其中:
DL=1,8位数据接口;DL=0,4位数据接口;
N=1,两行显示;N=0,一行显示;
F=1,5×10点阵字符;F=0,5×7点阵字符。
(7)设定DDRAM地址指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
A6
A5
A4
A3
A2
A1
A0
功能:
设定下一个要存入数据的CGRAM的地址。
(8)读取忙信号或AC地址指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
功能:
<1>读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令;当BF=0时,液晶显示器可以接收单片机送来的数据或指令;
<2>读取地址计数器(AC)的内容。
(9)数据写入DDRAM或CGRAM指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
0
数据
功能:
<1>将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符;
<2>将用户自己设计的图形存入CGRAM。
(10)从CGRAM或DDRAM读出数据的指令
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
1
数据
功能:
读取DDRAM或CGRAM中的内容。
3.1.5控制器接口时序说明
3.1.5.1读操作时序
图3读操作时序
3.1.5.2写操作时序
图4写操作时序
3.2硬件连接图
了解完LM016L基本资料,现在我们可以将LCD与单片机接在一起。
实现方案时,将89C51单片机的P1口与LCD数据口连接起来,P3口接液晶控制端口及按键。
具体的硬件连接图如图5所示。
图5液晶广告牌硬件设计图
4源程序代码
#include
#include//库函数头文件,代码中引用了_nop_()函数
//定义控制信号端口
sbitRS=P3^0;//P3.0
sbitRW=P3^1;//P3.1
sbitE=P3^2;//P3.2
intjishu=0;
//声明调用函数
voidlcd_w_cmd(unsignedcharcom);//写命令字函数
voidlcd_w_dat(unsignedchardat);//写数据函数
unsignedcharlcd_r_start();//读状态函数
voidint1();//LCD初始化函数
voiddelay(unsignedchart);//可控延时函数
voiddelay1();//软件实现延时函数,5个机器周期
voidmain()//主函数
{
unsignedcharlcd[]="iamthebestonemeibangsiweite";
unsignedcharlcd1[]="iamyuyangyifromwhut";
unsignedchari;
EA=1;//全局中断开
EX1=1;//外部中断0开
IT1=1;//边沿触发,IT1=0表示电平触发
P1=0xff;//送全1到P0口
int1();//初始化LCD
delay(255);
lcd_w_cmd(0x80);//设置显示位置
delay(255);
for(i=0;i<36;i++)//显示字符串
{
lcd_w_dat(lcd[i]);
delay(200);
}
lcd_w_cmd(0xc0);//设置显示位置
delay(255);
for(i=0;i<25;i++)//显示字符串
{
lcd_w_dat(lcd1[i]);
delay(200);
}
while
(1){
switch(jishu){
case0:
for(i=0;i<1;i++)//闪烁
{
lcd_w_cmd(0x08);
delay(200);
lcd_w_cmd(0x0d);
delay(200);
}
break;
case1:
for(i=0;i<1;i++)//左移
{
lcd_w_cmd(0x1c);
delay(200);
}
break;
case2:
for(i=0;i<1;i++)//右移
{
lcd_w_cmd(0x18);
delay(200);
}
break;
}
}
}
voidISR_Key(void)interrupt2using1
{
jishu++;
jishu=jishu%3;
}
//函数名:
delay
//函数功能:
采用软件实现可控延时
//形式参数:
延时时间控制参数存入变量t中
//返回值:
无
voiddelay(unsignedchart)
{
unsignedcharj,i;
for(i=0;ifor(j=0;j<50;j++);
}
//函数名:
delay1
//函数功能:
采用软件实现延时,5个机器周期
//形式参数:
无
//返回值:
无
voiddelay1()
{
_nop_();
_nop_();
_nop_();
}
//函数名:
int1
//函数功能:
lcd初始化
//形式参数:
无
//返回值:
无
voidint1()
{
lcd_w_cmd(0x3c);//设置工作方式
lcd_w_cmd(0x0d);//设置光标
lcd_w_cmd(0x01);//清屏
lcd_w_cmd(0x06);//设置输入方式
lcd_w_cmd(0x80);//设置初始显示位置
}
//函数名:
lcd_r_start
//函数功能:
读状态字
//形式参数:
无
//返回值:
返回状态字,最高位