精华内容
下载资源
问答
  • LCD1602显示电路图大全

    2020-07-14 13:22:06
    例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,...
  • lcd1602引脚图功能介绍

    2020-07-16 11:12:54
    LCD1602引脚图 1602采用标准的16脚接口,其中: 1脚:VSS为电源地 2脚:VCC接5V电源正极 3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时...
  • 51单片机简单的驱动LCD1602

    千次阅读 多人点赞 2018-12-13 23:04:05
    目录 【LCD1602】 什么是LCD1602 LCD1602管脚 状态字 RAM地址映射 ...CSDN始于python,终究还是要回到自己老本行,学学py只是时兴起,为了自己兴趣...LCD1602种工业字符型液晶,能够同时显示16x02即32个字...

    目录

    【LCD1602】

    什么是LCD1602

    LCD1602管脚

    状态字

    RAM地址映射

    控制器接口时序

    基本操作时序

    指令介绍

    电路图

    【程序】


    CSDN始于python,终究还是要回到自己老本行,学一学py只是一时兴起,为了自己兴趣,电信才是自己的真爱。

    【LCD1602】

    什么是LCD1602

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

    1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。

    1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。

    市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。

    注意:LCD1602仅能显示字母、符号或数字,无法显示汉字。

    LCD1602管脚

    状态字

    RAM地址映射

    控制器接口时序

    1、读操作时序

    2、写操作时序

    3、时序参数

    基本操作时序

    1602的基本操作时序一共有4个,下面一一介绍。

    写程序前我们先将用到的总线接口做一个同意声明:

    #define LCD1602_DB P2			//并行输入口
    sbit LCD1602_RS = P0^5;			//数据/命令选择端
    sbit LCD1602_RW = P0^6;			//读写选择端
    sbit LCD1602_EN = P0^7;			//使能端	

    <1>读状态:RS = L,R/W = H,EN = H

    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    LCD1602_EN = 1;
    sta = LCD1602_DB;

    这样就把当前液晶的状态字读到了sta这个变量中,可以通过判断sta最高位的值来了解当前液晶是否处于“忙”状态,也可以得知当前数据的指针位置。

    <2>读数据:RS = H,R/W = H,EN = H

    在实际使用时,读数据很少使用,大家可以仅了解就行。

    <3>写指令:RS = L,R/W = L,D0~D7 = 指令码,EN = 高脉冲

    在这里就E = 高脉冲需要了解一下。因为这一句很关键,当前状态是写数据,根据时序图,首先保证EN引脚是低电平状态,不管前三句之前怎么设置,1602这里EN引脚没有使能控制,就不会读总线上的信号。当前三句准备好之后,让EN引脚从低电平到高电平变化,然后EN引脚再从高电平到低电平出现一个下降沿,1602检测到这个下降沿之后,并且检测到RS = L,R/W = L,就会马上读取D0~D7的数据,完成单片机写1602指令的过程。

    归纳:EN使能引脚先低拉高,再从高拉低,形成一个高脉冲。

    <4>写数据:RS = H,R/W = L,D0~D7 = 数据,EN = 高脉冲

    写数据与写指令类似,就是把RS改成H,把总线改成数据而已。

    指令介绍

    1、显示模式设置

    写指令0x38:设置16×2显示,5×7点阵,8位数据接口。(这条指令是固定的,必须写0x38)

    2、显示开/关以及光标设置指令

    如下图所示:

    第一条指令:一个字节中8位,前5位是固定的0B0001,低3位分别用DCB从高到低表示

    第二条指令:高6位是固定的0B000001,低2位使用NS从高到低表示

    3、清屏指令

    写入0x01表示显示清屏(固定的),其中包含了数据指针清零,所有的显示清零。

    写入0x02仅仅是数据指针清零,显示不清零。

    4、RAM地址设置指令

    该指令的最高位为1,低7位为RAM地址,RAM地址与液晶上字符的关系如上图所示。通常在读写数据之前都要先设置好地址,然后再进行数据的读写操作。

    5、初始化过程

    延时15ms

    写指令38H(不检测忙信号)

    延时5ms

    写指令38H(不检测忙信号)

    延时5ms

    写指令38H(不检测忙信号)

    (以后每次写指令、读/写数据操作前,都要检测忙信号)

    写指令38H:显示模式设置

    写指令08H:显示关闭

    写指令01H:显示清屏

    写指令06H:显示光标移动设置

    写指令0CH:显示开及光标设置

    电路图

    或者可以参考下图

    【程序】

    关于LCD1602的参考程序,我在这里放两个,一个是自己最开始做51小车时写的关于LCD1602的程序,以下程序仅供参考

    /*写命令*/
    void Write_Cmd(uchar cmd)
    {
    	LCD1602_RS = 0;			//写入命令
    	LCD1602_RW = 0;
    	LCD1602_DB = cmd;			
    	Delay_10us(10);
    	LCD1602_EN = 1;			//使能端高电平
    	Delay_10us(10);
    	LCD1602_EN = 0;
    }
    
    /*写数据*/
    void Write_Dat(uchar dat)
    {
    	LCD1602_RS = 1;
    	LCD1602_RW = 0;
    	LCD1602_DB = dat;
    	Delay_10us(10);
    	LCD1602_EN = 1;			//使能端高电平
    	Delay_10us(10);
    	LCD1602_EN = 0;
    }
    
    /*LCD1602初始化*/
    void LCD_INIT()
    {
    	Write_Cmd(0x38);		//设置显示模式
    	Write_Cmd(0x0c);		//开显示不显示光标,光标不闪烁
    	Write_Cmd(0x06);		//写一个指针+1
    	Write_Cmd(0x01);		//清屏
    	Write_Cmd(0x80);		//设置数据指针起点
    }
    
    /*延时函数*/
    void Delay_10us(uint n)
    {
    	while(n--)
    	{		
    		_nop_();
    		_nop_();
    		_nop_();
    		_nop_();
    		_nop_();
    	}
    }
    
    /*LCD1602显示*/
    void Print_LCD1602()
    {
    	uint i,j;
    	Write_Cmd(0x80);				//写第1行
    	for(i = 0;i < 6;i++)
    		Write_Dat(str1[i]);
    	for(i = 0;i < 4;i++)
    		Write_Dat(disdata[i]);
    	for(i = 0;i < 4;i++)
    		Write_Dat(str2[i]);
    	
    	Write_Dat(0x20);
    	
    	if(HAA == 1)
    		Write_Dat('B');
    	else if(HAA == 0)
    		Write_Dat('T');
    	
    	Write_Cmd(0x80 + 0x40);	//写第2行
    	for(j = 0;j < 9;j++)
    		Write_Dat(str3[j]);
    	for(j = 0;j < 4;j++)
    		Write_Dat(distance[j]);
    	for(j = 0;j < 2;j++)
    		Write_Dat(str4[j]);
    }

    另一个是自己后来多了解之后看的

    #define LCD1602_DB P2			//并行输入口
    sbit LCD1602_RS = P0^5;			//数据/命令选择端
    sbit LCD1602_RW = P0^6;			//读写选择端
    sbit LCD1602_EN = P0^7;			//使能端	
    
    void main()
    {
        LCD1602_Init();
        LCD1602_Show(2,0,"Xiaomo_HAA");
        LCD1602_Show(0,11,"HAppy!");
    }
    
    //等待液晶准备好
    void LCD1602_wait()
    {
        unsigned char sta;
        LCD1602_DB = 0xff;
        LCD1602_RS = 0;
        LCD1602_RW = 1;
    
        do{
            LCD1602_EN = 1;
            sta = LCD1602_DB;    //读取状态字
            LCD1602_EN = 0;      
        }while(sta & 0x80);      //bit7等于1表示液晶正忙,重复检测直到其为0为止
    }
    
    //写命令
    void LCD1602_cmd(unsigned char cmd)
    {
        LCD1602_wait();
        LCD1602_RS = 0;
        LCD1602_RW = 0;
        LCD1602_DB = cmd;
        LCD1602_EN = 1;
        LCD1602_EN = 0;
    }
    
    //写数据
    void LCD1602_Data(unsigned char dat)
    {
        LCD1602_wait();
        LCD1602_RS = 1;
        LCD1602_RW = 0;
        LCD1602_DB = dat;
        LCD1602_EN = 1;
        LCD1602_EN = 0;
    }
    
    //设置显示RAM起始地址(x,y对应屏幕上字符坐标)
    void LCD1602_SetRAM(unsigned char x,unsigned char y)
    {
        unsigned char addr;
        if(y == 0)
            addr = 0x00 + x;
        else
            addr = 0x40 + x;
        LCD1602_cmd(addr | 0x80);
    }
    
    //显示字符串
    void LCD1602_Show(unsigned char x,unsigned y,unsigned char *str)
    {
        LCD1602_SetRAM(x,y);
        while(*str != '\0')
        {
            LCD1602_Data(*str++);
        }
    }
    
    //初始化LCD1602
    void LCD1602_Init()
    {
    	LCD1602_cmd(0x38);		//设置显示模式
    	LCD1602_cmd(0x0c);		//开显示不显示光标,光标不闪烁
    	LCD1602_cmd(0x06);		//写一个指针+1
    	LCD1602_cmd(0x01);		//清屏
    }

     

     

    展开全文
  • 详解LCD1602液晶显示屏的使用

    万次阅读 多人点赞 2019-10-27 11:50:23
    作为各类单片机实物设计的常用显示屏,LCD1602种专门用于显示字母、数字、符号等点阵式LCD,其1602是指LCD显示的内容为16X2,即可以显示两行,每行16个字符(1个汉字占用2个字符)。 2.硬件参数 (1) LCD1602主要...

    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显示总结

    万次阅读 多人点赞 2019-06-03 12:46:44
    1.LCD1602正常显示两行数据 /*------------------------ 功能:LCD1602显示两行数据 Author: Zhang Kaizhou Date: 2019-6-3 12:42:22 ------------------------*/ #include <reg52.h> #define uchar ...

    仿真原理图如下:
    在这里插入图片描述
    1.LCD1602正常显示两行数据

    /*------------------------
    功能:LCD1602显示两行数据
    Author: Zhang Kaizhou
    Date: 2019-6-3 12:42:22
    ------------------------*/
    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    	
    uchar code table0[] = {"0123456789ABCDEF"}; // 每行的字符数据
    uchar code table1[] = {"0123456789abcdef"};
    sbit lcdrs = P1^2; // LCD数据/命令选择端
    sbit lcdrw = P1^3; // LCD读写选择端
    sbit lcden = P1^4; // LCD使能端,高脉冲有效
    uchar num;
    
    void init();
    void writeCommand(uchar command);
    void delay(uchar xms);
    void writeData(uchar dat);
    
    void main()
    {
    	init();
    	writeCommand(0x80); // 将数据指针定位到第一行的首地址
    	for(num = 0; num < 16; num++)
    	{
    		writeData(table0[num]);
    		delay(5);
    	}
    	
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行的首地址
    	for(num = 0; num < 16; num++)
    	{
    		writeData(table1[num]);
    		delay(5);
    	}
    	while(1);
    }
    
    /*初始化LCD1602的设置*/
    void init()
    {
    	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
    	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
    	writeCommand(0x0c); // 开显示,不显示光标
    	writeCommand(0x06); // 写一个字符后地址指针自动加1
    	writeCommand(0x01); // 显示清零,数据指针清零
    }
    
    /*写指令函数*/
    void writeCommand(uchar command)
    {
    	lcdrs = 0; // 命令选择
    	lcdrw = 0;
    	P0 = command;
    	delay(5);
    	
    	lcden = 1; // 产生一个正脉冲使能信号
    	delay(5);
    	lcden = 0;
    }
    
    /*写数据函数*/
    void writeData(uchar dat)
    {
    	lcdrs = 1; // 数据选择
    	lcdrw = 0;
    	P0 = dat;
    	delay(5);
    	
    	lcden = 1;
    	delay(5);
    	lcden = 0;
    }
    
    /*延时函数*/
    void delay(uchar xms)
    {
    	uint i, j;
    	for(i = xms; i > 0; i--)
    		for(j = 110; j > 0; j--);
    }
    

    2.整屏左移显示

    /*------------------------
    功能:LCD1602整屏左移显示
    Author: Zhang Kaizhou
    Date: 2019-6-3 12:35:23
    ------------------------*/
    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    	
    uchar code table0[] = {"0123456789ABCDEF"}; // 每行的字符数据
    uchar code table1[] = {"0123456789abcdef"};
    sbit lcdrs = P1^2; // LCD数据/命令选择端
    sbit lcdrw = P1^3; // LCD读写选择端
    sbit lcden = P1^4; // LCD使能端,高脉冲有效
    uchar num;
    
    void init();
    void writeCommand(uchar command);
    void delay(uchar xms);
    void writeData(uchar dat);
    
    void main()
    {
    	init();
    	writeCommand(0x80 + 0x10); // 将数据指针定位到第一行的非显示存储区
    	for(num = 0; num < 16; num++)
    	{
    		writeData(table0[num]);
    		delay(5);
    	}
    	
    	writeCommand(0x80 + 0x50); // 将数据指针定位到第二行的非显示存储区
    	for(num = 0; num < 16; num++)
    	{
    		writeData(table1[num]);
    		delay(5);
    	}
    	
    	for(num = 0; num < 16; num++) // 循环整屏左移
    	{
    		writeCommand(0x1c); // 整屏左移
    		delay(100);
    	}
    	while(1);
    }
    
    /*初始化LCD1602的设置*/
    void init()
    {
    	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
    	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
    	writeCommand(0x0c); // 开显示,不显示光标
    	writeCommand(0x06); // 写一个字符后地址指针自动加1
    	writeCommand(0x01); // 显示清零,数据指针清零
    }
    
    /*写指令函数*/
    void writeCommand(uchar command)
    {
    	lcdrs = 0; // 命令选择
    	lcdrw = 0;
    	P0 = command;
    	delay(5);
    	
    	lcden = 1; // 产生一个正脉冲使能信号
    	delay(5);
    	lcden = 0;
    }
    
    /*写数据函数*/
    void writeData(uchar dat)
    {
    	lcdrs = 1; // 数据选择
    	lcdrw = 0;
    	P0 = dat;
    	delay(5);
    	
    	lcden = 1;
    	delay(5);
    	lcden = 0;
    }
    
    /*延时函数*/
    void delay(uchar xms)
    {
    	uint i, j;
    	for(i = xms; i > 0; i--)
    		for(j = 110; j > 0; j--);
    }
    

    3.刷屏显示多行字符

    /*----------------------------
    功能:LCD1602刷屏显示多行字符
    Author: Zhang Kaizhou
    Date: 2019-6-4 16:15:43
    -----------------------------*/
    #include <reg52.h>
    #include <string.h>
    #define uchar unsigned char
    #define uint unsigned int
    	
    uchar code table0[] = {"0123456789ABCDEF"}; // 每行的字符数据
    uchar code table1[] = {"0123456789abcdef"};
    uchar code table2[] = {"Welcome to here!"};
    uchar code table3[] = {"I'm ZKZ!"};
    uchar code table4[] = {"Life is nice!"};
    uchar code table5[] = {"Tomorrow is OK!"};
    
    sbit lcdrs = P1^2; // LCD数据/命令选择端
    sbit lcdrw = P1^3; // LCD读写选择端
    sbit lcden = P1^4; // LCD使能端,高脉冲有效
    uchar num;
    
    void init();
    void writeCommand(uchar command);
    void delay(uint xms);
    void writeData(uchar dat);
    
    void main()
    {
    	init();
    	/*第一屏*/
    	writeCommand(0x80); // 将数据指针定位到第一行首
    	for(num = 0; num < strlen(table0); num++)
    	{
    		writeData(table0[num]);
    		delay(5);
    	}
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
    	for(num = 0; num < strlen(table1); num++)
    	{
    		writeData(table1[num]);
    		delay(5);
    	}
    	delay(2000);
    	writeCommand(0x01);
    	
    	/*第二屏*/
    	writeCommand(0x80); // 将数据指针定位到第一行首
    	for(num = 0; num < strlen(table2); num++)
    	{
    		writeData(table2[num]);
    		delay(5);
    	}
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
    	for(num = 0; num < strlen(table3); num++)
    	{
    		writeData(table3[num]);
    		delay(5);
    	}
    	delay(2000);
    	writeCommand(0x01);
    	
    	/*第三屏*/
    	writeCommand(0x80); // 将数据指针定位到第一行首
    	for(num = 0; num < strlen(table4); num++)
    	{
    		writeData(table4[num]);
    		delay(5);
    	}
    	writeCommand(0x80 + 0x40); // 将数据指针定位到第二行首
    	for(num = 0; num < strlen(table5); num++)
    	{
    		writeData(table5[num]);
    		delay(5);
    	}
    	
    	while(1);
    }
    
    /*初始化LCD1602的设置*/
    void init()
    {
    	lcden = 0; // 拉低使能端,准备产生使能高脉冲信号
    	writeCommand(0x38); // 显示模式设置(16x2, 5x7点阵,8位数据接口)
    	writeCommand(0x0c); // 开显示,不显示光标
    	writeCommand(0x06); // 写一个字符后地址指针自动加1
    	writeCommand(0x01); // 显示清零,数据指针清零
    }
    
    /*写指令函数*/
    void writeCommand(uchar command)
    {
    	lcdrs = 0; // 命令选择
    	lcdrw = 0;
    	P0 = command;
    	delay(5);
    	
    	lcden = 1; // 产生一个正脉冲使能信号
    	delay(5);
    	lcden = 0;
    }
    
    /*写数据函数*/
    void writeData(uchar dat)
    {
    	lcdrs = 1; // 数据选择
    	lcdrw = 0;
    	P0 = dat;
    	delay(5);
    	
    	lcden = 1;
    	delay(5);
    	lcden = 0;
    }
    
    /*延时函数*/
    void delay(uint xms)
    {
    	uint i, j;
    	for(i = xms; i > 0; i--)
    		for(j = 110; j > 0; j--);
    }
    

    4.其他显示方式可通过改变写入指令来实现…

    展开全文
  • // 1、第一行显示 This LCD is OK! 第二行显示 0123456789ABCDEF // 2.5秒过后 // 2、第一行显示自定义字符; // 2.5秒过后 // 3、 在屏幕第一行第2个位置显示9(第0个位置,第1个位置,第2个位置) // 2.5秒过后 //...

    程序验证完全可用,已修正。
    //功能:
    // 1、第一行显示 This LCD is OK! 第二行显示 0123456789ABCDEF
    // 2.5秒过后
    // 2、第一行显示自定义字符(可自己再重新生成);
    // 2.5秒过后
    // 3、 在屏幕第一行第2个位置显示9(第0个位置,第1个位置,第2个位置)
    // 2.5秒过后
    // …
    // 然后开始循环显示

    #include <STC8.H>
    #include <intrins.h>
      
    typedef unsigned char 	uint8_t;
    typedef unsigned int 	uint16_t;
    
    #define LCD1602_DATAPINS P0
    #define LCD1602_E 	P43				//LCD控制脚重新定义
    #define LCD1602_RW  P26
    #define LCD1602_RS	P27
    #define LCD1602_FIRSTLINE	0		//LCD1602第一行
    #define LCD1602_SECONDLINE	1		//LCD1602第二行
    
    bit ubLCD1602Window1Update; 		//LCD1602显示窗口更新位变量
    bit ubLCD1602Window2Update;								   
    bit ubLCD1602Window3Update;
    
    uint8_t code ucPermanentDisplay[] = "This LCD is OK!";
    //uint8_t code Numerical_ASCII[] ={'0','1','2','3','4','5','6','7','8','9'}; 
    uint8_t code Numerical_ASCII[] ="0123456789ABCDEF";//与上一个字符串同样效果
    //自定义的8个5*8点阵字符,可根据需要自己再编辑
    uint8_t code ucArrayDefine[]={	
    								0x1F,0x00,0x1F,0x1F,0x00,0x1F,0x1F,0x1F,
    								0x00,0x1F,0x00,0x00,0x1F,0x00,0x00,0x00,
    								0x02,0x04,0x0F,0x1A,0x0A,0x1F,0x02,0x02,
    								0x10,0x07,0x08,0x08,0x08,0x08,0x07,0x00,	
    								0x00,0x10,0x07,0x08,0x08,0x08,0x08,0x07,	//摄氏度 ℃
    								0x12,0x09,0x04,0x02,0x01,0x00,0x00,0x00,
    								0x12,0x09,0x04,0x12,0x09,0x04,0x02,0x01,
    								0x12,0x09,0x04,0x12,0x09,0x04,0x12,0x09}; 
    
    uint8_t ucDisplayVal;			//0~255的数字变量
    uint8_t ucDisplayValArray[4];	//将0~255数字变量转化为字符变量的对应字符数组(供LCD1602显示)
       
    /**
     * @brief  LCD1602_Delay 
     * @note   当前延时 670ns,时间受规格书时序限制,此处是调整适合自己板子的最小时间
     *			当程序无法运行时,适当将此时间调大,调整到ms级别。
     * @param  none
     * @retval none
     */
    
    void LCD1602_Delay() 	// @24.000MHz	 STC8
    {	  	
    	uint16_t i;
    	i = 3;
    	while (--i);
    }
    
    void Delay5ms()		//@24.000MHz	STC8
    {
    	unsigned char i, j;
    	_nop_();
    	_nop_();
    	i = 156;
    	j = 213;
    	do
    	{
    		while (--j);
    	} while (--i);
    }
    /**
    * @brief  读写检测(读状态,液晶屏状态字) 
    * @note   LCD1602_Delay 延时是关键,在LCD1602规格书里,有对此时间进行强调。
    *	按照长沙太阳人电子有限公司的规格书即基本操作时序里1.1读状态
    * @param  none
    * @retval none
    */
    
    void LCD1602_WaitReady()
    {
    	uint8_t sta,ucTemp;	 
    	LCD1602_DATAPINS = LCD1602_DATAPINS|0xF0;	//设置输入口
    	LCD1602_RS = 0;
    	LCD1602_RW = 1;	 				//读
    	do 
    	{
    		LCD1602_E = 1;			 
    		LCD1602_Delay();			//读操作,数据建立时间很重要。	 
    		sta = LCD1602_DATAPINS; 	//读取状态字		
    		LCD1602_E = 0;		
    		sta = sta&0xF0;		
    				 
    		LCD1602_Delay();  
    
    		LCD1602_E = 1;			 
    		LCD1602_Delay();			//读操作,数据建立时间很重要。	 
    		ucTemp = LCD1602_DATAPINS; 	//读取状态字		
    		LCD1602_E = 0;
    		ucTemp = ucTemp>>4;		
    		sta = sta|ucTemp;		//合并为8位数据	
    	} while (sta & 0x80); 		//bit7等于1表示液晶正忙,重复检测直到其等于0为止
    }
    
    /**
    * @brief  LCD1602_WriteCommand 
    * @note   向LCD写入一个字节的命令
    * @param  none
    * @retval none
    */
    
    void LCD1602_WriteCommand(uint8_t command)
    {
    	uint8_t ucTemp;	
    	LCD1602_WaitReady();
    	LCD1602_RS = 0;				
    	LCD1602_RW = 0;				//写
    
    	ucTemp = command&0xF0;		
    	LCD1602_E = 1;		   	
    	LCD1602_DATAPINS = LCD1602_DATAPINS&0x0F;	//清高四位保低四位
    	LCD1602_DATAPINS = LCD1602_DATAPINS|ucTemp;				  
    	LCD1602_Delay();
    	LCD1602_E = 0;
    
    	ucTemp = command<<4;	
    	LCD1602_E = 1;		   		
    	LCD1602_DATAPINS = LCD1602_DATAPINS&0x0F;
    	LCD1602_DATAPINS = LCD1602_DATAPINS|ucTemp;				  
    	LCD1602_Delay();
    	LCD1602_E = 0;
    }
    
    /**
    * @brief  LCD1602_WriteData 
    * @note   向LCD写入一个字节的数据
    * @param  none
    * @retval none
    */		
       
    void LCD1602_WriteData(uint8_t dat)	
    {			 
    	uint8_t ucTemp;
    	LCD1602_WaitReady();
    	LCD1602_RS = 1;	
    	LCD1602_RW = 0;	
    
    	ucTemp = dat&0xF0;	
    	LCD1602_E = 1;		  
    	LCD1602_DATAPINS = LCD1602_DATAPINS&0x0F;
    	LCD1602_DATAPINS = LCD1602_DATAPINS|ucTemp;	 					  
    	LCD1602_Delay();
    	LCD1602_E = 0;
    
    	ucTemp = dat<<4;	
    	LCD1602_E = 1;		
    	LCD1602_DATAPINS = LCD1602_DATAPINS&0x0F;
    	LCD1602_DATAPINS = LCD1602_DATAPINS|ucTemp;	   					  
    	LCD1602_Delay();
    	LCD1602_E = 0;
    }
    
    /**
     * @brief   LCD1602 显示自定义字符
     * @note	仅支持5*8点阵,显示能力有限,只能自定义8个字符
     * @param 	P 要显示出来事先自定义字符取模数组名;
     * @retval 	None
     */
     
    void LCD1602_display_customize_character(uint8_t code * P)
    {  
    	uint8_t i;				
    	LCD1602_WriteCommand(0x40);			//写指令0x40,否则字模写不进 CG RAM中
    	for(i=0; i<64; i++)			   		//定义64即将可以写入的8个自定义字符都写入到 CG RAM中
    	{	
    		LCD1602_WriteData(*P++);
    	}
    }
    
    /**
     * @brief   LCD1602 控制显示
     * @note	只能显示字符
     * @param 	x:x轴坐标范围 0~39,但是只能显示前16个,后续为了移屏准备;
     *			ucLineX:y轴坐标范围 0~1,只能显示2行;
    						LCD1602_FIRSTLINE;
    						LCD1602_SECONDLINE;
     			character 要显示出来事先定义的字符
     * @retval 	None
     */
     
    void LCD1602_display_character(uint8_t x, uint8_t ucLineX, uint8_t character)
    {    
    	switch(ucLineX)
    	{
    		case LCD1602_FIRSTLINE:					//由输入的屏幕坐标计算显示RAM的地址
    			LCD1602_WriteCommand(x | 0x80);  	//第一行字符地址从0x00起始,
    			break;
    		case LCD1602_SECONDLINE:
    			LCD1602_WriteCommand(x | 0xC0);  	//第二行字符地址从0x40起始,0x40+0x80=0xC0
    			break;
    	}
        LCD1602_WriteData(character); 				//写要显示的字符
     
    }
     
    /**
     * @brief   LCD1602 将 0~255之内的数转化为 LCD1602可显示字符,一时间不容易弄明白,就是靠猜然后程序可以跑起来,哈哈!
     * @note	根据LCD1602规格书里 Character patterns 显示 数字为 0x30 = '0'  ... 0x39 = '9'
     			\0 为字符串结束符,占用一个字节,但是不占用字符串长度;
    			字符串的结束标志就是'\0',比如说 char s[30]="abc";
    			那么其实就是 s[0]='a',s[1]='b',s[2]='c',s[3]='\0'; '\0'就代表字符串结束。
     * @param 	P(定义的数组名)定义数组元素为4个,包含'\0':转化后的字节显示字符,显示个数最多为3个。0~255用 LCD1602_display_string 函数可直接调用
     *	P_ucString 要显示出来事先定义的字符串或字符
     * @retval 	None
     */
     
    void ConvertNumToCharacter(uint8_t * P, uint8_t ucNum)
    {
    	uint8_t ucArrayTemp[3]=0;	   			//局部变量初始化,可试一下不初始化效果
    	uint8_t i,j;	  
    	uint8_t ucNumTemp;
    	i = 0;
    	ucNumTemp = ucNum;						//使传入的数据不被函数改变	
    	do
    	{
    		ucArrayTemp[i++] = ucNumTemp % 10;	//处理数据低位在前
    		ucNumTemp /= 10;				
    	}while(ucNumTemp > 0);					//可处理3位的数据 
    //有3位数的时候
    	if(3==i)
    	{
    		while(i-- > 0)
    		{
    			*P++ = ucArrayTemp[i] + '0';		//将数据按照高位到低位放到指针开始处,转换为字符形式
    		}
    	}
    //有2位数的时候	比如是 20,但是仅显示低2位,高位显示空。
    	if(i==2)
    	{
    		for(j=2; j>1; j--)
    		{
    			*P++ = ucArrayTemp[j] + ' ';	 //	*P++ = ucArrayTemp[j] + 0x20	效果一样
    		}
    
    		while(i-- > 0)
    		{
    			*P++ = ucArrayTemp[i] + '0';
    		}
    	}
    //仅有一位数的时候,比如只有一个9的时候,仅显示最低位9,百位和十位不显示
    	if(i==1)
    	{
    		for(j=2; j>0; j--)
    		{
    			*P++ = ucArrayTemp[j] + ' ';	
    		}
    
    		while(i-- > 0)
    		{
    			*P++ = ucArrayTemp[i] + '0';
    		}
    	}
    
    	*P = '\0';								//结束字符串
    }
    /**
     * @brief   LCD1602 控制显示
     * @note	只能显示字符串
     * @param 	x:x轴坐标范围 0~39,但是只能显示前16个,后续为了移屏准备;
     *			ucLineX:y轴坐标范围 0~1,只能显示2行;
    						LCD1602_FIRSTLINE;
    						LCD1602_SECONDLINE;
     *			str: 要显示出来事先定义的字符串
     			ucStringLength:字符串实际长度;
     * @retval 	None
     */
    void LCD1602_display_string(uint8_t ucLineX, uint8_t x, uint8_t *str, uint8_t ucStringLength)
    {    
    	switch(ucLineX)
    	{
    		case LCD1602_FIRSTLINE:				//由输入的屏幕坐标计算显示RAM的地址
    			LCD1602_WriteCommand(x | 0x80);  	//第一行字符地址从0x00起始,设置RAM地址 
    			break;
    		case LCD1602_SECONDLINE:
    			LCD1602_WriteCommand(x | 0xC0);  	//第二行字符地址从0x40起始,0x40+0x80=0xC0设置RAM地址  
    			break;
    	}
    
        while (ucStringLength--)         	//连续写入len个字符数据
        {
            LCD1602_WriteData(*str++); 		//先取str指向的数据,然后str自加1
        }
    }
    
    /*******************************************************************************
    * 函 数 名       : LcdInit()
    * 函数功能		 : 初始化LCD屏
    * 输    入       : 无
    * 输    出       : 无
    *******************************************************************************/		   
    void LCD1602_Init()				//LCD初始化子程序
    {
    	ubLCD1602Window1Update = 1;	//初始化LCD1602使用到的变量	 
    	ubLCD1602Window2Update = 1;
    	ubLCD1602Window3Update = 1;
    	
     	LCD1602_WriteCommand(0x28); //数据长度4位,显示两行,5*7点阵,
    	Delay5ms();
     	LCD1602_WriteCommand(0x28);	//可根据实际情况,适当的删除此重复语句
    	Delay5ms();
     	LCD1602_WriteCommand(0x28);
    	Delay5ms();
     	LCD1602_WriteCommand(0x28);
    	Delay5ms();
    	LCD1602_WriteCommand(0x08);	//显示关闭
    	LCD1602_WriteCommand(0x01);	//清屏
    	LCD1602_WriteCommand(0x06); //显示光标移动设置
    	LCD1602_WriteCommand(0x0C); //显示开及光标设置
    }
    
    /**
     * @brief   LCD1602 显示服务程序
     * @note	当前为连个窗口在时间内切换,两行轮流显示字符串3
     * @param 	None
     * @retval 	None
     */
    
    void LCD1602_display_service(void)
    {						
    	uint16_t i;
    		
    	if(ubLCD1602Window1Update == 1)		//第一屏显示测试
    	{
    	//	ubLCD1602Window1Update = 0;	
    		LCD1602_display_string(0,0,ucPermanentDisplay,15); 	//第一行显示 This LCD is OK!	
    		for(i=0; i<16; i++)	 	//第二行显示 0123456789ABCDEF
    		{
    			LCD1602_display_character(i,1,Numerical_ASCII[i]);
    		}									   
    	}
    	
    	for(i=0; i<500; i++)
    	{
    		Delay5ms();
    	}
    	LCD1602_WriteCommand(0x01);	//清屏
    	
    //显示自定义字符
    	if(ubLCD1602Window2Update == 1)	  
    	{
    	//	ubLCD1602Window2Update = 0;	
    
    		LCD1602_display_customize_character(ucArrayDefine);		//写自定义字符到CGRAM中
    			 
    		LCD1602_WriteCommand(0x80);	 		//设置开始显示位置,第一行第一个位置开始显示
    
    		for(i=0; i<8; i++)
    		{
    			LCD1602_WriteData(i);  			//显示自定义字符,DD RAM data,规格书里是一种对应关系。
    		}
    	}
    	
    	for(i=0; i<500; i++)
    	{
    		Delay5ms();
    	}		
    	LCD1602_WriteCommand(0x01);	//清屏
    
    	if(ubLCD1602Window3Update == 1)	   //显示将 类型为 uint8_t 的数 ucDisplayVal 转化为字符进行显示出来
    	{
    	//	ubLCD1602Window3Update = 0;	
    		ConvertNumToCharacter(ucDisplayValArray,ucDisplayVal);	//数字123转为为字符123存放在 ucArray 数组中
    	
    		LCD1602_display_string(LCD1602_FIRSTLINE, 0, ucDisplayValArray, 3);	   	//在第一行,第0个位置开始显示数组 ucArray ,个数为3(0~255,最多显示3位)
    	}
    	
    	for(i=0; i<500; i++)
    	{
    		Delay5ms();
    	}		
    	LCD1602_WriteCommand(0x01);	//清屏
    }
    
    
    int main(void)
    { 
    	LCD1602_Delay();	//上电之前进行短的延时,等待外围器件上电稳定
    	LCD1602_Delay();	//可单独使用较长延时,根据实际情况
    	LCD1602_Delay();
    	LCD1602_Delay();
    	LCD1602_Delay();
    	
    	ucDisplayVal = 9;
    	LCD1602_Init();	   
    
    	while(1)
    	{		  
    		LCD1602_display_service();
    	}
    
    
    	return 0;
    }
    

    //结合网友程序,再添加一些,随发出来,能否帮到你,若是,手留余香。

    展开全文
  • STM32入门之LCD1602驱动

    千次阅读 多人点赞 2019-08-17 12:37:35
    LCD1602驱动要点:1. STM32的GPIO不是51单片机一样的准双向IO,读忙时需要设置。 平台:STM32F103RCT6 使用的GPIO:PB5,PB6,PB7 ;PA0~PA7,具体的配置程序中有详情 贴代码: main.c #include "stm32f10x_it.h" #...
  • 关于lcd1602A的使用

    千次阅读 2019-11-09 14:27:24
    1602液晶也叫1602字符型液晶,它是种专门用来显示字母、数字、符号等的点阵型液晶模块。 1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 lcd1602引脚 状态字的说明: ...
  • LCD1602A模块的应用

    千次阅读 2019-11-01 16:01:03
    LCD1602液晶显示器是广泛使用的种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。下图即是该模块:...
  • LCD1602

    2020-05-11 08:05:24
    LCD1602 1.市面绝大部分液晶都是基于HD77480液晶芯片的,通常14引脚或者16(1条背光电源线VCC和 地线GND),14和16控制原理相同,只是16的可以调节背光亮度. 2.操作时序: 3.代码: 引脚作用: RS:控制写命令/数据...
  • LCD1602 4数据显示

    千次阅读 2017-03-10 19:52:33
    //表示第一行   }  else    {   LCD_Write_Com(0xC0 + x); //表示第二行   }  while (*s)    {  LCD_Write_Data( *s);  s ++;   }  } /*------------------...
  • arduino驱动lcd1602

    千次阅读 2020-10-04 21:22:17
    arduino直接驱动1602液晶显示字母1602液晶在应用中非常广泛,最初的1602液晶使用的是HD44780控制器,现在各个厂家的1602模块基本上都是采用了与之兼容的IC,所以特性上基本都1602LCD主要技术参数 arduino直接驱动...
  • LCD1602动态显示

    千次阅读 多人点赞 2019-06-05 10:49:17
    功能:LCD1602局部动态显示 描述:在屏幕的二行固定位置显示count: 后面接着动态显示按键次数(00 ~ 99) Author: Zhang Kaizhou Date: 2019-6-5 10:50:22 -------------------------------------*/ #...
  • 、 学习要点(串行多总线类外设): 1、 正确分析时序图; 2、 多总线(多条数据线区别于DHT11这类单总线控制线不算)操作的传感器,要区单总线的传感器DHT11等,单总线时操作的而“多总线”是字节操作的,不用8...
  • 第一排显示黑块,第二排没有东西显示。求大佬帮忙解答~ 实物图,原理图,仿真图,代码 如下: 这是代码: #include <reg52.h> #include "intrins.h" #include <stdio.h> #define LCD1602_...
  • LCD1602液晶使用介绍--(完整版)

    万次阅读 多人点赞 2020-11-28 18:13:34
    LCD1602液晶在实际的产品运用中也是比较多产品,应为前段时间也正好用到了所以惊天就对LCD1602液晶做个总结,方便以后阅读同时也希望能够帮住到需要的人,总结的可能存在错误欢迎指出! 所谓的1602是指显示的...
  • LCD1602详解

    千次阅读 2016-11-18 10:50:35
    接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。刚开始接触它的大多是单片机的初学者。由于对它的不了解,不能随心所欲地对它进行驱动。经过段时间的学习,我...
  • void LCD_Busy_Wait() //LCD1602响应速度相对于单片机来说是偏慢的 { while((Read_LCD_State()&0x08)==0x80); DelayMS(5); } void Write_LCD_Data(uchar dat) //写数据 { LCD_Busy_Wait(); //忙检测  RS=1;...
  • 十一、LCD1602

    2020-11-26 09:09:00
    第一行的地址是 0x00H 到 0x27,第二行的地址从 0x40 到 0x67,其中第一行 0x00 到 0x0F是与液晶上第一行 16 个字符显示位置相对应的,第二行 0x40 到 0x4F 是与第二行 16 个字符显示位置相对应的。而每行都多.
  • C51单片机LCD1602驱动程序

    千次阅读 多人点赞 2020-09-01 10:43:24
    C51单片机LCD1602驱动程序LCD1602简介1602的引脚操作时序写操作时序时序参数LCD1602关键性操作、初始化二、清屏指令二、进入模式设置指令三、显示开关控制指令四、功能设定指令RAM地址映射图 LCD1602简介 LCD1602...
  • 基于51单片机编写的六电子密码锁由LCD1602显示

    千次阅读 多人点赞 2019-09-06 15:15:11
    基于51单片机编写的六电子密码锁由LCD1602显示 全部内容由本人原创! 从制定计划到焊接调试完成耗时5天! 此程序仅表示完成该项目其中的个方法,对有兴趣修改,完善的同学表示欢迎! *注:每个关键的地方都有...
  • LCD1602小程序

    千次阅读 2015-01-16 11:26:06
    LCD1602简单函数,相互学习
  • 默认从第一行第一位(地址x80)开始这里为了演示写入过程从第二行第一位(地址0xc0)开始 从左边八个按键输入0xc0(第二行第一位地址); 从左到右一次为d7~d0 键值为 :1 1 0 00 0 0 0; 然后给en一个下降沿 按下en再弹起 ...
  • LCD1602命令字

    千次阅读 2020-04-21 17:49:05
    文章目录LCD1602管脚说明1602里的存储器1602三条控制线控制指令 LCD1602管脚说明 1602里的存储器 1602里的存储器有三种:CGROM、CGRAM、DDRAM CGROM 保存了厂家生产时固化在LCM中的点阵型显示数据。 CGRAM是留给...
  • 【常用传感器】LCD1602液晶工作原理详解及例程代码

    千次阅读 多人点赞 2021-02-01 23:43:40
    LCD1602液晶显示屏
  • LCD1602液晶显示模块学习笔记

    千次阅读 2020-12-20 21:52:17
    LCD1602液晶显示模块 LCD1602(Liquid Crystal Display), 每行可显示16个字符共2行。 实物图 引脚图 主要引脚功能说明: RS引脚:RS=1时,选择数据寄存器,即向LCD1602内部写入需要显示的内容。RS=0时,选择命令...
  • 基于LCD1602的秒表计数器

    千次阅读 2020-03-21 12:06:47
    写这篇文章前,我刚刚完成LCD1602的学习,对它也有了一些感悟,当然也存在一些困惑,在这里,我将尽量把我的感悟详细的保存。 LCD1602 1602分为8引脚的和4引脚的,所以,我们在编写它的**.h**文件时需要分情况讨论...
  • 基于51单片机LCD1602

    千次阅读 2019-12-17 21:12:32
    )什么是LCD1602 1602液晶也叫1602字符型液晶,它是种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符组成,每个点阵字符都可以显示个字符,每之间有个点距的...
  • #define LCD1602_DATAPINS P0 //P0口用来发送数据,整个字节地发送 sbit LCD1602_RS = P2^6; //P26口声明P0口发的是数据还是命令,1为数据,0为命令 sbit LCD1602_RW = P2^5; //P25口声明现在
  • arduino连接LCD1602A

    千次阅读 2019-09-20 07:01:21
    接线图 [caption id="attachment_1183" align="alignnone" width="1108"] LCD1602A接线图(4)[/caption] 4接线法 [codesyntax lang="cpp"] /** * VSS...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,821
精华内容 8,728
关键字:

lcd1602第一位