历史上的今天
返回首页

历史上的今天

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

正在发生

2022年10月20日 | 【51单片机STC89C52】LCD1602液晶屏的使用

2022-10-20 来源:csdn

一、LCD1602模块

1、引脚说明

第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度

过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。

第 4 脚: RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。

第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。

第 7-14 脚:D0~D7 为 8 位双向数据线。


2、接线说明

VSS --- GND

VDD --- 5V

VL   ---  GND

RS  ---  P1.0

RW ---  P1.1

E     ---  P1.4

D0-D7  ---  P0.0-P0.7

BLA  ---  5V

BLK  --- GND

3、LCD模块控制指令 

 

二、开发逻辑

1、LCD1602 内部显示地址

例如第二行第一个字符的地址是 40H,那么是否直接写入 40H 就可以将光标定位在第二行第 一个字符的位置呢?这样不行,因为 写入显示地址时要求最高位 D7 恒定为高电平 1 所以实际写入的数据应该是 01000000B(40H) +10000000B(80H)=11000000B(C0H)。

2、LCD1602 模块字库表

3、基本操作时序表

读操作时序

检测忙信号


void check_busy()

{

char tmp = 0x80;

databuffer = 0x80;

while(tmp & 0x80){//1000 0000

RS = 0;

RW = 1;

EN = 0;

_nop_();

EN = 1;

_nop_();

_nop_();

tmp = databuffer;

EN = 0;

_nop_();

}

}


写操作时序


写指令/地址


void Write_Cmd_Func(char cmd)

{

check_busy();

RS = 0;

RW = 0;

EN = 0;

_nop_();

databuffer = cmd;

_nop_();

EN = 1;

_nop_();

_nop_();

EN = 0;

_nop_();

}


写数据/内容 


void Write_Data_Func(char dataShow)

{

check_busy();

RS = 1;

RW = 0;

EN = 0;

_nop_();

databuffer = dataShow;

_nop_();

EN = 1;

_nop_();

_nop_();

EN = 0;

_nop_();

}


时序参数

   

   

液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。


4、注意事项

(1) 在对液晶模块的初始化中要先设置其显示模式

(2) 在液晶模块显示字符时光标是自动右移的,无需人工干预

(3) 每次输入指令前都要判断液晶模块是否处于忙的状态

5、LCD1602 的一般初始化(复位)过程

 LCD1602 初始化过程 (8bit)

(1)延时 15ms

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

(3)延时 5ms

(4)以后每次写指令,读 / 写数据操作均需要检测忙信号

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

(6)写指令 08H :显示关闭

(7)写指令 01H :显示清屏

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

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

void LCD1602_INIT()

{

//(1)延时 15ms

Delay15ms();

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

Write_Cmd_Func(0x38);

//(3)延时 5ms

Delay5ms();

//(4)以后每次写指令,读/写数据操作均需要检测忙信号

//(5)写指令 38H:显示模式设置

Write_Cmd_Func(0x38);

//(6)写指令 08H:显示关闭

Write_Cmd_Func(0x08);

//(7)写指令 01H:显示清屏

Write_Cmd_Func(0x01);

//(8)写指令 06H:显示光标移动设置

Write_Cmd_Func(0x06);

//(9)写指令 0CH:显示开及光标设置}

Write_Cmd_Func(0x0c);

}


 LCD1602 初始化过程 (4bit)

(01)延时 50ms

(02)发送 0x03(4bit)(rs=0,rw=0)

(03)延时 4.5ms

(04)发送 0x03(4bit)(rs=0,rw=0)

(05)延时 4.5ms

(06)发送 0x03(4bit)(rs=0,rw=0)

(07)延时 150μs

(08)发送 0x02(4bit)(rs=0,rw=0)

(09)写指令 28H(8bit)

( 10 )写指令 0CH(8bit)

( 11 )写指令 01H(8bit)

( 12 )延时 2ms(8bit)

( 13 )写指令 06H(8bit)


三、显示一个字符

#include "reg52.h"

#include "intrins.h"

 

#define databuffer  P0 //定义8位数据线,Po端口组

sbit RS = P1^0;

sbit RW = P1^1;

sbit EN = P1^4;

 

void check_busy()

{

char tmp = 0x80;

databuffer = 0x80;

while(tmp & 0x80){//1000 0000

RS = 0;

RW = 1;

EN = 0;

_nop_();

EN = 1;

_nop_();

_nop_();

tmp = databuffer;

EN = 0;

_nop_();

}

}

 

void Write_Cmd_Func(char cmd)

{

check_busy();

RS = 0;

RW = 0;

EN = 0;

_nop_();

databuffer = cmd;

_nop_();

EN = 1;

_nop_();

_nop_();

EN = 0;

_nop_();

}

 

void Write_Data_Func(char dataShow)

{

check_busy();

RS = 1;

RW = 0;

EN = 0;

_nop_();

databuffer = dataShow;

_nop_();

EN = 1;

_nop_();

_nop_();

EN = 0;

_nop_();

}

 

void Delay15ms() //@11.0592MHz

{

unsigned char i, j;

 

i = 27;

j = 226;

do

{

while (--j);

} while (--i);

}

void Delay5ms() //@11.0592MHz

{

unsigned char i, j;

 

i = 9;

j = 244;

do

{

while (--j);

} while (--i);

}

 

 

void LCD1602_INIT()

{

//(1)延时 15ms

Delay15ms();

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

Write_Cmd_Func(0x38);

//(3)延时 5ms

Delay5ms();

//(4)以后每次写指令,读/写数据操作均需要检测忙信号

//(5)写指令 38H:显示模式设置

Write_Cmd_Func(0x38);

//(6)写指令 08H:显示关闭

Write_Cmd_Func(0x08);

//(7)写指令 01H:显示清屏

Write_Cmd_Func(0x01);

//(8)写指令 06H:显示光标移动设置

Write_Cmd_Func(0x06);

//(9)写指令 0CH:显示开及光标设置}

Write_Cmd_Func(0x0c);

}

 

void main()

{

char position = 0x80 + 0x05;

char dataShow = '@';

LCD1602_INIT();

Write_Cmd_Func(position);//选择要显示的地址

Write_Data_Func(dataShow);//发送要显示的字符

}


四、显示一行

void LCD1602_showLine(char row, char col, char *string)

{

switch(row){

 

case 1:

Write_Cmd_Func(0x80+col);

while(*string){

Write_Data_Func(*string);

string++;

}

break;

case 2:

Write_Cmd_Func(0x80+0x40+col);

while(*string){

Write_Data_Func(*string);

string++;

}

break;

}

}


主函数里

LCD1602_showLine(1,2,"LCD1602_test");

LCD1602_showLine(2,2,"CDTU@DT_1213");


推荐阅读

史海拾趣

Andigilog公司的发展小趣事

Andigilog是一家专注于提供模拟和混合信号集成电路解决方案的公司,以下是该公司发展的相关故事:

  1. 公司成立与早期发展:Andigilog成立于2002年,总部位于美国加利福尼亚州的圣何塞。该公司成立之初,专注于设计和销售模拟和混合信号集成电路(IC),以满足各种市场的需求。最初,公司的产品主要应用于电源管理、温度监测和控制等领域。

  2. 技术创新与产品推出:Andigilog在成立初期就致力于技术创新和产品研发。随着市场需求的不断变化,公司不断推出新型的集成电路产品,包括温度传感器、电源监测芯片等。这些产品具有高精度、低功耗、高集成度等优点,受到了客户的青睐。

  3. 合作伙伴关系与市场拓展:为了扩大市场份额和提升品牌知名度,Andigilog与各种合作伙伴建立了紧密的合作关系。公司与全球各地的分销商、代理商、原始设备制造商(OEM)等进行合作,共同开拓市场,推广公司的产品。此外,Andigilog还与行业内的其他公司进行技术合作和产品整合,共同提供更完整的解决方案。

  4. 全球布局与生产基地:随着业务的不断扩展,Andigilog在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在亚洲、欧洲等地区设立了生产工厂和销售办事处,以更好地服务全球客户。这些生产基地拥有先进的制造设备和技术,能够满足客户对产品质量和交货周期的要求。

  5. 持续发展与未来展望:作为一家专注于模拟和混合信号集成电路的公司,Andigilog将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Andigilog也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

CUI Devices公司的发展小趣事

在COVID-19全球大流行期间,CUI Devices展现出了高度的社会责任感。公司决定向那些致力于设计和制造抗击疫情关键医疗设备的OEM、制造商、志愿者和组织提供免费的产品样本。这些样本涵盖了呼吸器、呼吸机、血液分析仪、测试设备、患者监护仪、成像系统和家庭医用器材等多个领域。此外,公司还与全球的制造设施和分销合作伙伴紧密合作,以确保其多样化的产品组合能够随时满足市场需求。

Chipcon AS公司的发展小趣事

随着公司业务的不断发展,Chipcon AS公司开始将目光投向全球市场。公司通过参加国际电子展会、设立海外分支机构等方式,积极推广自己的产品和服务。同时,公司还针对不同国家和地区的市场需求,定制化开发了一系列符合当地标准的产品。这些举措使得Chipcon AS公司的产品在全球范围内得到了广泛应用和认可。

Amphenol Aerospace公司的发展小趣事

Chipcon AS公司深知人才是企业发展的核心力量。因此,公司一直注重人才的引进和培养。通过与高校和研究机构建立合作关系,公司吸引了大量优秀的研发人才加入。同时,公司还建立了完善的培训体系,为员工提供了广阔的职业发展空间。这些措施使得Chipcon AS公司的研发实力不断增强,为公司的持续发展提供了有力保障。

Danaher Corporation公司的发展小趣事

丹纳赫集团起源于1984年,由Steven Rales和Mitchell Rales兄弟二人创立。他们的愿景是建立一个致力于持续改善并提升客户满意度的制造公司。名字“Dana”源自古老的凯尔特语,寓意奔腾不息的精神和不断改善的品质。起初,丹纳赫集团并未直接涉足电子行业,但随着公司的发展,逐渐将业务范围扩展至包括电子设备和技术的领域。

Advanced Detector Corp公司的发展小趣事

为了进一步提升竞争力,ADC积极寻求与其他企业的战略合作。通过与业界领先的企业建立合作关系,ADC成功整合了各方资源,共同研发新技术、新产品。这些合作不仅加速了ADC的技术创新步伐,也为其带来了更多的商业机会。

问答坊 | AI 解惑

VCD机内置功放

长期以来,我使用VCD机时总感到不如意,原因是VCD机自身不带功放。要播放碟片时,除音箱外,非得再配电视机或者功放机不可,因此使用起来极其麻烦。本人有一台万利达早期生产的VCP-N28K型VCD机,为其加装了简洁的立体声功放电路, ...…

查看全部问答>

汽车设计制造全过程

对于大多数人来说,对车的欣赏基本都是整车,除了性能之外,汽车的外观和内饰是人们谈论最多的话题,因为这是对一辆车最直观的印象,所谓汽车设计,简单的理解是根据一款车型的多方面要求来设计汽车的外观及内饰,使其在充分发挥性能的基础上艺术化 ...…

查看全部问答>

ARM初学者入门手册 .pdf

大家分享一下,觉得还不错…

查看全部问答>

【压缩包】121篇FPGA 图像处理相关论文大赠送

应坛友要求做成压缩包方便大家下载!其实我的本意是让大家有选择的下的,没想到大家都求知若渴想要都下下来…

查看全部问答>

程序初始化进入HardFault_Handler

如题:IAR+Jlink,SWD方式调试,芯片型号为STM32F101CBT6,仿真运行,执行到函数TIM2_Configuration中的TIM_Cmd(TIM2, ENABLE);就进入到HardFault_Handler,如果复位后重新运行则执行到NVIC_Configuration中的NVIC_Init(&NVIC_InitStructure ...…

查看全部问答>

LTC1700芯片发热...不接负载电流达到150mA左右。。

本帖最后由 paulhyde 于 2014-9-15 09:09 编辑 如题,电路图pdf典型解法。其中输出端电容取的是470u/16V 反馈电阻取的300K 其他基本跟典型参数一样。后改进过电感600uh。效果一样的。不知道问题在哪里了。。。谢谢懂的朋友哈  …

查看全部问答>

有一款输出正负12V和正负5V芯片

有一款能输出正负5V和正负12V的电源芯片,在哪里见过,忘了型号了,哪位知道有哪些芯片可以输出多路双电源芯片…

查看全部问答>

我是新手,想学习PCB。应该怎么做?

我是新手,想学习PCB。应该怎么做?求高手指点。…

查看全部问答>

74hc373锁存异常

用2片373扩展IO口驱动多路继电器,输出与仿真结果完全不同 两片373分别叫Q1和Q2吧,Q1和Q2和数据输入口接51芯片P1口,LE分别接P3.0和P3.1使能,QE全部使能,起始P3.0和P3.1输出0,P1输出一个字节,Q1使能,关Q1;输出下个字节,Q2使能,关Q2。这样 ...…

查看全部问答>