【雕爷学编程】Arduino动手做(133)---LCD1602扩展板模块

发布时间 2023-06-28 11:20:23作者: 行者花雕

7款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

 

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十三:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield

 

 

LCD

LCD 即 Liquid Crystal Display 的首字母缩写,意为“液态晶体显示器”,即液晶显示器。而 LED 显示器是指液晶显示器(LCD)中的一种,即以 LED(发光二极管)为背光光源的液晶显示器(LCD)。可见,LCD 是包括 LED的。与 LED 显示器相对应的实际上是 CCFL显示器。

 

工作原理

液晶从形状和外观看上去都是一种液体,但它的水晶式分子结构又表现出固体的形态。像磁场中的金属一样,当受到外界电场影响时,其分子会产生精确的有序排列;如对分子的排列加以适当的控制,液晶分子将会允许光线穿透;光线穿透液晶的路径可由构成它的分子排列来决定,这又是固体的一种特征。液晶是一种有机复合物,由长棒状的分子构成。在自然状态下,这些棒状分子的长轴大致平行。液晶屏(Liquid Crystal Display,以下简称LCD)第一个特点是必须将液晶灌入两个列有细槽的平面之间才能正常工作。这两个平面上的槽互相垂直(90度相交),也就是说,若一个平面上的分子南北向排列,则另一平面上的分子东西向排列,而位于两个平面之间的分子被强迫进入一种90度扭转的状态。由于光线顺着分子的排列方向传播,所以光线经过液晶时也被扭转90度。但当液晶上加一个电压时,分子便会重新垂直排列,使光线能直射出去,而不发生任何扭转。LCD的第二个特点是它依赖极化滤光片和光线本身,自然光线是朝四面八方随机发散的,极化滤光片实际是一系列越来越细的平行线。这些线形成一张网,阻断不与这些线平行的所有光线,极化滤光片的线正好与第一个垂直,所以能完全阻断那些已经极化的光线。 只有两个滤光片的线完全平行,或者光线本身已扭转到与第二个极化滤光片相匹配,光线才得以穿透。LCD正是由这样两个相互垂直的极化滤光片构成,所以在正常情况下应该阻断所有试图穿透的光线。但是,由于两个滤光片之间充满了扭曲液晶,所以在光线穿出第一个滤光片后,会被液晶分子扭转90度,最后从第二个滤光片中穿出。另一方面,若为液晶加一个电压,分子又会重新排列并完全平行,使光线不再扭转,所以正好被第二个滤光片挡住。以Synaptics TDDI技术为例,是将触摸控制器和显示驱动器整合到了单一芯片中,这减少了组件数量,简化了设计。ClearPad 4291支持混合多点内嵌式设计,因利用了液晶显示器(LCD)中的已有层,因而无需分立式触控传感器。ClearPad 4191又前进了一步,利用了LCD中已有的电极,因此实现了更加简洁的系统架构。这两款解决方案都使触控屏更薄、显示器更明亮,有助于改进智能手机和平板电脑设计的整体美学效果。对于反射式的TN(扭转向列型 Twisted Nematic)液晶显示器其构造由如下几层组成:极化滤光片、玻璃、相互绝缘又透明的纵横两组电极、液晶体、电极、玻璃、极化滤光片、反射片。

LCD1602

也叫1602字符型液晶,它能显示2行字符信息,每行又能显示16个字符,所以简称1602。它是一种专门用来显示字母、数字、符号的点阵型液晶模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。由若干个5x7或者5x10的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。采用单+5V 电源供电,外围电路配置简单,价格便宜,具有很高的性价比。

 

LCD1602管脚功能

1602采用标准的16脚接口,其中:

第1引脚:GND为电源地

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

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

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

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

第6引脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳

变时执行指令。

第7~14引脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电

源。

第15引脚背光正极,

第16引脚背光负极。

 

LCD1602 电原理图

 

 

LCD1602的指令说明

LCD Keypad Shield扩展板
是一款提供2行16字符液晶显示的Arduino扩展板。扩展了多个按键输入,可供用户作为LCD显示屏的菜单选择按键或者操控按键使用。一个扩展板就能让你与Arduino设备进行互动。我们还扩展Arduino Reset按键,方便用户进行软件调试。用户通过调节扩展板上的蓝色电位器,能够帮助您调节LCD屏的对比度。

对于Arduino初学者来说,不必为繁琐复杂液晶驱动电路连线而头疼了,这款LCD扩展板将电路简化,直接将此板插到Arduino Duemilanove 或 Uno控制器上即可使用,调用Arduino自带的LCD库,简单的几行代码便可以完成数据和字符的显示功能,有兴趣的朋友还能学习自定义显示内容。

LCD Keypad Shield扩展板技术规格

1602蓝色背景液晶(2行16字节)

具有LCD对比度调节功能

5个按键输入

扩展模拟信号传感器接口和数字口

ICSP编程接口

具有APC220,蓝牙V3接口

尺寸:58x80mm

 

模块应用

锅炉控制面板

机器人控制面板

环境监控设备

机械运行状态监控

 

LCD Keypad Shield扩展板模块电原理图

 

LCD Keypad Shield输入输出扩展板使用2行16个字符液晶,具有对比度调节和背光灯,使用1个模拟口便完成5个按键的输入,1个复位按键,未使用的IO口都扩展出来备用,充分利用IO口。占用数字端口:PIN4(DB4),5(DB5),6(DB6),7(DB7),8(RS),9(E),10(背光控制),模拟按键端口A0。

引脚定义

模拟A0  按钮(选择、向上、向右、向下和向左)

数字4  DB4

数字5  DB5

数字6  DB6

数字7  DB7

数字8  RS(数据或信号显示选择)

数字9  复位

数字10 背光控制

 

 

Arduino实验开源代码

 

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十三:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield

实验之一:这个程序用来测试LCD液晶显示模块和5个按键。

LiquidCrystal库:IDE—工具—管理库—搜索LiquidCrystal—安装

*/



#include <LiquidCrystal.h>

// 选择LCD上使用到的引脚

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// 定义各按键

int lcd_key    = 0;

int adc_key_in  = 0;

#define btnRIGHT  0

#define btnUP    1

#define btnDOWN  2

#define btnLEFT  3

#define btnSELECT 4

#define btnNONE  5

//读取按键值

int read_LCD_buttons()

{

adc_key_in = analogRead(0);      // 从模拟口0读值

// 直接读到的5个按键值在以下值附近:0,144,329,504,741

// 通过设定不同的阀值,就可以对应读到相应的按键

if (adc_key_in > 1000) return btnNONE;

if (adc_key_in < 50)  return btnRIGHT;  

if (adc_key_in < 250)  return btnUP;

if (adc_key_in < 450)  return btnDOWN;

if (adc_key_in < 650)  return btnLEFT;

if (adc_key_in < 850)  return btnSELECT;  

// V1.0的版本使用以下的阀值:

/*

if (adc_key_in < 50)  return btnRIGHT;  

if (adc_key_in < 195)  return btnUP;

if (adc_key_in < 380)  return btnDOWN;

if (adc_key_in < 555)  return btnLEFT;

if (adc_key_in < 790)  return btnSELECT;  

*/

return btnNONE;

}

void setup()

{

lcd.begin(16, 2);          // 开始

lcd.setCursor(0,0);

lcd.print("Push the buttons"); // 输出“Push the buttons”

}

void loop()

{

lcd.setCursor(9,1);        // 光标定在第二行,空开9格

lcd.print(millis()/1000);    // 输出等待时间

lcd.setCursor(0,1);        // 光标移动到第二行开头

lcd_key = read_LCD_buttons();  // 读取按键

switch (lcd_key)          // 选择按键

{

  case btnRIGHT:

    {

    lcd.print("RIGHT ");

    break;

    }

  case btnLEFT:

    {

    lcd.print("LEFT  ");

    break;

    }

  case btnUP:

    {

    lcd.print("UP  ");

    break;

    }

  case btnDOWN:

    {

    lcd.print("DOWN  ");

    break;

    }

  case btnSELECT:

    {

    lcd.print("SELECT");

    break;

    }

    case btnNONE:

    {

    lcd.print("NONE  ");

    break;

    }

}

}

  Arduino实验场景图

按下不同按键的输出显示

 

Arduino实验开源代码

/*

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)

实验一百三十三:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield

  实验之二:ADC密钥测试

  LiquidCrystal库:IDE—工具—管理库—搜索LiquidCrystal—安装

*/



#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

char msgs[5][16] = {"Right Key OK ",

              "Up Key OK  ",

              "Down Key OK  ",

              "Left Key OK  ",

              "Select Key OK"

            };

int adc_key_val[5] = {50, 200, 400, 600, 800 };

int NUM_KEYS = 5;

int adc_key_in;

int key = -1;

int oldkey = -1;

void setup()

{

  lcd.clear();

  lcd.begin(16, 2);

  lcd.setCursor(0, 0);

  lcd.print("ADC key testing");

}

void loop()

{

  adc_key_in = analogRead(0);  // 从A0传感器端读取值

  key = get_key(adc_key_in);  // 转换为按键

  if (key != oldkey)  // 如果检测到按键

  {

  delay(50);  // 等待解除缓冲时间

  adc_key_in = analogRead(0);  // 从A0传感器端读取值

  key = get_key(adc_key_in);  // 转换为按键

  if (key != oldkey)

  {

    lcd.setCursor(0, 1);

    oldkey = key;

    if (key >= 0) {

      lcd.print(msgs[key]);

    }

  }

  }

  delay(100);

}

// 将ADC值转换为密钥号

int get_key(unsigned int input)

{

  int k;

  for (k = 0; k < NUM_KEYS; k++)

  {

  if (input < adc_key_val[k])

  {

    return k;

  }

  }

  if (k >= NUM_KEYS)k = -1;  // 未按下有效键

  return k;

}

  

Arduino实验场景图

 

实验开源仿真编程(Linkboy V4.62)