51单片机LCD1602液晶显示

LCD1602.noteLCD1602是一种工业字符型液晶,能够同时显示16*02即32个字符。LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,即可以显示图形。

简介:

它由若干个5*7或者5*10等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到字符间距和行间距的作用,正因为如此所以他不能很好的显示图形(用自定义CGRAM,显示效果也不好)。

CGRAM(Custom Glyph RAM) 代表图像定义(自定义字形)功能,这个在1602液晶显示器上有用

到。

1602采用标准的引脚,其中:

第1引脚:GND为电源地

第2引脚:VCC接5V电源正极

扫描二维码关注公众号,回复: 3685934 查看本文章

第3引脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

第4引脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0 时选择指令寄存器。

第5引脚:RW为读写信号线,高电平1时进行读操作,低电平0时进行写操作。

第6引脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳

变时执行指令。

第7~14引脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电

源。第15引脚背光正极,第16引脚背光负极。

特性

3.3V或5V工作电压,对比度可调

内含复位电路

提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能

有80字节显示数据存储器DDRAM

内建有192个5X7点阵的字型的字符发生器CGROM

8个可由用户自定义的5X7的字符发生器CGRAM

特征应用

微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。

操作控制

注:关于E=H脉冲--开始时初始化E为0,然后置E为1。

字符集

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母"A"的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母"A"。

单片机编程中还可以用字符型常量或变量赋值,如'A'。因为CGROM储存的字符代码与我们PC中的字符代码是基本一致的,因此我们在向DDRAM写C51字符代码程序时甚至可以直接用P1='A'这样的方法。PC在编译时就把'A'先转换为41H代码了。

字符代码0x00~0x0F为用户自定义的字符图形RAM(对于5X8点阵的字符,可以存放8组,5X10点阵的字符,存放4组),就是CGRAM了。

0x20~0x7F为标准的ASCII码,0xA0~0xFF为日文字符和希腊文字符,其余字符码(0x10~0x1F及0x80~0x9F)没有定义。

以下是1602的16进制ASCII码表地址:读的时候,先读上面那行,再读左边那列,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)

指令集

指令码

功能令:

 

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

*

设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容

进入模式设置指令

0

0

0

0

0

0

0

1

I/D

S

I/D=1,光标或闪烁向右移动,AC增加1。I/D=0,光标或闪烁向左移动,AC减少1,S整个显示移动

显示开关控制指令

0

0

0

0

0

0

1

D

C

B

[D=1: 整体显示 ON],[C=1: 游标ON],[B=1:游标位置反白允许]

光标或显示移位指令

0

0

0

0

0

1

S/C

R/L

*

*

光标或显示移位指令可使光标或显示在没有读写数据的情况下,向左或向右移动,指令不改变DDRAM 的内容

功能设定

0

0

0

0

1

DL

N

F

*

*

[DL=0/1:4/8位数据],[N=0/1,单行/双行显示],[F=0/1,5*8/5*10点阵显示模式]

设置CGRAM地址

0

0

0

1

AC5

AC4

AC3

AC2

AC1

AC0

CGRAM地址设置指令设置CGRAM地址指针,

设定DDRAM地址

0

0

1

0

AC5

AC4

AC3

AC2

AC1

AC0

DDRAM地址设置指令设置DDRAM地址。一行地址范围00H~4FH,两行DDRAM地址第一行00H~27H,第二行40H~67H,加上高2位,[一行:80H-A7H],[二行:C0H-E7H]

读忙标志和地址

0

1

BF

AC6

AC5

AC4

AC3

AC2

AC1

AC0

BF:忙标志位,BF=1,模块正在进行内部操作,此时模块不接受任何外部指令和数据。BF=0,模块可以接受外部的指令和数据;同时可以读出地址计数器(AC)的值。

写RAM指令

1

0

D7

D6

D5

D4

D3

D2

D1

D0

将数据D7-D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM),将用户自定义的字符写入CGRAM中,D7~D5为000,D4~D0为5点的字模数据

读RAM指令

1

1

D7

D6

D5

D4

D3

D2

D1

D0

从内部RAM读取数据D7--D0(DDRAM/CGRAM/IRAM/GRAM)

单片机与LCD模块之间有四种基本操作:

写命令

读状态

写显示数据

读显示数据

#define DataPort P0

sbit RS = P2^4;

sbit RW = P2^5;

sbit EN = P2^6;

#define RS_CLR RS = 0

#define RS_SET RS = 1

#define RW_CLR RW = 0

#define RW_SET RW = 1

#define EN_CLR EN = 0

#define EN_SET EN = 1

RS

R/W

操作

0

0

写命令操作(初始化、光标定位等)

0

1

读状态操作(读忙标志)

1

0

写数据操作(要显示的内容)

1

1

读数据操作(可以把显示存储区中的数据反读出来)

LCD上电时,都必须按照一定的时序对LCD进行初始化操作,主要任务是设置LCD的工作方式、显示状态、清屏、输入方式、光标位置等。

    •  
    • bit LCD_Check_Busy()
    • {
    • DataPort = 0xff;
    • RS_CLR;
    • RW_SET;
    • EN_CLR;
    • _nop_();
    • EN_SET;
    • return (bit)(DataPort & 0x80);
    • }
    • /*------------------------------*/
    •  
    • /*------------WR-CMD------------*/
    • void LCD_Write_Com(unsigned char com)
    • {
    • while(LCD_Check_Busy());
    • RS_CLR;
    • RW_CLR;
    • EN_SET;
    • DataPort = com;
    • _nop_();
    • EN_CLR;
    • }
    • /*------------------------------*/
    •  
    • /*-----------*/
    • void LCD_Write_Data(unsigned char Data)
    • {
    • while(LCD_Check_Busy());
    • RS_SET;
    • RW_CLR;
    • EN_SET;
    • DataPort = Data;
    • _nop_();
    • EN_CLR;
    • }

LCD中CGRAM的用法:

   要让LCD1602显示自定义字符,就得用到CGRAM指令,CGROM字码表中最左边16字节是自定义CGRAM,实际只有8个字节可用.它的字符码是00H---07H这8个地址,从指令表看可以看到RS=0;RW=0;DB7与DB6分别为01,只有DB0--DB6 六位为地址为,DB6 DB5 DB4都为0代表这8个自定义字符,后3位是8个字模数据的地址;     

             CGRAM地址:  01000000 0x40   首地址,代表字模数据从第一行开放入

                           01000001 0x41 从第二行开始,上一行空出来                

                           01000010 0x42                 

                           01000011    0x43                   

                           01000100 0x44                 

                              01000101   0x45                

                           01000110 0x46               

                           01000111 0x47          

举例说明:我们向这8个字节写入字模数据,显示个"日"字;

如果CGRAM地址设置为0x40:则"日"字的第一行就是从8行最上面开始写,即0x1f就是放到了最上面

如果开始设置CGRAM地址写入0x41:这样的话"日"字的第一行就放在了8行的第二行

//LCD1602显示自定义字符测试程序

//STC89C52RC 12MHz

#include <reg52.h>

#define uint unsigned int

#define uchar unsigned char

sbit rs=P3^5;//1602数据命令选择线

//sbit rw=P3^6;rw=0;rw直接接GND 一直写不读

sbit en=P3^4;//1602使能控制线

/*P0口接1602的D0-D7********************/

uchar code table[]={

    0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,            //℃,代码 0x00

    0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,             //一,代码 0x01

    0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,            //二,代码 0x02

    0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,             //三,代码 0x03

    0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,               //四,代码 0x04

    0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,            //五,代码 0x05

    0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x06

    0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x07

};

void delay(uint t) //延时函数 用延时函数代替忙检测

{

 uint x,y;

 for(x=t;x>0;x--)

  for(y=110;y>0;y--);

}

/*********************************************/

void lcd_wcom(uchar com) //1602写命令函数

{

 rs=0;

  //rw=0;

 P0=com;

 delay(5);

 en=1;

 en=0;

}

void lcd_wdat(uchar dat)//1602写数据函数

{

 rs=1;

 //rw=0;

 P0=dat;

 delay(5);

 en=1;

 en=0;

}

void lcd_init()

{

 lcd_wcom(0x38);//8位数据,5*8字形

 lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁

 lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位

 lcd_wcom(0x01);//清屏

}

void main()

{

 uchar i;

 lcd_init();

 lcd_wcom(0x40);//设置CGRAM地址,设置为00处,从8行中第一行开始  ①第一步设置CGRAM地址

 for(i=0;i<64;i++)//写入数组中数据                                                     ②装入数组里要显示的数据

 {

  lcd_wdat(table[i]);

 }  

 lcd_wcom(0x80);    //设置字符显示位置 第一行第一个位置                ③设置显示地址,然后发送数据

 lcd_wdat(0x00);     //给1602发送字符数据  显示℃

 delay(5);

 lcd_wcom(0x81);   

 lcd_wdat(0x01);     // 显示"一"

 delay(5);

 lcd_wcom(0x82);   

 lcd_wdat(0x02);     //显示"二"

 delay(5);

 lcd_wcom(0x83);

 lcd_wdat(0x03);    //显示"三"

 delay(5);

 lcd_wcom(0x84);

 lcd_wdat(0x04);    //显示"四"

 delay(5);

 lcd_wcom(0x85);

 lcd_wdat(0x05);   //显示"五"

 delay(5);

 lcd_wcom(0x86);

 lcd_wdat(0x06);   //显示"六"

 delay(5);  

 lcd_wcom(0x87);

 lcd_wdat(0x07);   //显示"日"

 delay(5);

 while(1);

}

猜你喜欢

转载自blog.csdn.net/janmesyang/article/details/81808743