AVR单片机学习笔记LCD1602模块Word格式文档下载.docx

上传人:b****5 文档编号:19623442 上传时间:2023-01-08 格式:DOCX 页数:10 大小:155.26KB
下载 相关 举报
AVR单片机学习笔记LCD1602模块Word格式文档下载.docx_第1页
第1页 / 共10页
AVR单片机学习笔记LCD1602模块Word格式文档下载.docx_第2页
第2页 / 共10页
AVR单片机学习笔记LCD1602模块Word格式文档下载.docx_第3页
第3页 / 共10页
AVR单片机学习笔记LCD1602模块Word格式文档下载.docx_第4页
第4页 / 共10页
AVR单片机学习笔记LCD1602模块Word格式文档下载.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

AVR单片机学习笔记LCD1602模块Word格式文档下载.docx

《AVR单片机学习笔记LCD1602模块Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《AVR单片机学习笔记LCD1602模块Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。

AVR单片机学习笔记LCD1602模块Word格式文档下载.docx

DataI/O

2

VDD

电源正极(模块供电)

10

D3

3

VL

接在滑动电阻可以调节对比度

11

D4

4

RS

数据/命令选择端(H/L)

12

D5

5

R/W

读/写选择端(H/L)

13

D6

6

E

使能信号(通知芯片读取数据)

14

D7

7

D0

15

BLA

模块背光灯正极

8

D1

16

BLK

模块背光灯负极

三、基本操作时序:

读状态:

输入:

RS=L、RW=H、E=H

模块输出:

状态字=D0~D7

写指令:

RS=L、RW=L、D0~D7=指令码、E=H

读数据:

RS=H、RW=H、E=H

数据=D0~D7

写数据:

RS=H、RW=L、D0~D7=数据、E=H

状态字说明(因为单片机的速度可能快过1602,所以需要判断当1602是否在忙,或者延时。

STA7

STA6

STA5

STA4

STA3

STA2

STA1

STA0

STA0-6:

当前数据地址指针的数值

主要用来检查1602模块的是否可以写入或读出操作

1:

禁止0:

允许

四、指令说明(这指令是用来设置1602显示的方式)

显示模式设置

指令码

功能

0

设置16X2显示,5X7点阵,8位数据接口

显示开/关及光标设置

D

C

B

D=1开显示

D=0关显示

C=1显示光标

C=0不显示光标

B=1光标闪烁

B=0光标不闪烁

N

S

N=1当读或写一个字符后地址指针加1,且光

标加1(即从左往右显示)

N=0当读或写一个字符后地址指针减1,且光

标减1(即从右往左显示)

S=1当写一个字符,中国男排显示左移(N=1)

五、时序图

写操作(写指令、写数据)时序图

时序参数

写指令时序,RS拉低表示写指令,R/W拉低表示写操作,给DB0-DB7赋值指令数据并保持>

;

40ns时间,将E拉高表示数据已经准备好保持>

150ns让1602读取,将E拉低,并延时>

10ns一次写操作完毕。

写数据时序,RS拉高表示写数据,R/W拉低表示写操作,给DB0-DB7赋值指令数据并保持>

六、电路图

由于只是写操作,所以R/W直接接地即可。

PORTA接1602的8位数据引脚

PORTD5接1602的RS引脚区分数据或命令:

H数据,L命令

PORTD4接1602的E引脚高脉冲使能,使能脉宽最小150ns

七、完整代码。

//代码功能:

驱动LCD1602显示屏

//平台:

DB-51Ver2.1开发板

//控制芯片:

ATmega16A

//时钟:

片内时钟

//设计者:

L、QQ:

1007566569

//

2013-8-10

//***************************************包含必备文件*******************************************************

#ifndef_STRING_H

#include&

quot;

string.h&

#endif

#ifndefuchar

#defineucharunsignedchar

#ifndefuint

#defineuintunsignedint

//***************************************移植必须修改*******************************************************

//共占用PORTA一组IO、PORTD中第4、5IO由于只是写操作,所以R/W直接接地即可。

#define_1602_DATA

PORTA//接1602的8位数据引脚

#define_1602_CMDIO

PORTD//控制线所对应的IO口

#define_1602_CMDIO_RS

//接1602的RS引脚区分数据或命令:

#define_1602_CMDIO_E

//接1602的E引脚高脉冲使能,使能脉宽最小150ns

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

设计者:

函数:

自定义函数voidMy_SetBit(unsignedchar*Date,unsignedcharWei,unsignedcharms)

参数:

Date:

寄存器地址Wei:

更改指定位ms:

若为1则将指定位置1若为0则将指定位置0

返回值:

无返回值,函数里面会更改寄存器值

例子:

My_SetBit((unsignedchar*)&

PORTB,2,1);

将PORTB寄存器中的第2位置1

函数描述:

修改指定寄存器中的指定位,不影响其他位。

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

/***第二版本***/

voidMy_SetBit(unsignedchar*Date,unsignedcharWei,unsignedcharms)

{

(((ms)==(0))?

(*Date&

=~(0x1;

0;

x--)

for(y=19;

y>

y--);

}

/*写入指定命令由于是写操作R/W可以直接接地保持低电平即可*/

voidlcdwrcom_1602(unsignedcharcdat)

My_SetBit((unsignedchar*)&

_1602_CMDIO,_1602_CMDIO_E,0);

//E置0,即将改变数据。

不允许1602读取数据(IO口状态)

_1602_CMDIO,_1602_CMDIO_RS,0);

//RS拉低表示是命令

_1602_DATA=cdat;

//将命令送至与1602的8位数据口相连接的IO口

delay_50us_1602(4);

//数据建立时间要>

40ns

_1602_CMDIO,_1602_CMDIO_E,1);

//E使能,命令已经准备好,通知1602读取命令(IO口状态)

delay_50us_1602(8);

//E高电平保持时间要>

150ns,让1602有时间读取完整

//E置0,不允许1602读取数据(IO口状态)可能改变。

delay_50us_1602

(2);

//根据时序图,让数据再保持一小段时间>

10ns

/*将指定数据写入显示屏由于是写操作R/W可以直接接地保持低电平即可*/

voidlcdwrdata_1602(unsignedchardat)

_1602_CMDIO,_1602_CMDIO_RS,1);

//RS拉高表示是数据

_1602_DATA=dat;

//根据时序图,让数据保持一小段时间

/*初始化1602*/

voidlcd_init_1602()

//具体含义请参考1602官方使用手册

lcdwrcom_1602(0x38);

//0x38设置显示模式为:

16X2显示,5X7点阵,8位数据接口

lcdwrcom_1602(0x0C);

//打开显示光标闪烁

lcdwrcom_1602(0x06);

//显示光标移动设置

lcdwrcom_1602(0x01);

//显示清屏

/*综合函数API*/

/*参数:

Show_1602(第一行显示的数据,第二行显示的数据,每个字符显示的时间)*/

voidShow_1602(unsignedcharText_1[],unsignedcharText_2[],unsignedintTime)

unsignedcharn;

unsignedintTmp;

unsignedcharTmpA,TmpC,TmpD;

//备份IO口原来的配置以备复原,避免影响其他模块代码

TmpA=DDRA;

TmpC=DDRC;

TmpD=DDRD;

//端口初始化

DDRA=0xFF;

DDRC=0xC0;

DDRD=0x30;

//1602初始化

lcd_init_1602();

lcdwrcom_1602(0x80+0x00);

//设置要显示(写入)的位置0x80-0x8F第一行的位置

Tmp=strlen(Text_1);

if(Tmp)

{

for(n=0;

n;

=Weishu&

&

Shuzi<

Weishu*10)

break;

Weishu*=10;

}

//判断位数&

uarr;

//将每一位拆分翻译&

darr;

for(Textlen=0;

Weishu;

Textlen++)

Tmp=Shuzi/Weishu;

Text[Textlen]=Tdate[Tmp];

Shuzi=Shuzi%Weishu;

Weishu/=10;

Show_1602_Char(Text,&

Time);

*/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1