精华内容
下载资源
问答
  • 2019-10-27 11:50:23

    1.简介

    作为各类单片机实物设计的常用显示屏,LCD1602是一种专门用于显示字母、数字、符号等点阵式LCD,其1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符(1个汉字占用2个字符)。

    2.硬件参数

    (1) LCD1602主要技术参数
    a.显示容量:16×2个字符
    b.芯片工作电压:4.5—5.5V
    c.工作电流:2.0mA(5.0V)
    d.模块最佳工作电压:5.0V
    e.字符尺寸:2.95×4.35(W×H)mm
    (2) 引脚定义
    在这里插入图片描述
    LCD1602引脚主要有逻辑电源引脚VDD,VSS;背光带电源引脚BLA,BLK;数据引脚D0-D7、RS、R/W、EN;偏压信号引脚VL;其中:

    1. VL引脚:为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度;
    2. RS引脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
    3. R/W引脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。
    4. EN引脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

    (3)电路图
    在这里插入图片描述
    其中可调电阻P用于调整显示器的对比度。电阻R作为限流电阻,防止过流烧坏显示屏背光灯。

    3.控制程序

    LCD1602显示屏控制程序简化下来,也相对简单,只需要实现写数据写指令初始化三个控制函数即可实现对LCD1602的控制。(写操作一般不用,这里就省略不说)
    (1)写操作时序
    在这里插入图片描述
    要实现下面的写数据和写指令函数,都是以写操作时序来进行编程,实现有效的控制;其中,可以通过写时序和RS引脚的定义,写数据和写指令的区别在于RS引脚的电平;RS为高电平时,写数据;RS为低电平时,写指令。
    (2)写数据函数

    //写数据
    void write_data(uchar date)
    {
      LCDRS=1;
      P0=date;
      LCDdelay(5);
      LCDEN=1;
      LCDdelay(5);
      LCDEN=0;
    }
    

    (3)写指令函数

    //写命令
    void write_com(uchar com)
    {
      LCDRS=0;
      P0=com;
      LCDdelay(5);
      LCDEN=1;
      LCDdelay(5);
      LCDEN=0;
    }
    

    (4)初始化函数
    LCD1602初始化需要做以下设置:
    a.设置写操作:R/W设为低电平;
    b.屏幕设置模式:写指令38H;
    c.打开显示,关闭光标:写指令0CH;
    d.设置显示光标移动位置:写指令06H;
    e.设置字符显示位置:写指令(字符显示的起始位置);

    void Init1602()
    {
      uchar i=0;
    LCDRW = 0;
      write_com(0x38);//屏幕初始化
      write_com(0x0c);//打开显示 无光标 无光标闪烁
      write_com(0x06);//当读或写一个字符是指针后一一位
      write_com(0x01);//清屏
      write_com(0x80);//设置位置
    }
    

    注:由于对LCD1602进行控制时不需要实现读操作,所以R/W在初始化后恒为低电平(或者此引脚直接对地短路)。

    4.显示字符

    要在LCD1602上显示特定的字符,实际上就是对LCD1602的DDRAM上写入对应的数据,显示屏便显示你想要的字符。
    (1)DDRAM地址映射图
    从RAM可以看出来,是读的意思,地址与显示位置如下,每行40个地址,1602只用到前16个,共两行,对应关系如图:
    在这里插入图片描述
    根据写指令格式,由于地址为7位,在写入地址是,第8位恒为1,如图:
    在这里插入图片描述
    当我们想在指定位置写入内容时,要先指定地址,如在第一行第一位写入,地址位是00H,再加上DB7的1,即80H(0010000000),第二行第一位是40H,再加上DB7的1,即C0H(0011000000),依次类推。
    比如要在第1行第3位写入“HELLO WOLRD”,即先写入地址,再写入数据:

    write_com(0x40+0);  //第1行第3位
    write_com(‘H’);
    write_com(‘O’);
    .....
    write_com(‘D’);
    

    如果是写在第2行第2位:

    write_com(0x40+0x80+2);  //第2行第2位
    //写数据与上面一样
    

    (2)显示函数
    为了程序的简洁与方便,我们将显示程序整合成一个显示函数:

    void Display_1602(uchar x,uchar y,uchar *str)
    {
    	 unsigned char addr;
      
      if (y == 0)
      {
        addr = 0x00 + x; //第一行的x位置显示
      }
      else
      {
        addr = 0x40 + x; //第二行x的位置显示
      }
      write_com(addr + 0x80);
      while (*str != '\0')
      {
        write_data(*str++);
      }
    
    }
    

    要实现上面显示就比较简单:
    第1行第3位显示“HELLO WOLRD”:

    Display_1602(3,1,”HELLO WOLRD”);
    

    第2行第2位显示“HELLO WOLRD”:

    Display_1602(2,2,”HELLO WOLRD”);
    

    更多LCD1602设计资料及例程 请关注公众号,首页回复“1602”获取资料
    在这里插入图片描述

    更多相关内容
  • 不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。
  • LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
  • LCD1602显示电路图大全

    2020-07-14 13:22:06
    基于51单片机的lcd1602液晶显示屏连接电路图 lcd1602显示电路图(二) lcd1602液晶显示电路图 lcd1602工作原理是什么 线段的显示 点阵图形式液晶由M&TImes;N个显示单元组成,假设LCD显示屏有64行,每行有...
  • 利用51单片机编程实现在LCD1206液晶屏上的滚动显示
  • 本刊上期介绍单片机捕获红外遥控解码方法电路原路和程序设计方法,并给出了实例...这一讲将介绍单片机驱动LCD1602 液晶显示模块。通过该讲,读者可以掌握LCD1602 液晶的工作原理和如何通过单片机来驱动LCD1602 液晶。
  • 在这里和大家分享一个用LCD1602液晶屏显示I LOVE YOU的源程序。
  • 基于LCD1602液晶显示屏的电子万年历设计
  • 51单片机LCD1602液晶显示屏

    千次阅读 2022-03-21 10:54:21
    LCD1602 (Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量: 16x2个字符, 每个字符为5*7点阵 二、引脚及...

    一、LCD1602介绍

            LCD1602 (Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符
           显示容量: 16x2个字符, 每个字符为5*7点阵 

    二、引脚及电路应用

    三、内部结构框图

     通过往DDRAM中写入数据,DDRAM在字模库里找到然后显示在屏幕上,屏幕只能显示16*2,但实际可以显示40*2,厂家其实并没有做出来。

    四、存储结构

    往这些地址中写入字符码,然后DDRAM会从CGROM中找到字符显示在屏幕上

     

    通过十六进制,上边一行是高位,左边一列是低位,来找到所要显示的字符 

    ASCII码表

     

    五、LCD1602时序结构及操作流程

     六、代码

    LCD1602.c

    #include <REGX52.H>
    
    //引脚配置:
    sbit LCD_RS=P2^6;
    sbit LCD_RW=P2^5;
    sbit LCD_E=P2^7;
    #define LCD_DataPort P0
    
    //函数定义:
    /**
      * @brief  LCD1602延时函数,12MHz调用可延时1ms
      * @param  无
      * @retval 无
      */
    void LCD_Delay()		//@12.000MHz  1ms 如果是更快的单片机,这里延时要长一点
    {
    	unsigned char i, j;
    
    	i = 2;
    	j = 239;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    
    /**
      * @brief  LCD1602写命令
      * @param  Command 要写入的命令
      * @retval 无
      */
    void LCD_WriteCommand(unsigned char Command)
    {
    	LCD_RS=0;//写指令
    	LCD_RW=0;
    	LCD_DataPort=Command;
    	LCD_E=1;//这里置高又置低,高电平速度太快,反应不过来,因此进行延时
    	LCD_Delay();
    	LCD_E=0;
    	LCD_Delay();
    }
    
    /**
      * @brief  LCD1602写数据
      * @param  Data 要写入的数据
      * @retval 无
      */
    void LCD_WriteData(unsigned char Data)
    {
    	LCD_RS=1;//写数据
    	LCD_RW=0;
    	LCD_DataPort=Data;
    	LCD_E=1;//这里置高又置低,高电平速度太快,反应不过来,因此进行延时
    	LCD_Delay();
    	LCD_E=0;
    	LCD_Delay();
    	
    }
    
    /**
      * @brief  LCD1602初始化函数
      * @param  无
      * @retval 无
      */
    void LCD_Init(void)
    {
    	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    	LCD_WriteCommand(0x0C);//显示开,光标关,闪烁关
    	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
    	LCD_WriteCommand(0x01);//清屏
    
    }
    
    /**
      * @brief  LCD1602设置光标位置
      * @param  Line 行位置,范围:1~2
      * @param  Column 列位置,范围:1~16
      * @retval 无
      */
    void LCD_SetCursor(unsigned char Line,unsigned char Column)
    {
    	if(Line==1)
    	{
    		LCD_WriteCommand(0x80|(Column-1));//0x80是确定光标位置的指令,A0-A6是确定地址
    	}
    	else
    	{
    		LCD_WriteCommand(0x80|(Column-1)+0x40);//换行所以要加一个基地址0x40
    	}	
    }
    
    /**
      * @brief  在LCD1602指定位置上显示一个字符
      * @param  Line 行位置,范围:1~2
      * @param  Column 列位置,范围:1~16
      * @param  Char 要显示的字符
      * @retval 无
      */
    void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
    {
      LCD_SetCursor(Line,Column);
    	LCD_WriteData(Char);       //char x=‘A’;(等效于char x=0x41;)
    }
    
    /**
      * @brief  在LCD1602指定位置开始显示所给字符串
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  String 要显示的字符串
      * @retval 无
      */
    void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char String[])
    {
    	//这里用到指针的作用,String[]指针指向该字符组的第一个地址,依次显示出来,直到'\0'的出现
    	unsigned char i;
      LCD_SetCursor(Line,Column);
    	for(i=0;String[i]!='\0';i++)
    	{
    		LCD_WriteData(String[i]);
    	}
    }
    
    /**
      * @brief  返回值=X的Y次方
      */
    int LCD_Pow(int X,int Y)//x的y次方
    {
    	unsigned char i;
    	int Result=1;
    	for(i=0;i<Y;i++)
    	{
    		Result*=X;
    	}
    	return Result;
    }
    /*
                        i
    789/100%10    7     3     10^(3-1)
    789/10%10     8     2     10^(2-1)
    789/1%10      9     1     10^(1-1)
    */
    /**
      * @brief  在LCD1602指定位置开始显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~65535
      * @param  Length 要显示数字的长度,范围:1~5
      * @retval 无
      */
    void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i;
      LCD_SetCursor(Line,Column);
    	//根据长度确定所要显示的位数,通过计算将Number中从高位到低位依次显示出来,对照ASCII码表0的基地址
    	//为0x30,显示几就在这个地址上加几就可以
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData(0x30+Number/LCD_Pow(10,i-1)%10);//将数字转化为ASCII码表
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:-32768~32767
      * @param  Length 要显示数字的长度,范围:1~5
      * @retval 无
      */
    void LCD_ShowSignedNum(unsigned char Line,unsigned char Column, int Number,unsigned char Length)
    {
    	unsigned char i;
    	unsigned int Number1;
      LCD_SetCursor(Line,Column);
    	if(Number>=0)
    	{
    		LCD_WriteData('+');
    		Number1=Number;
    	}
    	else
    	{
    		LCD_WriteData('-');
    		Number1=-Number;
    	}
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData(0x30+Number1/LCD_Pow(10,i-1)%10);//将数字转化为ASCII码表
    	}
    }
    
    /*
    输入0xA0                   i
    160/16%16     10     2     16^(2-1)
    160/1%16       0     1     16^(1-1)
    */
    /**
      * @brief  在LCD1602指定位置开始以十六进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~0xFFFF
      * @param  Length 要显示数字的长度,范围:1~4
      * @retval 无
      */
    void LCD_ShowHexNum(unsigned char Line,unsigned char Column, int Number,unsigned char Length)
    {
    	unsigned char i;
    	unsigned char SingleNumber;
      LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		SingleNumber=Number/LCD_Pow(16,i-1)%16;
    		//将16进制转化为ASCII码表,这里输入16进制,但进行计算的是十进制
    		if(SingleNumber<10)
    		{
    			LCD_WriteData('0'+SingleNumber);
    		}
    		else
    		{
    			LCD_WriteData('A'+SingleNumber-10);//这里的‘A’相当于是一个基地址
    		}
    	}	
    }
    
    /**
      * @brief  在LCD1602指定位置开始以二进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
      * @param  Length 要显示数字的长度,范围:1~16
      * @retval 无
      */
    void LCD_ShowBinNum(unsigned char Line,unsigned char Column, int Number,unsigned char Length)
    {
    	unsigned char i;
      LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData(0x30+Number/LCD_Pow(2,i-1)%2);//将数字转化为ASCII码表
    	}
    }

    main.c实现LCD屏流动显示,其实就是对指令的操作

    #include <REGX52.H>
    #include "LCD1602.h"
    #include "Delay.h"
    
    void main()
    {
    	LCD_Init();
    	LCD_ShowChar(2,3,'\\');//也可以直接写'A',A的ASCII码就是0x41,实际传输就是0x41
    	LCD_ShowString(1,3,"hello");
    	LCD_ShowNum(1,9,66,2);
    	LCD_ShowSignedNum(1,11,-88,2);
    	LCD_ShowHexNum(2,1,0xA0,2);
    	LCD_ShowBinNum(2,5,0xA5,8);
    	LCD_ShowChar(2,14,0xDF);
    	LCD_ShowString(1,16,"Welcome to China!");
    	while(1)
    	{
    		LCD_WriteCommand(0x18);
    		Delay(500);
    	}
    }

    展开全文
  • STM32驱动LCD1602液晶屏

    2019-11-27 11:17:32
    STM32驱动LCD1602液晶屏,通过GPIO控制和获取数据,对于学习STM32具有一定的参考价值。代码清楚,亲测可用!
  • 文件内含完整代码与Proteus仿真图,通过4×4矩阵键盘输入密码,密码将在LDC1602液晶显示屏上显示,按下输入键将输入密码与预设密码校对
  •  液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍LCD1602 液晶显示模块(其内部控制为HD44780 芯片),它可以显示两行,每行16 个...
  •  液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在嵌入式应用系统中得到越来越广泛的应用,这讲中向大家介绍LCD1602 液晶显示模块(其内部控制为HD44780 芯片),它可以显示两行,每行16 个...
  • 51单片机——LCD1602液晶显示屏

    千次阅读 2021-06-08 21:39:02
    如下图:红框就是LCD1602液晶显示屏,他是可插拔的,插上去后数码管就会乱码无效了,因为他两共用了MCU的8个P0口 LCD1602原理图 从上面两幅图可以看出来 LCD1602LCD_D0~LCD_D7分别对应MCU的P00-P07 LCD1602的...

    如下图:红框就是LCD1602液晶显示屏,他是可插拔的,插上去后数码管就会乱码无效了,因为他两共用了MCU的8个P0口
    在这里插入图片描述

    LCD1602原理图
    在这里插入图片描述
    在这里插入图片描述
    从上面两幅图可以看出来

    • LCD1602的LCD_D0~LCD_D7分别对应MCU的P00-P07
    • LCD1602的LCD_RS对应MCU的P26
    • LCD1602的LCD_RW对应MCU的P25
    • LCD1602的LCD_E对应MCU的P27

    LCD1602的16个引脚
    在这里插入图片描述

    A在5*7点阵的字模
    在这里插入图片描述
    在这里插入图片描述
    PC收到41H的代码后就去字模文件中将代表A字的这一组数据送到显卡去点亮屏幕上相应的点,你就看到“A”这个字符了。

    LCD1602指令集:
    在这里插入图片描述
    显示A的步骤

    • 第一步:功能设置,八位数据接口,两行显示,5*7点阵,写指令0x38

    • 第二步:显示设置,显示开,光标关,闪烁关,写指令0x0c

    • 第三步:输入方式设置,数据读写操作后,光标自动加一,画面不动,写指令0x06

    • 第四步:清屏,写指令0x01

    • 第五步:设置光标位置,即DDRAM地址设置
      如果是第一行,写指令0x80|(col-1)
      如果是第二行,写指令0x80|(col-1+0x40)
      这里做下解释,如下图所示,LCD1602只能显示两行,每行16个。
      所以第一行写指令0x80|(col-1),假设col=1,即用户想在第一行第一列写数据,我们只需要写指令0x80|0x00即可,第一行第二列写数据,我们写指令0x80|0x01。
      在这里插入图片描述

    • 第六步:写A这个数据,把P0口直接赋值为A即可

    例程:显示A
    Delay.h

    #ifndef __DELAY_H__
    #define __DELAY_H__
    
    void Delay(unsigned int xms);
    
    #endif
    
    

    Delay.c

    
    void Delay(unsigned int xms)
    {
    	unsigned char i, j;
    	while(xms--)
    	{
    		i = 2;
    		j = 239;
    		do
    		{
    			while (--j);
    		} while (--i);
    	}
    }
    
    

    LCD1602.h

    #ifndef __LCD1602_H__
    #define __LCD1602_H__
    
    //用户调用函数:
    void LCD_Init();
    void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char);
    void LCD_ShowString(unsigned char Line,unsigned char Column,char *String);
    void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
    void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length);
    void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
    void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length);
    
    #endif
    
    

    LCD1602.c

    #include <REGX52.H>
    #include <Delay.h>
    //引脚配置:
    sbit LCD_RS=P2^6;
    sbit LCD_RW=P2^5;
    sbit LCD_EN=P2^7;
    #define LCD_DataPort P0
    
    
    /**
      * @brief  LCD1602写命令
      * @param  Command 要写入的命令
      * @retval 无
      */
    void LCD_WriteCommand(unsigned char Command)
    {
    	LCD_RS=0;
    	LCD_RW=0;
    	LCD_DataPort=Command;
    	LCD_EN=1;
    	Delay(1);
    	LCD_EN=0;
    	Delay(1);
    }
    
    /**
      * @brief  LCD1602写数据
      * @param  Data 要写入的数据
      * @retval 无
      */
    void LCD_WriteData(unsigned char Data)
    {
    	LCD_RS=1;
    	LCD_RW=0;
    	LCD_DataPort=Data;
    	LCD_EN=1;
    	Delay(1);
    	LCD_EN=0;
    	Delay(1);
    }
    
    /**
      * @brief  LCD1602设置光标位置
      * @param  Line 行位置,范围:1~2
      * @param  Column 列位置,范围:1~16
      * @retval 无
      */
    void LCD_SetCursor(unsigned char Line,unsigned char Column)
    {
    	if(Line==1)
    	{
    		LCD_WriteCommand(0x80|(Column-1));
    	}
    	else if(Line==2)
    	{
    		LCD_WriteCommand(0x80|(Column-1+0x40));
    	}
    }
    
    /**
      * @brief  LCD1602初始化函数
      * @param  无
      * @retval 无
      */
    void LCD_Init()
    {
    	LCD_WriteCommand(0x38);//八位数据接口,两行显示,5*7点阵
    	LCD_WriteCommand(0x0c);//显示开,光标关,闪烁关
    	LCD_WriteCommand(0x06);//数据读写操作后,光标自动加一,画面不动
    	LCD_WriteCommand(0x01);//光标复位,清屏
    }
    
    /**
      * @brief  在LCD1602指定位置上显示一个字符
      * @param  Line 行位置,范围:1~2
      * @param  Column 列位置,范围:1~16
      * @param  Char 要显示的字符
      * @retval 无
      */
    void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char)
    {
    	LCD_SetCursor(Line,Column);
    	LCD_WriteData(Char);
    }
    
    /**
      * @brief  在LCD1602指定位置开始显示所给字符串
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  String 要显示的字符串
      * @retval 无
      */
    void LCD_ShowString(unsigned char Line,unsigned char Column,char *String)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=0;String[i]!='\0';i++)
    	{
    		LCD_WriteData(String[i]);
    	}
    }
    
    /**
      * @brief  返回值=X的Y次方
      */
    int LCD_Pow(int X,int Y)
    {
    	unsigned char i;
    	int Result=1;
    	for(i=0;i<Y;i++)
    	{
    		Result*=X;
    	}
    	return Result;
    }
    
    /**
      * @brief  在LCD1602指定位置开始显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~65535
      * @param  Length 要显示数字的长度,范围:1~5
      * @retval 无
      */
    void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData(Number/LCD_Pow(10,i-1)%10+'0');
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:-32768~32767
      * @param  Length 要显示数字的长度,范围:1~5
      * @retval 无
      */
    void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
    {
    	unsigned char i;
    	unsigned int Number1;
    	LCD_SetCursor(Line,Column);
    	if(Number>=0)
    	{
    		LCD_WriteData('+');
    		Number1=Number;
    	}
    	else
    	{
    		LCD_WriteData('-');
    		Number1=-Number;
    	}
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData(Number1/LCD_Pow(10,i-1)%10+'0');
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以十六进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~0xFFFF
      * @param  Length 要显示数字的长度,范围:1~4
      * @retval 无
      */
    void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i,SingleNumber;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		SingleNumber=Number/LCD_Pow(16,i-1)%16;
    		if(SingleNumber<10)
    		{
    			LCD_WriteData(SingleNumber+'0');
    		}
    		else
    		{
    			LCD_WriteData(SingleNumber-10+'A');
    		}
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以二进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
      * @param  Length 要显示数字的长度,范围:1~16
      * @retval 无
      */
    void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData(Number/LCD_Pow(2,i-1)%2+'0');
    	}
    }
    
    

    main.c

    #include <REGX52.H>
    #include "LCD1602.h"	//包含LCD1602头文件
    void main()
    {
    	LCD_Init();
    	LCD_ShowChar(1,1,'A');
    }
    
    

    结果:
    在这里插入图片描述

    百度网盘
    51单片机系列文章所有文件内容都在此处
    链接:https://pan.baidu.com/s/1iVir85WO_usDPxmyZ0qDIg
    提取码:4spe

    展开全文
  • LCD1602液晶简介

    2014-03-28 00:08:48
    所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型...
  • LCD1602液晶显示

    2022-05-22 18:36:03
    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏LCD)、控制驱动主电路HD44780及其扩展驱动电路。


    一、LCD1602简介

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。为了降低成本,绝大多数制造商都直接将裸片做到板子上。

    1. 显示原理

    点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。显示屏上64×16个显示单元与显示RAM区的1024字节相对应,每一字节的内容与显示屏上相应位置的亮暗对应。例如显示屏第一行的亮暗由RAM区的000H~00FH的16字节的内容决定,当(000H)=FFH时,屏幕左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,屏幕右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H…,(00EH)=00H,(00FH)=00H时,在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。

    字符型液晶显示模块是一种专门用于显示字母、数字和符号等的点阵式LCD,常用16×1,16×2,20×2和40×2等的模块。一般的LCD1602字符型液晶显示器的内部控制器大部分为HD44780,能够显示英文字母、阿拉伯数字、日文片假名和一般性符号。

    2. 外形尺寸

    LCD1602字符型液晶显示器实物外形如图1所示。
    在这里插入图片描述
    LCD1602分为带背光和不带背光两种,其控制器大部分为HD44780。带背光的比不带背光的厚,是否带背光在实际应用中并无差别,具体的鉴别办法可参考图2所示的器件尺寸示意图。
    在这里插入图片描述
    原理图:
    在这里插入图片描述

    3. 技术参数

    (1)显示容量:16×2个字符。
    (2)芯片工作电压:4.5~5.5V。
    (3)工作电流:2.0mA(5.0V)。
    (4)模块最佳的工作电压:5.0V。
    (5)字符尺寸:2.95mm×4.35mm(宽×高)。

    4. 引脚功能

    LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明见表1。
    在这里插入图片描述
    各引脚的功能介绍如下:
    ·引脚1:VSS为地电源。
    ·引脚2:VDD接5V正电源。
    ·引脚3:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10kQ的电位器调整其对比度。
    ·引脚4:RS为寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。
    ·引脚5:R/W为读/写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或显示地址;当RS为低电平,R/W为高电平时,可以读忙信号;当RS为高电平,R/W为低电平时,可以写入数据。
    ·引脚6:E端为使能端,当E端由高电平跳变为低电平时,液晶模块执行命令。
    ·引脚7~ 14:D0~D7为8位双向数据线。
    ·引脚15:背光源正极。
    ·引脚16:背光源负极。

    5. 指令集

    LCD1602液晶模块内部的控制器共有11条控制指令,见表2。
    在这里插入图片描述
    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表示在高电平时为8位总线,低电平时为4位总线;N表示在低电平时为单行显示,高电平时双行显示;F表示在低电平时显示5×7的点阵字符,高电平时显示5×10的点阵字符。
    (7)指令7:字符发生器RAM地址设置。
    (8)指令8:DDRAM地址设置。
    (9)指令9:读忙信号和光标地址。其中,BF为忙标志位,高电平表示忙,此时模块不能接收命令或数据,如果为低电平则表示不忙。
    (10)指令10:写数据。
    (11)指令11:读数据。

    6. 连接方式

    LCD1602与单片机的连接有两种方式,一种是直接控制方式,另一种是所谓的间接控制方式。它们的区别只是所用的数据线的数量不同,其他都一样。

    1.直接控制方式
    LCD1602的8根数据线和3根控制线E,RS和R/W与单片机相连后即可正常工作。一般应用中只须往LCD1602中写入命令和数据,因此,可将LCD1602的R/W读/写选择控制端直接接地,这样可节省1根数据线。VO引脚是液晶对比度调试端,通常连接一个10kΩ的电位器即可实现对比度的调整;也可采用将一个适当大小的电阻从该引脚接地的方法进行调整,不过电阻的大小应通过调试决定。

    2.间接控制方式
    间接控制方式也称为四线制工作方式,是利用HD44780所具有的4位数据总线的功能,将电路接口简化的一种方式。为了减少接线数量,只采用引脚DB4~DB7与单片机进行通信,先传数据或命令的高4位,再传低4位。采用四线并口通信,可以减少对微控制器I/O的需求,当设计产品过程中单片机的I/O资源紧张时,可以考虑使用此方法。

    二、时序图

    1. 写时序

    在这里插入图片描述

    2.读时序

    在这里插入图片描述

    综上:
    在这里插入图片描述

    三、程序设计

    1. 写数据、指令

    /**
      * @brief  LCD1602写数据
      * @param  Data 要写入的数据
      * @retval 无
      */
    void LCD_WriteData(unsigned char Data)
    {
    	LCD_RS=1;
    	LCD_RW=0;
    	LCD_DataPort=Data;
    	LCD_E=1;
    	LCD_Delay();
    	LCD_E=0;
    	LCD_Delay();
    }
    
    /**
      * @brief  LCD1602写指令
      * @param  Command 要写入的指令
      * @retval 无
      */
    void LCD_WriteCommand(unsigned char Command)
    {
    	LCD_RS=0;
    	LCD_RW=0;
    	LCD_DataPort=Command;
    	LCD_E=1;
    	LCD_Delay();
    	LCD_E=0;
    	LCD_Delay();
    }
    

    2. 初始化、设光标

    /**
      * @brief  LCD1602初始化函数
      * @param  无
      * @retval 无
      */
    void LCD_Init(void)
    {
    	LCD_WriteCommand(0x38);
    	LCD_WriteCommand(0x0C);
    	LCD_WriteCommand(0x06);
    	LCD_WriteCommand(0x01);
    }
    
    /**
      * @brief  LCD1602设置光标位置
      * @param  Line 行位置,范围:1~2
      * @param  Column 列位置,范围:1~16
      * @retval 无
      */
    void LCD_SetCursor(unsigned char Line,unsigned char Column)
    {
    	if(Line==1)
    	{
    		LCD_WriteCommand(0x80|(Column-1));
    	}
    	else
    	{
    		LCD_WriteCommand(0x80|(Column-1)+0x40);
    	}
    }
    
    

    3. 读数据(读忙信号)

    	read_busy_flag()
    	{
    		unsigned char flag; // flag为LCD状态标志
    		                    //Px为LCD上8位数据总线所连接的单片机IO端口
    		Px = 0xFF;          // 给8位数据总线赋值11111111    
    		LCD_RS = 0;             // 选择指令寄存器,读取LCD状态字
    		LCD_RW = 1;             // 读操作
    		do
    		{
    			LCD_E = 1;   // 使能端拉高
    			flag = Px; // 读取LCD状态
    			LCD_E = 0; // 使能端拉低
    		} while(flag & 0x80); // 如果DB7依然为1,表示忙,直到DB7为0时跳出
    	}
    
    

    4. 显示函数

    /**
      * @brief  在LCD1602指定位置上显示一个字符
      * @param  Line 行位置,范围:1~2
      * @param  Column 列位置,范围:1~16
      * @param  Char 要显示的字符
      * @retval 无
      */
    void LCD_ShowChar(unsigned char Line,unsigned char Column,unsigned char Char)
    {
    	LCD_SetCursor(Line,Column);
    	LCD_WriteData(Char);
    }
    
    /**
      * @brief  在LCD1602指定位置开始显示所给字符串
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  String 要显示的字符串
      * @retval 无
      */
    void LCD_ShowString(unsigned char Line,unsigned char Column,unsigned char *String)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=0;String[i]!='\0';i++)
    	{
    		LCD_WriteData(String[i]);
    	}
    }
    
    /**
      * @brief  返回值=X的Y次方
      */
    int LCD_Pow(int X,int Y)
    {
    	unsigned char i;
    	int Result=1;
    	for(i=0;i<Y;i++)
    	{
    		Result*=X;
    	}
    	return Result;
    }
    
    /**
      * @brief  在LCD1602指定位置开始显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~65535
      * @param  Length 要显示数字的长度,范围:1~5
      * @retval 无
      */
    void LCD_ShowNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以有符号十进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:-32768~32767
      * @param  Length 要显示数字的长度,范围:1~5
      * @retval 无
      */
    void LCD_ShowSignedNum(unsigned char Line,unsigned char Column,int Number,unsigned char Length)
    {
    	unsigned char i;
    	unsigned int Number1;
    	LCD_SetCursor(Line,Column);
    	if(Number>=0)
    	{
    		LCD_WriteData('+');
    		Number1=Number;
    	}
    	else
    	{
    		LCD_WriteData('-');
    		Number1=-Number;
    	}
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData('0'+Number1/LCD_Pow(10,i-1)%10);
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以十六进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~0xFFFF
      * @param  Length 要显示数字的长度,范围:1~4
      * @retval 无
      */
    void LCD_ShowHexNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i;
    	unsigned char SingleNumber;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		SingleNumber=Number/LCD_Pow(16,i-1)%16;
    		if(SingleNumber<10)
    		{
    			LCD_WriteData('0'+SingleNumber);
    		}
    		else
    		{
    			LCD_WriteData('A'+SingleNumber-10);
    		}
    	}
    }
    
    /**
      * @brief  在LCD1602指定位置开始以二进制显示所给数字
      * @param  Line 起始行位置,范围:1~2
      * @param  Column 起始列位置,范围:1~16
      * @param  Number 要显示的数字,范围:0~1111 1111 1111 1111
      * @param  Length 要显示数字的长度,范围:1~16
      * @retval 无
      */
    void LCD_ShowBinNum(unsigned char Line,unsigned char Column,unsigned int Number,unsigned char Length)
    {
    	unsigned char i;
    	LCD_SetCursor(Line,Column);
    	for(i=Length;i>0;i--)
    	{
    		LCD_WriteData('0'+Number/LCD_Pow(2,i-1)%2);
    	}
    }
    
    

    5. 示例

    void main()
    {
    	LCD_Init();						//LCD初始化
    	LCD_ShowChar(1,1,'A');			//在1行1列显示字符A
    	LCD_ShowString(1,3,"Hello");	//在1行3列显示字符串Hello
    	LCD_ShowNum(1,9,66,2);			//在1行9列显示数字66,长度为2
    	LCD_ShowSignedNum(1,12,-88,2);	//在1行12列显示有符号数字-88,长度为2
    	LCD_ShowHexNum(2,1,0xA5,2);		//在2行1列显示十六进制数字0xA5,长度为2
    	LCD_ShowBinNum(2,4,0xA5,8);		//在2行4列显示二进制数字0xA5,长度为8
    	LCD_ShowChar(2,13,0xDF);		//在2行13列显示编码为0xDF的字符
    	LCD_ShowChar(2,14,'C');			//在2行14列显示字符C
    	while(1)
    	{
    	}
    }
    
    展开全文
  • LCD1602液晶显示屏的字符显示

    千次阅读 2022-04-26 18:55:12
    #include "lcd1602.h" #include "delay.h" void main(void) { lcd1602_init(); //LCD初始化 while(1) { lcd1602_char(1,3,'f'); lcd1602_string(2,1,"dshal"); } } LCD1602子程序: .
  • LCD1602液晶显示屏应用

    千次阅读 2020-10-23 15:38:39
    与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里...
  • LCD1602液晶显示屏

    2021-03-23 16:06:14
    LCD1602液晶显示屏 1 LCD1602介绍 1.1外部引脚 1.2内部结构 LCD1602内部拥有自己的字模库【CGRAM+CDROM(charactor generator)】,由AC(address count)向DDRAM(data display)中相应的地址中写入数据,找出...
  • 这里面是c/c++课程资源,希望能够帮助新人学习c/c++,
  • 在这一章我们就来讨论LCD1602液晶显示屏驱动的设计与实现。 1、功能概述   LCD1602液晶又被称作1602字符型液晶,这是一种只用来显示字母、数字、符号等的点阵型液晶模块。LCD1602里面存储器一般有三种:CGROM、...
  • 本资源基于arduino实现LCD1602液晶显示,其中1602是使用IIC驱动(PCF8574芯片)的,只占用了2个GPIO口,大大节约了IO口资源
  • 单片机外设LCD1602液晶屏介绍

    万次阅读 多人点赞 2017-06-04 22:09:59
    CrystalDisplay):液晶显示器的缩写,一种被动式的显示器,即液晶本身并不发光,而是经液晶经过处理后能改变光线通过方向的特性,而达到白底黑字或黑底白字显示的目的。   液晶显示器具有功耗低、抗干扰能力强...
  • 51单片机下LCD1602液晶屏的使用示例(显示字符、数字、字符串等),使用的是UTF-8编码,如果出现乱码,请修改为UTF-8编码格式,注意:请自行根据你的单片机修改引脚号,可参考文章:...STC89C52
  • LCD1602液晶使用介绍--(完整版)

    万次阅读 多人点赞 2020-11-28 18:13:34
    文章目录LCD1602介绍1602引脚信号说明控制接口介绍1、基本操作时许2、状态字说明3、指令说明RAM地址映射控制时序图代码实现写入命令写数据试验例程CGRAM自定义字模(简易汉字显示LCD1602介绍 LCD1602液晶在实际...
  • LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏LCD)、控制驱动主电路HD44780及其扩展驱动...在本次实例中通过LCD1602液晶显示屏,显示简单文本,为后面结合各种传感的使用打下基础。
  • LCD1602液晶显示器

    2020-08-15 08:48:12
    在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电器,本文是基于 C51模块LCD1602液晶显示器程序并含有相关电路图。
  • 本文重点是由深圳市兴宇合电子技术人员为大家介绍LCD1602液晶显示屏的工作原理以及原理图,希望对大家有所帮助。 (1)LCD1602液晶显示屏工作原理如下: LCD1602液晶显示屏通过电压来改变填充在两块平行板...
  • 目录 LCD1602显示屏介绍 引脚介绍 内部结构框图 存储器 DDRAM储存地址 ...时序介绍 ...LCD1602快捷指令 ...LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,195
精华内容 7,278
关键字:

lcd1602液晶显示屏介绍

友情链接: interpolate.zip