转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi

欢迎加入讨论群 64770604

一、本次实验所需器材

1、Arduino板 https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-15820725129.16.AtgoEm&id=545093340395

2、1602液晶板:也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形。目前,尽管各厂家对其各自产品命名不尽相同,但均提供几乎都同样规格的1602模块或者兼容模块。1602最初采用的LCD控制器是HD44780,在各厂家生产的1602模块中,基本上也都采用了与之兼容的控制IC,所以从特性上基本上是一样的。因此,我们买到的1602模块,在端口标记上可能有所不同,有的从左向右,有的从右向左,但特性上是一样的。本实验中使用的1602板,最里面的孔为1号,最靠近边上的那个为16号。

1602实物图片:

1602的规格情况:

显示容量 16*2个字符
芯片工作电压 4.5-5.5V
工作电流 2,0MA(5.0V)
模块最佳工作电压 5.0V
字符尺寸 2.95*4.35(WXH)mm

1602管脚介绍:

第1脚:VSS为电源负极

第2脚:VCC接5V电源正极

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度,本实验使用了一个1KΩ电阻)。

第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。

第7~14脚:D0~D7为8位双向数据端。

第15~16脚:背灯电源。15脚背光正极,16脚背光负极。

1602字符集介绍:

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

1602的16进制ASCII码表地址可从百度搜索,这里不在列出,只写用法。如:感叹号!的ASCII为0x21,字母B的ASCII为0x42。

1602指令集:

3、电阻:1KΩ(1个)

4、杜邦线:若干

5、面包板:一个

二、8位连接法实验

1、硬件连接方式

2、代码:

int DI = ;
int RW = ;
int DB[] = {, , , , , , , };//使用数组来定义总线需要的管脚
int Enable = ; void LcdCommandWrite(int value) {
// 定义所有引脚
int i = ;
for (i=DB[]; i <= DI; i++) //总线赋值
{
digitalWrite(i,value & );//因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。
value >>= ;
}
digitalWrite(Enable,LOW);
delayMicroseconds();
digitalWrite(Enable,HIGH);
delayMicroseconds(); // 延时1ms
digitalWrite(Enable,LOW);
delayMicroseconds(); // 延时1ms
} void LcdDataWrite(int value) {
// 定义所有引脚
int i = ;
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
for (i=DB[]; i <= DB[]; i++) {
digitalWrite(i,value & );
value >>= ;
}
digitalWrite(Enable,LOW);
delayMicroseconds();
digitalWrite(Enable,HIGH);
delayMicroseconds();
digitalWrite(Enable,LOW);
delayMicroseconds(); // 延时1ms
} void setup (void) {
int i = ;
for (i=Enable; i <= DI; i++) {
pinMode(i,OUTPUT);
}
delay();
// 短暂的停顿后初始化LCD
// 用于LCD控制需要
LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5x7文字大小
delay();
LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5x7文字大小
delay();
LcdCommandWrite(0x38); // 设置为8-bit接口,2行显示,5x7文字大小
delay();
LcdCommandWrite(0x06); // 输入方式设定
// 自动增量,没有显示移位
delay();
LcdCommandWrite(0x0E); // 显示设置
// 开启显示屏,光标显示,无闪烁
delay();
LcdCommandWrite(0x01); // 屏幕清空,光标位置归零
delay();
LcdCommandWrite(0x80); // 显示设置
// 开启显示屏,光标显示,无闪烁
delay();
} void loop (void) {
LcdCommandWrite(0x01); // 屏幕清空,光标位置归零
delay();
LcdCommandWrite(0x80+);
delay();
// 写入欢迎信息
LcdDataWrite('H');
LcdDataWrite('E');
LcdDataWrite('L');
LcdDataWrite('L');
LcdDataWrite('O');
LcdDataWrite(' ');
LcdDataWrite('W');
LcdDataWrite('O');
LcdDataWrite('R');
LcdDataWrite('L');
LcdDataWrite('D');
delay();
LcdCommandWrite(0xc0+); // 定义光标位置为第二行第二个位置
delay();
LcdDataWrite('w');
LcdDataWrite('i');
LcdDataWrite('k');
LcdDataWrite('i');
LcdDataWrite('c');
LcdDataWrite('o');
LcdDataWrite('d');
LcdDataWrite('e');
LcdDataWrite('.');
LcdDataWrite('n');
LcdDataWrite('e');
LcdDataWrite('t');
delay();
LcdCommandWrite(0x01); // 屏幕清空,光标位置归零
delay();
LcdDataWrite('I');
LcdDataWrite(' ');
LcdDataWrite('a');
LcdDataWrite('m');
LcdDataWrite(' ');
LcdDataWrite('x');
LcdDataWrite('i');
LcdDataWrite('a');
LcdDataWrite('o');
LcdDataWrite('w');
LcdDataWrite('u');
LcdDataWrite('y');
LcdDataWrite('i');
delay();
LcdCommandWrite(0x02); //设置模式为新文字替换老文字,无新文字的地方显示不变。
delay();
LcdCommandWrite(0x80+); //定义光标位置为第一行第6个位置
delay();
LcdDataWrite('t');
LcdDataWrite('h');
LcdDataWrite('e');
LcdDataWrite(' ');
LcdDataWrite('a');
LcdDataWrite('d');
LcdDataWrite('m');
LcdDataWrite('i');
LcdDataWrite('n');
delay();
}

3、实验效果

三、四位连接法

4位连接法,可以省出几个数字端口。

1、连接方法

2、代码

int LCD1602_RS=;
int LCD1602_RW=;
int LCD1602_EN=;
int DB[] = { , , , };
char str1[]="Welcome to";
char str2[]="wikicode.net";
char str3[]="This is the";
char str4[]="4-bit interface"; void LCD_Command_Write(int command)
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW); temp=command & 0xf0;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW); temp=(command & 0x0f)<<;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW);
} void LCD_Data_Write(int dat)
{
int i=,temp;
digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW); temp=dat & 0xf0;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW); temp=(dat & 0x0f)<<;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW);
} void LCD_SET_XY( int x, int y )
{
int address;
if (y ==) address = 0x80 + x;
else address = 0xC0 + x;
LCD_Command_Write(address);
} void LCD_Write_Char( int x,int y,int dat)
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
} void LCD_Write_String(int X,int Y,char *s)
{
LCD_SET_XY( X, Y ); //设置地址
while (*s) //写字符串
{
LCD_Data_Write(*s);
s ++;
}
} void setup (void)
{
int i = ;
for (i=; i <= ; i++)
{
pinMode(i,OUTPUT);
}
delay();
LCD_Command_Write(0x28);//4线 2行 5x7
delay();
LCD_Command_Write(0x06);
delay();
LCD_Command_Write(0x0c);
delay();
LCD_Command_Write(0x80);
delay();
LCD_Command_Write(0x01);
delay(); } void loop (void)
{
LCD_Command_Write(0x01);
delay();
LCD_Write_String(,,str1);//第1行,第4个地址起
delay();
LCD_Write_String(,,str2);//第2行,第2个地址起
delay();
LCD_Command_Write(0x01);//
delay();
LCD_Write_String(,,str3);
delay();
LCD_Write_String(,,str4);
delay(); }

这里仅做了显示字符串的方法,也可以利用LCD_Write_Char这个过程来显示字符,如:LCD_Write_Char(1,0,0x3a)显示“:”,这里不再举例,在下面的时钟的代码中,会有所利用。

3、实现效果

四、利用Arduino+1602实现时钟

1、硬件连接:采用四位连接法。

2、代码

int LCD1602_RS=;
int LCD1602_RW=;
int LCD1602_EN=;
int DB[] = { , , , };
char logtxt[]="Local Time";
char *sec[]={"","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""}; void LCD_Command_Write(int command)
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW); temp=command & 0xf0;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW); temp=(command & 0x0f)<<;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW);
} void LCD_Data_Write(int dat)
{
int i=,temp;
digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW); temp=dat & 0xf0;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW); temp=(dat & 0x0f)<<;
for (i=DB[]; i <= ; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= ;
} digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds();
digitalWrite( LCD1602_EN,LOW);
} void LCD_SET_XY( int x, int y )
{
int address;
if (y ==) address = 0x80 + x;
else address = 0xC0 + x;
LCD_Command_Write(address);
} void LCD_Write_Char( int x,int y,int dat)
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
} void LCD_Write_String(int X,int Y,char *s)
{
LCD_SET_XY( X, Y ); //设置地址
while (*s) //写字符串
{
LCD_Data_Write(*s);
s ++;
}
} void setup (void)
{
int i = ;
for (i=; i <= ; i++)
{
pinMode(i,OUTPUT);
}
delay();
LCD_Command_Write(0x28);//4线 2行 5x7
delay();
LCD_Command_Write(0x06);
delay();
LCD_Command_Write(0x0c);
delay();
LCD_Command_Write(0x80);
delay();
LCD_Command_Write(0x01);
delay(); } void loop (void)
{ for(int index=,minindex=,hourindex=;index<;index++) //这里来设定现在时间,目前设定为12:59:00
       {
LCD_Command_Write(0x01);
delay();
LCD_Write_String(,,logtxt);
LCD_Write_String(,,sec[hourindex]);
LCD_Write_Char(,,0x3a);//显示:
LCD_Write_String(,,sec[minindex]);
LCD_Write_Char(,,0x3a);
LCD_Write_String(,,sec[index]); delay();
if (index==)
{
index=-;
minindex++;
if (minindex==)
{
minindex=;
hourindex++;
if (hourindex==)
{
hourindex=;
}
} }
} }

3、实现效果

Arduino入门笔记(5):1602液晶实验(实现时钟)的更多相关文章

  1. Arduino入门笔记(6):温度传感器及感温杯实验

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 :https://item.taob ...

  2. Arduino入门笔记(7):利用1602、1302实现时钟和定时器

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 常常听到老妈在做饭时说“开锅15分钟后叫我一下”,为何不做个定时器,来提醒老妈呢 ...

  3. Arduino入门笔记(4):用蜂鸣器演奏音乐并配有LED闪烁

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...

  4. Arduino入门笔记(3):单LED闪烁

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 在搭建好arduino开发环境(http://www.cnblogs.com/xi ...

  5. Arduino入门笔记(8):利用12864和ADXL345学习重力感应控制

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...

  6. Arduino入门笔记【1】

    刚刚接触这个东西只知道这是类似于单片机的开发板,可以做一些单片机实现或者不能实现的东西,但是比单片机要简单得多. Arduino到底是什么? 维基百科上的描述是:Arduino是一块开发板的微控制器和 ...

  7. Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...

  8. Arduino入门笔记(1):认识Arduino

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 各种网站论坛里经常看到网友DIY各种遥控小车.机器人什么的,一直很好奇,很想学习一 ...

  9. Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境

    欢迎加入讨论群 64770604 1.开发环境 (1)下载开发环境 Arduino的开发环境从http://arduino.cc/en/Main/Software官网下载即可,分为windows版本. ...

随机推荐

  1. Render

    render 渲染元素 元素是React应用程序的最小构建块 "根"DOM节点,它内部的所有内容都将由React DOM进行管理 仅使用React构建的App程序通常具有单个Dom ...

  2. 用R语言进行文本挖掘和主题建模

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 我们每天都会遇到各种各样的文本数据,但大部分是非结构化的,并不是全部都是有价值的. 据估计,全球约80%的数据是非结构化的.这包括音频,视频 ...

  3. navicat for mysql 破解方法

    https://www.cnblogs.com/da19951208/p/6403607.html  破解教程

  4. DAY2-MySQL专业安装

    MySQL安装 安装方法: 1.源码 2.二进制 (建议使用) 3.rpm (尽量不用) 一.下载MySQL: 一定要从官网下载,防止被勒索. 官网: http://dev/mysql.com 版本: ...

  5. 理解Go Context机制

    1 什么是Context 最近在公司分析gRPC源码,proto文件生成的代码,接口函数第一个参数统一是ctx context.Context接口,公司不少同事都不了解这样设计的出发点是什么,其实我也 ...

  6. 面试阿里前端P6血和泪换来的收获

      我的一个朋友在前端耕耘一段时间,也在网上进行了高度培训学习,最近一段时间他打算跳槽去阿里面试前端P6开发岗位,结果被痛虐了一回,估计从此以后会给他留下不可磨灭的阴影啊 真是十年生死两茫茫,一鲁代码 ...

  7. 浅谈HTTP协议

    1 HTTP概念 把握三个点: 1 HTTP协议(超文本传输协议) HTTP是一个基于TCP/IP通信协议来传递数据,默认端口80 2 HTTP是无连接(限制每次连接只处理一个请求),无状态的(对于事 ...

  8. 分布式系统关注点(15)——「水平&垂直切分」详解

    如果第二次看到我的文章,欢迎右侧扫码订阅我哟~ 

  9. 【转载】Docker+Kubernetes 干货文章精选

    主要涉及到以下关键字: K8S.Docker.微服务.安装.教程.网络.日志.存储.安全.工具.CI/CD.分布式.实践.架构等: 以下盘点2018年一些精选优质文章! 漫画形式: 漫画:小黄人学 S ...

  10. [翻译 EF Core in Action 1.11] 何时不应该使用EF Core

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...