如何向单片机lcd1602程序1602液晶显示屏

查看: 124757|回复: 160
arduino学习笔记10 - 1602液晶实验
本帖最后由 弘毅 于
17:53 编辑
本次试验使用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液晶接口引脚定义
01.JPG (80.33 KB, 下载次数: 291)
20:21 上传
接口说明:
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液晶的基本操作分以下四种:
02.JPG (51.04 KB, 下载次数: 175)
20:21 上传
下图就是1602液晶实物图
IMGP9978_调整大小.JPG (140.15 KB, 下载次数: 136)
13:30 上传
IMGP9984_调整大小.JPG (182.96 KB, 下载次数: 129)
13:30 上传
1602直接与arduino通信,根据产品手册描述,分8位连接法与4位连接法,咱们先使用8位连接法进行实验。硬件连接方式如下图
Snap1.jpg (149.64 KB, 下载次数: 278)
13:30 上传
IMGP9969_调整大小.JPG (196.73 KB, 下载次数: 150)
13:30 上传
代码如下int DI = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚
int Enable = 2;
void LcdCommandWrite(int value) {
// 定义所有引脚
int i = 0;
for (i=DB[0]; i &= DI; i++) //总线赋值
{
& &digitalWrite(i,value & 01);//因为1602液晶信号识别是D7-D0(不是D0-D7),这里是用来反转信号。
& &value &&= 1;
digitalWrite(Enable,LOW);
delayMicroseconds(1);
digitalWrite(Enable,HIGH);
delayMicroseconds(1);&&// 延时1ms
digitalWrite(Enable,LOW);
delayMicroseconds(1);&&// 延时1ms
}
void LcdDataWrite(int value) {
// 定义所有引脚
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);
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1);&&// 延时1ms
}
void setup (void) {
int i = 0;
for (i=E i &= DI; i++) {
& &pinMode(i,OUTPUT);
delay(100);
// 短暂的停顿后初始化LCD
// 用于LCD控制需要
LcdCommandWrite(0x38);&&// 设置为8-bit接口,2行显示,5x7文字大小& && && && && && && &
delay(64);& && && && && && && &
LcdCommandWrite(0x38);&&// 设置为8-bit接口,2行显示,5x7文字大小& && && && && && && && &
delay(50);& && && && && && && &
LcdCommandWrite(0x38);&&// 设置为8-bit接口,2行显示,5x7文字大小& && && && && && && && &
delay(20);& && && && && && && &
LcdCommandWrite(0x06);&&// 输入方式设定
& && && && && && && && & // 自动增量,没有显示移位
delay(20);& && && && && && && &
LcdCommandWrite(0x0E);&&// 显示设置
& && && && && && && && & // 开启显示屏,光标显示,无闪烁
delay(20);& && && && && && && &
LcdCommandWrite(0x01);&&// 屏幕清空,光标位置归零&&
delay(100);& && && && && && && &
LcdCommandWrite(0x80);&&// 显示设置
& && && && && && && && & // 开启显示屏,光标显示,无闪烁
delay(20);& && && && && && && &
void loop (void) {
&&LcdCommandWrite(0x01);&&// 屏幕清空,光标位置归零&&
&&delay(10);
&&LcdCommandWrite(0x80+3);
&&delay(10);& && && && && && && &
&&// 写入欢迎信息
&&LcdDataWrite('W');
&&LcdDataWrite('e');
&&LcdDataWrite('l');
&&LcdDataWrite('c');
&&LcdDataWrite('o');
&&LcdDataWrite('m');
&&LcdDataWrite('e');
&&LcdDataWrite(' ');
&&LcdDataWrite('t');
&&LcdDataWrite('o');
&&delay(10);
&&LcdCommandWrite(0xc0+1);&&// 定义光标位置为第二行第二个位置&&
&&delay(10);
&&LcdDataWrite('g');
&&LcdDataWrite('e');
&&LcdDataWrite('e');
&&LcdDataWrite('k');
&&LcdDataWrite('-');
&&LcdDataWrite('w');
&&LcdDataWrite('o');
&&LcdDataWrite('r');
&&LcdDataWrite('k');
&&LcdDataWrite('s');
&&LcdDataWrite('h');
&&LcdDataWrite('o');
&&LcdDataWrite('p');
&&delay(5000);
&&LcdCommandWrite(0x01);&&// 屏幕清空,光标位置归零&&
&&delay(10);
&&LcdDataWrite('I');
&&LcdDataWrite(' ');
&&LcdDataWrite('a');
&&LcdDataWrite('m');
&&LcdDataWrite(' ');
&&LcdDataWrite('h');
&&LcdDataWrite('o');
&&LcdDataWrite('n');
&&LcdDataWrite('g');
&&LcdDataWrite('y');
&&LcdDataWrite('i');
&&delay(3000);
&&LcdCommandWrite(0x02); //设置模式为新文字替换老文字,无新文字的地方显示不变。
&&delay(10);
&&LcdCommandWrite(0x80+5); //定义光标位置为第一行第六个位置
&&delay(10);&&
&&LcdDataWrite('t');
&&LcdDataWrite('h');
&&LcdDataWrite('e');
&&LcdDataWrite(' ');
&&LcdDataWrite('a');
&&LcdDataWrite('d');
&&LcdDataWrite('m');
&&LcdDataWrite('i');
&&LcdDataWrite('n');
&&delay(5000);
}复制代码实验效果如下
在正常使用下,8位接法基本把arduino的数字端口占满了,如果想要多接几个传感器就没有端口了,这种情况下怎么处理呢,咱们可以使用4位接法。
4位接法的硬件连接方法如下图
Snap2.jpg (141.83 KB, 下载次数: 259)
14:16 上传
IMGP9997_调整大小.jpg (174.75 KB, 下载次数: 147)
14:16 上传
硬件接好后把下面的代码上传到控制板上,看看效果。int LCD1602_RS=12;& &
int LCD1602_RW=11;& &
int LCD1602_EN=10;& &
int DB[] = { 6, 7, 8, 9};
char str1[]=&Welcome to&;
char str2[]=&geek-workshop&;
char str3[]=&this is the&;
char str4[]=&4-bit interface&;
void LCD_Command_Write(int command)
{
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 &= 9; i++)
{
& &digitalWrite(i,temp & 0x80);
& &temp &&= 1;
digitalWrite( LCD1602_EN,HIGH);
delayMicroseconds(1);
digitalWrite( LCD1602_EN,LOW);
}
void LCD_Data_Write(int dat)
{
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 &= 9; 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 )
{
&&
&&if (y ==0)& & address = 0x80 +
&&else& && && & address = 0xC0 +
&&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(0x01);
& &delay(50);
& &LCD_Write_String(3,0,str1);//第1行,第4个地址起
& &delay(50);
& &LCD_Write_String(1,1,str2);//第2行,第2个地址起
& &delay(5000);
& &LCD_Command_Write(0x01);
& &delay(50);
& &LCD_Write_String(0,0,str3);
& &delay(50);
& &LCD_Write_String(0,1,str4);
& &delay(5000);
& &
}复制代码
4位接法实验效果如下
这里我们讲解一下最关键的部分,就是LCD的控制命令。
在上面两段代码中,我们常常可以遇到0x01,0x38这种参数。这些参数代表什么呢?
在C/C++语言中,0x38代表的是十六进制的数值&38&,&0x&的意思就是十六进制。
先打开win7下的计算器,选择“程序员”“基本”,
Snap3.jpg (68.62 KB, 下载次数: 131)
15:01 上传
然后咱们选择“十六进制”,输入“38”,
Snap5.jpg (67.23 KB, 下载次数: 121)
15:01 上传
然后再点击“二进制”。这时十六进制的“38”就会转换为二进制下的数值“111000”。
Snap6.jpg (62.89 KB, 下载次数: 118)
15:01 上传
以8位控制法接LCD是,对应的控制信息就是“”
0x38.jpg (30.29 KB, 下载次数: 118)
15:01 上传
同理,也可以把二进制的控制信息,逆运算为十六进制的。
有的产品说明书写的控制命令是&38H&
这里说明一下,一般情况下
十六进制 前缀0x 后缀h&&
十进制 后缀D
八进制 后缀Q
二进制 后缀B
但是不同的程序语言,对于十六进制的表达方式不完全相同,在arduino下,表达十六进制数值“38”只能使用“0x38”而不能用“38H”
最后放三个附件,是三个不同厂家的1602 LCD手册,供大家深入研究。
(233 KB, 下载次数: 1701)
22:22 上传
点击文件名下载附件
(634.17 KB, 下载次数: 1841)
22:22 上传
点击文件名下载附件
(255.88 KB, 下载次数: 1503)
22:22 上传
点击文件名下载附件
不错 不错!````学习 学习···
写得很详细啊,对新手很好。
筆記詳細,也很直觀,對我們初學者真的很有幫助!
我不明白,把data写进显存DDRAM和将显存中的data显示到屏幕上两者的关系,显存是40x2,屏幕是16x2,倘若我要显示DDRAM中第17列、第2行存放的data到屏幕上该怎么办?
另外LiquidCrystal库中lcd.print()和lcd.write()的区别是什么?
我正不知道特此通知连接
树·水·风 发表于
我不明白,把data写进显存DDRAM和将显存中的data显示到屏幕上两者的关系,显存是40x2,屏幕是16x2,倘若我要 ...
=.=这些底层的东西,偶也云里雾里的,不太明白。。。。偶水平基本上就是能让他显示=.=
microseconds 是微秒 缩写是us 不是ms
树·水·风 发表于
我不明白,把data写进显存DDRAM和将显存中的data显示到屏幕上两者的关系,显存是40x2,屏幕是16x2,倘若我要 ...
显存中上下两列都只能使用前16个地址,1602没法使用后面的,所以你写入第17列的数据没法自动显示,除非你自己读出来,然后再放到前面的地址中去。
ardyPro 发表于
显存中上下两列都只能使用前16个地址,1602没法使用后面的,所以你写入第17列的数据没法自动显示,除非你 ...
貌似懂了。以后再试试。
买的模块没有针脚,老是接触不良,悲催呀
Powered by51单片机LCD1602液晶显示程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机LCD1602液晶显示程序
&&51单片机LCD1602液晶显示程序
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢用stc89c52单片机,lcd1602液晶显示屏怎样用c语言实现让两行字符循环显示。 - 【51单片机】 -
电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 1772|回复: 4
用stc89c52单片机,lcd1602液晶显示屏怎样用c语言实现让两行字符循环显示。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
用stc89c52单片机,lcd1602液晶显示屏怎样用c语言实现让两行字符循环显示。
在线时间124 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 12, 距离下一级还需 188 积分
一粒金砂(中级), 积分 12, 距离下一级还需 188 积分
移字节写就会流动显示
在线时间578 小时
威望1192分
芯币1773枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1192, 距离下一级还需 8 积分
纯净的硅(中级), 积分 1192, 距离下一级还需 8 积分
先做到能指定位置显示出自己想要的字符,然后再考虑流水灯的方式,将字符也流动起来
天地庄周马;江湖范蠡船。
个性签名还是放QQ号吧,,添加说明EEworld好友
在线时间1425 小时
威望6318分
芯币21668枚
E金币300枚
TA的帖子TA的资源
编程序实现
在线时间8 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
可以试试中断。
EEWORLD 官方微信
EE福利 唾手可得
Powered by&_&:引脚的连接方式
&_&:下面是对其各个引脚进行说明:
1 /*--------------------------------------------------------------------------
4 Header file for generic 80C52 and 80C32 microcontroller.
5 Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc.
6 All rights reserved.
7 --------------------------------------------------------------------------*/
9 #ifndef __REG52_H__
10 #define __REG52_H__
BYTE Registers
17 sfr PSW
18 sfr ACC
21 sfr DPL
22 sfr DPH
23 sfr PCON
24 sfr TCON
25 sfr TMOD
26 sfr TL0
27 sfr TL1
28 sfr TH0
29 sfr TH1
32 sfr SCON
33 sfr SBUF
8052 Extensions
36 sfr T2CON
37 sfr RCAP2L = 0xCA;
38 sfr RCAP2H = 0xCB;
39 sfr TL2
40 sfr TH2
BIT Registers
45 sbit CY
46 sbit AC
47 sbit F0
48 sbit RS1
49 sbit RS0
50 sbit OV
= PSW^0; //8052 only
54 sbit TF1
55 sbit TR1
56 sbit TF0
57 sbit TR0
58 sbit IE1
59 sbit IT1
60 sbit IE0
61 sbit IT0
64 sbit EA
65 sbit ET2
= IE^5; //8052 only
66 sbit ES
67 sbit ET1
68 sbit EX1
69 sbit ET0
70 sbit EX0
73 sbit PT2
74 sbit PS
75 sbit PT1
76 sbit PX1
77 sbit PT0
78 sbit PX0
81 sbit RD
82 sbit WR
83 sbit T1
84 sbit T0
85 sbit INT1
86 sbit INT0
87 sbit TXD
88 sbit RXD
91 sbit SM0
92 sbit SM1
93 sbit SM2
94 sbit REN
95 sbit TB8
96 sbit RB8
97 sbit TI
98 sbit RI
101 sbit T2EX
= P1^1; // 8052 only
102 sbit T2
= P1^0; // 8052 only
105 sbit TF2
= T2CON^7;
106 sbit EXF2
= T2CON^6;
107 sbit RCLK
= T2CON^5;
108 sbit TCLK
= T2CON^4;
109 sbit EXEN2
= T2CON^3;
110 sbit TR2
= T2CON^2;
111 sbit C_T2
= T2CON^1;
112 sbit CP_RL2 = T2CON^0;
114 #endif
reg52.h 一般自带直接引用就含有这个文件啦
1 /*--------------------------------------------------------------------------
2 INTRINS.H
4 Intrinsic functions for C51.
5 Copyright (c)
Keil Elektronik GmbH and Keil Software, Inc.
6 All rights reserved.
7 --------------------------------------------------------------------------*/
9 #ifndef __INTRINS_H__
10 #define __INTRINS_H__
12 extern void
13 extern bit
_testbit_ (bit);
14 extern unsigned char _cror_
(unsigned char, unsigned char);
15 extern unsigned int
(unsigned int,
unsigned char);
16 extern unsigned long _lror_
(unsigned long, unsigned char);
17 extern unsigned char _crol_
(unsigned char, unsigned char);
18 extern unsigned int
(unsigned int,
unsigned char);
19 extern unsigned long _lrol_
(unsigned long, unsigned char);
20 extern unsigned char _chkfloat_(float);
21 extern void
(unsigned char _sfr);
22 extern void
(unsigned char _sfr);
intrins.h 一般自带&
1 /*-----------------------------------------------
2 名称:LCD1602
3 论坛:www.doflye.net
4 编写:shifang
5 内容:通过标准程序静态显示字符
6 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
7 ------------------------------------------------*/
8 #include&reg52.h& //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
9 #include&intrins.h&
11 sbit RS = P2^4;
//定义端口
12 sbit RW = P2^5;
13 sbit EN = P2^6;
15 #define RS_CLR RS=0
16 #define RS_SET RS=1
18 #define RW_CLR RW=0
19 #define RW_SET RW=1
21 #define EN_CLR EN=0
22 #define EN_SET EN=1
24 #define DataPort P0
25 /*------------------------------------------------
26 uS延时函数,含有输入参数 unsigned char t,无返回值
27 unsigned char 是定义无符号字符变量,其值的范围是
28 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
29 长度如下 T=tx2+5 uS
30 ------------------------------------------------*/
31 void DelayUs2x(unsigned char t)
while(--t);
35 /*------------------------------------------------
36 mS延时函数,含有输入参数 unsigned char t,无返回值
37 unsigned char 是定义无符号字符变量,其值的范围是
38 0~255 这里使用晶振12M,精确延时请使用汇编
39 ------------------------------------------------*/
40 void DelayMs(unsigned char t)
while(t--)
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
49 /*------------------------------------------------
50 判忙函数
51 ------------------------------------------------*/
52 bit LCD_Check_Busy(void)
DataPort= 0xFF;
return (bit)(DataPort & 0x80);
62 /*------------------------------------------------
63 写入命令函数
64 ------------------------------------------------*/
65 void LCD_Write_Com(unsigned char com)
// while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
76 /*------------------------------------------------
77 写入数据函数
78 ------------------------------------------------*/
79 void LCD_Write_Data(unsigned char Data)
//while(LCD_Check_Busy()); //忙则等待
DelayMs(5);
DataPort= D
91 /*------------------------------------------------
92 清屏函数
93 ------------------------------------------------*/
94 void LCD_Clear(void)
LCD_Write_Com(0x01);
DelayMs(5);
99 /*------------------------------------------------
100 写入字符串函数
101 ------------------------------------------------*/
102 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
if (y == 0)
LCD_Write_Com(0x80 + x);
//表示第一行
LCD_Write_Com(0xC0 + x);
//表示第二行
while (*s)
LCD_Write_Data( *s);
118 /*------------------------------------------------
119 写入字符函数
120 ------------------------------------------------*/
121 void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
if (y == 0)
LCD_Write_Com(0x80 + x);
LCD_Write_Com(0xC0 + x);
LCD_Write_Data( Data);
133 /*------------------------------------------------
134 初始化函数
135 ------------------------------------------------*/
136 void LCD_Init(void)
LCD_Write_Com(0x38);
/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);
/*显示关闭*/
LCD_Write_Com(0x01);
/*显示清屏*/
LCD_Write_Com(0x06);
/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);
/*显示开及光标设置*/
152 /*------------------------------------------------
153 主函数[上面已经把显示功能封装好了,今后再写其他显示就直接调用]
154 ------------------------------------------------*/
155 void main(void)
LCD_Init();
LCD_Clear();//清屏
LCD_Write_Char(7,0,'o');
LCD_Write_Char(8,0,'k');
LCD_Write_String(1,1,"www.doflye.net");
阅读(...) 评论()

我要回帖

更多关于 单片机1602显示程序 的文章

 

随机推荐