首先附上1602的相关资料:
引脚功能:
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。
指令表:
指令码
|
功 能
|
||||||||||
令
|
RS
|
R/W
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
|
清除显示
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
|
地址归位
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
X
|
设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容
|
显示状态开/关
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
D
|
C
|
B
|
[D=1: 整体显示 ON][C=1: 游标ON]
[B=1:游标位置反白允许]
|
进入点设定
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
I/D
|
S
|
指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位
|
游标或显示移位控制
|
0
|
0
|
0
|
0
|
0
|
1
|
S/C
|
R/L
|
X
|
X
|
设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容
|
功能设定
|
0
|
0
|
0
|
0
|
1
|
DL
|
X
|
RE
|
X
|
X
|
[DL=0/1:4/8位数据]
[RE=0/1: 基本指令操作 / 扩充指令操作]
|
设定CGRAM地址
|
0
|
0
|
0
|
1
|
AC5
|
AC4
|
AC3
|
AC2
|
AC1
|
AC0
|
设定CGRAM 地址
|
设定DDRAM地址
|
0
|
0
|
1
|
0
|
AC5
|
AC4
|
AC3
|
AC2
|
AC1
|
AC0
|
设定DDRAM 地址(显示位址)
[第一行:80H-A7H]
[第二行:C0H-E7H]
|
读取忙标志和地址
|
0
|
1
|
BF
|
AC6
|
AC5
|
AC4
|
AC3
|
AC2
|
AC1
|
AC0
|
读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值
|
写数据到RAM
|
1
|
0
|
数据
|
将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM)
|
|||||||
读出RAM的值
|
1
|
1
|
数据
|
从内部RAM读取数据D7——D0(DDRAM/CGRAM/IRAM/GRAM)
|
特性:
3.3V或5V工作电压,对比度可调
内含复位电路
提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能
有80字节显示数据存储器DDRAM
内建有192个5X7点阵的字型的字符发生器CGROM
8个可由用户自定义的5X7的字符发生器CGRAM
测试电路原理图:
测试代码:
#include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit lcden=P3^2; //使能端 sbit lcdrs=P3^0; //数据命令选择端 sbit rw=P3^1; uchar code table[]="xian shi 1"; //输入的字符 uchar code table1[]="xian shi 2"; //输入的字符 uchar num=0; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com)//根据写时序图写出指令程序 { lcdrs=0; rw=0; P1=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date)//根据写时序图写出数据程序 { lcdrs=1; rw=0; P1=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { lcden=0; //使能端为低电平 write_com(0x38); /*显示模式设置 00111000 设置16*2显示 5*7点阵 8位数据接口*/ write_com(0x0f); /*显示开关及光标设置 00001DCB D=1,开显示 D=0, 关显示 C=1,显示光标 C=0,不显示光标 B=1,光标闪烁 B=0,光标不闪烁*/ write_com(0x06);//地址指针自动+1且光标+1,写字符屏幕不会移动 write_com(0X01); write_com(0X80); } void main() { init(); for(num=0;num<10;num++) //输入的字符数量,修改 { write_data(table[num]); delay(50); } write_com(0X80+0x40); for(num=0;num<10;num++) //输入的字符数量,修改 { write_data(table1[num]); delay(50); } while(1); }