51单片机1602移动液晶显示

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课时


设计主题:1602移动液晶显示
院系:工程技术学院
专业:11级电气自动化一班
学号:
姓名:
指导老师:孙建延
基于单片机控制的1602液晶显示
1.引言
单片机作为微型计算机发展的一个重要的分支,以其高可靠性、高性价比、低电压、低功耗的优势,赢得了广泛的应用。

单片机技术是一门技术性、应用性很强的学科,在目前和今后相当长的一段时间仍有着广泛的应用。

实验教学作为其极为重要的组成环节,在硬件扩展、接口应用、编程方法以及程序调试等方面,都起到重要作用。

作为学习自动控制专业的学生,单凭课堂理论课学习,不切实认真的进行实践仿真,势必出现理论与实践脱节、学习与应用脱节等局面。

1.1课程设计的思想
此次《单片机原理及系统》课程设计,选择的是利用1602液晶显示,利用AT89C52芯片实现一串滚动字符显示,本次设计使用的1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置128个字符的ASCⅡ字符集字库,只有并行接口,无串行接口。

通过C语言编程经keil软件生成可以在proteus软件中仿真装载的.hex文件,进而通过proteus软件进行硬件电路连接以
及软件的仿真,利用LM016L显示器替代1602型液晶显示器,最终得出液晶显示。

1.2课程设计的目的
此次程设计是在学习必修课程《单片机原理与系统设计》之后,为加强学生对单片机系统设计和应用能力的培养而开设的综合设计训练环节。

本课程设计应结合《单片机原理与系统设计》课程的基础理论,重点强调实际应用技能训练,包括单片机系统设计的软件和硬件两部分。

其课程设计任务是使学生通过应用单片机系统设计的基本理论,基本知识与基本技能,掌握单片机应用系统各主要环节的设计、调试方法,初步掌握并具备应用单片机进行设备技术改造和产品开发的能力,培养学生的创新意识,提高学生的动手能力和分析问题、解决问题的能力。

1.3课程设计要求
设计要求:采用单片机控制,通过C语言编程实现在1602液晶的第一行显示”WELCOME TO ZDH!”,然后在第二行显示”K092XWEI”然,定格在屏幕上。

2.设计方案及原理
2.1 1602型液晶简介
2.1.1 1602引脚功能
LCD1602引脚如图2.1所示:
图2.1 LCD1602引脚图
1602液晶显示屏各端口信号功能如表2.1所示:
表2.1 1602液晶接口信号说明
编号符号引脚说明编号符号引脚说明
1 Vss 电源地9 D
2 数据口
2 Vdd 电源正极10 D
3 数据口
3 V ee 液晶显示对比度调节端11 D
4 数据口
4 RS 数据/指令端(H/L)12 D
5 数据口
5 R/W 读写选择端(H/L) 13 D
6 数据口
6 E 使能信号14 D
7 数据口
7 D0 数据口15 BLA 背光电源正极
8 D1 数据口16 BLK 背光电源负极
2.2 1062型液晶初始化设置
使用该液晶显示屏时,应首先对其进行初始化设置。

各初始化设置指令码及功能,如表2.2所示:
表2.2 显示开/关及光标设置
指令码功能
0 0 0 0 1 D C B D=1 开显示;D=0 关显示
0 0 0 0 1 D C B C=1 显示光标;C=0 不显示光标
0 0 0 0 1 D C B B=1 光标闪烁;B=0 光标不显示
0 0 0 0 0 1 N 1 N=1当读或写一个字符后地址光标加1
0 0 0 0 0 1 N 1 N=0当读或写一个字符后地址光标加1
0 0 0 0 0 0 0 1 显示清屏:数据指针、所有显示清零
0 0 1 1 1 0 0 0 16×2显示、5×7点阵、8位数据接口2.3 1602液晶写操作时序流程
(1)通过RS确定是写数据还是写指令。

写指令包括使液晶的光标显示/不显示、光标闪烁/不闪烁、需/不需要移屏、在什么地方显示等。

(2)读/写控制端设为写模式,即低电平。

(3)将数据或指令送达数据线上。

(4)给E一个高脉冲将数据送入液晶控制器,完成操作。

2.4 硬件接口设计方案
(1)液晶1、2端为电源;15、16为背光电源(在仿真中可不用)。

(2)液晶3端为液晶对比度调节端,通过一个10千欧电位器接地来调节对比度。

(3)液晶4端为向液晶控制器写数据或写指令选择端,接单片机的P3.5口。

(4)液晶5端为读/写选择端,因为我们不从液晶读取任何数据,只向其写入指令或显示数据,因此此端始终选择为写状态,即为低电平接地。

(5)液晶6端为使能信号,是操作是必需的信号,接单片机的P3.4口。

(6)液晶7~14端口为数据或指令的输入输出口,接单片机P0的8个接口。

3.硬件设计
根据如上分析,在proteus软件环境中搭建硬件电路,采用A T89C52型单片机,LM016L显示器替代1602型液晶显示器。

硬件连接方式(两种)如图3.1、3.2所示:
图3.1 系统硬件电路图连接方式一
4.软件设计
4.1源程序清单
见附录1
4.2源程序调试结果
在keil软件中键入4.1中的源程序并给予调试。

调试结果如图4.1所示:
图4.1 源程序调试结果
由图可知源程序语法无误,并生成了.hex的文件,为在proteus软件中仿真做准备。

4.3仿真结果
在proteus软件中仿真,屏幕上会出现如下两行字符“Zhong Zhou University”
和“0123456789A”。

如图4.2所示:
图4.2 最终效果图
继而可知仿真成功,软硬件设计合理。

5.总结心得
通过一周的课程设计,让我感受最深的就是学习是一种乐趣。

在这次课程设计中,我们接触了一种新的实现,试验箱,他多样的功能激发了我们去学子它,进而掌握它的兴趣。

从拿到任务书,开始充分利用网络及图书馆等资源,查询资料,了解试验箱的功能。

在之前专业课理论知识的基础上,我们又从模糊到熟悉逐渐了解了什么是单片机编程。

然后面对我们的首要任务,我们的想法,回顾这一周的课设,我学会了单片机编程的一些功能的使用,但只是一小部分而已,我此后将继续研究这么一个强大的工具。

对于仿真软件的使用,非常有成就感,极大的激发了我们对新鲜事物学习的兴趣,从而以积极的心态去面对这次课程设计。

最后,我通过这次课程设计,使我对滤波器有了更深刻的认识。

总之,在这一周的时间,一直是有条不紊的进行着,到最后看到我们的努力得到收获的时候,我们满怀欣慰。

在这次课设中,我们看到了自己的进步,看到了老师和学长对工作的认真负责和对学生的耐心和热情,所以在以后的课程设计中,我将满怀激情,更加努力去面
对。

参考文献
1孙建延.基于C 语言编程MCS-51 单片机原理与应用[M] .北京:清华大学出版社,2011
2蔡美琴,张为民.MCS-51系列单片机系统及其应用.第2版.北京:高等教育出版社,2004
3 李广弟,朱月秀,冷祖祁.单片机基础.第3版.北京:北京航空航天大学出版社,2007
4 周润景,张丽娜.基于PROTEUS 的电路及单片机系统设计与仿真[M].北京:航空航天大学出版社,2006
附录
附录1 源程序清单
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LCD_RS = P3^3;
sbit LCD_RW = P3^4;
sbit LCD_EN = P3^5;
uchar code dis1[] = {" Zhong Zhou University "};
uchar code dis2[] = {" 0123456789A "};
/*******************************************************************/ /*
*/
/* 延时子程序
*/
/*
*/
/*******************************************************************/ void delay(int ms)
{
int i;
while(ms--)
{
for(i = 0; i< 250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*******************************************************************/ /*
*/
/*检查LCD忙状态
*/
/*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据。

*/
/*
/*******************************************************************/ bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
result = (bit)(P0&0x80);
LCD_EN = 0;
return result;
}
/*******************************************************************/ /*
*/
/*写指令数据到LCD
*/
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

*/
/*
*/
/*******************************************************************/ void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/*******************************************************************/ /*
*/
/*写显示数据到LCD
*/
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。

*/
/*
*/
/*******************************************************************/ void lcd_wdat(uchar dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 1;
_nop_();
_nop_();
_nop_();
_nop_();
LCD_EN = 0;
}
/*******************************************************************/ /*
*/
/* 设定显示位置
*/
/*
*/
/*******************************************************************/ void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80); //数据指针=80+地址变量
}
/*******************************************************************/ /*
*/
/* LCD初始化设定
*/
/*
*/
/*******************************************************************/ void lcd_init()
{
delay(15); //等待LCD电源稳定
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x38);
delay(5);
lcd_wcmd(0x0c); //显示开,关光标
delay(5);
lcd_wcmd(0x06); //移动光标
delay(5);
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*******************************************************************/ /*
*/
/* 清屏子程序
*/
/*
*/
/*******************************************************************/ void lcd_clr()
{
lcd_wcmd(0x01); //清除LCD的显示内容
delay(5);
}
/*******************************************************************/ /*
*/
/* 闪动子程序
*/
/*
*/
/*******************************************************************/
void flash()
{
delay(600); //控制停留时间
lcd_wcmd(0x08); //关闭显示
delay(200); //延时
lcd_wcmd(0x0c); //开显示
delay(200);
lcd_wcmd(0x08); //关闭显示
delay(200); //延时
lcd_wcmd(0x0c); //开显示
delay(200);
}
/*******************************************************************/ /*
*/
/* 主程序
*/
/*
*/
/*******************************************************************/ main()
{
uchar i,j;
delay(10);
lcd_init(); //初始化LCD
while(1)
{
lcd_clr();
lcd_pos(0x10); //设置显示位置为第一行第17列
i = 0;
while(dis1[i] != '\0')
{ //显示字符" "
lcd_wdat(dis1[i]);
i++;
}
lcd_pos(0x50); //设置显示位置为第二行第17列
i = 0;
while(dis2[i] != '\0')
{
lcd_wdat(dis2[i]); //显示字符" "
i++;
}
/*for(j=0;j<16;j++) //左移动16格
{
lcd_wcmd(0x18); //字符同时左移一格
delay(100); //控制移动时间
}
flash(); */ //闪动二次
for(j=0;j<29;j++) //向左移动29格
{
lcd_wcmd(0x18) ; //字符同时左移一格
delay(100) ; //控制移动时间
}
for(j=0;j<13;j++) //向右移动13格
{
lcd_wcmd(0x1C) ; //字符同时左移一格
delay(100) ; //控制移动时间
}
flash() ; //闪动二次}
}
附录2 主程序流程图 开始
初始化
写第一行字符
是否写完第一行
写第二行字符
是否写完第二行
两行定格在屏幕上
结束是



附图2.1 主程序流程图
附图3.1 连线方式一情况下的最终效果o。

相关文档
最新文档