历史上的今天
返回首页

历史上的今天

今天是:2025年10月13日(星期一)

正在发生

2022年10月13日 | 51单片机基础之LCD1602

2022-10-13 来源:csdn

外观:

原理:

LCD1602是一种工业字符型液晶,能够同时显示16x2即32个字符。 LCD1602液晶显示原理 LCD1602液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。 1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。


基本接线:


读状态:输入:RS=L,RW=H,E=H

----输出:D0~D7=状态字

写指令:输入:RS=L,RW=L,D0~D7=指令码

----输出:无

读数据:输入:RS=H,RW=H,E=H

----输出:D0~D7=数据

写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲

----输出:无


有开发板的直接接即可,注意不要接反了。


软件设计:

因为LCD代码是比较多的,有自己的LCD库,所以使用起来比较方便,写个.c和.h文件,再直接引用即可,一般不需要自己写,指定LCD函数是什么意思,怎么使用,能达到自己的目的即可,当然也不反对能独立写出代码的,对目标越熟悉,使用起来越高效。


程序:

需要自己创建main.c、lcd.c、lcd.h三个文件才能使用。


main.c


//在main.c里面引用LCD相关函数和数据

#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器

#include "lcd.h"

 

typedef unsigned int u16;   //对数据类型进行声明定义

typedef unsigned char u8;

 

u8 Disp[]=" LCD1602";         //数组,将显示字符串

 

void main(void)

{

while(1)

    {

        u8 i;

    LcdInit();                    //调用LCD初始化函数

    for(i=0;i<16;i++)

    {

    LcdWriteData(Disp[i]); //通过数组显示字符串

    }

    }    

}


 lcd.c


//一般.c里面放一些具体函数,main.c调用也是主要调用这个文件里面的函数。

#include "lcd.h"

 

void Lcd1602_Delay1ms(uint c)            //延时函数,延时1ms,带有形参

{

    uchar a,b;

for (; c>0; c--)

{

for (b=199;b>0;b--)

{

  for(a=1;a>0;a--);

}      

}

   

}

 

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

* 函 数 名         : LcdWriteCom

* 函数功能    : 向LCD写入一个字节的命令

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

#ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时

void LcdWriteCom(uchar com)   //写入命令

{

LCD1602_E = 0;     //使能

LCD1602_RS = 0;    //选择发送命令

LCD1602_RW = 0;    //选择写入

LCD1602_DATAPINS = com;     //放入命令

Lcd1602_Delay1ms(1); //等待数据稳定

 

LCD1602_E = 1;           //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}

#else 

void LcdWriteCom(uchar com)   //写入命令

{

LCD1602_E = 0; //使能清零

LCD1602_RS = 0; //选择写入命令

LCD1602_RW = 0; //选择写入

 

LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

 

LCD1602_E = 1; //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

 

LCD1602_DATAPINS = com << 4; //发送低四位

Lcd1602_Delay1ms(1);

 

LCD1602_E = 1; //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

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

* 函 数 名         : LcdWriteData

* 函数功能    : 向LCD写入一个字节的数据

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

#ifndef LCD1602_4PINS    

void LcdWriteData(uchar dat) //写入数据

{

LCD1602_E = 0; //使能清零

LCD1602_RS = 1; //选择输入数据

LCD1602_RW = 0; //选择写入

 

LCD1602_DATAPINS = dat; //写入数据

Lcd1602_Delay1ms(1);

 

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}

#else

void LcdWriteData(uchar dat) //写入数据

{

LCD1602_E = 0;   //使能清零

LCD1602_RS = 1;   //选择写入数据

LCD1602_RW = 0;   //选择写入

 

LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改

Lcd1602_Delay1ms(1);

 

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

 

LCD1602_DATAPINS = dat << 4; //写入低四位

Lcd1602_Delay1ms(1);

 

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);

LCD1602_E = 0;

}

#endif

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

* 函 数 名       : LcdInit()

* 函数功能 : 初始化LCD屏

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

#ifndef LCD1602_4PINS

void LcdInit()   //LCD初始化子程序

{

  LcdWriteCom(0x38);  //开显示

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

#else

void LcdInit()   //LCD初始化子程序

{

LcdWriteCom(0x32); //将8位总线转为4位总线

LcdWriteCom(0x28); //在四位线下的初始化

LcdWriteCom(0x0c);  //开显示不显示光标

LcdWriteCom(0x06);  //写一个指针加1

LcdWriteCom(0x01);  //清屏

LcdWriteCom(0x80);  //设置数据指针起点

}

 

#endif


对于代码中的:


#ifndef  ---------


xxxxxx


xxxxxx


#else


yyyyyy


yyyyyy


#endif


意义:如果没有定义 (---------)的话,就执行xxxxxxx,


           如果定义了  (---------)的话,就执行yyyyyyy,


             #endif  表示结束。


lcd.h


//一般.h里面放一些位定义,变量常量,和一些函数声名等

#ifndef __LCD_H_

#define __LCD_H_

 

//#define LCD1602_4PINS

 

#include

 

//---重定义关键词---//

#ifndef uchar

#define uchar unsigned char

#endif

 

#ifndef uint 

#define uint unsigned int

#endif

 

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

PIN口定义

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

#define LCD1602_DATAPINS P0

sbit LCD1602_E=P2^7;

sbit LCD1602_RW=P2^5;

sbit LCD1602_RS=P2^6;

 

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

函数声明

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

/*在51单片机12MHZ时钟下的延时函数*/

void Lcd1602_Delay1ms(uint c);   //误差 0us

/*LCD1602写入8位命令子函数*/

void LcdWriteCom(uchar com);

/*LCD1602写入8位数据子函数*/

void LcdWriteData(uchar dat) ;

/*LCD1602初始化子程序*/

void LcdInit();   

 

#endif

 

总结:

要让LCD1602显示数字和字符,有很多种方式,我这里只是一种(显示固定字符),当你需要显示多个变量的时候,这个函数就不适合了,必须要有专门显示数字的函数。

推荐阅读

史海拾趣

Electro Technik Industries公司的发展小趣事

随着电子技术的快速发展,ETI意识到只有不断创新才能在竞争中立于不败之地。公司加大了对研发的投入,积极引进国内外先进技术,并鼓励员工提出创新性的想法。在一次偶然的实验中,ETI的研发团队成功研发出了一种具有高效能、低功耗特点的电子元器件,这一突破性的技术成果迅速获得了市场的认可,为ETI带来了可观的收益。

AEM [ American Electronic Materials]公司的发展小趣事

在追求经济效益的同时,AEM始终关注环境保护和可持续发展。公司积极响应全球环保倡议,采用环保材料和生产工艺,减少生产过程中的废弃物排放和能源消耗。同时,AEM还投入大量资源研发节能环保的电子元器件产品,为客户提供更加绿色、高效的解决方案。

此外,AEM还积极参与社会公益活动,关注社会责任。公司通过捐款、赞助等方式支持教育、文化等事业的发展,为社会的和谐与进步贡献了自己的力量。

Fullywell Semiconductor Co Ltd公司的发展小趣事

面对市场需求的不断变化和技术的不断进步,Fullywell始终保持着对研发的重视和投入。在2020年,公司研发团队经过数年的努力,成功攻克了多项关键技术难题,推出了新一代的智能电源管理芯片。这款芯片在能效比、集成度和可靠性等方面均达到了行业领先水平,赢得了市场的广泛好评。Fullywell借此机会实现了产品的迭代升级,进一步巩固了其在电源管理芯片市场的领先地位。

Advanced Thermal Solutions公司的发展小趣事

ATS始终坚持以创新为驱动力,不断提升研发创新能力。公司设立了专门的研发团队,负责新技术和新产品的研发工作。通过与高校和研究机构的合作,ATS不断引入前沿的科技成果和人才资源,为公司的创新发展提供了有力支持。此外,ATS还建立了完善的研发流程和质量控制体系,确保每一款产品都能达到最高的性能和质量标准。

科达嘉CODACA公司的发展小趣事

科达嘉电子不仅立足于深圳,还积极布局全球市场。公司通过参加国际电子展会、与国际知名企业合作等方式,不断拓展海外市场。同时,科达嘉还根据客户需求,提供个性化的电感解决方案,赢得了众多客户的信任和合作。公司的主要产品,如一体成型电感、大电流电感等,已广泛应用于工业控制、汽车电子等多个领域。

Comtech AHA Corp公司的发展小趣事

在电子行业快速发展的背景下,Comtech AHA Corp敏锐地洞察到了物联网、5G等新兴领域的市场潜力。公司及时调整战略方向,加大在这些领域的研发投入,推出了一系列符合市场需求的新产品。凭借精准的市场定位和优质的产品质量,Comtech AHA Corp成功抓住了市场机遇,实现了业务的快速增长。

问答坊 | AI 解惑

诚意找人编写PADS /AD电路设计的图书

我们现有关于PADS /Altium Designer 电路设计的图书选题,诚找有写书意向的作者合作。要求作者有一些实战经验和写作资源,有一定的业余时间、能够保证写作进度。有意者请直接发信 联系方式:haohong99@163.com、478057587(QQ)。欢迎有实践开发 ...…

查看全部问答>

关于TPS54550电源芯片

我使用tps54550电源芯片产生 3.3V电压。芯片PH端输出的波形正确,可是经过滤波后,输出电压很低只有0.005V。我按照datasheet使用6.8uH和100uF电容做滤波。各位大侠帮帮忙吧...…

查看全部问答>

请问管理员,我怎么回复不了帖子?

我今天怎么回复不了我自己的帖子,我的问题解决了本来想说明下情况,是如何解决的,然后结贴,结果我一回复就说我\"回复太快!如果你是恶意刷楼,将会受到严厉惩罚!\"我没有刷楼啊,到了下午再试试还是不行,这个怎么回事,网站有问题了?也不知道我这个 ...…

查看全部问答>

单片机串口控制TFT(1.3-15寸TFT通用解决方案)

公司提供4.3-10.4寸系列真彩液晶终端,单片机,PLC,ARM串口直接控制,采用M600通用液晶显示驱动。       TFT驱动模组M600,这款模块的优势非常大,驱动模组提供的是RS232串口方式,通过协议来控制屏的显示,内置128M flash ...…

查看全部问答>

求教液晶屏色彩问题!

Wince启动后,色彩不对,偏色严重。但是在用Windows Media Player播放视频文件的时候,画面清晰的很。不过WMP的界面仍然偏色。请教各位可遇到这种情况,是哪方面原因造成的。…

查看全部问答>

大家有没有自己DIY个文本显示器啊?

用市场上现有的文本显示器的外壳,可以实现人机界面,DI,DO,AI,AO及RS232 ,RS485的通用控制器啊!    …

查看全部问答>

阻容电源问题

做了一个阻容电源,发现在会有变压器的那种兹兹的声音,而且电源摸上去还有点热,高手分析下原因…

查看全部问答>

开关电源变压器选择需要计算出哪些参数

本帖最后由 dontium 于 2015-1-23 13:32 编辑 同事花了半个月,就做了一款开关电源,还说技术保密。说实话做开关电源有技术难度吗? …

查看全部问答>

关于使用M16内部8M晶振的问题

最近弄了一个串口通信,使用的是M16单片机,但是死活设置熔断丝,却只能使用M16内部的1M时钟,才能串口通信正常(波特率寄存器设置没错)。设置外部时钟和内部的2M,4M,8M,都不能使串口通信正常,不知道怎么回事。下面是我设置内部8M的熔断丝的图片 ...…

查看全部问答>