学习液晶感觉还可以,对于不同的液晶片,学会读懂参考手册,才是最重要的。
https://wenku.baidu.com/view/840dcb2a6c85ec3a87c2c561.html
这个对应郭老师的课的总结,里面总结比我个人详细。
3、如何开始对一个没有任何概念的芯片开始单片机的操作.... 76
第九节、I602液晶显示原理及实现
1、1602LCD最简单液晶工作原理、
1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别
1602字符型液晶也叫1602液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。字符型液晶,能够同时显示16x02(2行,一行16字符)即32个字符。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
1.1、1602LCD主要技术参数:
- 显示容量:16×2个字符
- 芯片工作电压:4.5—5.5V
- 工作电流:2.0mA(5.0V)
- 模块最佳工作电压:5.0V
- 字符尺寸:2.95×4.35(W×H)mm
1.2、引脚功能说明
1602LC采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明所示:
第1脚:VSS为地电源。
第2脚:VDD接5V正电源。
第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。对比度调整端,若仅仅接地,对比度会很高,常常接上一个几K的电位器或可变电阻来调节对比度以实现理想的显示效果。
第4脚:RS:寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW:读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙(一般对于单纯的LCD显示只用到写操作)。
第6脚:E:使能信号,当E端由高电平变为低电平时,液晶模块执行命令。
第7~14脚:D0-D7:8个数据I/O口(双向数据线)。
第15脚: BG_VCC、背光电源正极
第16脚:BG_GND、是背光电源负极。
LCD寄存器的选择 | |||
E使能 | R/W读写 | RS | 功能说明 |
1 | 0 | 0 | 写入命令寄存器 |
1 | 0 | 1 | 写入数据寄存器 |
1 | 1 | 0 | 读写忙碌标志和RAM地址 |
1 | 1 | 1 | 读取RAM数据 |
0 | X |
| 不动作 |
1.3、基本操作时序
1.4、液晶指令设置和初始化
1.4.1、显示模式设置
指令码(0x38) | 功能 | |||||||
0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 设置16x2显示,5x7点阵,8位数据接口 |
1.4.2、显示开关及光标设置:(初始化)
指令码 | 功能 | ||||||||
0 | 0 | 0 | 0 | 1 | D | C | B | D=1 开显示 D=0关显示 C=1 显示光标 C=0不显示光标 B=1光标闪烁 B=0不闪烁 | |
0 | 0 | 0 | 0 | 0 | 1 | N | S | N=1(读或写一个字符后地址指针加1 &光标加1), N=0(读或写一个字符后地址指针减1 &光标减1), S=1 且 N=1 (当写一个字符后,整屏显示左移)(N=0右移)以得到光标不移动而屏幕移动的效果 s=0 当写一个字符后,整屏显示不移动
| |
1.4.3、数据指针设置
指令码 | 功能 |
80H+地址码(0-27H,,, 40H-67H) | 设置数据地址指针 |
数据首地址为80H,
第一行0-27H,
第二行40H-67H(当第一行装不下时,就需要第二行,但是需要设置数据指针0x80+0x40)
1.4.4、其他设置
指令码 | 功能 |
01H | 显示清屏:1.数据指针清零 2.所有显示清零 |
02H | 显示回车:1.数据指针 |
1.4.5、显示地址
1602字符液晶显示可分为上下两部分各16位进行显示,处于不同行时的字符显示地址如下
显示字符 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
第一行 地址 | 00H | 01H | 02H | 03H | 04H | 05H | 06H | 07H | 08H | 09H | 0AH | 0BH | 0CH | 0DH | 0EH | 0FH |
第二行 地址 | 40H | 41H | 42H | 43H | 44H | 45H | 46H | 47H | 48H | 49H | 4AH | 4BH | 4CH | 4DH | 4EH | 4FH |
1.5、液晶储存器结构
2、简单设计程序操作液晶
2.1、程序一
显示:I like mcu!”; 和www.stu.com”;直接显示液晶上
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbt lcdrs=P3^5;
sbit dula=P2^7;
uchar code table[]=“I like mcu!”;
uchar code table1[]=“www.stu.com”;
uchar num;
void main()
{
int ()
for(num=0;num<11;num++)//利用循环调用数组显示
{
write_data(table[num]);//显示:I like mcu!
delay(20);
}
write_com(1);//清屏指令,上面的一行会显示出来后立刻消失
write_com(0x80+0x40+0x03);//设置数据指针,显示第二行! +0x03:表示向后移动三字符
for(num=0;num<13;num++)//利用循环调用数组显示
{
write_data(table1[num]);//显示: www.stu.com
delay(20);
}
//write_data(‘1’);//显示:1或者输入按照CGROM中对应的码
//delay(20);
//write_data(‘B’);//显示B
while(1)
}
void write_com(ucahr com)//写命令子函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(ucahr data)//写数据子函数
{
lcdrs =1;
P0=data;
delay (5);
lcden =1;
delay (5);
lcden =0;
}
void delay (unit z)//延迟函数
{
unit x, y;
for (x=z; x>0; x++)
for (y=110; y>0; y++)
}
void init ()//初始化函数
{
dula=0;
wela=0
lcden=0;
write_com(0x38);
write_com(.0x0e);
write_com(.0x06);
write_com(.0x01);
write_com(.0x80);
}
2.2、程序二
显示:从右侧平移到液晶上显示出来。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbt lcdrs=P3^5;
sbit dula=P2^7;
uchar code table[]=“I like mcu!”;
uchar code table1[]=“www.stu.com”;
uchar num;
void main()
{
int ()
for(num=0;num<11;num++)//利用循环调用数组显示
{
write_data(table[num]);//显示:I like mcu!
delay(20);
}
write_com(0x80+0x53);//设置数据指针,指定写入位置!!!显示第二行! +0x53:第二行从53那个字符开始写入。
for(num=0;num<13;num++)//利用循环调用数组写入字符
{
write_data(table1[num]);//显示: www.stu.com字符
delay(20);
}
for(num=0;num<16;num++)//左移动循环
{
write_com(0x18);//左移指令0x18 0001 1000
delay(200);
}
//write_data(‘1’);//显示:1或者输入按照CGROM中对应的码
//delay(20);
//write_data(‘B’);//显示B
while(1)
}
void write_com(ucahr com)//写命令子函数
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(ucahr data)//写数据子函数
{
lcdrs =1;
P0=data;
delay (5);
lcden =1;
delay (5);
lcden =0;
}
void delay (unit z)//延迟函数
{
unit x, y;
for (x=z; x>0; x++)
for (y=110; y>0; y++)
}
void init ()//初始化函数
{
dula=0;
wela=0
lcden=0;
write_com(0x38);
write_com(.0x0e);
write_com(.0x06);
write_com(.0x01);
write_com(.0x80);
}
3、如何开始对一个没有任何概念的芯片开始单片机的操作
1、写命令子函数
2、写数据子函数
3、初始化子函数
4、main第一行,第二行显示,移动