4.11 51单片机-LCD1602显示屏

4.11 LCD1602显示屏

4.11.1 原理图介绍

4.11 51单片机-LCD1602显示屏

图4-11-1

4.11 51单片机-LCD1602显示屏

图4-11-2

根据原理图得知:

LCD1602的数据脚接P0口。

RD(RS)引脚接P2.6

WR(RW)引脚接P2.5

LCDE(E)引脚接P2.7

4.11.2 LCD1602字符屏幕介绍

1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号的点阵型液晶模块。

它是由若干个5x7或者5x11的点阵字符位组成,每个点阵字符位都可以用显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此,所以它不能很好的显示图片。

4.11 51单片机-LCD1602显示屏

图4-11-3 

4.11 51单片机-LCD1602显示屏

图4-11-4 

4.11 51单片机-LCD1602显示屏

图4-11-5

4.11.3 时序介绍

4.11 51单片机-LCD1602显示屏

图4-11-6 

 4.11 51单片机-LCD1602显示屏

4.11 51单片机-LCD1602显示屏

图4-11-8 

 4.11 51单片机-LCD1602显示屏

图4-11-9

LCD1602液晶模块的读/写操作、显示屏和光标的操作都是通过指令编程来实现的(其中,1为高电平,0为低电平),分别介绍如下。

(1)指令1:清屏。指令码01H,光标复位到地址00H。

(2)指令2:光标复位。光标复位到地址00H。

(3)指令3:输入方式设置。其中,I/D表示光标的移动方向,高电平右移,低电平左移;S表示显示屏上所有文字是否左移或右移,高电平表示有效,低电平表示无效。

(4)指令4:显示开关控制。其中,D用于控制整体显示的开与关,高电平表示开显示,低电平表示关显示;C用于控制光标的开与关,高电平表示有光标,低电平表示无光标;B用于控制光标是否闪烁,高电平闪烁,低电平不闪烁。

(5)指令5:光标或字符移位控制。其中,S/C表示在高电平时移动显示的文字,低电平时移动光标。

(6)指令6:功能设置命令。其中,DL表示在高电平时为4位总线,低电平时为8位总线;N表示在低电平时为单行显示,高电平时双行显示;F表示在低电平时显示5×7的点阵字符,高电平时显示5×10的点阵字符。

(7)指令7:字符发生器RAM地址设置。

(8)指令8:DDRAM地址设置。

(9)指令9:读忙信号和光标地址。其中,BF为忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平则表示不忙。

(10)指令10:写数据。

(11)指令11:读数据。

4.11.4 示例代码

下面代码实现在LCD1602屏幕上显示两排字母数字。

4.11 51单片机-LCD1602显示屏

图4-11-10

示例代码:

#include <reg51.h>
sbit lcd_1602_RS=P2^6;  //区分命令和数据
sbit lcd_1602_R_W=P2^5; //读写区分
sbit lcd_1602_E=P2^7;   //使能信号
#define lcd_1602_data_cmd P0  //发送接收数据和命令

//1602的初始化函数
void LCD1602_Init(void)
{
    LCD1602_WriteCmd(0x38); //设置显示模式
    LCD1602_WriteCmd(0x06); //设置数据指针自增
    LCD1602_WriteCmd(0x0C); //设置光标显示关闭,开启显示
    LCD1602_WriteCmd(0x01); //清屏
}

//1602写数据
void LCD1602_WriteData(unsigned char dat)
{
    lcd_1602_RS=1;//表示写数据
    lcd_1602_R_W=0;//表示写操作
    lcd_1602_data_cmd=dat;//写入的数据
    lcd_1602_E=1;//高脉冲
    DelayMs(5);
    lcd_1602_E=0;
}

//1602写命令
void LCD1602_WriteCmd(unsigned char cmd)
{
    lcd_1602_RS=0;
    lcd_1602_R_W=0;
    lcd_1602_data_cmd=cmd; 
    lcd_1602_E=1;
    DelayMs(5);
    lcd_1602_E=0;
}

/*
设置光标地址
x : 显示的位置
y :显示的行数 0表示1行显示  1表示第2行显示 
*/
void LCD1602_SetCursorAddr(unsigned char x,unsigned char y)
{
    unsigned char addr=0;
    if(y==1) //表示设置在第2行显示
    {
        addr=x+0x40;  //第二行地址
    }
    else
    {
        addr=x+0x00;    //第一行地址
    }
    LCD1602_WriteCmd(0x80|addr); //加上0x80表示设置地址
}

/*
设置显示的数据
*dat :表示要显示的数据
len  :显示数据的长度
*/
void LCD1602_DisplayData(unsigned  char *dat,unsigned char len)
{
     while(len--)
     {
         LCD1602_WriteData(*dat++);
     }   
}
code u8 str1[]="ABCDEFGHIJ";  //字符串结尾 '\0'
code u8 str2[]="1234567890";  //字符串结尾 '\0'
int main()
{
    LCD1602_Init();  //1602初始化
    DelayMs(50);
    LCD1602_SetCursorAddr(0x3,0x0);  //设置光标地址
    LCD1602_DisplayData(str1,strlen(str1)); //在1602上显示数据
    LCD1602_SetCursorAddr(0x3,0x1);  //设置光标地址
    LCD1602_DisplayData(str2,strlen(str2)); //在1602上显示数据
    while(1)
    {
       
}
}
上一篇:关于使用51单片机io口和lcd与定时器实现电子日历钟


下一篇:基于51单片机的抢答器设计