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