关于单片机液晶显示屏的LCD显示屏

51单片机实战:液晶显示器のLCD1602 - 简书
51单片机实战:液晶显示器のLCD1602
好吧,最终我还是决定把LCD和串口通信分开写。
首先祝各位新春快乐,鸡年大吉。上班的事业有成,上学的天天向上。过大年呢,还真没啥心情码字。
借着爆竹声咱扯会儿LCD(液晶显示器,Liquid Crystal Display)。今天要实战的这款俗称为LCD1602,尤其注意这个1602,他说明了这款显示器的显示能力:每行16个字符,共2行,乃字符显示器(仅ASCII)。
显示容量|芯片工作电压|工作电流|模块最佳工作电压
:---:|:---:|:---:|:---:|:---:
16×2 Char|4.5~5.5V|2.0mA(5.0V)|5.0V
对比度调节
数据(H)/命令(L)选择端
读(H)/写(L)选择端
使能(Enable)信号
背光电源正极
背光电源负极
LCD上也有一个单片机,用于控制屏幕显示。我们并不是直接操作那块屏幕,而是与那个单片机交互。
其中D0~7这8个数据口就是用于交互的,为并行传输。
因为我们要和LCD内嵌的单片机交互,所以需要指令。下面所列的东西都是当RS为低电平时发送的(若为高电平,就识别为数据)。
0xC0 (0x80+0x40)
设置16×2显示,5x7点阵,8位数据接口
||||Display,1:开显示
Cursor,1:显示光标
Blink,1:光标闪烁
|||||Next,1:读/写一个字符后,指针自动加1
Shift,1:写字符时,相对字符静止的屏幕移动
数据指针清0且所有指针清空
仅数据指针清0
简单说下,逻辑电路中只有高电平和低电平,也就是程序里面的1和0。但是在物理层面上,它需要一个具体的表现,然后整理成标准。
TTL就是本例中要用到的一种电平,单片机和LCD通过引脚传递电信号,从而达到1和0的传递。
TTL中的低电平(0)表现为0V,高电平(1)表现为5V
在Proteus里,1602就是LM016L,除了没有背光灯电源外用法一致(VEE是对比度调节,本例不用)。
RP1为上拉电阻,用于提高电压。由于这款单片机的P0引脚组的电压低于5V,所以需要上拉至5V,达到TTL的标准。
那个圆形的刻着Volts字样的东西是电压表,连接两个没被上拉电压的P0引脚,具体数值看后面的演示图。
#include &reg52.h&
#define uchar unsigned char
#define uint unsigned int
//coefficient of 1602 display(16 row 2 col. 5*7px per Char)
#define LCD_CLEAR 0x01
//宏定义:清屏
#define DISPLAY_MODE_
//宏定义:1602显示模式
#define DISPLAY_OFF 0x08
//宏定义:关显示
#define DISPLAY_ON_NO_CURSOR 0x0c
//宏定义:开显示且无光标
#define DISPLAY_ON_WITH_CURSOR_NO_BLINK 0x0e
//宏定义:开显示且有光标但不闪烁
#define DISPLAY_ON_WITH_CURSOR_BLINK 0x0f
//宏定义:开显示且有光标且闪烁
#define AUTO_BACK_STEP 0x04
//宏定义:读/写时指针自动减1
#define AUTO_NEXT_STEP 0x06
//宏定义:读/写时指针自动加1
#define AUTO_DISPLAY_MOVE_LEFT 0x07
//宏定义:字符相对静止,整屏左移
#define AUTO_DISPLAY_MOVE_RIGHT 0x05
//宏定义:字符相对静止,整屏右移
#define ALL_MOVE_LEFT 0x18
//宏定义:屏幕左移
#define ALL_MOVE_RIGHT 0x1c
//宏定义:屏幕右移
#define CURSOR_MOVE_LEFT 0x10
//宏定义:光标左移
#define CURSOR_MOVE_RIGHT 0x14
//宏定义:光标右移
#define FIRST_ROW 0x80
//宏定义:第一行头地址
#define SECOND_ROW FIRST_ROW+0x40
//宏定义:第二行头地址
uchar code fst[] = "Hello World!";
//第一行要显示的数据数组
uchar code sec[] = "";
//第二行要显示的数据数组
//字符计数
sbit enable = P0^5;
sbit RS = P0^7;
//数据/命令切换
sbit RW = P0^6;
//读/写切换
sbit anode = P0^0;
//连接电压表阳极
sbit cathode = P0^1;
//连接电压表阴极
//粗制的延时器,没走一次这个函数大约为1ms,适用于11.0592MHz及附近
void delay(uint z)
for(x=z;x&0;x--)
for(y=110;y&0;y--);
void writeCmd(uchar cmd)
//切换为写命令模式
enable = 1;
enable = 0; //执行完毕!
void writeDat(uchar dat){
RS = 1; //切换为数据模式
enable = 1;
enable = 0;
//初始化函数
void init(){
anode = 1;
cathode = 0;
//写模式,本例只往LCD写数据
enable = 0;
writeCmd(DISPLAY_MODE_1602);
//发送命令:1602模式
writeCmd(DISPLAY_ON_WITH_CURSOR_BLINK);
//发送命令:开始显示并闪烁光标
writeCmd(AUTO_NEXT_STEP);
//发送命令:数据指针自动加1
writeCmd(LCD_CLEAR);
//发送命令:清屏
void main(){
writeCmd(FIRST_ROW);
//发送命令:开始从第一行写入
for(num=0;num&=12;num++){
writeDat(fst[num]);
//发送数据,每次一字节
好,说一下上面代码中标//注意的地方,全都是delay(1)。
为了什么呢,不是蛋疼,是因为单片机给LCD传送信号时,数据是要放在数据线上的,要是LCD还没读完单片机给它发的啥就把内容撤走的话,就会造成数据丢失。
就是这个道理,为了传输稳定,所以延时一小会儿。这个延时的数值需要大家自己去试,并不一定所有的情况都延时大约1ms就够的。
本例用于显示字符数超过16个的情况。
uchar code fst[] = "ABCDEF";
//第一行要显示的数据数组
uchar code sec[] = "ABCDEFGHIJK";
//第二行要显示的数据数组
初始化函数
void init(){
anode = 1;
cathode = 0;
enable = 0;
writeCmd(DISPLAY_MODE_1602);
writeCmd(DISPLAY_ON_NO_CURSOR);
//换成不闪的,虽然跟这个新需求没什么联系,就是给你演示下效果
writeCmd(AUTO_NEXT_STEP);
writeCmd(LCD_CLEAR);
void main(){
writeCmd(FIRST_ROW);
//发送命令:开始从第一行写入
for(num=0;num&=16;num++){
writeDat(fst[num]);
writeCmd(SECOND_ROW);
//发送命令:开始从第二行写入
for(num=0;num&=20;num++){
writeDat(sec[num]);
//向左移动三次,每次间隔500ms
for(num=0;num&=3;num++) {
writeCmd(ALL_MOVE_LEFT);
//发送命令:整屏左移
delay(500);
delay(1000);
//暂停大约1s
//向右移动三次,每次间隔500ms
for(num=0;num&=3;num++) {
writeCmd(ALL_MOVE_RIGHT);
//发送命令:整屏右移
delay(500);
delay(3000);
//暂停大约3s后开始下一轮
移屏只移3个字符距离,所以并没有把第二行的K显示出来。
这次单讲LCD的入门应用,送给不爱看春晚的你。前两天搞定了科二考试,年后准备科三了。《扯单》系列的一周目大概还差两三篇就完结了,下集预告:串口应用。好了,看完文章实践实践后就该打麻将打麻将,该放炮仗放炮仗吧!总之大家吃好玩好。
埋头开荒,双商破冰,扬短避长,屎上醉男。
Github: https://github.com/jessehao
1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 (2)嵌入式系统发展的4个阶段:无操作系统阶段、简单操作系统阶段、实时操作系统阶段、面向Internet阶段。 (3)知...
什么是嵌入式 IEEE(Institute of Electrical and Electronics Engineers,美国电气和电子工程师协会)对嵌入式系统的定义:“用于控制、监视或者辅助操作机器和设备的装置”。原文为:Devices Used to Control,...
本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。 嵌入式系统基础 1、嵌入式系统的定义 (1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 (2)嵌入式系统发展的4个阶段:无操作系统阶段...
51单片机控制LCD1602模块 视频地址:LCD1602视频 (1)LCD1602概述 先来看看LCD1602什么意思?Liquid Crystal Display(LCD)表示液晶显示,1602 表示一行可以显示16个字符,一共有两行。 现在我们来看看如何使用简单的IO...
什么是ttl电平 TTL电平信号被利用的最多是因为通常数据表示采用二进制规定,+5V等价于逻辑&1&,0V等价于逻辑&0&,这被称做TTL(晶体管-晶体管逻辑电平)信号系统,这是计算机处理器控制的设备内部各部分之间通信的标准技术。 TTL电平信号对于计算机处理器控制的设备内...
& 前方有人晕倒了,现场环境安全,我具备急救知识,我是救护员,请大家为我作证。&
&同志 同志 你怎么了,路人甲,请你去打120,接通与否请尽快告知我,路人乙,请你去拿AED,现场有急救知识的人,赶紧过来帮助我& ,&03 1004 10...
跟同事一群,八个人一起去看了天才枪手,以为是谍战片。。。苍天,好吧,又被标题党安利了。。
内容就不细谈了,感兴趣的可以去百度或者找资源看下,讲的是考试作弊的内容。谈几点自己的见解。
电影给我最大的感觉就是紧张感,主人公,小琳为了能够及时给花钱买...
I am seeing some strange behavior with my application and the state of its database file after running some tests that close the database...
我个人写作一般还是在电脑上进行。因为最近参加打卡活动,我觉得先关注然后投稿就比较容易找到想要投稿的专题。 但当我对发布的文章进行投稿时,发现除了自己管理的专题外,并没有我关注的专题、只能搜索(网页端的逻辑一致)。 也许,向自己关注的专题投稿是一个很小众的需求吧。 由此产生的...51单片机综合学习系统之 12864点阵型液晶显示篇
51单片机综合学习系统之&12864点阵型液晶显示篇&《电子制作》2008年2月&站长原创,如需引用请注明出处
& & 大家好,通过以前的学习,我们已经对51单片机综合学习系统的使用方法及学习方式有所了解与熟悉,学会了1602字符型液晶显示的基本知识,体会到了综合学习系统的易用性与易学性,这一期我们将一起学习12864点阵型液晶显示屏的基本原理与使用方法。
点阵LCD的显示原理
& & 在数字电路中,所有的数据都是以0和1保存的,对LCD控制器进行不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。
&&&&那么,得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模的记载方式如图1所示:
图1 &A&字模图
& & 而中文的&你&在字模中的记载却如图2所示:
图2 &你&字模图
12864点阵型LCD简介
& & 12864是一种图形点阵液晶显示器,它主要由行驱动器/列驱动器及128&64全点阵液晶显示器组成。可完成图形显示,也可以显示8&4个(16&16点阵)汉字。
管脚功能描述
液晶显示器驱动电压
D/I=&H&,表示DB7∽DB0为显示数据
D/I=&L&,表示DB7∽DB0为显示指令数据
R/W=&H&,E=&H&数据被读到DB7∽DB0
R/W=&L&,E=&H&L&数据被写到IR或DR
R/W=&L&,E信号下降沿锁存DB7∽DB0
R/W=&H&,E=&H&DDRAM数据读到DB7∽DB0
H:选择芯片(右半屏)信号
H:选择芯片(左半屏)信号
复位信号,低电平复位
LCD驱动负电压
LED背光板电源
LED背光板电源
表1:12864LCD的引脚说明
& & 在使用12864LCD前先必须了解以下功能器件才能进行编程。12864内部功能器件及相关功能如下:
1. 指令寄存器(IR)
& & IR是用于寄存指令码,与数据寄存器数据相对应。当D/I=0时,在E信号下降沿的作用下,指令码写入IR。
2.数据寄存器(DR)
& & DR是用于寄存数据的,与指令寄存器寄存指令相对应。当D/I=1时,在下降沿作用下,图形显示数据写入DR,或在E信号高电平作用下由DR读到DB7∽DB0数据总线。DR和DDRAM之间的数据传输是模块内部自动执行的。
3.忙标志:BF
& & BF标志提供内部工作情况。BF=1表示模块在内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。
&&&&利用STATUS READ指令,可以将BF读到DB7总线,从检验模块之工作状态。
4.显示控制触发器DFF
& & 此触发器是用于模块屏幕显示开和关的控制。DFF=1为开显示(DISPLAY OFF),DDRAM的内容就显示在屏幕上,DFF=0为关显示(DISPLAY OFF)。
&&&&DDF的状态是指令DISPLAY ON/OFF和RST信号控制的。
5.XY地址计数器
& & XY地址计数器是一个9位计数器。高3位是X地址计数器,低6位为Y地址计数器,XY地址计数器实际上是作为DDRAM的地址指针,X地址计数器为DDRAM的页指针,Y地址计数器为DDRAM的Y地址指针。
&&&&X地址计数器是没有记数功能的,只能用指令设置。
& & Y地址计数器具有循环记数功能,各显示数据写入后,Y地址自动加1,Y地址指针从0到63。
6.显示数据RAM(DDRAM)
& & DDRAM是存储图形显示数据的。数据为1表示显示选择,数据为0表示显示非选择。DDRAM与地址和显示位置的关系见DDRAM地址表。
7.Z地址计数器
& & Z地址计数器是一个6位计数器,此计数器具备循环记数功能,它是用于显示行扫描同步。当一行扫描完成,此地址计数器自动加1,指向下一行扫描数据,RST复位后Z地址计数器为0。
&&&&Z地址计数器可以用指令DISPLAY START LINE预置。因此,显示屏幕的起始行就由此指令控制,即DDRAM的数据从哪一行开始显示在屏幕的第一行。此模块的DDRAM共64行,屏幕可以循环滚动显示64行。
12864LCD的指令系统及时序
& & 该类液晶显示模块(即KS0108B及其兼容控制驱动器)的指令系统比较简单,总共只有七种。其指令表如表2所示:
显示起始行设置
列地址设置
表2:12864LCD指令表
各功能指令分别介绍如下。
显示开/关指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
当DB0=1时,LCD显示RAM中的内容;DB0=0时,关闭显示。
2、显示起始行(ROW)设置指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
11显示起始行(0~63)
该指令设置了对应液晶屏最上一行的显示RAM的行号,有规律地改变显示起始行,可以使LCD实现显示滚屏的效果。
3、页(PAGE)设置指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
10111页号(0~7)
显示RAM共64行,分8页,每页8行。
4、列地址(Y Address)设置指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
01显示列地址(0~63)
设置了页地址和列地址,就唯一确定了显示RAM中的一个单元,这样MPU就可以
用读、写指令读出该单元中的内容或向该单元写进一个字节数据。
5、读状态指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
BUSY0ON/OFFREST0000
该指令用来查询液晶显示模块内部控制器的状态,各参量含义如下:
BUSY:1-内部在工作0-正常状态
ON/OFF:1-显示关闭0-显示打开
RESET:1-复位状态0-正常状态
在BUSY和RESET状态时,除读状态指令外,其它指令均不对液晶显示模块产生作用。
在对液晶显示模块操作之前要查询BUSY状态,以确定是否可以对液晶显示模块进行操作。
6、写数据指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
读数据指令
DB7 DB6 DB5 DB4 DB3DB2DB1 DB0
读显示数据
&&&&读、写数据指令每执行完一次读、写操作,列地址就自动增一。必须注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要读的单元中的数据。
12864点阵型LCD软硬件设计实例
&&&&通过以上学习,现在就来实际应用12864LCD的软硬件设计。本实例将在LCD上显示如图3所示内容:
图3 模拟显示效果图
&&&&在调试前先将显示切换开关切换到LCD显示状态。
图4 128*64LCD实验演示图
硬件原理图
图5 硬件原理图
程序流程图
图6 软件流程图
& & 在编写软件代码之前必须要先掌握汉字取模的方法。要得到上表中的文字,我们可以借助取模软件来完成。目前点阵LCD的取模软件有很多,我们以本开发板配套的取模软件为例来介绍一下汉字的取模方法。
&&&&打开取模软件出现如下显示界面:
&&&&在文字输入区中输入文字,我们以输入一个欢迎的&欢&字为例,了解其取模过程。在文字输入区中输入&欢&后按CTRL+ENTER组合键后就看到&欢&字已经在模拟显示区显示出来了
&&&&在&取模方式&中选择&C51格式&就可以在&点阵生成区&得到你要的汉字&欢&的显示代码。
&&&&经过以上步骤后一个汉字就取模成功了,在程序中只要调用这段代码就可显示出汉字&欢&了,其它汉字也用同样的方法。取完要显示的全部汉字代码后我们就可以编程了。
相关文章:
较新发布:
(C) 杭州晶控电子有限公司 版权所有
HANGZHOU KinCony ELECTRONICS CO.,LTD关于单片机控制LCD1602显示屏_单片机吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:149,245贴子:
关于单片机控制LCD1602显示屏收藏
本人新手,想让单片机每接收到一个信号就让显示屏改变一次显示内容。自己尝试改了一下淘宝店家给显示屏的程序,但是失败了T_T。想问问有没有人有类似的程序可以发我一下么?(^_^)感激不尽。或者详细说一下思路也可以
专业从事单片机开发的生产,具有高品质的研发团队和设备,产品高品质保证,10年生产开发经验.
单片机是at89c52rc
一般都是每次用清屏命令,然后直接写数据。第一行写满的位置之后,连续加若干空格,直到达到0X40地址,就开始从第二行显示了。这样每次刷屏显示一次,不会占用太多MCU时间,然而RAM就消耗较多。
比较简单。
注意协议,底部文件最好自己写
我有一个程序就是无线传输,用的是24l01模块,就是用电脑键盘打字,另一端的屏幕显示对应的字符,无线连接的
楼楼调试的怎么样了,可以发一下程序吗
楼楼调试的怎么样了,可以发一下程序吗
我对点阵式液晶屏比较熟悉可以找我聊聊
登录百度帐号 上传我的文档
 下载
 收藏
粉丝量:31
该文档贡献者很忙,什么也没留下。
 下载此文档
基于51单片机的液晶显示屏控制系统设计毕业设计
下载积分:3800
内容提示:基于51单片机的液晶显示屏控制系统设计毕业设计
文档格式:DOC|
浏览次数:126|
上传日期: 03:13:18|
文档星级:
全文阅读已结束,如果下载本文需要使用
 3800 积分
下载此文档
该用户还上传了这些文档
基于51单片机的液晶显示屏控制系统设计毕业设计
关注微信公众号四糸乃狂热爱好者 个人网站www.imguodong.com投稿:26粉丝:2716分享--dynmicweibozoneqqbaidu将视频贴到博客或论坛视频地址复制嵌入代码复制微信扫一扫分享收藏0硬币--稍后看马克一下~用手机看转移阵地~用或其他应用扫描二维码手机下视频请使用扫码若未安装客户端,可直接扫此码下载应用看过该视频的还喜欢miniOFF

我要回帖

更多关于 单片机液晶显示屏程序 的文章

 

随机推荐