小白学1602字符点阵型LCD液晶显示模块

       我们都知道,液晶显示已经深入我们的日常的生活之中,液晶显示器的英文名:LCD,而它经常被用于显示动画,比如影视,在工业上,LCD被经常用于状态的显示窗口。

       对于液晶的控制,我们第一步需要知道液晶的构造,液晶全称是“液态晶体”,介于固态和液态之间,我们一般常用的液晶形态是向列型液晶,分子形状为细长棒形,或者称之为杆状。在不同电流电场的作用下,液晶分子会做规则旋转呈90度排列。即在上下两片玻璃之间旋转,这样就会改变透射率和反射率。

       第二步就需要知道1602显示模块的接口。本次的1602液晶显示之所以叫1602,是因为它可以显示2行,每行显示16个点阵字符。再仔细的分下去就是一个点阵字符的大小为5*8点阵的图形字符(你可以仔细数一下液晶显示屏)。它带有字库,能显示ASCII字符。下图是1602LCD模块的显示图:


对于1602LCD的引脚说明:

V0:接可调电阻,可以调节液晶显示的对比度(一般俗指的就是亮度),若直接接地,对比度最高。

RS:数据或者命令的选择端,通俗的讲就是数据的读写和指令的写入。当单片机要往LCD模块写指令的时候,应使RS为低电平(从中央下达指令给地方,地方要摆好低姿态),同样当单片机从LCD模块读取状态时,RS也为低电平(从中央收取地方报告时,地方要以低姿态上书)。但是当单片机要写入数据给LCD时,应使RS为高电平(地方要高调的完成中央下达的年度计划)。单片机一般不会用于对LCD读取数据。

R/W:读写控制端。R/W为高电平时,表示读;R/W为低电平时,表示写(地方放低姿态)。

E:LCD模块的使能信号控制端。

单片机需要通过RS,RW和E这三端来控制LCD模块。

D0-D7:8位数据总线,三态双开(高电平状态、低电平状态、高阻状态[既悬空])

BLK:需要背光时,BLA串接一个限流电阻后接Vcc,BLK接地

BLK:背光接地。

写指令   输入:RS=L,R/W=L,E=下降沿脉冲,DB0-DB7=指令码

             输出:无

读状态   输入:RS=L,R/W=H,E=H(L为低电平,H为高电平),

             输出:DB0-DB7=状态字

写数据   输入:RS=H,R/W=L,E=下降沿脉冲,DB0-DB7=数据

             输出:无

读数据   输入:RS=H,R/W=H,E=H(L为低电平,H为高电平),

             输出:DB0-DB7=数据

       对于相关的指令码,可以通过LCD数据手册查询初始LCD的状态设置,既通过设置指令码(8个指令码D0-D7)来设置其状态,可以通过替换程序当中的LCD初始化中的小括号里面的16进制数值改变初始状态。

       一般来说:在LCD模块内部频率为270kHz(一些厂家为250KHz),而大部分的指令执行时间需要37us(40us)左右,只有清屏和DDRAM数据地址指针AC清零(或者说归位)指令执行时间需要1.52ms(1.64ms)左右,因此延时值可以取大点如5ms,保证操作可靠,以满足要求。

下面咱们就程序来说一下:

LCDdisplay.c

#include"stm32f10x_heads.h"

//Write_Command_LCM对LCD1602写指令

voidWrite_Command_LCM(u8 com)

{

  GPIO_ResetBits(GPIOD,GPIO_Pin_5);//RW=0,写操作

  GPIO_ResetBits(GPIOD,GPIO_Pin_4);//RS=0,指令

  GPIO_Write(GPIOD,com);

  GPIO_ResetBits(GPIOD,GPIO_Pin_6);//E=0,形成写脉冲

  delay_nms(5);

  GPIO_SetBits(GPIOD,GPIO_Pin_6);  //E=0,形成写脉冲

  delay_nms(5);

  GPIO_ResetBits(GPIOD,GPIO_Pin_6); //E=0,下降沿写

}

//Write_Data_LCM对LCD1602写数据

void Write_Data_LCM(u8info)

{

  GPIO_ResetBits(GPIOD,GPIO_Pin_5);//RW=0,写操作

  GPIO_ResetBits(GPIOD,GPIO_Pin_6);//E=0,形成写脉冲

  GPIO_Write(GPIOD,info);

  GPIO_SetBits(GPIOD,GPIO_Pin_4);//RS=1,指令

  delay_nms(5);

  GPIO_SetBits(GPIOD,GPIO_Pin_6);  //E=1,形成写脉冲

  delay_nms(5);

  GPIO_ResetBits(GPIOD,GPIO_Pin_6); //E=0,下降沿写

}

//LCM_Init(),对LCD1602初始化

voidLCM_Init(void)//LCM初始化

{

  Write_Command_LCM(0x38);//显示模式设置

  Write_Command_LCM(0x08);//关闭显示

  Write_Command_LCM(0x01);//显示清屏

  Write_Command_LCM(0x06);//显示光标移动位置

  Write_Command_LCM(0x0C);//显示开及光标设置

}

// Set_xy_LCM() 对LCD1602设定显示坐标位置,既开始显示数据时的位置

voidSet_xy_LCM(unsigned char x,unsigned char y)

{

  unsigned char address;

  if(x==0) //在lcd的显示屏的第一行显示数据

          address=0x80+y;

  if(x==1) //在lcd的显示屏的第二行显示数据

          address=0xc0+y;

  Write_Command_LCM(address);

}

//Display_List_Char()按指定的位置显示一串字符

voidDisplay_List_Char(unsigned char x,unsigned char y,unsigned char *s)

{

  Set_xy_LCM(x,y);

  while(*s)

  {

          Write_Data_LCM(*s)

          s++;

  }

}

//主程序运行

int main()

{

  LCM_Init();

  Display_List_Char(0,0,"fo.xi.90s");

 Display_List_Char(1,0,"guan,zhu,wo");

  while(1);

}

下面是LCD的.h文件

#ifndef __LCD_H

#define __LCD_H    

#include"sys.h"

#define rsPCout(6)

#define enPCout(8)

void Write_Command_LCM(u8info);

void Write_Data_LCM(u8info);

void LCM_Init (void);

       当然我们在日常的使用中,会用到动态的显示效果,这个可以利用switch和case语句进行程序的编写。(码字太烦躁了,不想码了,想要动态程序的可以留言,我看到后会发给你)。

需要将上面的程序慢慢看一下,方可与之前所描述的文字相对应,进行理解,可能说的有一些错误的地方,希望能提醒批改。

[文章未经作者的允许,不得转载]

猜你喜欢

转载自blog.csdn.net/qq_21990661/article/details/79679351