基于89C51的液晶显示系统设计课程设计
课程设计(论文)
题目名称基于89C51的液晶显示系统设计
课程名称单片机原理及应在电气测控学科中的应用学生姓名
学号
系、专业电气工程系电气工程及其自动化专业
指导教师
2013年6月14日
邵阳学院课程设计(论文)任务书
注:1.此表由指导教师填写,经系、教研室审批,指导教师、学生签字后生效;
2.此表1式3份,学生、指导教师、教研室各1份。
指导教师(签字):学生(签字):
邵阳学院课程设计(论文)评阅表
学生姓名学号
系电气工程系专业班级电气工程及其自动化专业11级电本一班题目名称基于89C51的液晶显示系统设计课程名称单片机原理及应在电气测控学科中的应用一、学生自我总结
二、指导教师评定
注:1、本表是学生课程设计(论文)成绩评定的依据,装订在设计说明书(或论文)的“任务书”页后面;
2、表中的“评分项目”及“权重”根据各系的考核细则和评分标准确定。
一、摘要 (6)
二、绪论 (7)
2.1课题设计目标 (7)
2.2课程设计的主要工作 (7)
2.3设计要求 (7)
三、硬件设计 (8)
3.1系统电路图 (8)
3.2 LCD1602 简介 (9)
四、软件设计 (13)
4.1系统框图 (13)
4.2参考程序 (15)
五、程序调试 (22)
六、课程总结 (23)
七、致谢 (24)
八、参考文献 (25)
液晶显示在中国已有二十余年的历史,几乎已经运用与生产生活的各个领域,液晶显示是集单片机技术、微电子技术、信息处理于一体的新型显示方式。LED液晶显示器具有低压低功耗、显示信息量大、已于彩色化、无电磁辐射、使用寿命长和无污染等优点,是目前显示器中一个理想的选择。
液晶显示技术发展迅猛,市场预测表明,液晶显示平均年销售呈增长10%~13%,不久的将来有可能取代CRT,成为电子信息产品的主要显示器件,液晶显示器对空间电磁辐射的干扰不敏感,且在紧凑的仪器空间不需要专门的屏蔽保护,因而可大大简化仪器的结构和降低制造成本,在各种便携式仪器,仪表将会越来越广泛的应用。特别是在电池供电的单片机产品中,液晶显示更是必选的显示器件。
关键字:新型显示方式,LCD液晶显示器,抗干扰,便携
2、绪论
2.1课题设计目标
课程设计是在校学生素质教育的重要环节,是理论与实践相结合的桥梁和纽带。单片机课程设计,要求学生更多的完成软硬结合的动手实践方案,解决目前学生课程设计过程中普遍存在的缺乏动手能力的现象。《单片机课程设计》是继《电子技术》、和《单片机原理与应用》课程之后开出的实践环节课程,其目的和任务是训练学生综合运用已学课程“电子技术基础”、“单片机原理及应用”的基本知识,独立进行单片机应用技术和开发工作,掌握单片机程序设计、调试和应用电路设计、分析及调试检测。
2.2课程设计的主要工作
(1)对系统的各个模块的各个功能进行深入分析和研究,在对课题所采用的方案进行可行详细的研究后设计具体功能电路。
(2)熟悉所选芯片的功能并完成具体电路设计。
(3)对系统的最终指标进行测试,针对系统的不足,进行分析并提出一些改正方法。
2.3设计要求
利用89C51驱动液晶显示器工作,液晶显示器的型号自己确定(可以用1602或者12864)要求显示出自己的基本信息。
1、要求设计出硬件系统的电气原理图;
2、要求设计出程序流程图和程序;
3、要求设计出实物或者仿真调试。
3、硬件设计
3.1系统电路图
整个电路系统由外部显示电路系统和最小系统两个部分组成。
液晶显示系统原理图如下所示:
液晶显示系统原理图
在外部显示电路系统中,由于我们使用的LCD液晶显示屏尺寸较大,所以我们使用了8个10千欧姆的上拉电阻,使LCD液晶显示屏能够驱动;同时我们还使用了10千欧姆的定位器。
最小系统包括晶振电路和复位电路两个部分,复位电路中接入了一个复位按钮。单片机最小系统图如下所示:
单片机最小系统图
3.2 LCD1602 简介
3.2.1 LCD1602 引脚功能
LCD1602引脚如图3.1所示
图3.2 LCD1602引脚图
引脚图的功能如表3—2所示
表3—2引脚功能图
3.2.2 LCD1602显示模指令集
(1)清屏
功能:清DDROM值和AC值
(2)归位
功能:光标复位,光标返回到地址00H
(3)输入方式设置
功能:设置光标,画面移动方式。
其中:I/D=1:数据读写操作后,AC 自加一;
I/D=0:数据读写操作后,AC 自减一;
S=1:数据读写操作,画面平移;
S=0:数据读写操作,画面不动;
(4)显示开关控制
功能:设置显示、光标和闪烁开关。
其中:D 表示显示开关,D=1 为开,D=0 为关;
C表示光标开关,C=1 为开,C=0 为关;
B表示闪烁开关,B=1 为开,B=0 为关。
(5)光标、画面位移
功能:光标、画面移动。
其中:S/C=1 画面移动一个字符位;
S/C=0 光标移动一个字符位;
R/L=1:右移;R/L=0 左移。
(6)功能设置
功能:工作方式设置(初始化指令)。
其中:DL=1,8 位数据接口;
DL=0,4 位数据接口;
N=1,两行显示;N=0,一行显示;
F=1,5*10 点阵显示;F=0,5*7 点阵显示。
(7)CGRAM 地址设置
功能:设置CGRAM 地址,A5~A0=0~3FH。
(8)DDRAM 地址设置
功能:设置DDRAM 地址。
其中:N=0,一行显示A6~A0=0~4FH;
N=1 两行显示,首行A6~A0=0~2FH,次行A6~A0=40~67H。
(9)读BF 及AC 值
功能:读忙BF 和地址计数器AC 的值。
其中:BF=1:忙,BF=0:准备好。此时AC 值意义为最近一次地址设置(CGRAM 或DDRAM)定义。
(10)写数据
功能:根据最近设置的地址性质,数据写入CGRAM或DDRAM中。
(11)读数据
功能:根据最近设置的地址性质,从CGRAM或DDRAM数据读出。
4、软件设计
4.1系统框图
本课题的程序设计是在C语言的基础之上的,可分为两大模块,分别是:(1)IIC协议;
(2)LCD显示。
(3)程序总体框图如图4.1所示:
图4.1总程序框图
(4)LCD 显示程序框图如图4.2 所示:
程序编写的基本思路:
开始→初始化→延时程序→写入指令→写入地址→读取地址→写入数据→读取数据→返回
图4.2LCD显示程序框图
4.2 参考程序
#include
#include
typedef unsigned char BYTE;
typedef bit BOOL;
sbit LCD_RS = P2^6; //定义引脚功能
sbit LCD_RW = P2^5;
sbit LCD_EP = P2^7;
BYTE code dis1[] = {" Welcome to "};
BYTE code dis2[] = {"Shaoyang College"};
BYTE code dis3[] = {" This is my "};
BYTE code dis4[] = {"project design"};
BYTE code dis5[] = {" Liu Chen "};
BYTE code dis6[] = {" 1992 10 08 "};
void delay(int ms)
{
int i;
while(ms--) //延时
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
BOOL lcd_bz()
{
BOOL result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (BOOL)(P0 & 0x80);//判断状态字最高位STA7,确保STA7为0 LCD_EP = 0;
return result;
}
void lcd_wcmd(BYTE cmd) // 写入指令数据到LCD
{
while(lcd_bz()); //为1不能进行读写操作
LCD_RS = 0; //写指令
LCD_RW = 0;
LCD_EP = 0;
_nop_();
_nop_();
P0 = cmd; //将指令写到P0口
_nop_();
_nop_();
_nop_();
LCD_EP = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 0; //产生下降沿,将指令写入LCD
}
void lcd_pos(BYTE pos)
{
lcd_wcmd(pos | 0x80); //LCD数据指针格式80H+地址
}
void lcd_wdat(BYTE dat)
{
while(lcd_bz()); //LCD忙检测,为1不能进行读写,为0可以读写LCD_RS = 1;
LCD_RW = 0;
LCD_EP = 0;
P0 = dat; //数据送入P0口
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EP = 1; //使能端拉高。为产生下降沿做准备
_nop_();
_nop_();
_nop_();
LCD_EP = 0; //使能端拉低,将数据写入LCD
}
void lcd_init() //LCD初始化设定
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c); //显示开,关光标
delay(1);
lcd_wcmd(0x06); //移动光标,当读或写一个字符后地址指针加1且光标加1 delay(1);
lcd_wcmd(0x01);
delay(1);
}
void flash()
{
delay(300);
lcd_wcmd(0x08);
delay(100);
lcd_wcmd(0x0c);
delay(100);
lcd_wcmd(0x08);
delay(100);
lcd_wcmd(0x0c);
delay(100);
}
void main()
{
BYTE i,j; //定义uisigned char型变量i,j
lcd_init(); // 初始化LCD
delay(10); //延时10ms
while(1)
{
lcd_wcmd(0x06); //向右移动光标
lcd_pos(0x10); //设置显示位置为第一行的第17个字符
i = 0;
while(dis1[ i ] != '\0')
{
lcd_wdat(dis1[ i ]);
i++;
// delay(30); //控制两字之间显示速度
}
lcd_pos(0x50); //设置显示位置为第二行第17个字符
i = 0;
while(dis2[ i ] != '\0')
{
lcd_wdat(dis2[ i ]);
i++;
//delay(30); //控制两字之间显示速度
}
for(j=0;j<16;j++)
{
lcd_wcmd(0x18); //字符同时左移一格
delay(80);
}
flash(); //闪动二次
delay(800); //控制停留时间
lcd_wcmd(0x01); //清除LCD的显示内容
delay(1);
lcd_wcmd(0x06);
lcd_pos(0); //设置显示位置为第一行的第1个字符
i = 0;
while(dis3[ i ] != '\0')
{
lcd_wdat(dis3[ i ]);
i++;
delay(30); //控制两字之间显示速度
}
lcd_pos(0x40); //设置显示位置为第二行的第16个字符i = 0;
while(dis4[ i ] != '\0')
{
lcd_wdat(dis4[ i ]);
i++;
delay(30); //控制两字之间显示速度
}
flash();
delay(800); //控制停留时间
lcd_wcmd(0x01);
delay(1);