文档库 最新最全的文档下载
当前位置:文档库 › LCD1602液晶显示器设计

LCD1602液晶显示器设计

LCD1602液晶显示器设计
LCD1602液晶显示器设计

LCD1602液晶显示课程设计

第一章绪论

1.1课题背景

当今时候是一个信息化的时代,信息的重要性不言而喻的,获取手段显得尤其重要。人们所接受的信息有70%来自于人的视觉,无论用何种方式获取的信息最终需要有某种显示方式来表示。在当代显示技术中,主流的有LED显示屏和LCD液晶显示,而在这些显示技术中,尤其以液晶显示器LCD(Liquid crystal display)为代表的平板显示器发展最快,应用最广。LCD是典型的发光器件,它一材料科学为基础,综合利用了精密机械,光电及计算机技术,并正在微机械,微光学,纤维光学等前沿领域研究基础上,向高集成化,智能化方向发展。

液晶显示技术发展迅猛,市场预测表明,液晶显示平均年销售呈增长10%~13%,不久的将来有可能取代CRT,成为电子信息产品的主要显示器件,另外,液晶显示器对空间电磁辐射的干扰不敏感,且在紧凑的仪器空间不需要专门的屏蔽保护,因而课大大简化仪器的结构和制造成本,在各种便携式仪器,仪表将会越来越广泛的应用。特别是在电池供电的单片机产品中,液晶显示更是必选的显示器件。

1.2课题设计目标

本设计是基于AT89C51芯片单片机为主控芯片,结合1602液晶显示模板等外围电路,通过软件程序,来实现液晶显示英文字母。本次设计的目的在于利用单片机和IIC技术来显示英文字母。

1.3课程设计的主要工作

(1)对系统的各个模块的各个功能进行深入分析和研究,在对课题所采用的方案进行可行详细的研究后设计具体功能电路。

(2)熟悉所选芯片的功能并完成具体电路设计。

(3)对系统的最终指标进行测试,针对系统的不足,进行分析并提出一些改正方法。

1.4 设计要求

(1)运行IIC总线技术。

(2)循环显示字母。

第二章硬件设计

2.1 LCD1602简介

2.1.1 LCD1602引脚功能

LCD1602引脚如图2.1所示

图2.1 LCD1602引脚图

引脚图的功能如表2—1所示

表2—1引脚功能图2.1.2 LCD1602显示模指令集

(1)清屏

(2)归位

(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 数据读出。

2.2 IIC总线

IIC 总线是PHILIPS公司推出的两线式串行总线。用于连接微控制器及其外围设备。IIC 总线产生于在80 年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

2.2.1 IIC 总线的特点

(1) 只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL。

(2) 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址;主机可以作为主发送器或主机接收器。

(3) 它是一个真正的多主机总线,如果两个或更多主机同时初始化数据

传输可以通过冲突检测和仲裁防止数据被破坏。

(4) 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s快速模式下可达400kbit/s高速模式下可达4Mbit/s。

(5) 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整。

(6) 连接到相同总线的IC数量只受到总线的最大电容400pF限制。

2.2.2 IIC协议总线信号时序

(1)数据的有效性

SDA线上的数据必须在时钟的高电平周期保持稳定数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。如图2.2 IIC总线的位传输所示。

图2.2 IIC总线的为传输

(2)起始和停止条件

在IIC总线中唯一出现的是被定义为起始(S)和停止(P)条件(见图2.3)的情况。其中一种情况是在SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件。当SCL是高电平时SDA线由低电平向高电平切换表示停止条件。

起始和停止条件一般由主机产生,总线在起始条件后被认为处于忙的状态。在停止条件的某段时间后,总线被认为再次处于空闲状态。如果产生重复起始(Sr)条件而不产生停止条件,总线会一直处于忙的状态,此时的起始条件(S)和重复起始(Sr)条件在功能上是一样的。因此在本文档的剩余部分,符号(S)将作为一个通用的术语既表示起始条件又表示重复起始条件,除非有特别声明的(Sr)。

如果连接到总线的器件合并了必要的接口硬件,那么用它们检测起始和停止条件十分简便。但是,没有这种接口的微控制器在每个时钟周期至少要采样SDA线两次来判别有没有发生电平切换。

图2.3起始和停止条件

(3)总线空闲状态

SDA 和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线,两条信号线各自的上拉电阻把电平拉高。

(4)数据传输与应答信号ACK

发送到SDA 线上的数据必须是8 位的。每次传输可以发送的数据不受限制。每个字节后必须在时钟的第9 个脉冲期间释放数据总线(SDA为高),由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收。如图2.4 IIC 总线响应。

图2.4IIC总线响应

首先传输的是数据的最高位(MSB)。如果从机要完成一些其他功能后(例如一个内部中断服务程序)才能接收或发送下一个完整的数据字节,可以使时钟SCL 保持低电平迫使主机进入等待状态。当从机准备好接收下一个数据字节并释放时钟线SCL后,数据传输继续。如图2.5 IIC总线数据传输所示。

图2.5IIC总线数据传输

2.2.3 IIC总线器件寻址方式

IIC 总线上的器件是共用总线的,因此,主器件在进行数据传输前要选择通信的从器件,即进行总线寻址。总线上的所有器件都有唯一的地址,由器件地址和引脚地址两部分构成,共7位。引脚地址由IIC总线外围器件的地址引脚(A2、A1、A0)决定的。

数据的传输遵循如图2.6 完整的数据传送所示,在起始条件之后,发送一个7 位的从机地址,紧接着第8 位是数据方向(R/ W),0-表示发送数据(写),1-表示接收数据(读)。数据传输一般由主机产生的停止位(P)终止。但是如果主机仍希望在总线上通讯,它可以产生重复起始条件(Sr),和寻址另一个从机,而不是首先产生一个停止条件。在这种传输中,可能有不同的读/写格式结合。如图2.6 IIC 总线完整的数据传输。

图2.6 IIC总线的数据传输

2.3 系统电路图

系统的电路图如2.7 所示:

运行状况如图2.8:

图2.9 运行状态

第三章软件设计

3.1系统框图

本课题的程序设计是在C语言的基础之上的,可分为两大模块,分别是:(1)IIC协议;(2)LCD显示。

程序总体框图如图3.1 所示:

图3.1总程序框图LCD 显示程序框图如图3.2 所示:

图3.2LCD显示程序框图3.2 程序清单

(一)

#include

#include

#define uint unsigned int

#define uchar unsigned char

uchar code display_1[]={"good morning"};

uchar code display_2[]={"miss you"};

sbit lcden=P3^4;

sbit lcdrs=P3^5;

//sbit lcdrw=P3^6;

uchar num;

uint i=0;

void delayms(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void write_com(uchar com) {

lcdrs=0;

lcden=0;

P0=com;

delayms(5);

lcden=0;

lcden=1;

delayms(5);

lcden=0;

}

void write_data(uchar date) {

lcdrs=1;

P0=date;

delayms(5);

lcden=0;

lcden=1;

delayms(5);

lcden=0;

}

void init()

{

lcden=0;

write_com(0x38);

write_com(0x0f);

write_com(0x06);

write_com(0x01);

}

void main()

{

init();

//lcdrw=0;

write_com(0x80+0x1a);

while(display_1[i]!='\0')

{

write_data(display_1[i]);

i++;

delayms(5);

}

write_com(0x80+0x5f);

for(num=0;num<10;num++) {

write_data(display_2[num]);

delayms(5);

}

for(num=0;num<16;num++) {

write_com(0x18);

delayms(100);

}

while(1);

}

(二)

/*********************************************************** *****************

* File: main.c

* 功能:向LCD输出HelloWorld

*********************************************************** *****************/

#include "config.h"

#define rs (1<<8)

#define rw (1<<9)

#define en (1<<10)

#define busy (1<<7)

uint8 txt[]={"HelloWorld"};

/*********************************************************** *****************

* 名称:ChkBusy()

* 功能:检查总线是否忙

*********************************************************** *****************/

void ChkBusy()

{

IODIR=0x700;

while(1)

{

IOCLR=rs;

IOSET=rw;

IOSET=en;

if(!(IOPIN & busy))break;

IOCLR=en;

}

IODIR=0x7ff;

}

/*********************************************************** *****************

* 名称:WrOp()

* 功能:写函数

*********************************************************** *****************/

void WrOp(uint8 dat)

{

ChkBusy();

IOCLR=rs; //全部清零

IOCLR=rw;

IOCLR=0xff; //先清零

IOSET=dat; //再送数

IOSET=en;

IOCLR=en;

}

/*********************************************************** *****************

* 名称:WrDat()

* 功能:写数据函数

*********************************************************** *****************/

void WrDat(uint8 dat)

{

ChkBusy();

IOSET=rs;

IOCLR=rw;

IOCLR=0xff; //先清零

IOSET=dat; //再送数

IOSET=en;

IOCLR=en;

}

/*********************************************************** *****************

* 名称:lcd_init()

* 功能:lcd初始化函数

*********************************************************** *****************/

void lcd_init(void)

{

WrOp(0x38);

WrOp(0x06); //光标加1

WrOp(0x0c); //开显示

}

/*********************************************************** *****************

* 名称:DisText()

* 功能:显示文本函数

*********************************************************** *****************/

void DisText(uint8 addr,uint8 *p)

{

WrOp(addr);

while(*p !='\0')WrDat(*(p++));

}

/*********************************************************** *****************

* 名称:main()

* 功能:显示文本

*********************************************************** *****************/

int main(void)

{

lcd_init();

IODIR=0x7ff; //设置为输出

IOCLR=0x7ff;

DisText(0x86,txt);

while(1);

}

/**--------------文件信息-------------------------------------------------------------------------------- **文件名: target.c

**描述: lpc210x(飞利浦的ARM)目标板特殊的代码,包括异常处理程序和目标板初始化程序

** 每个工程应当具有这个文件的拷贝,用户根据程序的需要修改本文件。

**注意:本文件必须以ARM(32位代码)方式编译,否则,必须更改init.s和vector.s文件

** 别的C代码不必使用ARM(32位代码)方式编译*********************************************************** *********************************************/

#define IN_TARGET

#include "config.h"

/*********************************************************** **********************************************

** 函数名称: IRQ_Exception

** 功能描述: 中断异常处理程序,用户根据需要自己改变程序

**

*********************************************************** *********************************************/

void __irq IRQ_Exception(void)

{

while(1); // 这一句替换为自己的代码}

/*********************************************************** **********************************************

** 函数名称: FIQ_Exception

** 功能描述: 快速中断异常处理程序,用户根据需要自己改变程序**

*********************************************************** *********************************************/

void FIQ_Exception(void)

{

while(1); // 这一句替换为自己的代码}

/*********************************************************** **********************************************

** 函数名称: TargetInit

** 功能描述: 目标板初始化代码,在需要的地方调用,根据需要改变

*********************************************************** *********************************************/

void TargetInit(void)

{

/* 添加自己的代码*/

}

/*********************************************************** **********************************************

** 函数名称: TargetResetInit

** 功能描述: 调用main函数前目标板初始化代码,根据需要改变,不能删除

*********************************************************** *********************************************/

void TargetResetInit(void)

{

/* 设置系统各部分时钟*/

/* PLLCON = 1;

#if ((Fcclk / 4) / Fpclk) == 1

VPBDIV = 0;

#endif

#if ((Fcclk / 4) / Fpclk) == 2

VPBDIV = 2;

#endif

#if ((Fcclk / 4) / Fpclk) == 4

VPBDIV = 1;

#endif

#if (Fcco / Fcclk) == 2

PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);

#endif

#if (Fcco / Fcclk) == 4

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器) 字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。这类液晶显示器通常 有16根接口线,下表是这16根线的定义。 字符型液晶接口说明 编号符号引脚说明编号符号引脚说明 1 Vss 电源地 9 D 2 数据线2 2 Vdd 电源正 10 D 3 数据线3 3 VL 液晶显示偏压信号 11 D 4 数据线4 4 RS 数据/命令选择端 12 D 5 数据线5 5 R/W 读/ 写选择端 13 D 6 数据线6 6 E 使能信号 14 D 7 数据线7 7 D0 数据线0 15 BLA 背光源正极 8 D1 数据线1 16 BLK 背光源负极(本学习板配的 内部已经接地) 下图是字符型液晶显示器与单片机的接线图。这用了P0口的8根线作为液晶显示器的数据 线,用P20、P21、P22做为3根控制线。

字符型液晶显示器与单片机的接线图 字符型液晶显示器的使用,字符型液晶显示器一般采用HD44780芯片做为控制器的。 1.字符型液晶显示器的驱动程序 这个驱动程序适用于1602型字符液晶显示器, 1) 初始化液晶显示器命令(RSTLCD) 设置控制器的工作模式,在程序开始时调用。 参数:无。 2) 清屏命令(CLRLCD) 清除屏幕显示的所有内容 参数:无 3) 光标控制命令(SETCUR) 用来控制光标是否显示及是否闪烁 参数:1个,用于设定显示器的开关、光标的开关及是否闪烁。 4) 写字符命令(WRITECHAR) 在指定位置(行和列)显示指定的字符。

参数:共有3个,即行值、列值及待显示字符,分别存放在XPOS、YPOS和A中。其中行值与列值均从0开始计数,A中可直接写入字符的符号,编译程序自动转化为该字符的ASCII 值。 5) 字符串命令(WRITESTRING) 在指定位置显示指定的一串字符。 参数:共有3个,即行值、列值和R0指向待显示字符串的内存首地址,字符串须以0结尾。如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下 行显示出来。 以下是驱动源程序 ;************************************************** ;连线图: ; DB0---DPROT.0 DB4---DPROT.4 RS-------------P2.0 ; DB1---DPROT.1 DB5---DPROT.5 RW-------------P2.1 ; DB2---DPROT.2 DB6---DPROT.6 E--------------P2.2 ; DB3---DPROT.3 DB7---DPROT.7 VLCD接1K电阻到GND* ;系统晶振为11.0592 ;************************************************** RS BIT P2.0 RW BIT P2.1 E BIT P2.2 DPORT EQU P0 XPOS EQU R1 ;列方向地址指针 YPOS EQU R2 ;行方向地址指针 CUR EQU R3 ;设定光标参数 NoDisp EQU 0 ;无显示 NoCur EQU 1 ;有显示无光标 CurNoFlash EQU 2 ;有光标但不闪烁 CurFlash EQU 3 ;有光标且闪烁

单片机+LCD1602液晶显示字符串

1602液晶显示字符串(附带程序)(注意说明:使用的实验板是郭天祥老师的52单片机板)

基本操作电路 状态字说明 RAM地址映射图

初始化相关指令的意思 读时序图

写时序图

要想通过1602液晶来显示你想要显示字符串,其实是很简单的,程序虽然有点长,但是都是按照步骤来的。 1602的五大步骤 第一个步骤: 检查LCD忙状态 lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。第二个步骤: 写指令数据到LCD RS=L,RW=L,E=高脉冲,D0-D7=指令码。 第三个步骤: 写显示数据到LCD RS=H,RW=L,E=高脉冲,D0-D7=数据。 第四个步骤: 设定显示位置 第五个步骤: LCD初始化设定 只要这五步你弄懂了,什么样的字符串都可以按照你的方式显示。至于这其中的步骤的具体的方式,我们就要参照1602的资料和时序图!不过你大可不必,这份文档就足够了! #include #include #define uchar unsigned char #define uint unsigned int

sbit dula=P2^6; sbit wela=P2^7; sbit LCD_RS = P3^5; sbit LCD_RW = P3^6; sbit LCD_EN = P3^4; uchar code dis1[] = {" WLCOME TO "}; uchar code dis2[] = {" JIANG GAN HUA "}; uchar code dis3[] = {" NAN CHANG "}; uchar code dis4[] = {" HANG KONG DX"}; void delay(int ms) { int i; while(ms--) { for(i = 0; i< 110; i++) { _nop_(); } } } 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; } void lcd_wcmd(uchar cmd) { while(lcd_busy()); LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); P0 = cmd;

LCD1602驱动详解

一.接口 LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不了解,不能随心所欲地对它进行驱动。经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD16 02的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。如图1所示:

图1 再来一张它的背面的,如图2所示:

图2它的16条引脚定义如下:

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。或同样阻值的RM065/RM063蓝白可调电阻。见图3。 图3 4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电 平时,选择命令;当RS为高电平时,选择数据。 5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态 或数据。如果不需要进行读取操作,可以直接将其接VSS。 6. E,执行命令的使能引脚,接单片机的一个I/O。 7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意 的8个I/O口。如果接P0口,P0口应该接4.7K—10K的上拉电阻。如果是4线并行驱动,只须接4个I/O口。 8. A背光正极,可接一个10—47欧的限流电阻到VDD。 9. K背光负极,接VSS。见图4所示。

1602液晶字符显示

1602液晶字符显示

1.基本简介 LCD1602工业字符型液晶,能够同时显示16x02即32个字符。(16列2行) 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方

便地应用于市面上大部分的字符型液晶。 2.管脚功能 1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VCC接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。 第7~14脚:D0~D7为8位双向数据端。 第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 ⑶特性 3.3V或5V工作电压,对比度可调

LCD1602高手使用详解

LCD1602高手使用详解 前面总算走完了对AVR MEGA16这块单片机的一些基本的应用方式了,这时候大家对AVR的一些内部资源比如定时器,ADC,最主要的IO口的使用方式应该有了一个虽比较粗浅但是却比较形象的认识了。这节我们来看使用单片机的另外一大主题,就是用单片机来实现芯片控制。 在前面的数码管显示一文中,就已经涉及到了用单片机来控制芯片为我们工作,CEPARK AVR开发板,为了达到增强驱动能力和节省IO口的作用,运用了移位寄存器74HC595来驱动两个四位八段数码管,是一个十分有创意的设计。但是前面的内容重心还是集中于对AVR的IO口的控制,所以,我们从这节开始要正式逐渐深入的接触各种芯片了。 先做个引子。单片机是一种微控制器,本身内部集成了数种资源比如CPU、内存、内部和外部总线系统,目前大部分还会具有外存。他的主要任务是利用各种资源实现电平控制,可以以此控制与它相连的下级系统,广泛用于工业自动控制领域。 我们就从这句话出发,首先单片机用来做控制用的,而且是利用的是本身的内部资源。但是,它的功能再强大,资源再丰富也总有一个上限,总有枯竭的一天。所以我们常常利用单片机外接芯片来弥补或者增强单片机的功能来完成我们所需功能的电路。比如程序存储器不足,可以外接外部存储器,比如单片机内部中断级不足,可以外接中断控制器等等。大家可以从这个角度来理解芯片控制的意义罢。 今天我们用AVR单片机来实现对LCD1602液晶显示芯片的控制。 首先从这个名字讲起,LCD:英文全称为Liquid Crystal Display,即为液态晶体显示,也就是我们常说的液晶显示了。(平时老说LCDLCD,可能大家也都不怎么注意过这个全称吧,呵呵,当增加词汇量了)1602则是表示这个液晶一共能显示2行数据,每一行显示16个字符。这个就是LCD1602的全部来由。 液晶显示的使用有多广泛我就不多说了,LCD1602好像10元左右就可以拿到了的,不算贵。我们来看看现在市面都有哪些样子的1602,下面从网上搜罗了几个(我手上的这个是蓝色背光白色字体的):

LCD1602液晶显示器设计

LCD1602液晶显示课程设计 第一章绪论 1.1课题背景 当今时候是一个信息化的时代,信息的重要性不言而喻的,获取手段显得尤其重要。人们所接受的信息有70%来自于人的视觉,无论用何种方式获取的信息最终需要有某种显示方式来表示。在当代显示技术中,主流的有LED显示屏和LCD液晶显示,而在这些显示技术中,尤其以液晶显示器LCD(Liquid crystal display)为代表的平板显示器发展最快,应用最广。LCD是典型的发光器件,它一材料科学为基础,综合利用了精密机械,光电及计算机技术,并正在微机械,微光学,纤维光学等前沿领域研究基础上,向高集成化,智能化方向发展。 液晶显示技术发展迅猛,市场预测表明,液晶显示平均年销售呈增长10%~13%,不久的将来有可能取代CRT,成为电子信息产品的主要显示器件,另外,液晶显示器对空间电磁辐射的干扰不敏感,且在紧凑的仪器空间不需要专门的屏蔽保护,因而课大大简化仪器的结构和制造成本,在各种便携式仪器,仪表将会越来越广泛的应用。特别是在电池供电的单片机产品中,液晶显示更是必选的显示器件。 1.2课题设计目标 本设计是基于AT89C51芯片单片机为主控芯片,结合1602液晶显示模板等外围电路,通过软件程序,来实现液晶显示英文字母。本次设计的目的在于利用单片机和IIC技术来显示英文字母。 1.3课程设计的主要工作 (1)对系统的各个模块的各个功能进行深入分析和研究,在对课题所采用的方案进行可行详细的研究后设计具体功能电路。 (2)熟悉所选芯片的功能并完成具体电路设计。

(3)对系统的最终指标进行测试,针对系统的不足,进行分析并提出一些改正方法。 1.4 设计要求 (1)运行IIC总线技术。 (2)循环显示字母。 第二章硬件设计 2.1 LCD1602简介 2.1.1 LCD1602引脚功能 LCD1602引脚如图2.1所示 图2.1 LCD1602引脚图 引脚图的功能如表2—1所示

lcd1602使用说明

1602采用标准的16脚接口,其中: 第1脚:VSS为地电源 第2脚:VDD接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15~16脚:空脚

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如表1所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 1602液晶模块内部的控制器共有11条控制指令,如表2所示,

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平) 指令1:清显示,指令码01H,光标复位到地址00H位置 指令2:光标复位,光标返回到地址00H 指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效 指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标

LCD1602等液晶屏使用注意事项

LCD1602等液晶屏使用注意事项 很多人都在使用LCD1602等液晶做显示,结合我自己使用的体会,说几点: 一、为什么开机后,程序中写的开机菜单(如logo等)没有显示就直接进入后面的代码,而且极容易出现满屏乱码? 答:系统的电源从上电到稳定要有几十毫秒甚至更长的时间,这段时间极易使单片机程序走乱,或者开始几行代码没有正确执行。解决的方法是在配置位(--CONFIG())中一定要加入上电定时使能位:PWR TEN。这样就可以使得单片机在上电时的72MS内保持复位状态,避免由于电压还未稳定而发生程序执行错误等问题。 二、程序可以正确执行,也能正确显示,但运行一段时间后,在字符间隔的空白处会出现乱码,如何解决? 答:这可能是干扰所导致的,可以这样解决:在字符间隔的空白处,要写入空格符补齐(注意:空格也是字符!),如数组里的字符串,即使不足16位,后面也要用空格补齐到16位。其他没有字符的空白处,同样要写入空格,总的原则是:所有字符间隔的空白处,一定不要使它们处于游离状态! 三、为什么在清屏之后的显示内容上,往往会缺失第一行前面的几个字符? 答:清屏是要耗时的。因此在清屏命令之后一定要安排一条延时50MS以上的命令,不然因为延时不够,单片机来不及,就会使得第一行前面几个字符来不及写。形成空格,或所有字符都会退后几个位置。 四、为什么屏幕上显示的字符和程序中设定的位置不同,如退后几格? 答:仍然是要正确的安排延时的问题。很多朋友的程序可能是引用书上或网上下的,这时要特别注意的是:原来使用的晶振的频率和你现在使用的晶振是否一致? 举一例:如果原来的程序是在4M时用的,那你引用后是在8M中使用,那所有的延时函数的时间都不对了(延时时间减少了一半!),LCD1602在使用中,很多地方都安排有延时,如果延时时间不够,就不能正确显示。解决的办法是重新修改延时函数的值,使之符合要求。 五、程序可以正确执行,也能正确显示,但连续运行一段时间后(可能几个小时到几天),显示屏上原来正确显示的字符会变成乱码。如何解决? 答:有些人喜欢将屏幕上一成不变的的那些字符,写在大循环之前,即一次写成之后,永远不再改变,这样做从道理上说并无问题,程序也比较简单明了。但是如果长时间运行,可能遇到干扰等原因,会使个别字符出现乱码。我的做法是在大循环中,安排一定的时间刷新一次屏幕(重写一次),这样即使因干扰出现乱码,也能及时更新。刷新的安排有多种方法:如安排在更新数据的同时更新那些不变的字符,比如温度显示,(如28*C)温度值是不断更新的,但*C是永远不要更新的。实际上程序中可能还有其他功能,

lcd1602时序

前面总算走完了对AVR MEGA16这块单片机的一些基本的应用方式了,这时候大家对AVR的一些内部资源比如定时器,ADC,最主要的IO口的使用方式应该有了一个虽比较粗浅但是却比较形象的认识了。这节我们来看使用单片机的另外一大主题,就是用单片机来实现芯片控制。 在前面的数码管显示一文中,就已经涉及到了用单片机来控制芯片为我们工作,CEPARK AVR开发板,为了达到增强驱动能力和节省IO口的作用,运用了移位寄存器74HC595来驱动两个四位八段数码管,是一个十分有创意的设计。但是前面的内容重心还是集中于对AVR的IO口的控制,所以,我们从这节开始要正式逐渐深入的接触各种芯片了。 先做个引子。单片机是一种微控制器,本身内部集成了数种资源比如CPU、内存、内部和外部总线系统,目前大部分还会具有外存。他的主要任务是利用各种资源实现电平控制,可以以此控制与它相连的下级系统,广泛用于工业自动控制领域。 我们就从这句话出发,首先单片机用来做控制用的,而且是利用的是本身的内部资源。但是,它的功能再强大,资源再丰富也总有一个上限,总有枯竭的一天。所以我们常常利用单片机外接芯片来弥补或者增强单片机的功能来完成我们所需功能的电路。比如程序存储器不足,可以外接外部存储器,比如单片机内部中断级不足,可以外接中断控制器等等。大家可以从这个角度来理解芯片控制的意义罢。 今天我们用AVR单片机来实现对LCD1602液晶显示芯片的控制。 首先从这个名字讲起,LCD:英文全称为Liquid Crystal Display,即为液态晶体显示,也就是我们常说的液晶显示了。(平时老说LCDLCD,可能大家也都不怎么注意过这个全称吧,呵呵,当增加词汇量了)1602则是表示这个液晶一共能显示2行数据,每一行显示16个字符。这个就是LCD1602的全部来由。 液晶显示的使用有多广泛我就不多说了,LCD1602好像10元左右就可以拿到了的,不算贵。我们来看看现在市面都有哪些样子的1602,下面从网上搜罗了几个(我手上的这个是蓝色背光白色字体的): 其实显而易,见也就是背光和字体的颜色不一样罢,不过老实说,蓝色背光的1602看上去显得确实比较亮,也许是人眼视觉的关系。 接下来进入LCD1602使用的重点:操作时序。操作时序永远使用是任何一片IC 芯片的最主要的内容。一个芯片的所有使用细节都会在它的官方器件手册上包含。所以使用一个器件事情,要充分做好的第一件事就是要把它的器件手册上有

LCD1602显示屏地驱动设置及例程

LCD1602显示屏的驱动设置及例程 一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。我手里这块LCD1602的型号是HJ1602A,是绘晶科 技公司的产品,它有16条引脚。如图1所示: 图1 再来一张它的背面的,如图2所示: 引脚号符号引脚说明引脚号符号引脚说明 1 VSS 电源地9 D 2 数据端口 2 VDD 电源正极10 D 3 数据端口 3 VO 偏压信号11 D 4 数据端口 4 RS 命令/数据12 D 5 数据端口 5 RW 读/写13 D 6 数据端口 6 E 使能14 D 7 数据端口 7 D0 数据端口15 A 背光正极

图3

图4 二.基本操作 LCD1602的基本操作分为四种: 1. 读状态:输入RS=0,RW=1,E=高脉冲。输出:D0—D7为状态字。 2. 读数据:输入RS=1,RW=1,E=高脉冲。输出:D0—D7为数据。 3. 写命令:输入RS=0,RW=0,E=高脉冲。输出:无。 4. 写数据:输入RS=1,RW=0,E=高脉冲。输出:无。 读操作时序图(如图5): 图5 写操作时序图(如图6):

图6 时序时间参数(如图7): 图7 三.DDRAM、CGROM和CGRAM DDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下(如图8): 图8 DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。同样LCD1602共有80个字节的显存,即DDRAM。但L CD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

LCD1602字符测试显示程序与仿真

#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int uchar code table1 []={" WELCOME "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 //************管脚定义************************ sbit lcd_rs = P3^0; //液晶数据命令选择端 sbit lcd_en = P3^1; //液晶使能 //************参数定义************************ uint tvalue;//温度值 uchar tflag;//温度正负标志 uchar data disdata[5]; //************子函数定义************************ void delay(uchar z); //delay延时子程序 void init_lcd(); //LCD1602初始化函数 void write_com(uchar com); //LCD1602写指令函数 void write_data(uchar date); //LCD1602写数据函数 void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数 void welcome_1(); //LCD1602显示欢迎函数1 //************主函数************************ void main() { welcome_1(); delay(200); while(1); } //************delay延时子程序************************ void delay(uchar z)

LCD1602显示控制器设计

EDA技术课程设计 题目 LCD1602显示控制器设计 系 (部) 班级 姓名 学号 指导教师 2014 年06 月 30 日至 07 月 06 日共 1 周2014年07月02日

课程设计成绩评定表

目录 目录 (3) 1 引言 (4) 2 VHDL/ QuartusII简介 (5) 3 系统设计 (6) 3.1 整体功能 (6) 3.2 各模块功能设计 (6) 3.2.1 功能 (6) 3.2.2 模块引脚 (6) 3.2.3 程序 (7) 3.2.4 仿真图 (12) 4 系统调试及下载......................................................................................... 错误!未定义书签。 5 设计总结 (14)

1 引言 通过对LCD1602/LCD12864显示模块控制时序和指令集的对比分析,利用Verilog HDL描述语言完成了多功能LCD显示控制模块的IP核设计,所设计的LCD显示控制器具有很好的可移植性,只需通过端口的使能参数配置便可以驱动LCD1602/LCD12864模块实现字符或图形的实时显示,并且该多功能LCD控制器的可行性也在CycloneⅡ系列的EP2C5T144C8 FPGA芯片上得到了很好的验证。基于FPGA设计 LCD显示控制器,关键在于采用硬件描述语言设计有限状态机(FSM)来控制LCD模块的跳转,文献中就是使用FSM实现了对LCD模块的显示控制,但是它们都是针对一种类型LCD模块的某种显示模式,不具有多模式的显示控制能力。因此,多功能LCD显示控制器的有限状态机就需要设置更多的条件转换,来实现多种控制模式。系统上电后,首先完成持续大约0.1 s(根据时钟频率配置)的自动复位,然后才根据模块的端口参数选择不同显示模式所对应的初始化命令,在状态机中设置有初始化命令、起始行地址和屏显示数据3条转换路径来适应LCD屏的工作状态,同时也在关键转换路径上设置有可以配置的延时循环,这样既能方便LCD模块的工作调试,又能使LCD模块一直工作在写屏模式(RW=0)。对于LCD屏的显示数据存储可以完全采用FPGA内嵌的ROM/RAM单元实现,如果使用双口RAM(存储器读写独立)就能实现LCD模块的动态实时显示。

at89c51和LCD1602显示日期

#include <> #include <> #include <> // 定义控制信号端口 sbit RS=P3^2; sbit RW=P3^3; sbit E= P3^4; void lcd_init(); void delay100us(unsigned char t); void delay5us(unsigned char n); void delay1s(z); void disp(char tab[]); void lcd_zdy(char com,char tab[]); unsigned char lcd_r_start(); void lcd_w_cmd(unsigned char com); void lcd_w_dat(unsigned char dat); main() { char year[]="2017"; char month[]="05" ; char day[]="11" ; char nian[]={0x04,0x0F,0x72,0x0F,0x0A,0x1F,0x02,0x00}; char yue[]={0x1E,0x12,0x1E,0x12,0x1E,0x12,0x16,0x00}; char ri[]={0x1E,0x12,0x12,0x1E,0x12,0x12,0x1E,0x00}; char wish[]="happy day"; while(1) { char x; P1=0xff; // 送全1到P1口 lcd_init(); delay100us(255); lcd_zdy(0x40,nian); lcd_zdy(0x48,yue); lcd_zdy(0x50,ri); lcd_w_cmd(0x82); disp(year); lcd_w_dat(0x00); disp(month); lcd_w_dat(0x01); disp(day); lcd_w_dat(0x02); delay1s(2);

LCD1602的电路图和程序

MS 基于1602字符型液晶显示器的显示系统 姓名:杨越 班级:电子11-1 学号:110400104

一、实习目的 (1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。 (2)了解LCD1602的基本原理及用法。 (3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载 程序。 (4)能够熟练焊接电路板。 二、实验设备与器件 CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器, 三、实验内容 内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统 要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。 (1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号); 以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。 以下具体阐述这三个管脚: RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。 R/W为读写选择,高电平进行读操作,低电平进行写操作。 E端为使能端,后面和时序联系在一起。 除此外,D0~D7分别为8位双向数据线。 操作时序:

注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0. 读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作; 所以对控制器每次进行读写操作前,必须进行读写检测。(即后面的读忙子程序) 指令集: LCD_1602 初始化指令小结: 0x38 设置16*2显示,5*7点阵,8位数据接口 0x01 清屏 0x0F 开显示,显示光标,光标闪烁 0x08 只开显示 0x0e 开显示,显示光标,光标不闪烁 0x0c 开显示,不显示光标 0x06 地址加1,当写入数据的时候光标右移 0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变 0x18 光标和显示一起向左移动 (2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。主要功能模块包括:内部存储器,内部 PLL 锁相环模块,2 个异步串口通讯 SCI ,1个串行外设接口 SPI MSCAN 模块,1 个8 通道输入/输出比较定时器模块 TIM ,周期中断定时器模块 PIT ,16 通道 A/D 转换模块 ADC ,1 个 8 通道脉冲宽度调制模块 PWM ,输入/输出数字 I/O 口。

LCD1602液晶显示器简介

LCD1602液晶显示器简介 一概述 液晶(Liquid Crystal)是一种高分子材料,因其特殊的物理、化学、光学特性,广泛应用轻薄显示器上。 液晶显示器(Liquid Crystal Display,LCD)的主要原理是以电流刺激液晶分子产生点、线、面并配合背部灯管构成画面。 各种型号的液晶通常是按照显示字符的行数或液晶点阵的行、列数来命名。例如,1602表示每行显示16个字符,一共可以显示两行。这类液晶通常称为字符型液晶,只能显示ASCII码字符。12232表示液晶显示画面由122列、32行组成,共有122*32个点来显示各种图形。用户可以通过程序控制这些点中任何一个点显示或不显示,从而构成各种图形画面。因此,12232称为图形型液晶。 液晶体积小,功耗低,显示操作简单。但其有致命的弱点,即使用温度范围很窄。通用型液晶工作温度为0到+55摄氏度,存储温度为-20到+60摄氏度。 二 LCD1602 1 1602的外形尺寸(毫米) 2 主要技术参数

3接口信号说明 4 基本操作时序 4RAM地址映射图 控制器内部带有80B的RAM缓冲区。对应关系如下图所示。 向图中的00~0F、40~4F地址中的任意处写入显示数据时,液晶可立即显示出来;当写入到10~27或50~67地址时,必须通过移屏指令将他们一移入可显示区域方可正常显示。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示。

这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。 6状态字说明 说明:原则上每次对控制器进行读写操作前,都必须进行读写检测,确保STA7为0。实际上,由于单片机的操作速度慢于液晶控制器的反应速度,因此可以不进行检测,或只进行简短的延时即可。 7 指令说明 1602液晶模块内部的控制器共有11条控制指令。 (1)显示模式设置

基于FPGA的LCD1602原理综述

LCD1602的简单使用原理——跟大家分享我学习1602的总 结与体会 我的总结主要分为这几部分: ①LCD1602的硬件特性及引脚功能 ②LCD1602的时序特性 ③LCD1602的使用原理(包括带字库和不带字库的简要使用方法,控制显示指令) ④基于FPGA的LCD1602使用案例 Part 1. LCD1602的硬件特性及引脚功能 LCD1602顾名思义是一种02*16,即为两行十六列的液晶显示屏,液晶两行,每行可以显示16个字符,但是CGRAM及CGROM里面一共有160个字符,包括阿拉伯数字,英文字母大小写,常用符号及日文。每个字符对应于一个ASCII码值,在液晶显示屏上显示对应的字符时候,只需要将对应的ASCII码写到DDRAM中就好,详细的步骤会在下面细说。液晶板上排列着5*8的字符点阵,8行,每行5个点位,高电平1就是该点显示,低电平0就是该点不显示。 一、引脚功能: RS,R/W,E控制数据端口DB0~DB7,数据的命令的读写由控制端口控制,并通过数据端口传输。端口其他特性这里不再赘述,详细见1602液晶手册。O(∩_∩)O

二、硬件特性: ①CGRAM 和CGROM CGRAM:character generator ram CGROM:character generator rom CGRAM的地址空间: CGRAM的地址是0x40~0x7F, 64个地址空间,每个地址双字节,一共128字节,一个字符是8个字节,所以一共能显示8个自定义字符(每个双字节地址只有一个字节是被自定义字符数据写入的,另外个字节无效,因为CGARM的字符代码的规定,详细原因见下面) 字符对应的区位码如下图所示: CGRAM: 字符产生ram,用来存放用户自定义的字符,如上图的两条(1)~(8),区位码为0x00~0x0F.0x00~0x07对应于(1)~(8);0x08~0x0F对应于下一条(1)~(8),虽然看起来有16个地址,但是其实只要8个地址可用,CGRAM的“字符码”规定0~2为地址,3位无效,4~7位全为0,因此CGRAM的字符码等效为0000X111,X为无效位,最后三位的地址只要八个,所以实际能用的只有8个。 其他为CGROM中自带的字符,区位码从0x21~0x7F,以各自的ASCII码作为区位码表示的基本字符。 将自定义的字符字模数8*8据写入,字符数据有八行,每行八位点阵。 ②DDRAM DDRAM:data display ram数据显示存储器

LCD1602滚动显示

/******************************************************************************* * * 描述: LCD1602 滚动显示 * * 显示方式: * * 1、从左到右逐字显示,闪动二次,清屏。 * * 2、再从右到左逐字显示,闪动二次,清屏。 * * 3、周期性地重复上述显示方式。 * ******************************************************************************** / #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[] = {" https://www.wendangku.net/doc/3a1162888.html, "}; BYTE code dis3[] = {" OT EMOCLEW "}; BYTE code dis4[] = {" MOC.NIHCERP.WWW "}; delay(int ms) { // 延时子程序 int i; while(ms--) { for(i = 0; i< 250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } } BOOL lcd_bz() { // 测试LCD忙碌状态 BOOL result; LCD_RS = 0;

LCD1602显示全部字库字符

LCD1602显示全部字库字符、看门狗定时器测试 LCD1602液晶内含有192个字符字库,这个程序是分6屏进行显示,整个显示过程长约7秒,看门狗定时器设置时间为8.38秒,刚好显示完全部字符,修改看门狗就可以看到在显示中途重启,比较直观 LCD_E BIT P3.4 ;LCD片选 LCD_RS BIT P3.5 ;指令、数据位 LCD_RW BIT P3.6 ;读、写位 PORT EQU P0 ;端口定义 WDT_COUNT EQU 0E1H ;看门狗 START: LCALL LCD_INIT LCALL WDT_INIT MOV A,#01H ;清屏 LCALL WR_CMD DISP_LOOP: MOV R0,#06H ;循环计数器 MOV R1,#80H ;LCD地址计数器 MOV R2,#00H ;字符表指针计数器 MOV DPTR,#TAB WR_DAT_LOOP: MOV A,R1 ;地址命令 LCALL WR_CMD INC R1 ;地址加一 MOV A,R2 ;表指针 MOVC A,@A+DPTR LCALL WR_DA T LCALL DELAY100MS INC R2 ;表指针加一 CJNE R1,#90H,BIJIAO ;字符是否到16 MOV R1,#0C0H ;到16,换地址 BIJIAO: CJNE R1,#0D0H,WR_DAT_LOOP ;字符数是否到32 MOV R1,#80H ;地址回归 LCALL DELAY1S MOV A,#1B ;清屏 LCALL WR_CMD DJNZ R0,WR_DA T_LOOP MOV WDT_COUNT,#00110111B LJMP DISP_LOOP LCD_INIT: MOV A,#111000B ;8位总线 LCALL WR_CMD MOV A,#10B ;数据指针清零

基于51和PROTEUS的液晶显示屏LCD1602的使用

液晶显示屏1602的使用 一、L CD1602显示字符‘A’ 斧头帮2010-05-10 Proteus仿真图 C程序: /****************************************** 实例81:用LCD显示字符'A' *******************************************/ #include //包含单片机寄存器的头文件 #include //包含_nop_()函数定义的头文件 sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚 /***************************************************** 函数功能:延时1ms (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒

***************************************************/ void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; } /***************************************************** 函数功能:延时若干毫秒 入口参数:n ***************************************************/ void delay(unsigned char n) { unsigned char i; for(i=0;i

相关文档
相关文档 最新文档