转载请注明:@小五义 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. HTTP Strict Transport Security实战详解

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...

  2. 唱吧DevOps的落地,微服务CI/CD的范本技术解读

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  3. Can I use MyBatis to generate Dynamic SQL without executing it?

    Although MyBatis was designed to execute the query after it builds it, you can make use of it's conf ...

  4. JavaScript的垃圾回收机制

    JavaScript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation).通常我们使 ...

  5. java.util.ConcurrentModificationException异常的解决

    问题复现: List<String> list = new ArrayList<>();list.add("11");list.add("55&q ...

  6. switch窗口句柄

    Set<String> windows = browser.getWebDriver().getWindowHandles(); //获得所有窗口句柄 for (String string ...

  7. codeforces 671D

    首先O(n2)dp很好想 f[i][j]表示i子树内的所有边都被覆盖且i~j的路径也都被覆盖的最小花费. 考虑去掉无用的状态,其实真正用到的就是每一条链. 去掉第二维,f[i]表示i子树内的边都被覆盖 ...

  8. gitlab pipelines job执行时日志较大报错

    问题描述 gitlab pipelines job执行时日志较大报错 Job's log exceeded limit of 4194304 bytes. 解决方案 出现该问题主要是因为gitlab ...

  9. Dubbo原理和源码解析之标签解析

    一.Dubbo 配置方式 Dubbo 支持多种配置方式: XML 配置:基于 Spring 的 Schema 和 XML 扩展机制实现 属性配置:加载 classpath 根目录下的 dubbo.pr ...

  10. springboot2.x里面访问静态资源的坑

    在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径( classpath:/META/resources/,classpa ...