历史上的今天
返回首页

历史上的今天

今天是:2025年02月24日(星期一)

正在发生

2020年02月24日 | MSP430F5529与LCD1602显示模块(上)

2020-02-24 来源:eefocus

LCD1602介绍

外观

LCD1602外观1

LCD1602外观2

主要技术参数

显示容量: 16X2个字符


芯片工作电压: 4.5~5.5V


工作电流: 2.0mA(5.0V)


模块最佳工作电压: 5.0V


字符尺寸: 2.95X4.35(WXH)mm


接口说明

并口传输模式

VSS 电源地


VDD 电源正极(5V)


V0 液晶显示偏压信号


RS 数据/命令选择端(H/L)


RW 读/写选择端(H/L)


E 使能信号


D0 Data I/O


D1 Data I/O


D2 Data I/O


D3 Data I/O


D4 Data I/O


D5 Data I/O


D6 Data I/O


D7 Data I/O


A 背光源正极


K 背光源负极


IIC/I2C模式

GND 电源地


VCC 电源正极(5V)


SDA 数据I/O口


SCL 数据时钟


单片机实现

并口传输模式

基本操作时序:

读状态:


输入:RS=L,RW=H,E=H


输出:D0~D7=状态字


写指令:


输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲


输出:无


读数据:


输入:RS=H,RW=H,E=H


输出:DO~D7=数据


写数据:


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


输出:无


RAM地址映射图:

RAM地址映射图

指令说明

1、清屏指令(clear display) RS=L,RW=L,D0~D7=0000_0001


功能:


清除液晶显示器,即将DDRAM中的内容全部填入20H(空白字符)


光标撤回至显示屏左上角


将地址计数器(AC)设为0


光标移动方向为从左向右,并且DDRAM的自增量为1(I/D=1)

清屏指令

2、光标归位指令(Return Home)RS=L,RW=L,D0~D7=0000_001X


功能:


将地址计数器(AC)设为00H


DDRAM内容保持不变,光标移至左上角

光标归位指令

3、进入模式设置指令(Entry Mode Set)


功能:


设定每次写入1位数据后光标移位方向并且设定光标每次写入一个字符后是否移动 。


I/D = 0时光标左移,DDRAM地址自增1


I/D = 1时光标右移,DDRAM地址自增1(当从CGRAM中读取或写入数据时,CGRAM操作与DDRAM相同)


SH = 0 且 DDRAM是读操作(CGRAM读或写),整个屏幕不移动


SH = 1 且DDRAM是写操作,整个屏幕移动,移动方向由I/D决定。

进入模式设置指令

4、显示开关控制(Display ON/OFF Control)


功能:


D = 1 , 显示功能开


D = 0 , 显示功能关,但是DDRAM中的数据依然保留


C = 1 , 有光标


C = 0 , 没有光标


B = 1 , 光标闪烁


B = 0 , 光标不闪烁

显示开关控制

5、设置显示屏或光标移动方向的指令


功能:


整屏的移动或光标移动

S/C =0 R/L =0 光标左移 ,地址计数器减1(即显示内容和光标一起左移)


S/C =0 R/L =1 光标右移 ,地址计数器加1(即显示内容和光标一起右移)


S/C =1 R/L =0 显示内容左移 ,光标不移动


S/C =1 R/L =1 显示内容右移 ,光标不移动

设置显示屏或光标移动方向的指令

6、功能设定指令


功能:


设定数据总线位数、显示的行数及字形。


DL=1 ,数据总线是8位


DL=0 ,数据总线是4位


N=0 ,显示一行


N=1 ,显示两行


F=0 ,5*8 点阵/字符


F=1 ,5*11点阵/字符

功能设定指令

7.设置DDRAM(光标)地址

设置DDRAM(光标)地址

功能:


设置地址计数器AC的值,实则上是设置光标所在的位置。


DDRAM的地址与显示屏对照关系(N=LOW)

DDRAM的地址与显示屏对照关系

八线模式单片机实现代码

非常感谢MSP430F5529&LCD1602程序的作者Aliqiji提供思路和代码!


端口操作宏定义

#define DataDir     P3DIR //D0~D7分别对应P3.0-P3.7

#define DataPort    P3OUT


#define CLR_RS P1OUT&=~BIT3;    //RS = P1.3

#define SET_RS P1OUT|=BIT3;

#define CLR_RW P1OUT&=~BIT4;    //RW = P1.4

#define SET_RW P1OUT|=BIT4;

#define CLR_EN P1OUT&=~BIT5;    //EN = P1.5

#define SET_EN P1OUT|=BIT5;


初始化端口

void GPIO_init(){


        P1DIR |= BIT3+BIT4+BIT5;        //控制线端口设为输出状态

        DataDir  = 0xFF;


}


精确延时

void delay_ms(unsigned int ms){ //For MSP430F5529

    for(;ms>0;ms--) __delay_cycles(1000);

}


写指令

void LCD1602_WriteCMD(unsigned char cmd)

{

        CLR_EN;

        CLR_RS;     //指令

        CLR_RW;     //写

        DataPort=cmd;   //指令数据传到P0口待发送给LCD1602

        SET_EN;     

        CLR_EN;     //产生下降沿

delay_ms(1);

}


写数据

void LCD1602_WriteDATA(unsigned char Data)

    {

        CLR_EN;

        SET_RS; //数据

        CLR_RW; //写

        DataPort=Data;

        SET_EN;

        CLR_EN; //产生下降沿

        delay_ms(1);

    }


LCD1602初始化

void LCD1602_Init()

    {

        GPIO_init();

LCD1602_WriteCMD(0x38); //  置功能,8位总线,双行显示,显示5X7的点阵字符

        LCD1602_WriteCMD(0x0f); //  显示开关控制,开显示, 有光标,闪烁

        LCD1602_WriteCMD(0x06); //  光标和显示位置设置,  光标移动方向右移,屏幕上所有文字不动

        LCD1602_WriteCMD(0x01); //  清显示,指令码01H,光标复位到地址00H位置

delay_ms(10);

    }


在当前指针位置显示单个字符

void DispChar(unsigned char data)

{

    LCD1602_WriteDATA(data);

}


在当前指针位置显示字符串

void DispStr(unsigned char *str)

{

while(*str != 0){

        DispChar(*str++);

    }

}


设置指针位置

这部分的内容在前文指令说明中***设置DDRAM(光标)地址*** 处有所提及。


设置指针在第一行最左端


    LCD1602_WriteCMD(0x80);


设置指针在第二行最左端


    LCD1602_WriteCMD(0x80 + 0x40);


四线模式单片机实现代码

在显示速度要求不高的情况下,八线并口模式占用了过多的单片机管脚,如果管脚资源紧张,可以试一试使用四线模式。


四线模式是指只使用数据端口D4~D7完成与八线模式一样的操作,但不同的是,四线模式只能写而不能读。


四线模式的时序操作与八线模式不同点在于,一个指令或者一个数据,需要传输两次,也就是EN产生两次下降沿,第一次下降沿的时候传输高四位数据,第二次下降沿的时候传输低四位数据。


那么,我们应该怎么修改上述代码来实现四线模式呢~请看下文


端口操作宏定义

#define DataDir     P3DIR 

#define DataPort    P3OUT


#define CLR_RS P1OUT&=~BIT3;    //RS = P1.3

#define SET_RS P1OUT|=BIT3;

#define CLR_RW P1OUT&=~BIT4;    //RW = P1.4

#define SET_RW P1OUT|=BIT4;

#define CLR_EN P1OUT&=~BIT5;    //EN = P1.5

#define SET_EN P1OUT|=BIT5;


初始化端口

由于我当时写的综合代码中,P3.4端口被占用,所以我采用了P3.0,P3.5,P3.6,P3.7四个端口作为数据口。


void GPIO_init(){


        P1DIR |= BIT3+BIT4+BIT5;        //控制线端口设为输出状态

        DataDir  = BIT0+BIT5+BIT6+BIT7;


}


设置数据端口

void Set_DataPort(unsigned char Data){

    if(Data&BIT4) P3OUT |= BIT0;

    else P3OUT &= ~BIT0;

    if(Data&BIT5) P3OUT |= BIT5;

    else P3OUT &= ~BIT5;

    if(Data&BIT6) P3OUT |= BIT6;

    else P3OUT &= ~BIT6;

    if(Data&BIT7) P3OUT |= BIT7;

    else P3OUT &= ~BIT7;

}


写指令

void LCD1602_WriteCMD(unsigned char cmd)

{

        CLR_EN;

        CLR_RS;     //指令

        Set_DataPort(cmd&0b11110000);   //指令数据传到P0口待发送给LCD1602

        SET_EN;     //LCD1602使能口

        CLR_EN;     //产生下降沿

        Set_DataPort((cmd&0b00001111)<<4);   //指令数据传到P0口待发送给LCD1602

        SET_EN;

        CLR_EN

        delay_ms(1);

}


写数据

void LCD1602_WriteDATA(unsigned char data)

{

        CLR_EN;

        SET_RS;     //指令

        Set_DataPort(data&0b11110000);   //数据传到P0口待发送给LCD1602

        SET_EN;     //LCD1602使能口

        CLR_EN;     //产生下降沿

        Set_DataPort((data&0b00001111)<<4);   //数据传到P0口待发送给LCD1602

        SET_EN;

        CLR_EN

        delay_ms(1);

}


LCD1602初始化

void LCD1602_Init()

    {

        GPIO_init();

        LCD1602_WriteCMD(0b00101000); //  置功能,4位总线,双行显示,显示5X7的点阵字符  //00101000

        LCD1602_WriteCMD(0b00001100); //  显示开关控制,开显示, 有光标,闪烁

        LCD1602_WriteCMD(0b00000110); //  光标和显示位置设置,  光标移动方向右移,屏幕上所有文字不动

        LCD1602_WriteCMD(0b00000001); //  清显示,指令码01H,光标复位到地址00H位置

delay_ms(10);

    }


单片机接线

接线按照1.3接口说明以及代码中所选择的端口接即可,背光源A、K一般情况下是不用接的。


特别要说明的是,V0(液晶显示偏压信号)的接线,数据手册中说它要接一个电位器到地以调节对比度,如下图所示。

调节对比度

所以我们可以把它接到MSP430F5529的拨码电位器(P6.5)上,接上之后就可以通过拨动拨码电位器调节屏幕的对比度啦!


结语

通过学习LCD1602的操作,我们可以了解到单片机与外设间进行并口通信的一般原理。并口通信速度快,但是占用的管脚多,接线麻烦,在管脚资源紧张的情况下还会导致很多其他的问题,虽然LCD1602提供的四线模式可以在一定程度上缓和这种矛盾,但是有没有其他更省管脚资源的方法呢?答案是有的,那就是采用串口通信,下篇文章我将讲讲利用I2C协议与LCD1602进行串口通信~

推荐阅读

史海拾趣

Brainboxes公司的发展小趣事

随着全球化进程的加速,Brainboxes逐渐将业务拓展至全球范围。公司在多个国家和地区设立分支机构或销售网络,以便更好地服务当地客户。同时,Brainboxes也在不断探索新的应用领域和市场机会,为公司的未来发展奠定坚实基础。展望未来,Brainboxes将继续致力于技术创新和市场拓展,为电子行业的发展贡献更多力量。

这五个故事分别展现了Brainboxes公司在电子行业中的创立与发展、技术创新与荣誉、内部制造与供应链、客户亲密度与工业连接以及全球布局与未来展望等方面的事实。通过这些故事,可以更加全面地了解Brainboxes公司在电子行业中的成长轨迹和发展成就。

Bussmann (Eaton)公司的发展小趣事

1985年,Cooper工业(后更名为库柏工业)收购了Bussmann公司,并成立了新的事业部——“Cooper Bussmann熔断器”。这一收购为Bussmann带来了更多的资源和市场机会,使其能够进一步扩大生产规模,提升产品质量,并加强在全球市场的布局。同时,Cooper工业的支持也帮助Bussmann巩固了在电路保护领域的领先地位,并逐渐将其打造成为熔断器电路保护及相关配件的最知名品牌。

Fair Rite公司的发展小趣事

随着全球进入数字化、网络化、智能化时代,电子元器件市场发生了深刻的变化。Fair Rite积极应对市场变化,通过技术创新和产品研发,不断推出适应新需求的产品。例如,公司针对EMF/EMI干扰较严重或容易出现导漏流问题的情况,推出了EMI抑制铁芯线圈(SM-BL系列),帮助客户节省PCB空间并降低干扰信号。同时,Fair Rite还注重满足客户的性价比需求,为每个新产品进行定制化设计和质量验证(遵循ISO9001:2008标准),确保其在不同应用场景下稳定可靠。

这些故事展示了Fair Rite在电子行业中不断发展壮大的历程。通过不断创新、拓展市场和提升品质,Fair Rite已经成为电子行业中的佼佼者之一。

GE Solid State公司的发展小趣事
对于视力障碍的学生或学习者来说,可听的曝光表电路可以作为一种辅助工具来帮助他们理解和感知光线和曝光量的概念。
Calex Mfg Co Inc公司的发展小趣事

Calex Mfg. Co., Inc.的创业之路并非一帆风顺。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人们凭借着对电子行业的热爱和对技术的深刻理解,坚持研发创新,不断推出符合市场需求的产品。他们通过精益求精的制造工艺和严格的质量控制,逐渐在市场中树立起了良好的口碑。

CINTERION公司的发展小趣事

CINTERION的前身可追溯到西门子于1995年创建的无线模块业务。在成立之初,该公司便专注于工业用机器对机器(M2M)无线通信模块的研发与生产。随着技术的不断进步,CINTERION逐渐在行业内崭露头角,其产品在智能电网、汽车、公用事业等领域得到了广泛应用。1996年,CINTERION成功推出了全球第一款蜂窝模组,这一创新为公司在无线通信模组市场打下了坚实的基础。

问答坊 | AI 解惑

用洞洞板搞些制作的TX来说简直太方便

用洞洞板搞些制作的TX来说简直太方便…

查看全部问答>

Creating Schematic Symbols in OrCAD Capture.pdf

Creating Schematic Symbols in OrCAD Capture.…

查看全部问答>

单片机

  我是一个单片机初学者,很菜的,以前只学过C,怎么才能进入真正的单片机编程,或者提供一些简单的小程序什么的?哪位老师能给我说一下具体的方法?!我很想学好它,当然我也会努力的…

查看全部问答>

家用恒温控制器电路图

家用恒温控制器电路图:   …

查看全部问答>

单片机开发深度资料

单片机开发深度资料…

查看全部问答>

请问下UCOS+ARM9模式下如何编写串口通信

请问下UCOS+ARM9模式下如何编写串口通信 最近将UCOS移植到了ARM9下,但是编写串口通信时出了问题,主要是目前串口无法接受到PC机上的数据,请问各位朋友有谁碰到过类似的问题?…

查看全部问答>

USB资料共享

小弟最近学习USB,发现论坛这方面资料很少。上传些,希望大家能多多交流。…

查看全部问答>

TMDSDC3359Z智能电网智能数据集中器Demo

[ 本帖最后由 德州仪器_视频 于 2013-10-14 14:51 编辑 ]…

查看全部问答>

在CCSV5怎样加载IAR工程

在CCSV5怎样加载IAR工程,求教…

查看全部问答>

开关AD中断会影响AD转换结果?

程序中在计算数值的时候将AD中断关闭,计算完成后再将AD中断打开,但是现在发现在AD采样率低的时候AD转换结果没问题,但是提高了采样率,AD结果就不对了,寄存器显示OVERRUN,貌似是数据丢失或者覆盖,这是咋回事呢? 开关AD中断不该影响AD转换啊? ...…

查看全部问答>