一、数据手册解读
通过看数据手册我们需要知道,这个屏幕每个引脚的定义以及如何进行发送和接收。通过下面这张图我们就可以知道,这些引脚和我们的编程是有关的,需要注意的是,这里我们在接线的时候,一定要把DB0-DB7接到同一个端口,意思就是要接P0就都接P0。这样方便我们直接去处理。我们这里使用的是并行数据传输,也就是说并不像我们之前学习的I2C和SPI接口,需要一位一位的接收和发送。这里的8位数据是同时进行传输的。因此时序上也会有一些区别。
根据上面这张图片,我们需要知道我们要那些底层的函数,我们只想在LCD1602上进行显示,因此我们这次不需要读的一些函数,只需要一个写指令和一个写数据函数。因此具体的函数实现如下
void lcd1602_write_cmd(uchar cmd)
{
LCD1602_DABUS = cmd;
LCD1602_EN = 1;
LCD1602_WR = 0;
LCD1602_RS = 0;
LCD1602_EN = 0;
delay40us();
}
void lcd1602_write_date(uchar date)
{
LCD1602_DABUS = date;
LCD1602_EN = 1;
LCD1602_WR = 0;
LCD1602_RS = 1;
LCD1602_EN = 0;
delay40us();
}
相信大家看到了每个函数结束会有一个延时函数,这是因为不论是写指令还是写数据,LCD1602内部的芯片都需要一定的时间来进行处理,这里我们的延时就是让CPU等一等内部的芯片。
二、LCD1602常用指令集
我们需要注意的是,最后一个指令,判断忙碌信号,我的LCD1602忙信号老是过不去,因此我在前面使用了延时,而不是用这种检测方式。对于上面的指令你可以将它想象成为,你要使用一个东西之前,你需要先对他进行一些设置,也就是进行初始化。
三、LCD1602初始化及显示函数
void lcd1602_init(void)
{
lcd1602_write_cmd(0x01); //发送清屏指令
delay2ms(); //等待指令执行
lcd1602_write_cmd(0x06); //模式设置 写入数据后光标右移,写入数据后显示屏不移动
lcd1602_write_cmd(0x0f); //显示功能开 有光标 光标不闪烁
lcd1602_write_cmd(0x14); //设定显示屏或光标移动方向 设置为光标右移1格,且AC值加1
lcd1602_write_cmd(0x38); //数据总线位数为8位 显示2行 5*7点阵
}
//设置需要显示字符的坐标
//x取值0-15 y取值0-1
void lcd1602_setcoord(uchar x, uchar y)
{
uchar addr = 0;
if (y == 0)
{
addr = 0x80 + x;
}
else
{
addr = 0xc0 + x;
}
lcd1602_write_cmd(addr);
}
//在LCD1602上显示字符串,而且这个函数还可以实现,自动换行显示
void lcd1602_display_str(uchar x, uchar y, uchar *str)
{
uchar i = 0;
lcd1602_setcoord(x, y);
while (str[i] != '\0')
{
lcd1602_write_date(str[i]);
if (((i + x) == 15) && y == 0)
{
lcd1602_setcoord(0, 1);
}
else if (((i + x) == 15) && y == 1)
{
lcd1602_setcoord(0, 0);
}
i++;
}
}
这张图片就是DDRAM内存里面的地址,如果我们想要显示一个字符,我们首先需要发送,一个地址,也就是说我们需要告诉LCD1602在那个地方进行显示,然后发送我们需要显示的数据。因此在每次显示前都需要设置地址。但是我们需要注意的是同一个地址只能显示一个字符,不然的话就会进行覆盖。上面代码里面的第二个函数就是用来设置地址的,这个函数会将我们想要显示的坐标位置,转换成内部内存的地址,我们只需要告诉函数x,y的坐标函数就会自己转换。上面代码里面的最后一个函数就是用来显示字符串的。只需要给他传入起始坐标,和字符串的头指针就可以完成显示。