实验六:LCD显示

实验一:

1. 实验原理

LCD显示原理:通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光射出的目的。

LCD1602指令集说明:https://www.cnblogs.com/aslmer/p/5801363.html

2. 材料清单

元器件名称 信号参数规格 数量 参考实物图
Arduino开发板 Uno R3 1
面包包 840孔无焊板 1
LCD显示屏 LCD1602 1
面板包专用插线 - 1

3. 硬件连接

4. 程序设计

4.1 流程图

4.2 程序源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
LCD 实验
*/

//定义引脚
const int DI = 12; //RS
const int RW = 11; //RW

const int DB[8] = {3, 4, 5, 6, 7, 8, 9, 10}; //DB:07~02

const int Enable = 2; //使能信号

int i;
// 写命令
void LcdCommadWrite(int value) {
//写指令
for (i = DB[0]; i < DI; i ++) {
digitalWrite(i, value & 01);
value >>= 1;
}

/*
下面这几个干嘛的?
*/
digitalWrite(Enable, LOW); //
delayMicroseconds(1);
digitalWrite(Enable, HIGH);
delayMicroseconds(1);
digitalWrite(Enable, LOW);
delayMicroseconds(1);
}

// 写数据
void LcdDataWrite(int value) {
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);

for (int di : DB) {
digitalWrite(di, value & 01);
value >>= 1;
}


/*
下面这几个干嘛的?
*/
digitalWrite(Enable, LOW); //
delayMicroseconds(1);
digitalWrite(Enable, HIGH);
delayMicroseconds(1);
digitalWrite(Enable, LOW);
delayMicroseconds(1);
}


void setup() {
for (i = Enable; i <= DI; i ++) {
pinMode(i, OUTPUT);
}

//短暂延迟后初始化LCD
delay(100);
/*
为什么写指令之间要加延迟?
*/

//设置为8位接口, 2行显示, 5x7文字大小
//0x38 = 0011 1000
//0x38:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
//为什么 重复三次?
LcdCommadWrite(0x38);
delay(64);
LcdCommadWrite(0x38);
delay(50);
LcdCommadWrite(0x38);
delay(20);

//0x06 = 0000 0110 : 光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。
LcdCommadWrite(0x06); //输入方式指定
delay(20);
//显示设置
//0x0E = 0000 1110 : 显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。
LcdCommadWrite(0x0E);
delay(20);


//开启显示屏, 光标显示、无闪烁
delay(20);
LcdCommadWrite(0x01); //清屏
delay(100);
LcdCommadWrite(0x80); // 显示设置
delay(20);
}



void loop() {
//0x01 清除液晶显示器,即将DDRAM中的内容全部填入20H(空白字符)
// 光标撤回显示屏左上方
// 将地址计数器(AC)设为0,
// 光标移动方向为从左向右,并且DDRAM的自增量为1(I/D=1).
LcdCommadWrite(0x01); //清屏
delay(10);

//0x80 = 1000 0100 : 设置DDRAM地址
LcdCommadWrite(0x80 + 4); //第一行 第5个开始
char wc[] = "Wellcome!";
for (char ch : wc) {
LcdDataWrite(ch);
}

delay(10);
char ila[] = "I Love Arduino!";
for (char ch : ila) {
LcdDataWrite(ch);
}
delay(10000);
}

5. 调试及实验现象

6. 代码回顾

7. 扩展实验


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!