arduino使用74HC595控制LCD1602
时间: 2023-10-23 20:14:40 浏览: 52
首先,需要将LCD1602连接到Arduino上,具体连接方式可以参考下面的电路图:
![LCD1602电路图](https://img-blog.csdn.net/20180828132014288?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3J1Y2hlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
接下来,需要连接74HC595芯片,具体连接方式可以参考下面的电路图:
![74HC595电路图](https://img-blog.csdn.net/20180828132029108?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3J1Y2hlcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/70)
接下来,需要编写代码实现控制LCD1602。首先,需要定义引脚:
```c++
#define SRCLK 2 // 74HC595的时钟引脚
#define RCLK 3 // 74HC595的锁存引脚
#define SER 4 // 74HC595的串行数据引脚
#define RS 5 // LCD1602的RS引脚
#define RW 6 // LCD1602的RW引脚
#define EN 7 // LCD1602的EN引脚
```
接下来,需要定义一个函数,用于向74HC595芯片发送数据:
```c++
void shiftOut(byte data) {
digitalWrite(RCLK, LOW);
for (int i = 0; i < 8; i++) {
digitalWrite(SRCLK, LOW);
digitalWrite(SER, (data >> i) & 0x01);
digitalWrite(SRCLK, HIGH);
}
digitalWrite(RCLK, HIGH);
}
```
然后,需要定义一些LCD1602的命令和数据:
```c++
#define LCD_CLEAR 0x01 // 清屏
#define LCD_HOME 0x02 // 光标复位
#define LCD_ENTRY_MODE 0x06 // 模式设置
#define LCD_DISPLAY_ON 0x0c // 开启显示
#define LCD_DISPLAY_OFF 0x08 // 关闭显示
byte LCD_INIT_1[] = {
0x38, // 8位数据总线,2行显示,5x7点阵字符
0x0c, // 开启显示,关闭光标,关闭光标闪烁
0x06, // 光标右移,字符不移动
0x01 // 清屏
};
byte LCD_INIT_2[] = {
0x38, // 8位数据总线,2行显示,5x7点阵字符
0x0f, // 开启显示,开启光标,开启光标闪烁
0x06, // 光标右移,字符不移动
0x01 // 清屏
};
```
接下来,需要定义一些函数,用于向LCD1602发送命令和数据:
```c++
void lcdCommand(byte command) {
shiftOut(0x00);
digitalWrite(RS, LOW);
digitalWrite(RW, LOW);
shiftOut(command);
digitalWrite(EN, HIGH);
delayMicroseconds(1);
digitalWrite(EN, LOW);
delayMicroseconds(100);
}
void lcdData(byte data) {
shiftOut(0x00);
digitalWrite(RS, HIGH);
digitalWrite(RW, LOW);
shiftOut(data);
digitalWrite(EN, HIGH);
delayMicroseconds(1);
digitalWrite(EN, LOW);
delayMicroseconds(100);
}
```
最后,需要在setup函数中初始化引脚和LCD1602:
```c++
void setup() {
pinMode(SRCLK, OUTPUT);
pinMode(RCLK, OUTPUT);
pinMode(SER, OUTPUT);
pinMode(RS, OUTPUT);
pinMode(RW, OUTPUT);
pinMode(EN, OUTPUT);
digitalWrite(RS, LOW);
digitalWrite(RW, LOW);
digitalWrite(EN, LOW);
for (int i = 0; i < 4; i++) {
shiftOut(0x00);
}
for (int i = 0; i < sizeof(LCD_INIT_1); i++) {
lcdCommand(LCD_INIT_1[i]);
delayMicroseconds(100);
}
for (int i = 0; i < sizeof(LCD_INIT_2); i++) {
lcdCommand(LCD_INIT_2[i]);
delayMicroseconds(100);
}
}
```
然后,在loop函数中就可以使用lcdCommand和lcdData函数向LCD1602发送命令和数据了。例如,向第一行第一列写入字符串"Hello World":
```c++
void loop() {
lcdCommand(0x80); // 光标移动到第一行第一列
for (int i = 0; i < 11; i++) {
lcdData("Hello World"[i]);
}
delay(1000);
}
```
以上就是使用74HC595控制LCD1602的步骤和代码。需要注意的是,74HC595芯片是一个移位寄存器,可以将8位数据依次发送到芯片中,然后通过锁存引脚将数据一次性输出到8个输出引脚中。因此,在向74HC595芯片发送数据时,需要先将锁存引脚拉低,然后依次将8位数据通过串行数据引脚发送到芯片中,最后再将锁存引脚拉高,这样数据才会被一次性输出到8个输出引脚中。在本例中,使用了shiftOut函数来实现向74HC595芯片发送数据。同时,由于LCD1602需要发送命令和数据,因此需要分别定义lcdCommand和lcdData函数来向LCD1602发送命令和数据。在向LCD1602发送命令和数据时,需要先将RS引脚设置为LOW(命令模式)或HIGH(数据模式),然后将RW引脚设置为LOW(写入模式),最后通过shiftOut函数向LCD1602发送数据。需要注意的是,在向LCD1602发送命令和数据时,需要先将EN引脚拉低,然后将EN引脚拉高,这样才能使LCD1602响应命令和数据。