基于msp430G2533的LCD1602液晶字符串循环显示课程设计策画

基于msp430G2533的LCD1602液晶字符串循环显示课程设计策画
基于msp430G2533的LCD1602液晶字符串循环显示课程设计策画

课程设计题目LCD1602液晶字符串循环显示学院

专业

班级

姓名

指导教师

2013 年 1 月15 日

课程设计任务书

学生姓名:专业班级:

指导教师:工作单位:

题目要求:

使用LaunchPad上的板上资源,外接1602液晶,编写程序使字符串在液晶上循环移动。

时间安排:

2014年元月1日~2014年元月17日下午17:30 指导教师签名:年月日

系主任(或责任教师)签名:年月日

目录

引言 (1)

1 课程设计要求 (2)

2 硬件电路 (3)

2.1 MSP430G2553单片机 (3)

2.1.1 MSP430G2553单片机特点 (3)

2.1.2 MSP430G2553单片机结构 (3)

2.1.3 MSP430G2553的时钟系统 (4)

2.1.4 I/O寄存器 (5)

2.2 LCD1602液晶屏 (5)

3 方案设计 (7)

3.1 设计方案 (7)

3.2 方案选择 (7)

4 程序设计 (8)

4.1 程序结构 (8)

4.2 主程序源程序 (8)

4.3 子程序源程序 (8)

4.4 子程序头文件 (12)

5 调试 (13)

5.1 CCSv5编译软件 (13)

5.2 调试过程 (13)

6 结束语 (15)

附录1:代码 (16)

附录2:实物图 (22)

参考文献 (23)

本科生课程设计成绩评定表 (24)

引言

本次课程设计旨在设计一个基于MSP430 系列微处理器的LCD1602液晶字符串循环移动。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正在以前所未见的速度被单片机智能控制系统所代替。单片机的使用随处可见,而人们的生活也越来越离不开单片机。

液晶是相态的一种,因为其特殊的物理、化学、光学特性,20世纪中叶开始被广泛应用在轻薄型的显示技术上液晶显示器也被广泛运用,也发挥着越来越大的作用。尽年来,液晶显示技术飞速发展,运用更加广泛。

本课程设计通过MSP430G2553单片机控制LCD1602液晶显示器实现一串字符循环移动。

1 课程设计要求

使用LaunchPad上的板上资源,外接1602液晶,编写程序使“Wuhan Uniwersity of Technology welcome You!”在液晶上循环移动显示。

2 硬件电路

2.1 MSP430G2553单片机

2.1.1 MSP430G2553单片机特点

MSP430G2系列是德州仪器近期推出的一款产品,在秉承MSP430超低功耗,高集成度的优点的同时,具有高性价比的特点。该系列被称为ValueLine,旨在以8位单片机的价格实现16位单片机的性能。MSP-EXP430Launchpad是TI推出的又一套用于MSP430和电路实验的开发板。除了学生自主创新实践外,LaunchPad开发板还可以用于本科低年级课程,如嵌入式C语言,电子技术基础,微机原理,单片机等课程的自主实验环节以及课程设计。该套开发板为单片机热爱者提供了一个很好的学习平台。

2.1.2 MSP430G2553单片机结构

如图所示是板载一颗MSP430G2553单片机的Launch Pad评估实验开发板:

图1Launch Pad评估实验开发板

板上额外资源:

(1)板载USB调试与编程仿真器接口,无驱动可安装

(2)支持所有采用DIP14和DIP20封装MSP430G2XX和MSP430F20器

(3)红绿两粒LED,两个按键

(4)配套两款电容触摸板

(5)所有管脚在板子两边引出

2.1.3 MSP430G2553的时钟系统

MSP430G2系列单片机的时钟系统需要支持系统低功耗运行的需要。通过对三个内部时钟信号的运用,用户可很容易的选择功耗最低,效率最高的系统时钟方案。在软件的控制下,MSP430G2系列单片机运行时可以不接外接晶振,也可接一只外接电阻或者接一到两只外接晶振,也可以外接频率发生器。

基本时钟模块包括二至四个时钟源:

LFXT1CLK:外接低频或高频振荡器,如手表晶振,频率发生器,外部时钟源(400kHz至16MHz).

XT2CLK:外接高频晶振,范围在400kHz至16MHz

DCOCLK:内部时钟震荡

VLOCLK:内部低频低功耗晶振,标准频率是12kHz 三种时钟信号可被CPU和外设所使用:

ACLK:辅助时钟,ACLK可被软件配置成从LFXT1CLK或VLOCLK输入震荡ACLK可以被1,2,4,8分频。ACLK可以被选用作为外围模块的时钟输入。

MCLK:主时钟,主时钟可以从LFXT1CLK或VLOCLK,XT2CLK或DCOCLK 输入MCLK用在CPU系统之中。

SMCLK:辅助主时钟。SMCLK可被选择从LFXT1CLK,VLOCLK,XT2CLK 或DCOCLK输入。SMCLK可以被1,2,4,8分频。SMCLK可被选用为外围模块的时钟。

2.1.4 I/O寄存器

和大部分单片机类似,M SP430系列单片机也是将8个IO口编为一组。每个IO 口有四个控制寄存器,P1和P2还有额外的3个中断寄存器。寄存器情况可参见表1。

表1 I/O寄存器

2.2 LCD1602液晶屏

LCD1602采用8位并行数据传输,其操作时序如下图所示:

LCD1602接口由8位数据线,电源地电源正,液晶显示偏压信号(VL),数据命令选择端(RS),读写选择端(RW)组成。其接口信号说明如下图所示:

图2接口信号说明图

可以在1602的液晶显示偏压信号端接一个可变电阻,调节显示亮度,初始状态时,调至1602上面一排显示12个黑块为止,LCD1602电路图如下图所示:

3 方案设计

3.1 设计方案

方案一:使用MSP430F1612编程控制LCD1602液晶屏实现实现一串字符左右交替整屏移动。

方案二:使用MSP430G2553编程控制LCD1602液晶屏实现一串字符左右交替整屏移动。

3.2 方案选择

要完成控制LCD1602液晶屏实现一串字符左右交替整屏移动,MSP430G2553单片机足够了,而且能够比MSP430F1612节省资源,价格低,所以选择方案二。

4 程序设计

4.1 程序结构

该程序主要由主程序源程序main.c、子程序源程序cry1602.c和子程序头文件cry1602.h构成采用这种程序结构,使程序更加清晰,一目了然,减少程序错误的机会,增强了程序的可移植性。在程序设计中MSP430G2553中P1口作为并行数据输出端,P2.0、P2.1、P2.2分别作为LCD1602液晶的RS、RW、E端。4.2 主程序源程序

主程序中使用看门狗定时器进行计时,控制字符串移动的速度。字符串先左移,再右移,之后循环移动。程序如下:

#include

#include "cry1602.h"

#define uchar unsigned char

uchar *s1 = " Wuhan University of Technology Welcome!";

void main(void)

{

WDTCTL = WDT_ADLY_250; //间隔定时器,定时250ms

uchar *s2;

uchar j,k,l;

uchar i = 0;

s2 = s1;

LcdReset();

while(*s1++ != '\0') i++; //计算字符串有效字符个数

while(1)

{

for(j = 0;j < i;j++)

{

l = j;

for(k = 0;k < 16;k++)

{

if(l < i)

Disp1Char(k,0,s2[l++]);

else

Disp1Char(k,0,' ');

}

IFG1 &= ~WDTIFG; //清除中断失效标志

while(!(IFG1 & WDTIFG));

IFG1 &= ~WDTIFG;

}

}

}

4.3 子程序源程序

子程序中包含一些宏定义,使程序可移植性增强,还包含一些对LCD1602液晶的操作程序及延时程序。程序如下:

#include

#include "cry1602.h"

#define datadir P1DIR

#define dataport P1OUT

#define busy 0x80

#define ctrldir P2DIR

#define CLR_RS P2OUT &= ~BIT0; //RS = P2.0

#define SET_RS P2OUT |= BIT0;

#define CLR_RW P2OUT &= ~BIT1; //RW = P2.1

#define SET_RW P2OUT |= BIT1;

#define CLR_EN P2OUT &= ~BIT2; //EN = P2.2

#define SET_EN P2OUT |= BIT2;

void DispStr(uchar x,uchar y,uchar *ptr)

{

uchar *temp;

uchar i,n = 0;

temp = ptr;

while(*ptr++ != '\0') n++; //计算字符串有效字符个数

for(i = 0; i < n; i++)

{

Disp1Char(x++,y,temp[i]);

if(x == 0x0f)

{

x = 0;

y ^= 1;

}

}

}

void DispNChar(uchar x,uchar y,uchar n,uchar *ptr)

{

uchar i;

for(i = 0; i < n; i++)

{

Disp1Char(x++,y,ptr[i]);

if(x == 0x0f)

{

x = 0;

y ^= 1;

}

}

}

void LocateXY(uchar x,uchar y)

{

uchar temp;

temp = x&0x0f;

y &= 0x01;

if(y) temp |= 0x40;//如果在第2行

temp |= 0x80;

LcdWriteCommand(temp,1);

}

void Disp1Char(uchar x,uchar y,uchar data)

{

LocateXY(x,y);

LcdWriteData(data);

}

void LcdReset(void)

{

ctrldir |= 0x07; //控制线端口设为输出状态datadir = 0xff; //数据端口设为输出状态LcdWriteCommand(0x38,0); //规定的复位操作

Delay5ms();

LcdWriteCommand(0x38,0);

Delay5ms();

LcdWriteCommand(0x38,0);

Delay5ms();

LcdWriteCommand(0x38,1); //显示模式设置LcdWriteCommand(0x08,1); //显示关闭LcdWriteCommand(0x01,1); //显示清屏LcdWriteCommand(0x06,1); //写字符时整体不移动LcdWriteCommand(0x0c,1); //显示开,不开游标,不闪烁}

void LcdWriteCommand(uchar cmd,uchar chk)

{

if(chk) WaitForEnable(); //检测忙信号?

CLR_RS;

CLR_RW;

_NOP();

dataport = cmd; //将命令字写入数据端口_NOP();

SET_EN; //产生使能脉冲信号

_NOP();

_NOP();

CLR_EN;

}

void LcdWriteData(uchar data)

{

WaitForEnable(); //等待液晶不忙

SET_RS;

CLR_RW;

_NOP();

dataport = data; //将四显示数据写入数据端口

_NOP();

SET_EN; //产生使能脉冲信号

_NOP();

_NOP();

CLR_EN;

}

void WaitForEnable(void)

{

P1DIR &= 0X00; //将P1口切换为输入状态CLR_RS;

SET_RW;

_NOP();

SET_EN;

_NOP();

_NOP();

while((P1IN & busy) != 0); //检测忙标志

CLR_EN;

P1DIR |= 0xff; //将P1口切换为输出状态

}

void Delay5ms(void)

{

uint i = 40000;

while(i != 0)

{ i--;}

}

4.4 子程序头文件

该头文件中是对子程序进行程序说明,方便主程序的调用。程序如下:

#ifndef _CRY1602_H

#define _CRY1602_H

#define uchar unsigned char

#define uint unsigned int

void DispStr(uchar x,uchar y,uchar *ptr);

void DispNChar(uchar x,uchar y,uchar n,uchar *ptr);

void LocateXY(uchar x,uchar y);

void Disp1Char(uchar x,uchar y,uchar data);

void LcdReset(void);

void LcdWriteCommand(uchar cmd,uchar chk);

void LcdWriteData(uchar data);

void WaitForEnable(void);

void Delay5ms(void);#endif

5调试

5.1 CCSv5编译软件

Code Composer Studio 是一种针对TI的DSP、微控制器和应用处理器的集成开发环境。CCStudio包括一套用于开发和调试嵌入式应用程序的工具。它包括用于各种TI设备系列的编译器、源代码编辑器、项目生成环境、调试程序、探查器、模拟器和其他许多功能。CCStudio提供一个单一用户界面,指导用户完成应用程序开发流程的每一步骤。

安装好CCSv5之后,先新建一个工程,然后在新建的工程里建立.c或.h文件,接下来便可以在文件里编写程序,并调试运行,Build Project 为编译,Debug 是仿真。

5.2 调试过程

程序编写完成后,经检查无误后,点击Project->Build Project,进行编译,编译结果如图2所示:

图2程序调试界面

在调试过程中,开始时LCD1602液晶一直没有显示,认为是程序出了问题,不过经过检查和调试,发现程序没问题。不是程序问题,就检查硬件,最终发现了问题是LCD1602液晶屏的V0口与GND间的滑动变阻器没有调节合适,导致

无法观察到显示效果。经过调节滑动变阻器,就可以观察到课程设计所要求的效果。如图3所示:

图4 LCD1602液晶显示

在调试过程中,有时候会出现无法脱机运行的情况,经过检查,发现是因为芯片管脚接触不良导致的,压紧芯片即可解决问题。

6结束语

通过完成本次课程设计,我学到了许许多多的知识,获得了丰富的经验。在完成课程设计的过程中对MSP430G2553有了初步的了解,掌握了该单片机的一些使用技巧,例如:I/O口寄存器的设置及使用,定时器的使用和中断的使用等等。掌握并能够熟练使用CCSv5这个编程软件,在该软件上进行编写程序,下

载并进行调试,最终完成了本次课程设计。在程序设计、编写程序到调试的过程中,加强了我独立发现问题解决问题的能力,同时使得实践能力得到进一步的提高。

在实践中,充分将理论知识用于实践,使自身对知识的理解更进一层,更加能够熟练的掌握并使用理论知识。实践是检验真理的唯一标准,只有通过实践才能体现出理论知识的价值。

附录1

1 主程序

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

程序功能:循环显示字符串

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

#include

#include "cry1602.h"

#define uchar unsigned char

uchar *s1 = " Wuhan University of Technology Welcome!";

void main(void)

{

WDTCTL = WDT_ADLY_250; //间隔定时器,定时250ms

uchar *s2;

uchar j,k,l;

uchar i = 0;

s2 = s1;

LcdReset();

while(*s1++ != '\0') i++; //计算字符串有效字符个数

while(1)

{

for(j = 0;j < i;j++)

{

l = j;

for(k = 0;k < 16;k++)

{

if(l < i)

Disp1Char(k,0,s2[l++]);

else

Disp1Char(k,0,' ');

}

IFG1 &= ~WDTIFG; //清除中断失效标志

while(!(IFG1 & WDTIFG));

IFG1 &= ~WDTIFG;

}

}

}

2 子程序源程序

#include

#include "cry1602.h"

/*****************宏定义***********************/

#define datadir P1DIR

#define dataport P1OUT

#define busy 0x80

#define ctrldir P2DIR

#define CLR_RS P2OUT &= ~BIT0; //RS = P2.0

#define SET_RS P2OUT |= BIT0;

#define CLR_RW P2OUT &= ~BIT1; //RW = P2.1

#define SET_RW P2OUT |= BIT1;

#define CLR_EN P2OUT &= ~BIT2; //EN = P2.2

#define SET_EN P2OUT |= BIT2;

/*************************************************** 函数名称:Dispstr

功能:让液晶从某个位置起连续显示一个字符串

参数:x--位置的列坐标

y--位置的行坐标

ptr--指向字符串存放位置的指针

返回值:无

***************************************************/ void DispStr(uchar x,uchar y,uchar *ptr)

{

uchar *temp;

uchar i,n = 0;

temp = ptr;

while(*ptr++ != '\0') n++; //计算字符串有效字符个数for(i = 0; i < n; i++)

{

Disp1Char(x++,y,temp[i]);

if(x == 0x0f)

{

x = 0;

y ^= 1;

}

}

}

/*************************************************** 函数名称:DispNChar

功能:让液晶从某个位置起连续显示一个字符串

参数:x--位置的列坐标

y--位置的行坐标

n--显示字符个数

ptr--指向字符串存放位置的指针

返回值:无

***************************************************/ void DispNChar(uchar x,uchar y,uchar n,uchar *ptr)

{

uchar i;

for(i = 0; i < n; i++)

{

Disp1Char(x++,y,ptr[i]);

if(x == 0x0f)

{

x = 0;

y ^= 1;

}

}

}

/*************************************************** 函数名称:LocateXY

功能:向液晶输入显示字符位置的坐标信息

参数:x--位置的列坐标

y--位置的行坐标

返回值:无

***************************************************/ void LocateXY(uchar x,uchar y)

{

uchar temp;

temp = x&0x0f;

y &= 0x01;

if(y) temp |= 0x40;//如果在第2行

temp |= 0x80;

LcdWriteCommand(temp,1);

}

/*************************************************** 函数名称:Disp1Char

功能:在某个位置显示一个字符

参数:x--位置的列坐标

y--位置的行坐标

data--显示的字符数据

返回值:无

***************************************************/ void Disp1Char(uchar x,uchar y,uchar data)

{

LocateXY(x,y);

LcdWriteData(data);

}

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

函数名称:LcdReset

功能:对1602液晶模块进行复位操作

参数:无

返回值:无

***************************************************/ void LcdReset(void)

{

ctrldir |= 0x07; //控制线端口设为输出状态datadir = 0xff; //数据端口设为输出状态LcdWriteCommand(0x38,0); //规定的复位操作

Delay5ms();

LcdWriteCommand(0x38,0);

Delay5ms();

LcdWriteCommand(0x38,0);

Delay5ms();

LcdWriteCommand(0x38,1); //显示模式设置LcdWriteCommand(0x08,1); //显示关闭LcdWriteCommand(0x01,1); //显示清屏LcdWriteCommand(0x06,1); //写字符时整体不移动LcdWriteCommand(0x0c,1); //显示开,不开游标,不闪烁}

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

函数名称:LcdWriteCommand

功能:向液晶模块写入命令

参数:cmd--命令,

chk--是否判忙的标志,1:判忙,0:不判

返回值:无

***************************************************/ void LcdWriteCommand(uchar cmd,uchar chk)

{

if(chk) WaitForEnable(); //检测忙信号?

CLR_RS;

CLR_RW;

_NOP();

dataport = cmd; //将命令字写入数据端口

_NOP();

SET_EN; //产生使能脉冲信号

_NOP();

_NOP();

CLR_EN;

}

/*************************************************** 函数名称:LcdWriteData

功能:向液晶显示的当前地址写入显示数据

参数:data--显示字符数据

返回值:无

***************************************************/ void LcdWriteData(uchar data)

{

WaitForEnable(); //等待液晶不忙

SET_RS;

CLR_RW;

_NOP();

dataport = data; //将四显示数据写入数据端口

_NOP();

SET_EN; //产生使能脉冲信号

_NOP();

_NOP();

CLR_EN;

}

/*************************************************** 函数名称:WaitForEnable

功能:等待1602液晶完成内部操作

参数:无

返回值:无

***************************************************/ void WaitForEnable(void)

{

P1DIR &= 0X00; //将P1口切换为输入状态CLR_RS;

SET_RW;

_NOP();

SET_EN;

_NOP();

_NOP();

while((P1IN & busy) != 0); //检测忙标志

CLR_EN;

P1DIR |= 0xff; //将P4口切换为输出状态

}

/*************************************************** 函数名称:Delay5ms

功能:延时约5ms

参数:无

返回值:无

***************************************************/ void Delay5ms(void)

{

uint i = 40000;

while(i != 0)

{

i--;

}

}

3 子程序头文件

#ifndef _CRY1602_H

#define _CRY1602_H

#define uchar unsigned char

#define uint unsigned int

void DispStr(uchar x,uchar y,uchar *ptr);

void DispNChar(uchar x,uchar y,uchar n,uchar *ptr);

void LocateXY(uchar x,uchar y);

void Disp1Char(uchar x,uchar y,uchar data);

void LcdReset(void);

void LcdWriteCommand(uchar cmd,uchar chk);

void LcdWriteData(uchar data);

void WaitForEnable(void);

void Delay5ms(void);#endi

附录2

图5 实物

参考文献

[1]曹磊.MSP430单片机C程序设计与实践[M].北航大学出版社,2007-7.

[2]李建忠.MSP430单片机原理与实践教程[M].西安电子科技大学出版社,2002.

[3]皮大能,南光群,刘金华.单片机课程设计指导书[M].北京理工大学出版

LCD1602自定义显示字符

LCD1602自定义显示字符 从CGROM表中可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个, 实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000x111,x为无效位,最后三位为000-111共8个。 如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H)。 从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为01000000-01000111八个地址。 我们向这8个字节写入字模数据,让它能显示出“℃” 地址:01000000数据:00010000图示:○○○■○○○○ 0100000100000110○○○○○■■○ 0100001000001001○○○○■○○■ 0100001100001000○○○○■○○○ 0100010000001000○○○○■○○○ 0100010100001001○○○○■○○■ 0100011000000110○○○○○■■○ 0100011100000000○○○○○○○○ 字定义字符地址 0x40————0x00 0x48————0x01 0x50————0x02 0x58————0x03 0x60————0x04 0x68————0x05 0x70————0x06 0x78————0x07 程序操作: 1.定义字符数组 uchar code Word1[]={0x15,0x0A,0x15,0x0A,0x15,0x0A,0x15,0x0A};//自定义字符数组 2.写数据到CGRAM中 uchar j; WriteCommandLCD(0x40); for(j=0;j<8;j++) { WriteDataLCD(Word1[j]); } 3.读取数据并显示 WriteCommandLCD(0xC8);//显示在第一行 WriteDataLCD(0x00);//地址

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 自定义字符

LCD1602 自定义字符 2011-09-06 20:40:55| 分类:1602|举报|字号订阅 用户自定义字符的应用: 我们从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM 的字符码规定0-2位为地址,3位无效,4-7全为零。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。 如果我们要想显示这8个用户自定义的字符,操作方法和显示CGROM的一样,先设置DDRAM位置,再向DDRAM写入字符码,例如“A”就是41H。现在我们要显示CGRAM的第一个自定义字符,就向DDRAM写入00000000B(00H),如果要显示第8个就写入00000111(08H),简单吧! 好!现在我们来看怎么向这八个自定义字符写入字模。有个设置CGRAM地址的指令如下图: 从这个指令可以看出指令数据的高2位已固定是01,只有后面的6位是地址数据,

而这6位中的高3位就表示这八个自定义字符,最后的3位就是字模数据的八个地址了。例如第一个自定义字符的字模地址为01000000-01000111八个地址。我们向这8个字节写入字模数据,让它能显示出“℃” 地址:01000000数据:00010000 图示: ○○○■○○○○0100000100000110 ○○○○○■■○ 0100001000001001 ○○○○■○○■ 0100001100001000 ○○○○■○○○ 0100010000001000 ○○○○■○○○ 0100010100001001 ○○○○■○○■ 0100011000000110 ○○○○○■■○ 0100011100000000 ○○○○○○○○ 图示: 下面我们写一段程序让这8个自定义字符显示出一个心的图案: # include unsigned char table1[]={0x03,0x07,0x0f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x18,0x1E,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f, 0x07,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,

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工作电压,对比度可调 内含复位电路 提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

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 ;数据指针清零

LCD1602汉字显示讲解

LCD1602显示汉字研究与程序设计 1602是一款最常用也是最便宜的液晶显示屏。最多可以显示两行标准字符,每行最多可以显示16个字符。 1602可以显示内部常用字符(包括阿拉伯数字,英文字母大小写,常用符号和日文假名等),也可以显示自定义字符(单或多个字符组成的简单汉字,符号,图案等,最多可以产生8个自定义字符)。 一、显示常用字符。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是41H,显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 十进制十六进制ASCII字符十进制十六进制ASCII 字符十进制十六进制ASCII字符 00 00 自定义字符1 56 38 8 96 60 ` 01 01 自定义字符2 57 39 9 97 61 a 02 02 自定义字符3 58 3A : 98 62 b 03 03 自定义字符4 59 3B ; 99 63 c 04 04 自定义字符5 60 3C < 100 64 d 05 05 自定义字符6 61 3D = 101 65 e 06 06 自定义字符7 62 3E > 102 66 f 07 07 自定义字符8 63 3F ? 103 67 g 08 08 自定义字符1 64 40 @ 104 68 h 09 09 自定义字符2 65 41 A 105 69 i 10 0A 自定义字符3 66 42 B 106 6A j 11 0B 自定义字符4 67 43 C 107 6B k 12 0C 自定义字符5 68 44 D 108 6C l 13 0D 自定义字符6 69 45 E 109 6D m 14 0E 自定义字符7 70 46 F 110 6E n 15 0F 自定义字符8 71 47 G 111 6F o 32 20 空格72 48 H 112 70 p 33 21 ! 73 49 I 113 71 q 34 22 " 74 4A J 114 72 r 35 23 # 75 4B K 115 73 s 36 24 $ 76 4C L 116 74 t 37 25 % 77 4D M 117 75 u 38 26 & 78 4E N 118 76 v 39 27 ' 79 4F O 119 77 w 40 28 ( 80 50 P 120 78 x 41 29 ) 81 51 Q 121 79 y 42 2A * 82 52 R 122 7A z 43 2B + 83 53 S 123 7B { 44 2C , 84 54 T 124 7C | 45 2D - 85 55 U 125 7D }

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 MAIN: MOV SP,#60H MOV 40H,#01H MOV 41H,#02H MOV 42H,#03H MOV 43H,#04H MOV 44H,#05H MOV 45H,#06H MOV 46H,#07H ACALL DD1 ;DD1是LCD初始化

MOV DPTR,#TABLE1 ACALL DD2;DD2是LCD第一行显示TABLE1 ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据 SJMP $ DD1: MOV p0,#01H ;清屏 CALL ENABLE MOV p0,#38H ;显示功能 CALL ENABLE MOV p0,#0FH ;显示开关控制 CALL ENABLE MOV p0,#06H ;+1 CALL ENABLE RET DD2: MOV p0,#80H;第一行的开始位置 cALL ENABLE CALL WRITE1;到TABLE1取码? RET DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 RET ENABLE: CLR RS ;送命令 CLR RW CLR E CALL DELAY SETB E RET WRITE1: MOV R1,#00H ;显示table中的值 A1: MOV A,R1;到table取码 MOVC A,@A+DPTR call wRITE2 ;显示到lcd INC R1 CJNE A,#00H,A1 ;是否到00h RET WRITE2:MOV p0,A ;显示 SETB RS CLR RW CLR E CALL DELAY SETB E RET

1602LCD字符手册

目录 一.字符型模块的性能???????????????????????????????????????1 二.基本原理???????????????????????????????????????????????2 三.技术参数???????????????????????????????????????????????3 四.时序特性???????????????????????????????????????????????4 五.引脚、指功能???????????????????????????????????????????5 六.使用实例???????????????????????????????????????????????6 七.使用注意事项???????????????????????????????????????????7

1.字符型模块的性能 重量轻:<100g; 体积小:<11mm厚; 功耗低:10—15mW; 显示内容:192种字符(5×7点字型); 32种字符(5×10点字型); 可自编8(5×7)或许(5×10)种字符; 指令功能强:可组合成各种输入、显示、移位方式以满足不同的要求; 接口简单方便:可与8位微处理器或微控制器相联; 工作温度宽:0—50oC 可靠性高:寿命为50,000小时(25oC) 2.基本原理 2.1 液晶体 液晶板上排列着若干5×7或5×10点阵的字符显示位,每个显示位可显示1个字符,从规格上分为每行8、16、20、24、32、40位,有一行、两行及四行三类。 2.2 工作电路 图1是字符型模块的电路框图,它由KS0066、KS0065及几个电阻电容组成。KS0065是扩展显示字符用的(例如:16个字符×1行模块就可不用KS0065,16个字符×2行模块就要用1片KS0065)。 图1 接口方面,有8条数据,三条控线。可与微处理器或微控制相连,通过送入数据和指令,就可使模块正常工作,图2是模块和微处理器相连的例子。

单片机+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;

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

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工作电压,对比度可调

液晶1602显示字符代码

1602液晶字符码 十十六ASCII 十十六ASCII 十十六ASCII 进制进制字符进制进制字符进制进制字符 00 00 自定义字符1 56 38 8 96 60 ` 01 01 自定义字符2 57 39 9 97 61 a 02 02 自定义字符3 58 3A : 98 62 b 03 03 自定义字符4 59 3B ; 99 63 c 04 04 自定义字符5 60 3C < 100 64 d 05 05 自定义字符6 61 3D = 101 65 e 06 06 自定义字符7 62 3E > 102 66 f 07 07 自定义字符8 63 3F ? 103 67 g 08 08 自定义字符1 64 40 @ 104 68 h 09 09 自定义字符2 65 41 A 105 69 i 10 0A 自定义字符3 66 42 B 106 6A j 11 0B 自定义字符4 67 43 C 107 6B k 12 0C 自定义字符5 68 44 D 108 6C l 13 0D 自定义字符6 69 45 E 109 6D m 14 0E 自定义字符7 70 46 F 110 6E n 15 0F 自定义字符8 71 47 G 111 6F o 32 20 空格72 48 H 112 70 p 33 21 ! 73 49 I 113 71 q 34 22 " 74 4A J 114 72 r 35 23 # 75 4B K 115 73 s 36 24 $ 76 4C L 116 74 t 37 25 % 77 4D M 117 75 u 38 26 & 78 4E N 118 76 v 39 27 ' 79 4F O 119 77 w 40 28 ( 80 50 P 120 78 x 41 29 ) 81 51 Q 121 79 y 42 2A * 82 52 R 122 7A z 43 2B + 83 53 S 123 7B { 44 2C , 84 54 T 124 7C | 45 2D - 85 55 U 125 7D } 46 2E . 86 56 V 126 7E ~ 47 2F / 87 57 W 48 30 0 88 58 X 49 31 1 89 59 Y 50 32 2 90 5A Z 51 33 3 91 5B [ 52 34 4 92 5C \ 53 35 5 93 5D ] 54 36 6 94 5E ^ 55 37 7 95 5F _

LM1602液晶显示程序

#include #define uchar unsigned char #define uint unsigned int unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; uchar second = 30; uchar minite = 11; uchar hour = 15; sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++); } void Write_Command(uchar command) { P0 = command; RS = 0; RW = 0; E = 1; delay(); E = 0; } void Write_Data(uchar Data) { P0 = Data; RS = 1; RW = 0; E = 1; delay(); E = 0; } void LCD_Init(void)//初始化 { Write_Command(0x01); Write_Command(0x38);

Write_Command(0x0c); Write_Command(0x06); } void LCD_Printfc(uchar hang,uchar lie,uchar sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie; Write_Command(a); Write_Data(sign); } void LCD_Display(uchar *tab1) { uchar i; Write_Command(0x80); for(i=0; i<16; i++) { Write_Data(tab1[i]); delay(); } /* Write_Command(0xc0); for(i=0; i<16; i++) { Write_Data(tab2[i]); delay(); }*/ } void time_view(void) { if(second == 60) { minite ++; second = 0; } if(minite == 60) { hour++; minite = 0; } if(hour == 24)

LCD-1602引脚功能

LCD1602已很普遍了,具体介绍我就不多说了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,定义如下表所示: 字符型LCD的引脚定义 HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表:

也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: DDRAM地址与显示位置的对应关系 我们知道文本文件中每一个字符都是用一个字节的代码记录的。一个汉字是用两个字节的代码记录。在PC上我们只要打开文本文件就能在屏幕上看到对应的字符是因为在操作系统里和BIOS里都固化有字符字模。什么是字模?就代表了是在点阵屏幕上点亮和熄灭的信息数据。例如“A” 字的字模: 01110 ○■■■○ 10001 ■○○○■ 10001 ■○○○■ 10001 ■○○○■ 11111 ■■■■■ 10001 ■○○○■ 10001 ■○○○■ 上图左边的数据就是字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。看出是个“A”字了吗?在文本文件中“A”字的代码是41H,PC收到41H 的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字了。 刚才我说了想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM 的00H地址写入“A”字的代码41H就行了,可41H这一个字节的代码如何才能让LCD模块在屏幕的阵点上显示“A”字呢?同样,在LCD模块上也固化了字模存储器,这就是CGROM和CGRAM。HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。下图说明了CGROM 和CGRAM与字符的对应关系。

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

/***************************************************** 函数功能:判断液晶模块的忙碌状态 返回值:result。result=1,忙碌;result=0,不忙 ***************************************************/ bit Lcd_BusyTest(void) { bit result; RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1; //E=1,才允许读写 _nop_(); //空操作 _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 result=BF; //将忙碌标志电平赋给result E=0; return result; } /***************************************************** 函数功能:将模式设置指令或显示地址写入液晶模块 入口参数:dictate ***************************************************/ void Lcd_WriteCom (unsigned char dictate) { while(Lcd_BusyTest()==1); //如果忙就等待 RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0; E=0; //E置低电平(写指令时就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_(); //空操作两个机器周期,给硬件反应时间 Lcd_Data=dictate; //将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=1; //E置高电平 _nop_(); _nop_(); _nop_(); _nop_(); //空操作四个机器周期,给硬件反应时间 E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令} /***************************************************** 函数功能:指定字符显示的实际地址 入口参数:x

lcd1602~~~~~~~~~~~~~~显示字符A

#include //包含单片机寄存器的头文件 #include //包含_nop_()函数定义的头文件 #include "LCD1602.h" void main(void) //主函数 { Init_LCD1602(); //调用LCD初始化函数 Write_Addr(0x07); //将显示地址指定为第1行第8列 Write_Data('A'); //将字符常量'A'写入液晶模块 //字符的字形点阵读出和显示由液晶模块自动完成while(1); } LCD1602.h: #ifndef _LCD1602_H_ #define _LCD1602_H_ sbit RS=P1^0; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P1^1; //读写选择位,将RW位定义为P2.1引脚 sbit EN=P1^2; //使能信号位,将E位定义为P2.2引脚 sbit Busy=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚 /***************************************************** 函数功能:延时1ms ***************************************************/ 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

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显示屏地驱动设置及例程

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的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不

相关文档
最新文档