接口16 × 2液晶与LPC2148 ARM 7微控制器
在用任何微控制器闪烁led之后,下一个重要的项目是在LCD上显示字符。在这个项目中,我们将看到如何接口LCD与LPC2148微控制器,当我们说LCD,一个16 X 2字母数字LCD模块具体。
在进入实际项目之前,我们将讨论一些关于16 x 2液晶显示器的事情。LCD显示器或液晶显示器是一种具有液晶和led背光的显示模块。一个16 × 2的LCD显示器由两行显示器组成,每行包含16个字符。
市面上最常见的16 × 2液晶显示器是JHD162A,带有HD44780或KS0066U显示控制器。HD44780由日立公司生产,KS0066U由三星公司生产。两个控制器兼容。
这个液晶模块有16个引脚,在5V电源上运行。16 × 2液晶显示器的标准引脚如下。
销的配置
密码 | 的名字 | 函数 |
1 | VSS | 电源(接地) |
2 | VDD | 电源+ 5 v |
3. | 签证官或三角 | 对比度调节:通过可变电阻。 |
4 | RS | 低电平时选择命令寄存器;高时数据寄存器 |
5 | R / W̅̅ | 低写寄存器;从寄存器高读 |
6 | E | 当给出高、低、低脉冲时,发送数据到数据引脚 |
7 | DB0 | 数据总线 |
8 | DB1 | 数据总线 |
9 | DB2 | 数据总线 |
10 | db4 | 数据总线 |
11 | DB4 | 数据总线 |
12 | DB5跑车 | 数据总线 |
13 | DB6 | 数据总线 |
14 | DB7 | 数据总线 |
15 | 一个 | LED背光电源(+5V) |
16 | K | LED背光电源(GND) |
从引脚配置可以看出,引脚可以按照Power引脚、control引脚和data引脚进行排序。电源引脚,即引脚1、2、3、15和16用于为模块以及背光led供电。合同调整引脚(引脚3或VEE)的电压通常由电位器给出,当壶被调整时将控制实际显示的对比度。
有8个数据引脚用于传输8位数据,即每次1字节的数据。LCD可以在8位模式或4位模式下使用。在4位模式下,8条数据线中只有4条被用来传输数据。
剩下的三个引脚即RS(引脚4),RW(引脚5)和E(引脚6)被称为控制引脚,是非常重要的引脚。
RS引脚是寄存器选择引脚的缩写,当它是LOW时,用来选择指令寄存器;当它是HIGH时,用来选择数据寄存器。
RW引脚或读写引脚用于选择读模式或写模式。当RW为HIGH时,选择读取模式,从寄存器中读取数据。当RW为LOW时,选择写入模式,可以将数据写入寄存器。
由于我们只使用写入模式,我们可以将RW引脚连接到地(通过一个下拉电阻)。
Enable (E)引脚,顾名思义,用于启用数据或指令的执行。只有当高到低的脉冲被给到使能引脚时,即仅在脉冲的下降沿上,数据或指令才由液晶显示模块执行。
LCD模块与LPC2148接口
16 × 2液晶显示模块与LPC2148单片机的接口电路如下图所示。
从电路图可以看出,LCD的4个数据引脚(D4 - D7)与LPC2148的P0.17到P0.20引脚相连。控制引脚RS和E分别接在LPC2148单片机的P0.12和P.13引脚上。
从电路图上可以清楚地看出,LCD是在4位模式下使用的。在LCD中使用4位模式的优点是只需要4个引脚,这在资源密集型应用中是非常重要的。
在LCD中使用4位模式也有一个折衷。由于只使用了4个引脚,我们一次只能发送4位的数据。因此,为了发送一个字节的数据,所花费的时间将是8位模式的两倍。
如果单片机上的I/O引脚数量有限,时间不是问题,那么我们可以采用4位模式。此外,4位模式需要额外的代码行,以便在每次发送指令或数据时将较低的小块数据移到较高的小块数据。
重要提示: ARM7 MCU,特别是LPC2148 MCU工作在3.3V电源上。项目中使用的ARM7开发板有一个单独的5V电源用于液晶模块,不从单片机吸取任何电源。
当将5V LCD模块与3.3V MCU像LPC2148一样连接时,如果直接连接,则有可能工作。在这种情况下,我们需要使用一个电平转换芯片作为单片机LPC2148和液晶显示模块之间的中间模块。
常用的电平移位器是HEF4050B,它是一个十六进制非反相缓冲器。它可以用来将逻辑电平转换为标准TTL电平。在74系列if ic中还有其他缓冲器或电平移位器。
初始化液晶显示模块
按电路图连接液晶显示模块后,第一步是对液晶显示模块进行初始化。为此,我们需要在程序中使用LCD的一些命令。LCD Module的配置命令及其功能如下表所示。
上面的表格看起来令人困惑,很难理解。因此,下表将为您提供一个简化的LCD命令列表及其各自的功能。
1 | 功能设置:8位模式,1行,5×7点 | 0 x30 |
2 | 功能设置:8位模式,2行,5×7点 | 0 x38 |
3. | 功能设置:4位模式,1行,5×7点 | 0 x20 |
4 | 功能设置:4位模式,2行,5×7点 | 0 x28 |
5 | 输入模式 | 0 x06 |
6 | 关闭显示关闭光标 | ( |
7 | 光标在上 | 0 x0e |
8 | 光标关闭时显示 | 0 x0c |
9 | 光标闪烁 | 0 x0f |
10 | 将整个显示器左移 | 0 x18 |
11 | 将整个显示器右移 | 0 x1c |
12 | 向左移动光标一个字符 | 0 x10 |
13 | 向右移动光标一个字符 | 0 x14 |
14 | 清晰显示(也可以清晰显示DDRAM内容) | 0 x01 |
15 | 设置显示的DDRAM地址或光标位置 | 0 x80 +地址 |
16 | 设置CGRAM地址或设置指向CGRAM位置的指针 | 0 x40 +地址 |
在这些命令中,我们将在我们的项目中使用五个命令。下面列出了它们及其在项目中的功能。
- 0 x28:该命令用于使能2行模块的4位模式,每个字符为5 × 7点。
- 0 x0c:显示开关命令,用于打开显示屏,关闭光标。
- 0 x01:该命令用于清除显示信息。更具体地说,它清除DDRAM的内容。
- 0 x80:设置光标位置到第一行的开头。这还意味着DDRAM地址是用这个值设置的。
- 0 xc0:它也用于设置光标的位置,但这次将位置设置为第二行中的起始位置。
LCD与LPC2148的接口程序
正如我们在之前的教程中看到的,如何设置锁相环,使CPU时钟运行在60 MHz (LPC2148的最大值),我们将包括在这段代码中。用LPC2148编写LCD接口编程的步骤如下。
- 设置锁相环模块
- LCD模块初始化
- 将数据发送到LCD模块
更详细的步骤解释了程序。
# include < lpc214x.h >
/*定义PORT0的17、18、18、20引脚作为数据引脚,PORT0的12、13引脚作为RS、E引脚用于LCD*/
#定义x001e0000液晶0
#定义RS (1 < < 12)
#定义E (1 < < 13)
/*定义程序中使用的函数*/
空白延迟(int);
无效CMD (unsigned char);
显示(无符号字符);
空白LCDinit(无效);
Void string (char *);
/*延迟函数的定义*/
Void delay (int d)
{
unsigned int i = 0;
(; d > 0; d -)
{
(我= 11998;> 0;-);
}
}
/* cmd函数的函数定义。用于向LCD模块发送初始化命令。因此,RS引脚设置为LOW。代码也写了两次:一旦4位被接收,它们被移动,下4位被捕获*/
无效CMD (unsigned char c)
{
IOPIN0 = (IOPIN0 & 0xffe1ffff) | ((c&0x000000f0)<<13);
IOCLR0 = RS;
IOSET0 = E;
延迟(10);
IOCLR0 = E;
IOPIN0 = (IOPIN0 & 0xffe1ffff) | ((c&0x0000000f)<<17);
IOCLR0 = RS;
IOSET0 = E;
延迟(10);
IOCLR0 = E;
}
/*显示函数的函数定义。用于将实际数据发送到LCD模块。因此,RS引脚设置为HIGH*/
显示(unsigned char c)
{
IOPIN0 = (IOPIN0 & 0xffe1ffff) | ((c&0xf0)<<13);
IOSET0 | = RS;
IOSET0 | = E;
延迟(10);
IOCLR0 | = E;
IOPIN0 = (IOPIN0 & 0xffe1ffff) | ((c&0xf)<<17);
IOSET0 | = RS;
IOSET0 | = E;
延迟(10);
IOCLR0 | = E;
}
/*函数捕获数据并传递给显示命令*/
空字符串(char *p)
{
而p (*)
{
显示(* p + +);
}
}
/* LCD初始化函数的函数定义。初始化LCD模块的命令使用这个函数*/给出
空白init(空白)
{
cmd (0 x00000028);
cmd (0 x0000000c);
cmd (0 x00000001);
cmd (0 x00000080);
}
int main ()
{
PINSEL0= 0 x00;
PINSEL1 = 0 x00;
IODIR0 =液晶RS | | E;
/*初始化锁相环并将其分配为系统时钟和外设时钟*/
PLL0CON = 0 x01;
PLL0CFG = 0 x24;
PLL0FEED = 0 xaa;
PLL0FEED = 0 x55;
而(!(PLL0STAT & 0 x00000400));
PLL0CON = 0 x03;
PLL0FEED = 0 xaa;
PLL0FEED = 0 x55;
VPBDIV = 0 x01;
LCDinit ();
而(1)
{
字符串(“电子中伟德亚洲会玩假吗心”);
cmd (0 xc0);
string(" LCD教程");
(1);
}
}
2反应
在命令和数据子程序中,为什么要移动13位?
IOPIN = 11111111111 xxxx11111111111111111
XXXX是命令代码
例如0x28命令,xxxx实际变为1010,而不是10100