前言
在嵌入式系统或微控制器项目中,LCD(液晶显示屏)是常用的显示设备之一,特别是LCD1602这种具有16个字符宽度和2行显示的模块,因其成本低廉、易于使用而广受欢迎。然而,要在LCD上显示字符,通常需要依赖一个字符集或字模表,这些字符集包含了每个字符在LCD上显示的像素模式。
而下面我将根据字模表,通过仿真实现让显示屏显示特定的文字。
正文
首先,明确我们的目标:
根据字模表显示器显示以下内容:
Experiment is done!
2024-06-18
现在,让我们打开仿真软件和编程软件。再次明确我们的目标,然后就可以画出如下仿真图:
接下来就可以准备编程了。
首先,为了与LCD1602进行通信,我们需要包含必要的头文件。
#include <reg51.h>
#include <stdio.h>
接下来,我们定义四个外部数据(xdata)的字符型变量,它们通过_at_关键字被映射到了特定的内存地址上。这些地址是LCD控制器的寄存器地址,分别用于写入命令、写入数据、读取忙状态和读取数据(尽管在这个例子中,我们并没有使用LCD_DATA_RD来读取数据)。在这里我们提前将需要输出的数据在字模表中找到然后将其存储到数组中。
unsigned char str1[]={0x45,0x78,0x70,0x65,0x72,0x69,0x6D,0x65,0x6E,0x74,0x20,0x69,0x73,0x20,0x64,0x6F,0x6E,0x65,0x21,0x20,
0x20,0x20,0x20,0x20,0x20,0x32,0x30,0x32,0x34,0x2D,0x30,0x36,0x2D,0x31,0x38,0x20,0x20,0x20,0x20,0x20};
xdata unsigned char LCD_CMD_WR _at_ 0x9000;
xdata unsigned char LCD_DATA_WR _at_ 0x9002;
xdata unsigned char LCD_BUSY_RD _at_ 0x9004;
xdata unsigned char LCD_DATA_RD _at_ 0x9006;
然后,我们定义LCD_WriteCommand和LCD_WriteData两个函数,它们负责向LCD发送命令和数据。这两个函数在发送之前都会检查LCD的忙状态,以确保LCD已经准备好接收新的命令或数据。这是通过读取LCD_BUSY_RD寄存器的最高位来实现的,如果最高位为1,则表示LCD正忙,需要等待;如果为0,则表示LCD空闲,可以发送数据。
void LCD_WriteCommand(unsigned char c)
{
while(LCD_BUSY_RD & 0x80);
LCD_CMD_WR = c;
}
void LCD_WriteData(unsigned char d)
{
while(LCD_BUSY_RD & 0x80);
LCD_DATA_WR = d;
}
最后,在main函数中,我们首先对LCD1602进行初始化,包括设置功能、显示模式、开关控制、清屏和地址自动递增。之后,将LCD的数据指针定位到第一行起始,通过循环从str1中取出前20个字符写入LCD(即输出lcd的第一行文字)。随后,将指针移至第二行起始,再取出接下来的字符(即输出lcd的第二行文字)写入。最后,程序进入无限循环一直显示。
void main(void)
{
unsigned int i;
//LCD1602初始化
LCD_WriteCommand(0x30);
LCD_WriteCommand(0x38);
LCD_WriteCommand(0x0C);
LCD_WriteCommand(0x01);
LCD_WriteCommand(0x06);
LCD_WriteCommand(0x01);
// 写第一行字符
LCD_WriteCommand(0x80);
for(i=0;i<20;i++)
LCD_WriteData(str1[i]);
//写第二行字符
LCD_WriteCommand(0xC0);
for(i=20;i<40;i++){
LCD_WriteData(str1[i]);
}
while(1);
}
这里我们放出最后完成的效果图:
结语
这样,我们就成功地实现了在 LCD1602 上显示自定义文本了。希望这个讲解能帮到你,如果你有任何疑问,欢迎留言!