单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 87|回复: 17
打印 上一主题 下一主题
收起左侧

【Arduino】168种传感器模块系列实验(142)---LCD1602扩展板模块

[复制链接]
跳转到指定楼层
楼主
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
实验一百四十二:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield





评分

参与人数 1黑币 +12 收起 理由
zero0 + 12 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
沙发
 楼主| eagler8 发表于 2020-2-12 11:47 | 只看该作者
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)液晶显示器其构造由如下几层组成:极化滤光片、玻璃、相互绝缘又透明的纵横两组电极、液晶体、电极、玻璃、极化滤光片、反射片。

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




地板
 楼主| eagler8 发表于 2020-2-12 12:08 | 只看该作者
管脚功能
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引脚背光负极。




5#
 楼主| eagler8 发表于 2020-2-12 12:15 | 只看该作者
LCD1602 电原理图



6#
 楼主| eagler8 发表于 2020-2-12 13:52 | 只看该作者
LCD1602的指令说明



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

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




8#
 楼主| eagler8 发表于 2020-2-12 14:58 | 只看该作者

技术规格
1602蓝色背景液晶(2行16字节)
具有LCD对比度调节功能
5个按键输入
扩展模拟信号传感器接口和数字口
ICSP编程接口
具有APC220,蓝牙V3接口
尺寸:58x80mm

模块应用
锅炉控制面板
机器人控制面板
环境监控设备
机械运行状态监控

9#
 楼主| eagler8 发表于 2020-2-12 15:26 | 只看该作者
模块电原理图



10#
 楼主| eagler8 发表于 2020-2-12 15:57 | 只看该作者

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 背光控制

11#
 楼主| eagler8 发表于 2020-2-12 16:01 | 只看该作者

12#
 楼主| eagler8 发表于 2020-2-12 16:19 | 只看该作者



13#
 楼主| eagler8 发表于 2020-2-13 09:12 | 只看该作者
实验开源参考代码

  1. /*
  2. 【Arduino】168种传感器模块系列实验(资料 +代码 +图形 +仿真)
  3. 实验一百四十二:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield
  4. 实验之一:这个程序用来测试LCD液晶显示模块和5个按键。
  5. */

  6. #include <LiquidCrystal.h>

  7. // 选择LCD上使用到的引脚
  8. LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

  9. // 定义各按键
  10. int lcd_key     = 0;
  11. int adc_key_in  = 0;

  12. #define btnRIGHT  0
  13. #define btnUP     1
  14. #define btnDOWN   2
  15. #define btnLEFT   3
  16. #define btnSELECT 4
  17. #define btnNONE   5

  18. //读取按键值
  19. int read_LCD_buttons()
  20. {
  21. adc_key_in = analogRead(0);          // 从模拟口0读值
  22. // 直接读到的5个按键值在以下值附近:0,144,329,504,741
  23. // 通过设定不同的阀值,就可以对应读到相应的按键
  24. if (adc_key_in > 1000) return btnNONE;
  25. if (adc_key_in < 50)   return btnRIGHT;  
  26. if (adc_key_in < 250)  return btnUP;
  27. if (adc_key_in < 450)  return btnDOWN;
  28. if (adc_key_in < 650)  return btnLEFT;
  29. if (adc_key_in < 850)  return btnSELECT;  

  30. // V1.0的版本使用以下的阀值:
  31. /*
  32. if (adc_key_in < 50)   return btnRIGHT;  
  33. if (adc_key_in < 195)  return btnUP;
  34. if (adc_key_in < 380)  return btnDOWN;
  35. if (adc_key_in < 555)  return btnLEFT;
  36. if (adc_key_in < 790)  return btnSELECT;   
  37. */

  38. return btnNONE;
  39. }

  40. void setup()
  41. {
  42. lcd.begin(16, 2);              // 开始
  43. lcd.setCursor(0,0);
  44. lcd.print("Push the buttons"); // 输出“Push the buttons”
  45. }

  46. void loop()
  47. {
  48. lcd.setCursor(9,1);            // 光标定在第二行,空开9格
  49. lcd.print(millis()/1000);      // 输出等待时间


  50. lcd.setCursor(0,1);            // 光标移动到第二行开头
  51. lcd_key = read_LCD_buttons();  // 读取按键

  52. switch (lcd_key)               // 选择按键
  53. {
  54.    case btnRIGHT:
  55.      {
  56.      lcd.print("RIGHT ");
  57.      break;
  58.      }
  59.    case btnLEFT:
  60.      {
  61.      lcd.print("LEFT   ");
  62.      break;
  63.      }
  64.    case btnUP:
  65.      {
  66.      lcd.print("UP    ");
  67.      break;
  68.      }
  69.    case btnDOWN:
  70.      {
  71.      lcd.print("DOWN  ");
  72.      break;
  73.      }
  74.    case btnSELECT:
  75.      {
  76.      lcd.print("SELECT");
  77.      break;
  78.      }
  79.      case btnNONE:
  80.      {
  81.      lcd.print("NONE  ");
  82.      break;
  83.      }
  84. }
  85. }
复制代码



14#
 楼主| eagler8 发表于 2020-2-13 09:12 | 只看该作者
实验场景图



15#
 楼主| eagler8 发表于 2020-2-13 09:24 | 只看该作者
按下不同按键的输出显示




16#
 楼主| eagler8 发表于 2020-2-13 10:21 | 只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料 +代码 +图形 +仿真)
  3.   实验一百四十二:LCD1602 字符液晶屏 输入输出扩展板 LCD Keypad Shield
  4.   实验之二:ADC密钥测试
  5.   LiquidCrystal库:IDE—工具—管理库—搜索LiquidCrystal—安装
  6. */

  7. #include <LiquidCrystal.h>

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

  9. char msgs[5][16] = {"Right Key OK ",
  10.                     "Up Key OK    ",
  11.                     "Down Key OK  ",
  12.                     "Left Key OK  ",
  13.                     "Select Key OK"
  14.                    };

  15. int adc_key_val[5] = {50, 200, 400, 600, 800 };
  16. int NUM_KEYS = 5;
  17. int adc_key_in;
  18. int key = -1;
  19. int oldkey = -1;

  20. void setup()
  21. {
  22.   lcd.clear();
  23.   lcd.begin(16, 2);
  24.   lcd.setCursor(0, 0);
  25.   lcd.print("ADC key testing");
  26. }

  27. void loop()
  28. {
  29.   adc_key_in = analogRead(0);    // 从A0传感器端读取值
  30.   key = get_key(adc_key_in);  // 转换为按键

  31.   if (key != oldkey)   // 如果检测到按键
  32.   {
  33.     delay(50);  // 等待解除缓冲时间
  34.     adc_key_in = analogRead(0);    // 从A0传感器端读取值
  35.     key = get_key(adc_key_in);    // 转换为按键
  36.     if (key != oldkey)
  37.     {
  38.       lcd.setCursor(0, 1);
  39.       oldkey = key;
  40.       if (key >= 0) {
  41.         lcd.print(msgs[key]);
  42.       }
  43.     }
  44.   }
  45.   delay(100);
  46. }

  47. // 将ADC值转换为密钥号
  48. int get_key(unsigned int input)
  49. {
  50.   int k;

  51.   for (k = 0; k < NUM_KEYS; k++)
  52.   {
  53.     if (input < adc_key_val[k])
  54.     {
  55.       return k;
  56.     }
  57.   }

  58.   if (k >= NUM_KEYS)k = -1;  // 未按下有效键
  59.   return k;
  60. }
复制代码


17#
 楼主| eagler8 发表于 2020-2-13 10:32 | 只看该作者

18#
 楼主| eagler8 发表于 2020-2-13 14:56 | 只看该作者

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表