目录
- 目标
- 理论学习
- 实物图
- 技术参数
- LCD1602 正面
- 背面
- IIC/I2C 1602A
- 正面
- 背面
- CGRAM
- LCD1602 接线图
- IIC/I2C 1602A接线图
- 效果图
- IDE代码
- LCD1602
- 引入库LiquidCrystal.h
- 代码
- IIC/I2C 1602A
- 方法一:引入库LiquidCrystal_I2C.h
- 方式二
- 运行检测程序检测模块的默认起始地址
- 简单示例
- 温度显示在1602A
目标
- 液晶开机画面显示Welcome to use!
- 读取LM35温度传感器的值,显示在液晶屏上
理论学习
- LCD1602液晶是一款通用建议液晶,可以显示ASCII码的英文字母、数字和标点符号(不能显示中文)。
- LCD1602总共可以显示2行*16个字符。
实物图
市场主要有两个型号LCD1602和IIC/I2C 1602A(高配简洁版)
技术参数
LCD1602 正面
- VSS:接地
- VDD:正5V
- VO:对比度(2.2K-4.4K电阻)
- R/W:高电平是read,低电平是write
- A:Led正,液晶
- K:Led负,液晶
背面
IIC/I2C 1602A
正面
背面
CGRAM
参考原文链接:https://blog.csdn.net/wait_for_taht_day5/article/details/50636096
CGRAM : 允许用户自建字模区的空间。从CGROM表上可以看到,在表的最左边是一列可以允许用户自定义的CGRAM,从上往下看着是16个,实际只有8个字节可用。它的字符码是00000000-00000111这8个地址,表的下面还有8个字节,但因为这个CGRAM的字符码规定0-2位为地址,3位无效,4-7全为零(表上的高位)。因此CGRAM的字符码只有最后三位能用也就是8个字节了。等效为0000X111,X为无效位,最后三位为000-111共8个。
CGROM : 字模存储用空间。你要显示某个ASCII字符时,要显示字符的字模就存在这里。
DDRAM : 显示用RAM。直接和屏幕上的点相对应。屏幕上的一个点和DDRAM中的一个位对应。
1602液晶屏一行显示16个,对应于00-0F/40-4F,而DDRAM可以储存80个,如果需要显示10-27/50-67的内容就需要用到左移右移来实现。
总结:DDRAM是用来使液晶屏显示的,CGROM是液晶屏可以显示的内容(在CGROM 表中查看),CGRAM是用来扩展液晶屏可以显示的内容。
LCD1602 接线图
IIC/I2C 1602A接线图
接线说明:
- CND:系统电源负极
- VCC:系统电源正极
- SDA:IIC数据线
- SCL:IIC时钟线
对比度可以通过蓝色电位器调节,顺时针增强,逆时针减弱
效果图
IDE代码
LCD1602
引入库LiquidCrystal.h
可以在IDE左上角Sketch-Include Library中选择引入
其实这些库在IDE的安装路径中也可以找到
可以看到c++的定义和源码以及一些例子,可以去参考中文说明时序图看源文件学习代码
代码
/*液晶LCD1602并显示温度传感器LM35
*/#include<Arduino.h>#include<LiquidCrystal.h>// 定义引脚命名
#define LM35 A0
// 定义输出引脚
LiquidCrystal lcd(12,11,5,4,3,2)int val = 0;
// 定义温度初始值
float temp = 0;// the setup function runs once when you press reset or power the board
void setup() {// 打开串口Serial.begin(9600);// 让led使能,16字符*2行lcd.begin(16,2);lcd.print("Welcome to user!");delay(2000);// 清屏lcd.clear();}// the loop function runs over and over again forever
void loop()
{val = analogRead(LM35);temp = 0.48876 * val;Serial.print(val);Serial.print("= LM35 = ");Serial.println(temp);/* 通过lcd显示 */// 因为是16*2两行,可以看做是xy坐标x是0-15,y是0-1;如下显示第一行lcd.setCursor(0,0)lcd.print("LM35 = ");// 如下显示第二行lcd.setCursor(0,1)lcd.print((int)temp/10);lcd.print(".");lcd.print((int)temp%10);// 打印摄氏度lcd.print((char)223);lcd.print("C");delay(1000);
}
IIC/I2C 1602A
方法一:引入库LiquidCrystal_I2C.h
通过地址http://pan.baidu.com/s/1miJ9fio下载库文件
检测程序:http://pan.baidu.com/s/1pLlEKvp
将解压的库文件拷贝到IDE安装路径
通过IDE的左上角Sketch-import library导入
方式二
github地址:https://github.com/johnrickman/LiquidCrystal_I2C
下载库文件:LiquidCrystal_I2C-1.1.3.zip
Arduino IDE中选择:Sketch > Include library > Add .ZIP library添加完成后就可以使用了。
运行检测程序检测模块的默认起始地址
将上面程序拷贝到英文目录中编译执行
调出串口监视器,打印的0x27即为默认起始地址
简单示例
#include <Wire.h>
#include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line displayvoid setup()
{lcd.init(); // initialize the lcd // Print a message to the LCD.lcd.backlight();lcd.print("Hello, world!");
}void loop()
{
}
温度显示在1602A
#include <Wire.h>
#include <LiquidCrystal_I2C.h>// #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h
#include <DallasTemperature.h>#define ONE_WIRE_BUS A0 //1-wire数据总线连接在IO4
OneWire oneWire(ONE_WIRE_BUS); //声明
DallasTemperature sensors(&oneWire); //声明LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line displayvoid setup()
{Serial.begin(115200);Serial.println("");sensors.begin(); //初始化总线sensors.setWaitForConversion(false); //设置为非阻塞模式lcd.init(); // initialize the lcd // Print a message to the LCD.lcd.backlight();lcd.print("Hello, world!");
}unsigned long previousMillis = 0; //毫秒时间记录
const long interval = 1000; //时间间隔void loop()
{//以下段落相当于每秒读取前次温度,并发起新一次温度转换unsigned long currentMillis = millis(); //读取当前时间if (currentMillis - previousMillis >= interval) //如果和前次时间大于等于时间间隔{previousMillis = currentMillis; //更新时间记录float tempC = sensors.getTempCByIndex(0); //获取索引号0的传感器摄氏温度数据if (tempC != DEVICE_DISCONNECTED_C) //如果获取到的温度正常{Serial.print("\n当前温度是: ");Serial.print(tempC);Serial.println(" ℃");Serial.println(" ");String val = "temp:"+ String(tempC) + String("℃");lcd.setCursor(0,0);lcd.print("Hello, UNO world!");lcd.setCursor(0,1);//lcd.print(val);// lcd.print((int)tempC/10);// lcd.print(".");// lcd.print((int)tempC%10);lcd.print("temp:");lcd.print(tempC);// 打印摄氏度lcd.print((char)223);lcd.print("C");}sensors.requestTemperatures(); //发起新的温度转换}delay(500);Serial.print(".");
}