历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2021年12月24日 | 51单片机系列——学习LCD1602液晶显示-8总线-显示一串字符

2021-12-24 来源:eefocus

今天重温一下LCD1602液晶显示的内容,做了个8总线方式显示一串字符“ First Try ”的实验

仿真图如下:


代码如下:

LCD1602.h


#ifndef _LCD1602_H_

#define _LCD1602_H_


#include


//重定义关键字

#ifndef uchar

#define uchar unsigned char

#endif


#ifndef uint 

#define uint unsigned int

#endif


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

PIN口定义

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

#define Lcd1602DataPin 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 Lcd1602Init();


#endif


LCD1602.c


#include "lcd1602.h"

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

* 函 数 名         : Lcd1602_Delay1ms

* 函数功能     : 延时函数

* 输    入         : c

* 输    出         : 无

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

void Lcd1602_Delay1ms(uint c){//延时函数

    uchar a,b;

 for (; c>0; c--){

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

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

   }      

 }    

}


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

* 函 数 名         : LcdWriteCom

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

* 输    入         : com

* 输    出         : 无

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

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

{

 LCD1602_E = 0;     //使能

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

 LCD1602_RW = 0;    //选择写入


Lcd1602DataPin = com;     //放入命令

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

LCD1602_E = 1;           //根据写数据时序图,拉高写入时序(数据)

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;     //再拉低数据写完了,释放

}


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

* 函 数 名         : LcdWriteData

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

* 输    入         : dat

* 输    出         : 无

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

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

{

 LCD1602_E = 0; //使能清零

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

 LCD1602_RW = 0; //选择写入


Lcd1602DataPin = dat; //写入数据

Lcd1602_Delay1ms(1);

LCD1602_E = 1;   //写入时序

Lcd1602_Delay1ms(5);   //保持时间

LCD1602_E = 0;

}


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

* 函 数 名       : Lcd1602Init()

* 函数功能   : 初始化LCD屏

* 输    入       : 无

* 输    出       : 无

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

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

{

 LcdWriteCom(0x38);  //开显示,设置为8总线,2行显示,5*7点阵,这是“功能设定指令”

 LcdWriteCom(0x0c);  //开显示不显示光标,“显示开关控制指令”

 LcdWriteCom(0x06);  //写一个指针加1,“进入模式设置指令”

 LcdWriteCom(0x01);  //清屏,“清屏指令”

 LcdWriteCom(0x80);  //设置数据指针起点,第一个字符是在0x00,位置,但写入的数据地址格式必须是0x**+0x80,因此在这提前加地址加一个0x80;这里不写也行但必须在main函数中调用前将数据要写入的地址+0x80

}


main.c


#include

#include"lcd1602.h"


#define uint unsigned int

#define uchar unsigned char


uchar DisplayData[]=" First Try "; //定义要显示的字符串,空格也算一个字符

void main(void){

 uchar i;

 Lcd1602Init(); //调用LCD1602的初始化函数,初始化函数中用到了写命令函数的调用

 for(i=0;i<11;i++){ //循环调用LCD1602写数据函数,分别写入字符

  LcdWriteData(DisplayData[i]);

 }

 while(1); //死循环在这儿,这样数据就能一直静态显示:因为数据输入LCD1602后会一直存放在DDRAM中,直至改变

}


实验结果:

总结使用LCD1602的方法:

1、先进行LCD1602的初始化,即初始化函数Lcd1602Init();

需要初始化的内容有

(1):

(2):

(3):

(4):

初始化时必须对这些进行设定,通过自己编写的写命令函数将这些功能命令字节写入LCD1602中


在我们的程序中我们还将光标的位置进行了设置,也就是数据在哪个点阵开始显示的。当然了你可以不在初始化中写确定显示地址命令,在mian.c文件中显示之前确定显示地址即可。

(5):确定显示地址命令:

图7

2、初始化完后,就可以通过自己写的写数据函数,向LCD的DDRAM写入要显示的字符了。

问题:

1、都是写入数据,都是写入一个字节,为啥要整一个写命令函数“”和“写数据函数”呢?

答:原因就在于写命令和写数据时对LCD1602_RS引脚的高低电平要求不一样。

写命令:LCD1602_RS=0;

写数据:LCD1602_RS=1;

因此要分开写两个函数实现功能。


2、确定显示的地址,为什么在地址+0x80

答:上图(5)写入显示地址命令的固定格式:0x80+显示地址


3、写时序:

4、怎么单独显示一个字符


uchar dat=1;

dat=dat+0x30;

LcdWriteData(dat);//这样就可以了,ASCII码的形式


5、怎么在第二行显示


//实现在第二行显示:

 LcdWriteCom(0x40+0x80);  //通过写命令函数,先重新确认光标的位置

 for(i=0;i<11;i++){ //再循环调用LCD1602写数据函数,分别写入字符

  LcdWriteData(DisplayData[i]);

}


5、LCD1602的RAM地址映射

结束语:静心的去学习,才能有收获,哪有什么一蹴而就的成功。

推荐阅读

史海拾趣

Gold Peak Group公司的发展小趣事
在控制电路周围设置必要的安全防护措施,如防护罩、警示标志等,防止人员误操作或触电事故的发生。
Caliber公司的发展小趣事

在环保意识日益增强的今天,Caliber公司积极响应国家号召,推动绿色环保生产。公司投入大量资金引进环保设备和技术,减少生产过程中的污染排放。同时,Caliber还研发了一系列节能型电子产品,为用户提供更加环保的选择。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

AUK Contractors Co Ltd公司的发展小趣事

AUK Contractors Co Ltd成立之初,电子市场正处于技术革新的热潮中。公司凭借对新技术敏锐的洞察力,成功研发出一款具有颠覆性的电路板设计,显著提高了电子设备的性能和稳定性。这一创新不仅赢得了客户的广泛认可,还为公司赢得了多个重要合同,从而奠定了在电子行业中的坚实地位。

埃派克森微电子(Apexone)公司的发展小趣事

作为一家具有社会责任感的企业,埃派克森微电子在发展过程中始终关注社会公益事业。在四川汶川地震发生后,公司积极发起救援捐赠活动,通过中国扶贫基金会为灾区捐款10万元,帮助受灾民众度过难关。这一行动体现了埃派克森的社会责任感和人文关怀精神,也为公司在社会中树立了良好的形象。

这五个故事展示了埃派克森微电子在电子行业中的发展历程和取得的成就。从创新起步到专利技术的突破与商用,再到业绩的连续增长和国际化步伐的加快,以及积极履行社会责任的公益行动,都充分展现了埃派克森微电子的实力和担当。未来,随着科技的不断进步和市场需求的不断变化,埃派克森微电子将继续保持创新精神,不断提升产品性能和市场竞争力,为电子行业的发展做出更大的贡献。

HCH Co公司的发展小趣事

背景:面对电子行业的快速变化和多元化需求,HCH Co公司意识到仅凭一己之力难以应对所有挑战。因此,公司积极寻求与其他行业的跨界合作机会,以共同推动电子行业的创新发展。

发展:通过与汽车、医疗、教育等多个行业的领军企业建立合作关系,HCH Co公司成功将自身的电子技术和产品应用于更广泛的领域。例如,与汽车制造商合作开发智能驾驶系统、与医疗机构合作研发远程医疗设备等。跨界合作不仅为公司带来了新的增长点,也促进了不同行业之间的技术交流和资源共享。未来,HCH Co公司将继续秉承开放合作的理念,与更多行业伙伴携手共创美好未来。

请注意,以上五个故事是基于假设构建的,旨在反映电子行业中企业可能的发展路径和趋势。实际情况中,“HCH Co”公司的具体发展故事可能有所不同。

Anvo-Systems公司的发展小趣事

Anvo-Systems深知人才是企业发展的核心动力。因此,公司一直注重与高校和研究机构的合作,共同开展电子技术的研发与创新。通过与高校合作开展科研项目、设立奖学金等方式,Anvo-Systems吸引了大批优秀的人才加入公司。同时,公司还建立了完善的培训体系,为员工的职业发展提供了有力支持。这些举措不仅提升了公司的研发实力,也为公司的未来发展储备了丰富的人才资源。

问答坊 | AI 解惑

基于Actel FPGA的UART应用

UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传送器,工作于数据链路层,包含了RS-232、RS-422、RS-485串口通信。它具有传输线少、成本低和可靠性高等优点。广泛应用于通信领域、医疗及消费电子领域、汽车电子领域和工业及数 ...…

查看全部问答>

请教 怎么对地址总线的某一位赋值???

我的硬件是PXA270 通过16位数据总线连接到64MBYTE的FLASH P33,地址总线是26位 p33是由两块32M的flash组成的,在程序中不能同时访问上下两块FLASH的地址 而是需要有一个地址总线,即最高位的A25作为内部片选,选择当前访问的是BOTTOM 还是top flas ...…

查看全部问答>

如何更新固件

  本人在项目中设计的系统需要在线更新,是一个基于DSP的系统,就是可以通过上位机经过网口更新配置里面的算法程序及参数,但是不知道具体的框架设计.因为要更新肯定要涉及到FLASH的烧写,但又不是全部擦除和烧写,只更新需要更新的,那这个如何 ...…

查看全部问答>

wince 5.0短信截获

wince 5.0和6.0下短信截获用什么方法好。 我使用的5.0和6.0的机器上没有cemapi.dll,所以使用cemapi的方法不行,mapirule也是基于cemapi的,也不能用。ril需要ril.dll占用空间太大。 还有什么好的方法可以截获短信,在网上看到有一种钩子函数的方 ...…

查看全部问答>

问个有关44B0X接口的分配问题,谢谢

自己想刷块板,但技术没那么强,上来问个问题,因为44B0X接口到最后不够用,分配成问题,所以问一下,怎么合理的资源分配,谢谢的 问题如下: LCD的24针口利用了GPC8(DISP_ON),GPC9(EL_ON),GPE3,GPE4,GPE6,GPE7。 剩下没用的接口为:GPA ...…

查看全部问答>

pxa270 ce5.0电源管理源码谁有,能给一份来参考下吗?

       目前我正在做pxa270平台,windows ce5.0系统,现在就只是简单的休眠啊,挂起啊之类的,有谁实现稍微复杂点的功能啊,如系统空闲的情况下降低CPU的频率,电压等。有的吗?100分送上…

查看全部问答>

嵌入式系统开发中的印度工程师和中国工程师

在公司用嵌入式系统开发产品,开发组里有印度工程师,在一次闲聊时听到这么一个说法:中国工程师硬件开发比较厉害,印度工程师软件开发比较厉害。不过的确注意到公司软件开发部门印度人比较多。除了语言上的原因外还有别的原因吗?--- (一个月的贴 ...…

查看全部问答>

PCB热转印法双面板PDF文件输出

分开步骤都知道一些,但组合起来就不会了…

查看全部问答>

2011电阻测量仪制作

本帖最后由 paulhyde 于 2014-9-15 08:56 编辑 分享一下,你不一样的想法~ [ 本帖最后由 levelgod 于 2011-8-31 13:03 编辑 ]  …

查看全部问答>