arduino学习笔记九--Arduino 控制1602字符液晶显示

1602 字符液晶是最常用的一种,很具有代表性,1602 液晶分4 总线和8 总线2 种驱动方式(关于该液晶的详细资
料,大家可以自己搜索,这里就不做详细说明了)。我们用单片机驱动1602 液晶,使用并口操作很容易就驱动起来了,
但使用 Arduino 板驱动1602 液晶,还真有点费劲,因为他只能位操作。根据官方网站提供的例程,很容易看出他们
使用的是最常用的8 总线驱动方式,然而他巧妙的使用for 循环语句完成了位操作的赋值。

实验器材:Arduino DM 一个,USB 电缆一根,LCD1602 一个,单芯杜邦线若干。
根据例程定义接线图如下:

arduino学习笔记九--Arduino 控制1602字符液晶显示_第1张图片

大家需要注意的是,液晶根据不同的颜色不同的型号,对比度(VEE)调节电压也不同,一般都需要接个电位器进
行调节,本实验使用的是灰膜液晶,VEE 直接接到地即可

arduino学习笔记九--Arduino 控制1602字符液晶显示_第2张图片

arduino学习笔记九--Arduino 控制1602字符液晶显示_第3张图片

根据我们使用的液晶更改功能初始化设置,指令集如下表:

arduino学习笔记九--Arduino 控制1602字符液晶显示_第4张图片

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1 为高电平、0 为低电平)
指令1:清显示,指令码01H,光标复位到地址00H 位置
指令2:光标复位,光标返回到地址00H
指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效
指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,
高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁
指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标
指令6:功能设置命令 DL:高电平时为4 位总线,低电平时为8 位总线 N:低电平时为单行显示,高电平时双行显
示 F: 低电平时显示5x7 的点阵字符,高电平时显示5x10 的点阵字符
指令7:字符发生器RAM 地址设置
指令8:DDRAM 地址设置
指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示
不忙。
指令10:写数据
指令11:读数据

来看看官方的工程代码:

 

int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚
int Enable = 2;
void LcdCommandWrite(int value) // poll all the pins
{
int i = 0;
for (i=DB[0]; i <= DI; i++) //总线赋值
{
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1); // send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1); // pause 1 ms according to datasheet
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void LcdDataWrite(int value) // poll all the pins
{
int i = 0;
digitalWrite(DI, HIGH);
digitalWrite(RW, LOW);
for (i=DB[0]; i <= DB[7]; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,LOW);
delayMicroseconds(1); // send a pulse to enable
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1); // pause 1 ms according to datasheet
}
void setup (void) {
int i = 0;
for (i=Enable; i <= DI; i++)
{
pinMode(i,OUTPUT);
}
delay(100); // initiatize lcd after a short pause needed by the LCDs controller
LcdCommandWrite(0x38); // set: // 8-bit interface, 1 display lines, 5x7 font
delay(20);
LcdCommandWrite(0x06); // entry mode set: // increment automatically, no display shift
delay(20);
LcdCommandWrite(0x0E); // display control: // turn display on, cursor on, no blinking
delay(20);
LcdCommandWrite(0x01); // clear display, set cursor position to zero
delay(100);
LcdCommandWrite(0x80); // display control: // turn display on, cursor on, no blinking
delay(20);
}
void loop (void) {
LcdCommandWrite(0x02); // set cursor position to zero
delay(10); // Write the welcome message
LcdDataWrite('H');
LcdDataWrite('o');
LcdDataWrite('l');
LcdDataWrite('a');
LcdDataWrite(' ');
LcdDataWrite('C');
LcdDataWrite('a');
LcdDataWrite('r');
LcdDataWrite('a');
LcdDataWrite('c');
LcdDataWrite('o');
LcdDataWrite('l');
LcdDataWrite('a');
delay(500);
}

Arduino DM 的数字端口只有14 个,那么LCD1602 就占用了10 个,浪费了不少资源,对我们以后的电路扩展带来
了极大的不便。于是我就可以使用该液晶的4 总线驱动方式,可以节省3 个数字端口出来作其他扩展。本人编写的工
程代码如下:
 

/********************************************************************/
int LCD1602_RS=12;
int LCD1602_RW=11;
int LCD1602_EN=10;
int DB[] = { 6, 7, 8, 9}; //定义4 总线数字IO 口
char str1[]="Welcome to"; //第一行显示内容
char str2[]="www.DFRobot.cn"; //第二行显示内容
/********************************************************************/
void LCD_Command_Write(int command) //写命令
{
int i,temp;
digitalWrite( LCD1602_RS,LOW);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);
temp=command & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
temp=(command & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
/********************************************************************/
void LCD_Data_Write(int dat) //写数据
{
int i=0,temp;

digitalWrite( LCD1602_RS,HIGH);
digitalWrite( LCD1602_RW,LOW);
digitalWrite( LCD1602_EN,LOW);
temp=dat & 0xf0;
for (i=DB[0]; i <= 9; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
temp=(dat & 0x0f)<<4;
for (i=DB[0]; i <= 10; i++)
{
digitalWrite(i,temp & 0x80);
temp <<= 1;
}
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
/********************************************************************/
void LCD_SET_XY( int x, int y ) //设置坐标
{
int address;
if (y ==0) address = 0x80 + x;
else address = 0xC0 + x;
LCD_Command_Write(address);
}
/********************************************************************/
void LCD_Write_Char( int x,int y,int dat) //写字符
{
LCD_SET_XY( x, y );
LCD_Data_Write(dat);
}
/********************************************************************/
void LCD_Write_String(int X,int Y,char *s) //写字符串

{
LCD_SET_XY( X, Y ); //设置地址
while (*s) //写字符串
{
LCD_Data_Write(*s);
s ++;
}
}
/********************************************************************/
void setup (void)
{
int i = 0;
for (i=6; i <= 12; i++)
{
pinMode(i,OUTPUT);
}
delay(100);
LCD_Command_Write(0x28);//4 线 2 行 5x7
delay(50);
LCD_Command_Write(0x06);
delay(50);
LCD_Command_Write(0x0c);
delay(50);
LCD_Command_Write(0x80);
delay(50);
LCD_Command_Write(0x01);
delay(50);
}
/********************************************************************/
void loop (void)
{
LCD_Command_Write(0x02); //光标返回首地址
delay(50);
LCD_Write_String(3,0,str1);//第1 行,第4 个地址起
delay(50);
LCD_Write_String(1,1,str2);//第2 行,第2 个地址起
while(1);
}

根据程序定义接线图如下:

arduino学习笔记九--Arduino 控制1602字符液晶显示_第5张图片

arduino学习笔记九--Arduino 控制1602字符液晶显示_第6张图片

编译后,下载进Arduino,显示如图:

arduino学习笔记九--Arduino 控制1602字符液晶显示_第7张图片

这个代码容易移植,以后需要用到显示的地方,都可以直接引用。
Arduino 语言关于字符液晶4 总线的库函数,使用该库函数程序就变的更简洁了。函数例程如下:
#include
LCD4Bit lcd = LCD4Bit(1); //传递参数1 和2,表示选择1 线和2 线字符液晶。
lcd.clear(); //清屏
delay(1000); //延时
lcd.printIn("arduino"); //显示字符串
lcd.cursorTo(2, 0); //line=2, x=0
lcd.leftScroll(20, 50); //將LCD 上现有的文字以50ms 的速度向左移动20 个字符位
注意:若使用LCD4Bit.h 的话,RW 需要接地.

你可能感兴趣的:(arduino,笔记,学习)