在本教程中,我们将了解如何将 16x2 LCD 与 ARM7-LPC2148 微控制器连接,并显示简单的欢迎消息。如果您是 ARM7 的新手,请从 ARM7 LPC2148 的基础知识开始,并了解如何使用 Keil uVision 对其进行编程
所需材料
硬件
ARM7-LPC2148 微控制器板
液晶屏 (16X2)
电位计
5V 稳压器 IC
试验板
连接线
9V电池
微型 USB 连接线
软件
凯尔乌维森 5
魔术闪光工具
在进入项目之前,我们必须对LCD操作模式和LCD十六进制代码知之甚少。
16X2液晶显示模块
16X2 LCD表示它有16列和2行。此液晶屏有 16 个引脚。下图显示了LCD显示器的引脚名称及其功能。
LCD可以在两种不同的模式下工作,即4位模式和8位模式。在 4 位模式下,我们逐个半字节发送数据,首先是上半字节,然后是下半字节。对于那些不知道什么是半字节的人:半字节是一组四位,所以字节的下四位(D0-D3)形成下半字节,而字节的上四位(D4-D7)形成较高的半字节。这使我们能够发送8位数据。
而在8位模式下,我们可以一次直接发送8位数据,因为我们使用了所有8条数据线。
在本项目中,我们将使用最常用的模式,即4位模式。在四位模式下,我们可以节省4个引脚的微控制器,并减少布线开销。
16x2还使用十六进制代码来接受任何命令,LCD有许多十六进制命令,例如移动光标,选择模式,将控件移动到第二行等。
电路图和连接
下表显示了液晶屏与 ARM7-LPC2148 之间的电路连接。
稳压器与液晶屏的连接 / ARM7 棒
下表显示了 ARM7 和 LCD 与稳压器之间的连接。
带液晶屏的电位计
电位计用于改变LCD显示器的对比度。电位器有三个引脚,左引脚(1)连接到+5V,中心(2)连接到LCD模块的VEE或V0,右引脚(3)连接到GND。我们可以通过转动旋钮来调整对比度。
跳线设置
ARM7-Stick中存在跳线引脚,因此我们可以通过使用USB或使用5V DC输入来供电和上传代码。您可以看到下面的图像。
下图显示了跳线处于直流位置。这意味着我们必须从外部5V电源为电路板供电。
这张图片显示跳线是在USB模式下连接的。在这里,电源和代码通过微型USB端口提供。
注意:在本教程中,我们通过使用USB上传代码,将跳线设置为USB,然后将跳线更改为直流模式,以从稳压器的5v输入为LPC2148供电。您可以在最后给出的视频中查看。
将16x2 LCD 与 ARM7 微控制器连接的最终电路如下所示:
编程 ARM7-液化板 2148
要对ARM7-LPC2148进行编程,我们需要可视化和闪存魔术工具。我们正在使用USB电缆通过微型USB端口对ARM7记忆棒进行编程。我们使用Keil编写代码并创建一个十六进制文件,然后使用闪存魔术将HEX文件闪存到ARM7棒。
本教程末尾给出了将 LCD 与 ARM 7 连接的完整代码,下面我们将介绍其中的一些部分。
首先,我们需要包含所需的头文件
#include -Header File to include LPC214x libraries
#include -Header File for using integer type with specified widths
#include - Header File for include standard library
#include - Header File for include standard input output library
初始化LCD模块是一个非常重要的步骤。在这里,我们使用某些十六进制代码,这些代码实际上是命令,以告诉LCD有关操作模式(4位),LCD类型(16x2),起始行等的信息。
void LCD_INITILIZE(void) //Function to get ready the LCD
{
IO0DIR = 0x0000FFF0; //Sets pin P0.4,P0.6 ,P0.12,P0.13,P0.14,P0.15as OUTPUT
delay_ms(20);
LCD_SEND(0x02); // Initialize lcd in 4-bit mode of operation
LCD_SEND(0x28); // 2 lines (16X2)
LCD_SEND(0x0C); // Display on cursor off
LCD_SEND(0x06); // Auto increment cursor
LCD_SEND(0x01); // Display clear
LCD_SEND(0x80); // First line first position
}
对于4位模式,我们对引脚有不同类型的写入功能,即使用上下半字节。让我们看看,它是如何完成的
void LCD_SEND(char command) //Function to send hex commands nibble by nibble
{
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0xF0)<<8) ); //Send upper nibble of command
IO0SET = 0x00000040; //Making Enable HIGH
IO0CLR = 0x00000030; //Making RS & RW LOW
delay_ms(5);
IO0CLR = 0x00000040; //Makeing Enable LOW
delay_ms(5);
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0x0F)<<12) ); //Send Lower nibble of command
IO0SET = 0x00000040; //ENABLE HIGH
IO0CLR = 0x00000030; //RS & RW LOW
delay_ms(5);
IO0CLR = 0x00000040; //ENABLE LOW
delay_ms(5);
}
蚕食发送逻辑
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0x0F)<<12) ); //Send Lower nibble of command
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((command & 0xF0)<<8) ); //Send upper nibble of command
以上两种说法在本方案中起着重要作用。第一个命令发送下半字节,第二个命令发送上半字节。这不会影响我们所做的其他引脚。让我们先看看它是如何发生的,然后再了解这个逻辑
ORing- (A|0=A),(A|1=1)
ANDing-(A&0=0),(A&1=A)
因此,我们使用屏蔽概念和逻辑移位操作,而不会影响其他引脚。表示仅使用引脚 (P0.12-P0.15),不影响 P0.4、P0.6 等其他引脚。它将通过将数据移入四位并使上半字节代替下半字节并掩盖上半字节来完成。然后,我们将下位设为零(0XF0),并使用半字节数据进行ORed,以获得输出端的上半字节数据。
类似的过程用于较低的蚕食数据,但在这里我们不需要移动数据。
在将数据写入输出时,即在命令模式下,RS 应为 LOW,执行使能必须为高电平,而在数据模式下,RS 应为高电平,执行使能必须为高电平。
现在,为了发送要在输出端打印的字符串数据,相同的原理是逐个半字节地使用。这里的重要步骤是寄存器选择(RS)对于数据模式必须为高电平。
void LCD_DISPLAY (char* msg) //Function to print the characters sent one by one
{
uint8_t i=0;
while(msg[i]!=0)
{
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0xF0)<<8) ); //Sends Upper nibble
IO0SET = 0x00000050; //RS HIGH & ENABLE HIGH to print data
IO0CLR = 0x00000020; //RW LOW Write mode
delay ms(2);
IO0CLR = 0x00000040; // EN = 0, RS and RW unchanged(i.e. RS = 1, RW = 0)
delay ms(5);
IO0PIN = ( (IO0PIN & 0xFFFF00FF) | ((msg[i] & 0x0F)<<12) ); //Sends Lower nibble
IO0SET = 0x00000050; //RS & EN HIGH
IO0CLR = 0x00000020;
delay ms(2);
IO0CLR = 0x00000040;
delay ms(5);
i++;
}