目录
目标理论学习实物图技术参数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(高配简洁版)
技术参数
![在这里插入图片描述](https://img-blog.csdnimg.cn/765459e8579643bab0f630f2ca035a81.png)
LCD1602 正面
![在这里插入图片描述](https://img-blog.csdnimg.cn/8cd1b109eef44abe999d795db68a7588.png)
VSS:接地VDD:正5VVO:对比度(2.2K-4.4K电阻)R/W:高电平是read,低电平是writeA:Led正,液晶K:Led负,液晶
背面
![在这里插入图片描述](https://img-blog.csdnimg.cn/e6d8d1d0eab74ade9780fcf5f1c18278.png)
IIC/I2C 1602A
正面
![在这里插入图片描述](https://img-blog.csdnimg.cn/15db3b2976b34825a5330fe3924acb99.png)
背面
![在这里插入图片描述](https://img-blog.csdnimg.cn/d4393b7addce4f73add9879d553cb489.png)
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中的一个位对应。
![在这里插入图片描述](https://img-blog.csdnimg.cn/086629a5c58c4bd6ab0867d977e98887.png)
1602液晶屏一行显示16个,对应于00-0F/40-4F,而DDRAM可以储存80个,如果需要显示10-27/50-67的内容就需要用到左移右移来实现。
总结:DDRAM是用来使液晶屏显示的,CGROM是液晶屏可以显示的内容(在CGROM 表中查看),CGRAM是用来扩展液晶屏可以显示的内容。
LCD1602 接线图
![在这里插入图片描述](https://img-blog.csdnimg.cn/62e5a1eb7bcf452ea2c5501d92af6bfe.png)
IIC/I2C 1602A接线图
接线说明:
CND:系统电源负极VCC:系统电源正极SDA:IIC数据线SCL:IIC时钟线
对比度可以通过蓝色电位器调节,顺时针增强,逆时针减弱
效果图
![在这里插入图片描述](https://img-blog.csdnimg.cn/62acdf09696b42cb85c8b450dbb6ef50.png)
IDE代码
LCD1602
引入库LiquidCrystal.h
可以在IDE左上角Sketch-Include Library中选择引入 其实这些库在IDE的安装路径中也可以找到 可以看到c++的定义和源码以及一些例子,可以去参考中文说明时序图看源文件学习代码 ![在这里插入图片描述](https://img-blog.csdnimg.cn/d4fe4928ba4848d58b7ae661b2b4dace.png)
代码
/*
液晶LCD1602并显示温度传感器LM35
*/
#include
#include
// 定义引脚命名
#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安装路径 ![在这里插入图片描述](https://img-blog.csdnimg.cn/61aeb5b1a0034937b9bf837d5ecaa72e.png)
通过IDE的左上角Sketch-import library导入 ![在这里插入图片描述](https://img-blog.csdnimg.cn/433ec1ccb9a9422884aeafc6865b2b96.png)
方式二
github地址:https://github.com/johnrickman/LiquidCrystal_I2C 下载库文件:LiquidCrystal_I2C-1.1.3.zip Arduino IDE中选择:Sketch > Include library > Add .ZIP library添加完成后就可以使用了。
运行检测程序检测模块的默认起始地址
将上面程序拷贝到英文目录中编译执行 调出串口监视器,打印的0x27即为默认起始地址
简单示例
#include
#include
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
void setup()
{
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Hello, world!");
}
void loop()
{
}
温度显示在1602A
#include
#include
// #include //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h
#include
#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 display
void 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(".");
}
|