Arduino 入门教程GO 第八章 用显示屏写出自己的名字-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 683|回复: 0

Arduino 入门教程GO 第八章 用显示屏写出自己的名字

[复制链接]
发表于 2022-1-17 15:04 | 显示全部楼层 |阅读模式
本帖最后由 OpenJumper 于 2022-1-17 15:04 编辑

[md]## 一、1602液晶显示器显示实验

在上一章节中我们学会了使用四位数码管来显示我们想要显示的东西,那么,如果觉得显示的还是不够多又能怎么办呢?这个时候,就需要用到我们的1602液晶显示器了。

## 二、实验器材

+ UNO控制板:1块

+ 1602液晶显示器:1块

+ 面包板:1块

+ 面包板跳线:若干

## 三、连线示意图

01.jpg
图8-1


## 四、硬件连接图

02.jpg
图8-2


## 五、硬件知识要点

本次试验使用arduino直接驱动1602液晶显示文字

1602液晶在应用中非常广泛,最初的1602液晶使用的是HD44780控制器,现在各个厂家的1602模块基本上都是采用了与之兼容的IC,所以特性上基本都是一致的。

**1602LCD主要技术参数**

+ 显示容量为:16×2个字符;

+ 芯片工作电压:4.5~5.5V;

+ 工作电流:2.0mA(5.0V);

+ 模块最佳工作电压:5.0V;

+ 字符尺寸:2.95×4.35(W×H)mm。

**1602液晶接口引脚定义**

|编号|符号|引脚说明|编号|符号|引脚说明|
|:--|:--|:--|:--|:--|:--|
|1|VSS|电源地|9|D2|Date I/O|
|2|VDD|电源正极|10|D3|Date I/O|
|3|VL|液晶显示偏压信号|11|D4|Date I/O|
|4|RS|数据/命令选择端(V/L)|12|D5|Date I/O|
|5|R/W|读/写选择端(H/L)|13|D6|Date I/O|
|6|E|使能信号|14|D7|Date I/O|
|7|D0|Date I/O|15|BLA|背光源正极|
|8|D1|Date I/O|16|BLK|背光源负极|

**接口说明:**

1、两组电源 一组是模块的电源 一组是背光板的电源 一般均使用5V供电。本次试验背光使用3.3V供电也可以工作。

2、VL是调节对比度的引脚,串联不大于5KΩ的电位器进行调节。本次实验使用1KΩ的电阻来设定对比度。其连接分高电位与低电位接法,本次使用低电位接法,串联1KΩ电阻后接GND。

注意:不同液晶的对比度电阻是不同的,最好是接一个电位器进行测试,本次实验使用的1KΩ电阻在其他液晶上不一定正确。

3、RS 是很多液晶上都有的引脚 是命令/数据选择引脚 该脚电平为高时表示将进行数据操作;为低时表示进行命令操作。

4、RW 也是很多液晶上都有的引脚 是读写选择端 该脚电平为高是表示要对液晶进行读操作;为低时表示要进行写操作。

5、E 同样很多液晶模块有此引脚 通常在总线上信号稳定后给一正脉冲通知把数据读走,在此脚为高电平的时候总线不允许变化。

6、D0—D7 8 位双向并行总线,用来传送命令和数据。

7、BLA是背光源正极,BLK是背光源负极。

**1602液晶的基本操作分以下四种:**[/md]
读状态 输入 RS=L,R/W=H,E=H 输出D0~D7=状态字
写指令 输入 RS=L,R/W=L,D0~D7=指令码,E=高脉冲 输出
读数据 输入 RS=H,R/W=H,E=H 输出 D0~D7=数据
写数据 输入 RS=H,R/W=L,D0~D7=数据,E=高脉冲 输出


[md]

1602直接与arduino通信,根据产品手册描述,分8位连接法与4位连接法,我们先使用8位连接法进行实验。

## 六、程序编写[/md]
  1. int DI = 12;
  2. int RW = 11;
  3. int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚
  4. int Enable = 2;

  5. void LcdCommandWrite(int value) {
  6. // 定义所有引脚
  7. int i = 0;
  8. for (i=DB[0]; i <= DI; i++) //总线赋值
  9. {
  10. digitalWrite(i,value & 01);
  11. //因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。
  12.    value >>= 1;
  13. }
  14. digitalWrite(Enable,LOW);
  15. delayMicroseconds(1);
  16. digitalWrite(Enable,HIGH);
  17. delayMicroseconds(1);  // 延时1ms
  18. digitalWrite(Enable,LOW);
  19. delayMicroseconds(1);  // 延时1ms
  20. }

  21. void LcdDataWrite(int value) {
  22. // 定义所有引脚
  23. int i = 0;
  24. digitalWrite(DI, HIGH);
  25. digitalWrite(RW, LOW);
  26. for (i=DB[0]; i <= DB[7]; i++) {
  27.    digitalWrite(i,value & 01);
  28.    value >>= 1;
  29. }
  30. digitalWrite(Enable,LOW);
  31. delayMicroseconds(1);
  32. digitalWrite(Enable,HIGH);
  33. delayMicroseconds(1);
  34. digitalWrite(Enable,LOW);
  35. delayMicroseconds(1);  // 延时1ms
  36. }

  37. void setup (void) {
  38. int i = 0;
  39. for (i=Enable; i <= DI; i++) {
  40.    pinMode(i,OUTPUT);
  41. }
  42. delay(100);
  43. // 短暂的停顿后初始化LCD
  44. // 用于LCD控制需要
  45. LcdCommandWrite(0x38);  // 设置为8-bit接口,2行显示,5x7文字大小                     
  46. delay(64);                     
  47. LcdCommandWrite(0x38);  // 设置为8-bit接口,2行显示,5x7文字大小                        
  48. delay(50);                     
  49. LcdCommandWrite(0x38);  // 设置为8-bit接口,2行显示,5x7文字大小                        
  50. delay(20);                     
  51. LcdCommandWrite(0x06);  // 输入方式设定
  52.                          // 自动增量,没有显示移位
  53. delay(20);                     
  54. LcdCommandWrite(0x0E);  // 显示设置
  55.                          // 开启显示屏,光标显示,无闪烁
  56. delay(20);                     
  57. LcdCommandWrite(0x01);  // 屏幕清空,光标位置归零  
  58. delay(100);                     
  59. LcdCommandWrite(0x80);  // 显示设置
  60.                          // 开启显示屏,光标显示,无闪烁
  61. delay(20);                     
  62. }

  63. void loop (void) {
  64.   LcdCommandWrite(0x01);  // 屏幕清空,光标位置归零  
  65.   delay(10);
  66.   LcdCommandWrite(0x80+3);
  67.   delay(10);                     
  68.   // 写入欢迎信息
  69.   LcdDataWrite('W');
  70.   LcdDataWrite('e');
  71.   LcdDataWrite('l');
  72.   LcdDataWrite('c');
  73.   LcdDataWrite('o');
  74.   LcdDataWrite('m');
  75.   LcdDataWrite('e');
  76.   LcdDataWrite(' ');
  77.   LcdDataWrite('t');
  78.   LcdDataWrite('o');
  79.   delay(10);
  80.   LcdCommandWrite(0xc0+1);  // 定义光标位置为第二行第二个位置  
  81.   delay(10);
  82.   LcdDataWrite('o');
  83.   LcdDataWrite('p');
  84.   LcdDataWrite('e');
  85.   LcdDataWrite('n');
  86.   LcdDataWrite('-');
  87.   LcdDataWrite('j');
  88.   LcdDataWrite('u');
  89.   LcdDataWrite('m');
  90.   LcdDataWrite('p');
  91.   LcdDataWrite('e');
  92.   LcdDataWrite('r');
  93.   delay(5000);
  94.   LcdCommandWrite(0x01);  // 屏幕清空,光标位置归零  
  95.   delay(10);
  96.   LcdDataWrite('I');
  97.   LcdDataWrite(' ');
  98.   LcdDataWrite('a');
  99.   LcdDataWrite('m');
  100.   LcdDataWrite(' ');
  101.   LcdDataWrite('h');
  102.   LcdDataWrite('a');
  103.   LcdDataWrite('i');
  104.   LcdDataWrite('b');
  105.   LcdDataWrite('o');
  106.   LcdDataWrite('i');
  107.   delay(3000);
  108.   LcdCommandWrite(0x02); //设置模式为新文字替换老文字,无新文字的地方显示不变。
  109.   delay(10);
  110.   LcdCommandWrite(0x80+5); //定义光标位置为第一行第六个位置
  111.   delay(10);  
  112.   LcdDataWrite('t');
  113.   LcdDataWrite('h');
  114.   LcdDataWrite('e');
  115.   LcdDataWrite(' ');
  116.   LcdDataWrite('a');
  117.   LcdDataWrite('d');
  118.   LcdDataWrite('m');
  119.   LcdDataWrite('i');
  120.   LcdDataWrite('n');
  121.   delay(5000);
  122. }
复制代码
[md]
## 七、程序知识要点

在上面的代码中,我们常常可以遇到0x01,0x38这种参数。这些参数代表什么呢?

在C/C++语言中,0x38代表的是十六进制的数值"38","0x"的意思就是十六进制。

这里说明一下,一般情况下

十六进制 前缀0x 后缀h  

十进制 后缀D

八进制 后缀Q

二进制 后缀B

但是不同的程序语言,对于十六进制的表达方式不完全相同,在arduino下,表达十六进制数值“38”只能使用“0x38”而不能用“38H”

## 八、拓展阅读

在这一章的拓展阅读中,我们来一起了解一下四位接法:

在正常使用下,8位接法基本把arduino的数字端口占满了,如果想要多接几个传感器就没有端口了,这种情况下怎么处理呢,咱们可以使用4位接法。

四位接法的接线图如下图所示:

实验程序代码:[/md]
  1. int LCD1602_RS=12;   
  2. int LCD1602_RW=11;   
  3. int LCD1602_EN=10;   
  4. int DB[] = { 6, 7, 8, 9};
  5. char str1[]="Welcome to";
  6. char str2[]="geek-workshop";
  7. char str3[]="this is the";
  8. char str4[]="4-bit interface";

  9. void LCD_Command_Write(int command)
  10. {
  11. int i,temp;
  12. digitalWrite( LCD1602_RS,LOW);
  13. digitalWrite( LCD1602_RW,LOW);
  14. digitalWrite( LCD1602_EN,LOW);

  15. temp=command & 0xf0;
  16. for (i=DB[0]; i <= 9; i++)
  17. {
  18.    digitalWrite(i,temp & 0x80);
  19.    temp <<= 1;
  20. }

  21. digitalWrite( LCD1602_EN,HIGH);
  22. delayMicroseconds(1);
  23. digitalWrite( LCD1602_EN,LOW);

  24. temp=(command & 0x0f)<<4;
  25. for (i=DB[0]; i <= 9; i++)
  26. {
  27.    digitalWrite(i,temp & 0x80);
  28.    temp <<= 1;
  29. }

  30. digitalWrite( LCD1602_EN,HIGH);
  31. delayMicroseconds(1);
  32. digitalWrite( LCD1602_EN,LOW);
  33. }

  34. void LCD_Data_Write(int dat)
  35. {
  36. int i=0,temp;
  37. digitalWrite( LCD1602_RS,HIGH);
  38. digitalWrite( LCD1602_RW,LOW);
  39. digitalWrite( LCD1602_EN,LOW);

  40. temp=dat & 0xf0;
  41. for (i=DB[0]; i <= 9; i++)
  42. {
  43.    digitalWrite(i,temp & 0x80);
  44.    temp <<= 1;
  45. }

  46. digitalWrite( LCD1602_EN,HIGH);
  47. delayMicroseconds(1);
  48. digitalWrite( LCD1602_EN,LOW);

  49. temp=(dat & 0x0f)<<4;
  50. for (i=DB[0]; i <= 9; i++)
  51. {
  52.    digitalWrite(i,temp & 0x80);
  53.    temp <<= 1;
  54. }

  55. digitalWrite( LCD1602_EN,HIGH);
  56. delayMicroseconds(1);
  57. digitalWrite( LCD1602_EN,LOW);
  58. }

  59. void LCD_SET_XY( int x, int y )
  60. {
  61.   int address;
  62.   if (y ==0)    address = 0x80 + x;
  63.   else          address = 0xC0 + x;
  64.   LCD_Command_Write(address);
  65. }

  66. void LCD_Write_Char( int x,int y,int dat)
  67. {
  68.   LCD_SET_XY( x, y );
  69.   LCD_Data_Write(dat);
  70. }

  71. void LCD_Write_String(int X,int Y,char *s)
  72. {
  73.     LCD_SET_XY( X, Y );    //设置地址
  74.     while (*s)             //写字符串
  75.     {
  76.       LCD_Data_Write(*s);   
  77.       s ++;
  78.     }
  79. }

  80. void setup (void)
  81. {
  82.   int i = 0;
  83.   for (i=6; i <= 12; i++)
  84.    {
  85.      pinMode(i,OUTPUT);
  86.    }
  87.   delay(100);
  88.   LCD_Command_Write(0x28);//4线 2行 5x7
  89.   delay(50);
  90.   LCD_Command_Write(0x06);
  91.   delay(50);
  92.   LCD_Command_Write(0x0c);
  93.   delay(50);
  94.   LCD_Command_Write(0x80);
  95.   delay(50);
  96.   LCD_Command_Write(0x01);
  97.   delay(50);

  98. }

  99. void loop (void)
  100. {
  101.    LCD_Command_Write(0x01);
  102.    delay(50);
  103.    LCD_Write_String(3,0,str1);//第1行,第4个地址起
  104.    delay(50);
  105.    LCD_Write_String(1,1,str2);//第2行,第2个地址起
  106.    delay(5000);
  107.    LCD_Command_Write(0x01);
  108.    delay(50);
  109.    LCD_Write_String(0,0,str3);
  110.    delay(50);
  111.    LCD_Write_String(0,1,str4);
  112.    delay(5000);
  113.    
  114. }
复制代码





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

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-28 08:25 , Processed in 0.078180 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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