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

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

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

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

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

它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明: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 语言关于字符液晶4 总线的库函数,使用该库函数程序就变的更简洁了。函数例程如下:
#include <LCD4Bit.h>
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 需要接地.

  • 8
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
A:要控制led灯,你可以将led灯连接到arduino板上,并使用蓝牙模块hc-05来发送控制指令。以下是步骤: 1. 将蓝牙模块hc-05与arduino板连接。将hc-05的VCC接到arduino的5V口,GND接到arduino的GND口,TXD接到arduino的RX口,RXD接到arduino的TX口。 2. 将led灯连接到arduino的数字引脚上。例如,将led灯的正极连接到arduino的D7引脚,负极连接到arduino的GND口。 3. 安装蓝牙模块hc-05的串口库,可以在arduino官网或github上找到。将蓝牙模块hc-05与arduino板连接后,打开Arduino IDE软件,选择Tools->Port,选择当前使用的串口,然后打开Serial Monitor。设置Baud Rate为9600。 4. 在arduino IDE中编写代码。以下是一个示例: #include <SoftwareSerial.h> SoftwareSerial bluetooth(2, 3); //接收/发送蓝牙数据 int led = 7; //连接到led的数字引脚 void setup(){ pinMode(led, OUTPUT); //设置led的引脚为输出模式 bluetooth.begin(9600); //初始化蓝牙串口 } void loop(){ if(bluetooth.available() >= 1){ //如果接收到来自蓝牙的数据 int value = bluetooth.read(); //读取数据 if(value == '1'){ //如果接收到字符1 digitalWrite(led, HIGH); //点亮led灯 } else if(value == '0'){ //如果接收到字符0 digitalWrite(led, LOW); //关闭led灯 } } } 5. 将代码上传到arduino板上。点击Arduino IDE的“上传”按钮。 现在你可以使用安装了蓝牙模块hc-05的手机或电脑的蓝牙连接到arduino板,并发送字符1或0来控制led灯。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜航一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值