LCD1602液晶
一,1602介绍
1,管脚
GND - 接地
VCC - 电源
VO - 对比度调节
RS - 数据 or 命令选择端口
RW - 读 or 写选择端口
DB0->DB7 传输口
BLA - 背光源正极
BLK - 背光源负极
2,写数据的区域
1602可以写 16x2 个字符,一行16个,一共两行。
注意!!!!!!!
1602只能接收字符库的东西(十六进制),不能接收十进制!!!!
如果要送十进制的0~9的数加上: 0x30 。这样子十进制就会转化成 ASCII 码表
比如:lcd_write_date(0x30+0);//显示0
而不是 :lcd_write_date(0);//十进制无法显示,显示出来的是一坨不知道什么东西
注意:看图先看上面再看左边(先纵再横);比如 0 就是 30 。
加个 0x 在前面就可以变成十六进制了 0x30
地址: 这里是隐藏区域,可以写数据但是不会显示。使用整屏幕移动指令 16 次可以移动出来;
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 10 ...... 27
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F | 50 ...... 67
在写数据之前要确定在哪里显示!
上面的对应了16个字符,两行。
第一行地址: 0x80(起始地址)
比如:lcd_write_com(0x80);//这样子就设置了地址指针指向第一行开头
比如设定在第三个开始显示:lcd_write_com(0x80+0x03);//这样子就设定了数据在第三个开始写入
第二行地址: 0x80+0x40(起始地址)
比如:lcd_write_com(0x80+0x40);这样子就设置了地址指针指向第二行开头
比如设定在第三个开始显示:lcd_write_com(0x80+0x42);//这样子就设定了数据在第三个开始写入
3,说明
1602没有所谓的动态显示,静态显示。
可以这么理解:写在循环外的是静态显示<不会变的>
写在循环内的是动态显示<会改变的>
4,指令
0011 1000 = 0x38
作用:开启1602显示,5x7点阵,8位IO口,光标设置;
0000 1DCB
D:
D = 1,开显示。D = 0,关显示,1602不显示东西。
C:
C = 1,开启光标,C = 0。关闭光标<下面的那一横东西>
B:
B = 1,光标闪烁。B = 0,光标不闪烁<闪烁的正方形>
0000 01NS
N:
N = 1,写或读数据指针与光标自动加一。N = 0,写或读数据指针与光标自动减一。
S:
S 默认0就好。
0000 0001 = 0x01
清屏指令
0000 0010 = 0x02
显示回车,指针清零
0001 1000 = 0x18
整个屏幕左移
0001 1100 = 0x1c
整个屏幕右移
二,1602驱动
#include<reg52.h>
/***************延时*******************/
void delay(unsigned int z)// 延时 z 个毫秒
{
unsigned int x,y;
for(x=0;x<z;x++)
{
for(y=0;y<110;y++)
{
;
}
}
}
/*************1602驱动*****************/
/* 只演示写 */
#define lcd_io P0 // 传输的 IO 口
sbit EN = P2^7; // 使能端
sbit RS = P2^6; // 数据或命令选择端,对应电平的( 1 0 )
sbit RW = P2^5; // 读或写选择端,对应电平的( 1 0 )
void lcd_bus() // 检测LCD1602是否忙
{
unsigned char i;
lcd_io = 0xff; // 读命令之前置位
RS = 0; // 命令
RW = 1; // 读
for(i=0;i<200;i++)
{ // 最多检测 200 次,防止死机
EN = 0;
EN = 1; // 发射脉冲信号
if(!(lcd_io & 0x80))
{
break; // 不忙则退出
}
}
EN = 0; // 使能端拉低,阻止数据或命令传输
}
void lcd_write_date(unsigned char date)
{
lcd_bus(); // 检测忙
RS = 1; // 数据
RW = 0; // 写
lcd_io = date; // 给数据
delay(5); // 等待数据建立
EN = 1; // 高脉冲,传输数据过去
delay(5);
EN = 0;
}
void lcd_write_com(unsigned char com)
{
lcd_bus(); // 检测忙
RS = 0; // 命令
RW = 0; // 写
lcd_io = com; // 给命令
delay(5); // 等待命令建立
EN = 1; // 高脉冲,传输命令据过去
delay(5);
EN = 0;
}
/**************初始化******************/
void init()
{
lcd_write_com(0x38); // 启动LCD
lcd_write_com(0x0c); // LCD开显示,显示光标,光标闪烁
lcd_write_com(0x06); // 写一个数据指针自动加一,不整屏移动
lcd_write_com(0x01); // 清屏指令 <方便等一下的写数据>
}
/**************主函数******************/
void main()
{
init();
}
三,演示
自己思考一下吧;
-。-、